gaoluyang
2026-09-30 26b18a7699c443685a7ffb38f8c6843110389aa8
feat(migration): 按 dev_新疆_新聚 重新对齐 basic/performance/inspect 三模块

原移植自 master 分支,与新版 dev_新疆_新聚 存在代码代差,导致 inspect-server
大量编译错误。改为以 dev_新疆_新聚 为准:

- basic-server:60 个 java + 9 个 mapper XML 以源覆盖,补 16 个新文件,
删除 master 独有的 StandardMethodList*/StandardProductListService2* 6 个文件
- performance-server:23 个 java + 4 个 XML 覆盖,补 CustomerDoubleSerialize
- inspect-server:补全 214 个 java + 28 个 XML 及报表模板
- ruoyi-common:User.id/deptId 由 Long 改回 Integer,QueryWrappers 恢复
非字符串字段用 eq 的语义(均为 dev 分支的较新实现)
- ruoyi-system:补回 UserMapper/UserService/UserServiceImpl/UserMapper.xml
及 ISysDictTypeService.selectLabelByDict
- Result.getMessage() → getMsg()(与目标字段改名对齐)

六个模块 mvn install -DskipTests 全部 BUILD SUCCESS。
已修改87个文件
已添加287个文件
已删除7个文件
31490 ■■■■■ 文件已修改
basic-server/src/main/java/com/ruoyi/basic/controller/CapacityScopeController.java 264 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/controller/CertificationController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/controller/LaboratoryController.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/controller/ProductPartController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/controller/ProductSupplierDensityController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/controller/SealController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/controller/StandardMethodController.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/controller/StandardTemplateController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/controller/StandardTreeController.java 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/controller/StructureTestObjectPartController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/dto/AddStandardTreeNodeDto.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/dto/IfsInventoryQuantityCheckDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/dto/IfsInventoryQuantityDto.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/dto/IfsInventoryQuantitySupplierDto.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/dto/InventoryDetailDTO.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/dto/SampleDto.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/dto/StandardLibraryTreeNodeDto.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/dto/StandardLibraryTreeRowDto.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/dto/StandardTreeTemplateBindingDto.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/dto/StandardTreeTemplateBindingVo.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/dto/TemplateBindingItemDto.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/dto/TemplateInspectionItemDto.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/dto/UpdateStandardTreeNodeDto.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/mapper/CertificationMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/mapper/IfsInventoryQuantityMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/mapper/SealMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/mapper/StandardMethodAttachmentMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/mapper/StandardMethodIndustryMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | 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 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/mapper/StandardProductListMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/mapper/StandardTemplateMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/mapper/StandardTreeMapper.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/mapper/StandardTreeTemplateBindingMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/mapper/StandardTreeTemplateDeviceMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/mapper/StructureItemParameterMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/Certification.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/IfsInventoryQuantity.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/Laboratory.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardMethod.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardMethodAttachment.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardMethodIndustry.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardMethodList.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardProductList.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardProductListSupplierAsk.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardTemplate.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardTree.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardTreeTemplateBinding.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardTreeTemplateDevice.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/StructureItemParameter.java 6 ●●●●● 补丁 | 查看 | 原始文档 | 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 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/StandardProductListService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/StandardProductListService2.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/StandardTreeService.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/StructureItemParameterService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/impl/CapacityScopeServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/impl/CertificationServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/impl/LaboratoryServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/impl/ProductSupplierDensityServiceImpl.java 18 ●●●●● 补丁 | 查看 | 原始文档 | 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 332 ●●●●● 补丁 | 查看 | 原始文档 | 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 414 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardTemplateServiceImpl.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardTreeServiceImpl.java 823 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/impl/StructureItemParameterServiceImpl.java 276 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/utils/StandardTemplateInspectionItemParser.java 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/utils/StandardTreePath.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/utils/StandardTreePathParser.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/vo/IfsInventoryQuantityVO.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/resources/mapper/CertificationMapper.xml 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/resources/mapper/IfsInventoryQuantityMapper.xml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/resources/mapper/SealMapper.xml 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/resources/mapper/StandardMethodListMapper.xml 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/resources/mapper/StandardMethodMapper.xml 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/resources/mapper/StandardProductListMapper.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/resources/mapper/StandardTemplateMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/resources/mapper/StandardTreeMapper.xml 221 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/resources/mapper/StandardTreeTemplateDeviceMapper.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/resources/mapper/StructureItemParameterMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/resources/mapper/StructureTestMapper.xml 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/pom.xml 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/basic/pojo/InsSample.java 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/controller/DataAnalysisController.java 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/controller/FinishProductSpotCheckController.java 198 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/controller/IfsOrderInspectionController.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/controller/IfsPartPropsRecordController.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/controller/InformationNotificationController.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java 284 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderPlanController.java 303 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderRatesController.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/controller/InsProductDeviationWarningController.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/controller/InsReportController.java 205 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/controller/InsSampleReceiptController.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/controller/InsUnqualifiedHandlerController.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/controller/OutsourcingFinishProductInspectionController.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/controller/RawMaterialOrderController.java 367 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/controller/ReportController.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/controller/WarehouseController.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/CopperInsOrderDto.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/CostStatisticsDto.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/DataAnalysisDto.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/EnterFactoryReport.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/HistoryDto.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/IfsPartPropsRecordDTO.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/IfsStockQueryDTO.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/InsOrderDeviceRecordDto.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/InsOrderPlanDTO.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/InsOrderPlanProductDto.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/InsOrderUpdateDto.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/InsPlaceOrderDto.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/InsProductAnalysisDto.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/InsProductBindingDto.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/InsProductDeviationWarningDto.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/InsReportExport.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/InsulatingDto.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/OmitOrderProductDto.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/OrderSplitDTO.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/OrderTemplateSelectionDto.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/ProcurementSuppliesListEDto.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/ProductResultDto2.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/RawMaterialStandardTreeDto.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/ReportPageDto.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleOrderDto.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleProductDto.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleProductDto2.java 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleProductExportDto.java 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleProductRawAnalysisDto.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleReceiptActionDto.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleReceiptPageDto.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleReceiptQueryDto.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/SaveInsContextDto.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/SaveOrderDevicesDto.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/SaveTemplateContextDto.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/SpotCheckQuarterDto.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/SpotCheckYearDto.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/TemplateRateDto.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/UnqualifiedHandlerDto.java 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/VerifyPlanDto.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/WarehouseCellAndSampleDto.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/WarehouseDto.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/WriteInspectionConditionDto.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/event/NewJuOrderPlacedEvent.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/excel/OrderSplitExcelData.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/excel/OrderSplitExcelListener.java 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/DataAnalysisMapper.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/IfsPartPropsRecordMapper.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/IfsSplitOrderRecordMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderDeviceRecordMapper.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderFactoryVerifyItemMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderFactoryVerifyMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderFileMapper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java 177 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderRatesMapper.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderStandardTemplateMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderStateMapper.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderTemplateDeviceMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderTemplateMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsProductDeviationWarningDetailMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsProductDeviationWarningMapper.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsProductMapper.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsProductResultMapper.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsProductUserMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsReportMapper.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsSampleMapper.java 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsSampleReceiptMapper.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsSampleUserMapper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsUnqualifiedHandlerFileMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsUnqualifiedHandlerMapper.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsUnqualifiedRetestProductMapper.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsUnqualifiedRetestResultMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/RawMaterialOrderTemplateMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/SpotCheckQuarterItemMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/SpotCheckQuarterMapper.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/SpotCheckYearItemMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/SpotCheckYearMapper.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/WarehouseCellMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/WarehouseHistoryMapper.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/WarehouseMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/WarehouseShelfMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/IfsPartPropsRecord.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/IfsSplitOrderRecord.java 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrder.java 262 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrderDeviceRecord.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrderFactoryVerify.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrderFactoryVerifyItem.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrderFile.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrderRates.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrderStandardTemplate.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrderState.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrderTemplate.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrderTemplateDevice.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsProduct.java 225 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsProductDeviationWarning.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsProductDeviationWarningDetail.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsProductResult.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsProductUser.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsReport.java 138 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsSample.java 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsSampleReceipt.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsSampleUser.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsUnqualifiedHandler.java 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsUnqualifiedHandlerFile.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsUnqualifiedRetestProduct.java 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsUnqualifiedRetestResult.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/RawMaterialOrderTemplate.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/SpotCheckQuarter.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/SpotCheckQuarterItem.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/SpotCheckYear.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/SpotCheckYearItem.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/Warehouse.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/WarehouseCell.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/WarehouseHistory.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/WarehouseShelf.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/DataAnalysisService.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/FinishProductSpotCheckService.java 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/IfsOrderInspectionService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/IfsPartPropsRecordService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/IfsSplitOrderRecordService.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderDeviceRecordService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderFactoryVerifyItemService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderFileService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderPlanService.java 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderRatesService.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderService.java 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderStandardTemplateService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderStateService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderTemplateService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/InsProductDeviationWarningDetailService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/InsProductDeviationWarningService.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/InsProductService.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/InsReportService.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/InsSampleReceiptService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/InsSampleService.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/InsUnqualifiedHandlerFileService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/InsUnqualifiedHandlerService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/InsUnqualifiedRetestProductService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/OutsourcingFinishProductInspectionService.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/RawMaterialOrderService.java 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/RawMaterialOrderTemplateService.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/ReportService.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/SpotCheckQuarterItemService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/SpotCheckYearItemService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/WarehouseCellService.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/WarehouseService.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/DataAnalysisServiceImpl.java 613 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/FinishProductSpotCheckServiceImpl.java 677 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/IfsOrderInspectionServiceImpl.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/IfsPartPropsRecordServiceImpl.java 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/IfsSplitOrderRecordServiceImpl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderDeviceRecordServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderFactoryVerifyItemServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderFileServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java 6033 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderRatesServiceImpl.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java 1738 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderStandardTemplateServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderStateServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderTemplateServiceImpl.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsProductDeviationWarningDetailServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsProductDeviationWarningServiceImpl.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsProductServiceImpl.java 316 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java 1254 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsSampleReceiptServiceImpl.java 165 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsSampleServiceImpl.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsUnqualifiedHandlerFileServiceImpl.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsUnqualifiedHandlerServiceImpl.java 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsUnqualifiedRetestProductServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/OutsourcingFinishProductInspectionServiceImpl.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/RawMaterialOrderServiceImpl.java 1061 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/RawMaterialOrderTemplateServiceImpl.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/ReportServiceImpl.java 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/SpotCheckQuarterItemServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/SpotCheckYearItemServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/WarehouseCellServiceImpl.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/WarehouseServiceImpl.java 189 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/task/RawMaterIalSchedule.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/util/HackLoopTableRenderPolicy.java 154 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/util/PreserveReportPicturePlaceholderHandler.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/util/ReportSignaturePictureUtils.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/util/UserUtils.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/util/XWPFDocumentUtils.java 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/vo/DeviationAnalyzeVo.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/vo/IfsOrderVO.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/vo/InsOrderPlanTaskSwitchVo.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/vo/InsOrderPlanVO.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/vo/InsOrderPrintingVo.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/vo/InsOrderTemplateDetailVo.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/vo/InsSampleUserVO.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/vo/OrderTemplateSummaryVo.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/vo/ProductVo.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/vo/RawMaterialSupplierVo.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/vo/RawProductAnalysisVo.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/vo/SampleDefectsChildrenVo.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/vo/SampleDefectsFatherVo.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/vo/SampleVo.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/vo/TemplateConditionVo.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/vo/UnqualifiedHandlerVO.java 155 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/lib/license.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/DataAnalysisMapper.xml 315 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/IfsPartPropsRecordMapper.xml 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/IfsSplitOrderRecordMapper.xml 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsOrderDeviceRecordMapper.xml 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsOrderFileMapper.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsOrderMapper.xml 576 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsOrderRatesMapper.xml 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsOrderStateMapper.xml 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsOrderTemplateDeviceMapper.xml 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsOrderTemplateMapper.xml 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsProductDeviationWarningDetailMapper.xml 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsProductDeviationWarningMapper.xml 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsProductMapper.xml 184 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsProductResultMapper.xml 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsProductUserMapper.xml 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsReportMapper.xml 155 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsSampleMapper.xml 780 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsSampleReceiptMapper.xml 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsSampleUserMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsUnqualifiedHandlerMapper.xml 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsUnqualifiedRetestProductMapper.xml 205 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/RawMaterialOrderTemplateMapper.xml 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/SpotCheckQuarterItemMapper.xml 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/SpotCheckQuarterMapper.xml 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/SpotCheckYearMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/WarehouseCellMapper.xml 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/WarehouseHistoryMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/WarehouseMapper.xml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/static/detection-report-template-v2.docx 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/static/detection-report-template.docx 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/static/factory_verify.docx 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/static/inspection-report-template-v2.docx 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/static/report-template.docx 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/static/small-detection-template.docx 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/static/small-report-template.docx 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/static/small-wg-detection-template.docx 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/static/small-wg-report-template.docx 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/static/split_order_import_template.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/static/spot_check_quarter.docx 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/static/spot_check_year.docx 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/controller/AuxiliaryCorrectionHoursController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/controller/AuxiliaryOriginalHoursController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/controller/AuxiliaryOutputWorkingHoursController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/controller/AuxiliaryWorkingHoursController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/controller/AuxiliaryWorkingHoursDayController.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/controller/PerformanceShiftController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/controller/ShiftTimeController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/dto/AuxiliaryAllDto.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/dto/AuxiliaryOriginalHoursLookDto.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/dto/AuxiliaryOutputWorkingHoursTemporaryDto.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/mapper/AuxiliaryCorrectionHoursMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/mapper/AuxiliaryOutputWorkingHoursMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/mapper/AuxiliaryOutputWorkingHoursTemporaryMapper.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/mapper/AuxiliaryWorkingHoursDayMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/mapper/AuxiliaryWorkingHoursMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/mapper/PerformanceShiftMapper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/pojo/AuxiliaryOutputWorkingHoursTemporary.java 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/service/AuxiliaryOutputWorkingHoursTemporaryService.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryCorrectionHoursServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryOriginalHoursServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryOutputWorkingHoursServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryOutputWorkingHoursTemporaryServiceImpl.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryWorkingHoursDayServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryWorkingHoursServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/utils/CustomerDoubleSerialize.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/resources/mapper/AuxiliaryOutputWorkingHoursMapper.xml 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/resources/mapper/AuxiliaryOutputWorkingHoursTemporaryMapper.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/resources/mapper/AuxiliaryWorkingHoursDayMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/resources/mapper/AuxiliaryWorkingHoursMapper.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/resources/mapper/PerformanceShiftMapper.xml 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/User.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/QueryWrappers.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/exception/ErrorException.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictTypeMapper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserMapper.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/UserService.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserServiceImpl.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/UserMapper.xml 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/controller/CapacityScopeController.java
@@ -1,41 +1,26 @@
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 com.ruoyi.common.core.domain.Result;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
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)表控制层
@@ -55,13 +40,10 @@
    private StructureItemParameterService structureItemParameterService;
    private ISysDictTypeService dictTypeService;
    private StandardTemplateService standardTemplateService;
    @Operation(summary = "获取项目检验参数列表")
    @PostMapping("/selectItemParameterList")
    public Result selectItemParameterList(Page page,StructureItemParameter itemParameter) throws Exception {
    @GetMapping("/selectItemParameterList")
    public Result selectItemParameterList(Page page,StructureItemParameter itemParameter) {
        return Result.success(capacityScopeService.selectItemParameterList(page, itemParameter));
    }
@@ -72,7 +54,7 @@
    }
    @Operation(summary = "删除项目检验参数")
    @PostMapping("/delItemParameter")
    @DeleteMapping("/delItemParameter")
    public Result<?> delItemParameter(Integer id) {
        return Result.success(capacityScopeService.delItemParameter(id));
    }
@@ -84,8 +66,8 @@
    }
    @Operation(summary = "获取检验对象")
    @PostMapping("/selectTestObjectList")
    public Result selectTestObjectList(Page page,PageTestObjectDto pageTestObjectDto) throws Exception {
    @GetMapping("/selectTestObjectList")
    public Result selectTestObjectList(Page page,PageTestObjectDto pageTestObjectDto) {
        return Result.success(capacityScopeService.selectTestObjectList(page, pageTestObjectDto));
    }
@@ -96,7 +78,7 @@
    }
    @Operation(summary = "删除检验对象")
    @PostMapping("/delTestObject")
    @DeleteMapping("/delTestObject")
    public Result<?> delTestObject(Integer id) {
        return Result.success(capacityScopeService.delTestObject(id));
    }
@@ -114,14 +96,14 @@
    }
    @Operation(summary = "设备里面选择检验项目(树形结构)")
    @PostMapping("/getInsProduction")
    @GetMapping("/getInsProduction")
    public Result getInsProduction() {
        return Result.success(capacityScopeService.getInsProduction());
    }
    @Operation(summary = "维护检验对象的产品")
    @PostMapping("/selectProductListByObjectId")
    public Result selectProductListByObjectId(Page page,ProductDTO1 productDTO) throws Exception {
    @GetMapping("/selectProductListByObjectId")
    public Result selectProductListByObjectId(Page page,ProductDTO1 productDTO) {
        return Result.success(productService.selectProductListByObjectId(page, productDTO));
    }
@@ -138,7 +120,7 @@
    }
    @Operation(summary = "删除产品")
    @PostMapping("/delProduct")
    @DeleteMapping("/delProduct")
    public Result delProduct(Integer id) {
        return Result.success(productService.delProduct(id));
    }
@@ -154,229 +136,7 @@
    @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("服务端报错");
        }
        structureItemParameterService.importEquipData(file);
        return Result.success();
    }
basic-server/src/main/java/com/ruoyi/basic/controller/CertificationController.java
@@ -7,10 +7,7 @@
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
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 org.springframework.web.bind.annotation.*;
@Tag(name = "资质说明")
@AllArgsConstructor
@@ -23,7 +20,7 @@
    @Operation(summary = "查询资质明细列表")
    @PostMapping("/getCertificationDetail")
    @GetMapping("/getCertificationDetail")
    public Result getCertificationDetail(Page page,Certification certification) {
        return Result.success(certificationService.getCertificationDetail(page, certification));
    }
@@ -34,8 +31,8 @@
        return Result.success(certificationService.addCertificationDetail(certification));
    }
    @Operation(summary = "删除资质明细列表")
    @PostMapping("/delCertificationDetail")
    public Result<?> delCertificationDetail( String ids) {
    @DeleteMapping("/delCertificationDetail")
    public Result<?> delCertificationDetail(String ids) {
        return Result.success(certificationService.delCertificationDetail(ids));
    }
}
basic-server/src/main/java/com/ruoyi/basic/controller/LaboratoryController.java
@@ -24,7 +24,7 @@
    private LaboratoryService laboratoryService;
    @Operation(summary = "查询实验室管理列表")
    @PostMapping("/selectItemParameter")
    @GetMapping("/selectItemParameter")
    public Result selectItemParameter(Page page ,Laboratory itemParameter) {
        return Result.success(laboratoryService.selectItemParameter(page, itemParameter));
    }
@@ -36,7 +36,7 @@
    }
    @Operation(summary = "删除实验室参数")
    @PostMapping("/delParameter")
    @DeleteMapping("/delParameter")
    public Result<?> delParameter(Integer id) {
        return Result.success(laboratoryService.delParameter(id));
    }
basic-server/src/main/java/com/ruoyi/basic/controller/ProductPartController.java
@@ -7,10 +7,7 @@
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
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 org.springframework.web.bind.annotation.*;
@RestController
@AllArgsConstructor
@@ -21,7 +18,7 @@
    private ProductPartService productPartService;
    @Operation(summary = "根据产品id查询零件")
    @PostMapping("/selectByProductId")
    @GetMapping("/selectByProductId")
    public Result selectByProductId(Page page,ProductPart productPart){
        return Result.success(productPartService.selectByProductId(page,productPart));
    }
@@ -41,7 +38,7 @@
    }
    @Operation(summary = "删除产品零件")
    @PostMapping("/deleteProductPart")
    @DeleteMapping("/deleteProductPart")
    public Result deleteProductPart(Integer id) {
        productPartService.removeById(id);
        return Result.success();
basic-server/src/main/java/com/ruoyi/basic/controller/ProductSupplierDensityController.java
@@ -8,10 +8,7 @@
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
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 org.springframework.web.bind.annotation.*;
/**
@@ -29,7 +26,7 @@
    private ProductSupplierDensityService productSupplierDensityService;
    @Operation(summary = "根据产品id查询厂家密度绑定")
    @PostMapping("/selectSupplierDensityByProductId")
    @GetMapping("/selectSupplierDensityByProductId")
    public Result selectSupplierDensityByProductId(Page page,ProductSupplierDensity supplierDensity) {
        return Result.success(productSupplierDensityService.selectByProductId(page, supplierDensity));
    }
@@ -49,7 +46,7 @@
    }
    @Operation(summary = "删除厂家密度绑定")
    @PostMapping("/deleteProductSupplierDensity")
    @DeleteMapping("/deleteProductSupplierDensity")
    public Result deleteProductSupplierDensity(Integer id) {
        productSupplierDensityService.removeById(id);
        return Result.success();
basic-server/src/main/java/com/ruoyi/basic/controller/SealController.java
@@ -8,10 +8,7 @@
import com.ruoyi.common.utils.JackSonUtil;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
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 org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import java.util.List;
@@ -43,7 +40,7 @@
    }
    @Operation(summary = "查询印章列表")
    @PostMapping("/selectSeal")
    @GetMapping("/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
@@ -21,8 +21,8 @@
    private StandardMethodService standardMethodService;
    @Operation(summary = "获取标准方法列表")
    @PostMapping("/selectStandardMethodList")
    public Result selectStandardMethodList(Page page,StandardMethod standardMethod) throws Exception {
    @GetMapping("/selectStandardMethodList")
    public Result selectStandardMethodList(Page page,StandardMethod standardMethod)  {
        return Result.success(standardMethodService.selectStandardMethodList(page, standardMethod));
    }
@@ -39,7 +39,7 @@
    }
    @Operation(summary = "删除标准方法")
    @PostMapping("/delStandardMethod")
    @DeleteMapping("/delStandardMethod")
    public Result<?> delStandardMethod(Integer id) {
        return Result.success(standardMethodService.delStandardMethod(id));
    }
@@ -50,10 +50,29 @@
        return Result.success(standardMethodService.upStandardMethod(standardMethod));
    }
    @Operation(summary = "导入标准明细")
    @PostMapping("/importStandardDetails")
    public Result<?> importStandardDetails(@RequestPart("file") MultipartFile file) throws IOException {
        standardMethodService.inputExcel(file);
        return Result.success();
    @Operation(summary = "获取行业选项")
    @GetMapping("/selectIndustryOptions")
    public Result selectIndustryOptions() {
        return Result.success(standardMethodService.selectIndustryOptions());
    }
    @Operation(summary = "查询标准附件")
    @GetMapping("/selectAttachments")
    public Result selectAttachments(Integer standardMethodId) {
        return Result.success(standardMethodService.selectAttachments(standardMethodId));
    }
    @Operation(summary = "上传标准附件")
    @PostMapping("/uploadAttachment")
    public Result uploadAttachment(@RequestParam("standardMethodId") Integer standardMethodId,
                                   @RequestParam("file") MultipartFile file) {
        return Result.success(standardMethodService.uploadAttachment(standardMethodId, file));
    }
    @Operation(summary = "删除标准附件")
    @DeleteMapping("/deleteAttachment")
    public Result deleteAttachment(Long id) {
        return Result.success(standardMethodService.deleteAttachment(id));
    }
}
basic-server/src/main/java/com/ruoyi/basic/controller/StandardTemplateController.java
@@ -18,8 +18,8 @@
    private StandardTemplateService standardTemplateService;
    @Operation(summary = "获取原始记录模板列表")
    @PostMapping("/selectStandardTemplatePageList")
    public Result selectStandardTemplatePageList(Page page,StandardTemplate standardTemplate) throws Exception {
    @GetMapping("/selectStandardTemplatePageList")
    public Result selectStandardTemplatePageList(Page page,StandardTemplate standardTemplate){
        return Result.success(standardTemplateService.selectStandardTemplatePageList(page, standardTemplate));
    }
@@ -36,7 +36,7 @@
    }
    @Operation(summary = "删除原始记录模板")
    @PostMapping("/delStandardTemplate")
    @DeleteMapping("/delStandardTemplate")
    public Result<?> delStandardTemplate(Integer id) {
        return Result.success(standardTemplateService.delStandardTemplate(id));
    }
@@ -48,7 +48,7 @@
    }
    @Operation(summary = "通过模板id获取检验项模板内容")
    @PostMapping("/getStandTempThingById")
    @GetMapping("/getStandTempThingById")
    public Result<?> getStandTempThingById(Integer id) {
        return Result.success(standardTemplateService.getStandTempThingById(id));
    }
@@ -56,8 +56,7 @@
    @Operation(summary = "编辑模板编制")
    @GetMapping("/getEditTemplatePreparation")
    public Result<?> getEditTemplatePreparation(@RequestParam("id") Integer id) {
        StandardTemplate byId = standardTemplateService.getById(id);
        return Result.success("OK", byId.getThing());
        return Result.success(standardTemplateService.getStandTempThingById(id));
    }
    @Operation(summary = "复制原始记录模板")
basic-server/src/main/java/com/ruoyi/basic/controller/StandardTreeController.java
@@ -1,19 +1,18 @@
package com.ruoyi.basic.controller;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.ruoyi.basic.service.*;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.basic.dto.AddStandardTreeNodeDto;
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.dto.StandardLibraryTreeNodeDto;
import com.ruoyi.basic.dto.UpdateStandardTreeNodeDto;
import com.ruoyi.basic.dto.StandardTreeTemplateBindingDto;
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.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import lombok.AllArgsConstructor;
@@ -31,7 +30,7 @@
    private StandardTreeService standardTreeService;
    private StandardMethodListService standardMethodListService;
    private StandardMethodService standardMethodService;
    private StandardProductListService standardProductListService;
@@ -51,57 +50,37 @@
    @Operation(summary = "添加标准树")
    @PostMapping("/addStandardTree")
    public Result addStandardTree(@RequestBody StandardTree standardTree) {
        return Result.success(standardTreeService.addStandardTree(standardTree));
    }
    @Operation(summary = "给标准树添加检验标准")
    @PostMapping("/addStandardMethodList")
    public Result addStandardMethodList(String tree, Integer standardId) {
        return Result.success(standardMethodListService.addStandardMethodList(standardId, tree));
    public Result addStandardTree(@RequestBody AddStandardTreeNodeDto dto) {
        return Result.success(standardTreeService.addStandardTree(dto));
    }
    @Operation(summary = "根据标准树进行标准查询")
    @PostMapping("/selectsStandardMethodByFLSSM")
    @GetMapping("/selectsStandardMethodByFLSSM")
    public Result selectsStandardMethodByFLSSM(String tree) {
        return Result.success(standardMethodListService.selectsStandardMethodByFLSSM(tree));
        if (tree == null || tree.trim().isEmpty()) {
            return Result.fail("标准树参数不能为空");
        }
        return Result.success(standardMethodService.selectsStandardMethodByFLSSM(tree));
    }
    @Operation(summary = "修改标准库中的内容")
    @PostMapping("/upStandardProductList")
    public Result upStandardProductList(String str) {
    public Result upStandardProductList(@RequestBody Map<String, String> map) {
        String str = map.get("str");
        StandardProductList list = JSON.parseObject(str, StandardProductList.class);
        return Result.success(standardProductListService.upStandardProductList(list));
    }
    @Operation(summary = "修改标准库区间")
    @PostMapping("/updateSection")
    public Result updateSection(String str) {
    public Result updateSection(@RequestBody Map<String, String> map) {
        String str = map.get("str");
        StandardProductList list = JSON.parseObject(str, StandardProductList.class);
        return Result.success(standardProductListService.updateSection(list));
    }
    @Operation(summary = "删除标准树下的检验标准")
    @PostMapping("/delStandardMethodByFLSSM")
    public Result delStandardMethodByFLSSM(Integer id) {
        return Result.success(standardMethodListService.delStandardMethodByFLSSM(id));
    }
    @Operation(summary = "删除标准树下的检验项目")
    @PostMapping("/delStandardProductByIds")
    public Result delStandardProductByIds(String ids) {
        JSONArray lists = JSON.parseArray(ids);
        return Result.success(standardProductListService.delStandardProduct(lists));
    }
    @Operation(summary = "新增标准树下的检验项目")
    @PostMapping("/addStandardProduct")
    public Result addStandardProduct(String ids, String tree) {
        return Result.success(standardTreeService.addStandardProduct(ids, tree));
    }
    @Operation(summary = "删除标准树的层级")
    @PostMapping("/delStandardTree")
    @DeleteMapping("/delStandardTree")
    public Result delStandardTree(String tree) {
        return Result.success(standardTreeService.delStandardTree(tree));
    }
@@ -113,19 +92,19 @@
    }
    @Operation(summary = "通过检验标准查询检验项目")
    @PostMapping("/selectStandardProductListByMethodId")
    public Result selectStandardProductListByMethodId(Integer id, String tree, Integer page) {
        return Result.success(standardProductListService.selectStandardProductListByMethodId(id, tree, page));
    @GetMapping("/selectStandardProductListByMethodId")
    public Result selectStandardProductListByMethodId(Integer id, String tree, Integer page, String keyword) {
        return Result.success(standardProductListService.selectStandardProductListByMethodId(id, tree, page, keyword));
    }
    @Operation(summary = "批量编辑查询检验项目")
    @PostMapping("/selectStandardProductByMethodId")
    @Operation(summary = "批量查询检验项目")
    @GetMapping("/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));
    }
    @Operation(summary = "批量编辑查询所有检验项目和检验子项枚举")
    @PostMapping("/selectStandardProductEnumByMethodId")
    @Operation(summary = "批量查询所有检验项目和检验子项枚举")
    @GetMapping("/selectStandardProductEnumByMethodId")
    public Result selectStandardProductEnumByMethodId(Integer id, String tree, String item) {
        return Result.success(standardProductListService.selectStandardProductEnumByMethodId(id, tree, item));
    }
@@ -133,7 +112,7 @@
    @Operation(summary = "获取标准树下标准方法枚举")
    @GetMapping("/selectStandardMethodEnum")
    public Result selectStandardMethodEnum() {
        return Result.success(standardMethodListService.selectStandardMethodEnum());
        return Result.success(standardMethodService.selectStandardMethodEnum());
    }
    @Operation(summary = "获取产品架构")
@@ -148,43 +127,6 @@
        return Result.success(standardTreeService.upStandardProducts(product));
    }
    @PostMapping("/getStandTreeBySampleType")
    @Operation(summary = "仅获取光纤的型号")
    public Result<?> getStandTreeBySampleType(String laboratory, String sampleType) {
        return Result.success(standardTreeService.getStandTreeBySampleType(laboratory, sampleType));
    }
    @Operation(summary = "导入标准库")
    @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();
    }
    @Operation(summary = "重置标准库单价")
    @PostMapping("/resetTreeOfPrice")
    public Result resetTreeOfPrice(String tree, Integer standardId) {
        standardTreeService.resetTreeOfPrice(tree, standardId);
        return Result.success();
    }
    @Operation(summary = "重置标准库工时系数")
    @PostMapping("/resetTreeOfHour")
    public Result resetTreeOfHour(String tree, Integer standardId) {
        standardTreeService.resetTreeOfHour(tree, standardId);
        return Result.success();
    }
    @Operation(summary = "重置标准库要求描述和要求值")
    @PostMapping("/resetTreeOfAsk")
    public Result resetTreeOfAsk(String tree, Integer standardId) {
        standardTreeService.resetTreeOfAsk(tree, standardId);
        return Result.success();
    }
    @Operation(summary = "标准库拖拽")
    @PostMapping("/resetTreeDrag")
@@ -203,7 +145,7 @@
    @Operation(summary = "标准树排序")
    @PostMapping("/updateTreeSort")
    public Result updateTreeSort(@RequestBody List<FactoryDto> list) {
    public Result updateTreeSort(@RequestBody List<StandardLibraryTreeNodeDto> list) {
        return Result.success(standardTreeService.updateTreeSort(list));
    }
@@ -211,27 +153,29 @@
    @Operation(summary = "根据产品id查询厂家要求值绑定")
    @PostMapping("/selectSupplierAsk")
    public Result selectSupplierAsk(StandardProductListSupplierAsk supplierAsk) throws Exception {
    public Result selectSupplierAsk(@RequestBody StandardProductListSupplierAsk supplierAsk) throws Exception {
        return Result.success(standardProductListSupplierAskService.selectByProductId(supplierAsk));
    }
    @Operation(summary = "新增厂家要求值绑定")
    @PostMapping("/addProductSupplierAsk")
    public Result addProductSupplierAsk(String str) {
    public Result addProductSupplierAsk(@RequestBody Map<String, String> map) {
        String str = map.get("str");
        StandardProductListSupplierAsk supplierAsk = JSON.parseObject(str, StandardProductListSupplierAsk.class);
        return Result.success(standardProductListSupplierAskService.addProductSupplierAsk(supplierAsk));
    }
    @Operation(summary = "更新厂家要求值绑定")
    @PostMapping("/updateProductSupplierAsk")
    public Result updateProductSupplierAsk(String str) {
    public Result updateProductSupplierAsk(@RequestBody Map<String, String> map) {
        String str = map.get("str");
        StandardProductListSupplierAsk supplierAsk = JSON.parseObject(str, StandardProductListSupplierAsk.class);
        standardProductListSupplierAskService.updateProductSupplierAsk(supplierAsk);
        return Result.success();
    }
    @Operation(summary = "删除厂家要求值绑定")
    @PostMapping("/deleteProductSupplierAsk")
    @DeleteMapping("/deleteProductSupplierAsk")
    public Result deleteProductSupplierAsk(Integer supplierAskId) {
        standardProductListSupplierAskService.removeById(supplierAskId);
        return Result.success();
@@ -239,8 +183,20 @@
    @Operation(summary = "修改标准树")
    @PostMapping("/updateStandardTree")
    public Result updateStandardTree(@RequestBody StandardTree standardTree) {
        return Result.success(standardTreeService.updateStandardTree(standardTree));
    public Result updateStandardTree(@RequestBody UpdateStandardTreeNodeDto dto) {
        return Result.success(standardTreeService.updateStandardTree(dto));
    }
    @Operation(summary = "查询标准绑定的原始记录模板")
    @GetMapping("/selectTemplateBindings")
    public Result selectTemplateBindings(Integer standardTreeId) {
        return Result.success(standardTreeService.selectTemplateBindings(standardTreeId));
    }
    @Operation(summary = "保存标准绑定的原始记录模板")
    @PostMapping("/saveTemplateBindings")
    public Result saveTemplateBindings(@RequestBody StandardTreeTemplateBindingDto dto) {
        return Result.success(standardTreeService.saveTemplateBindings(dto));
    }
    @Operation(summary = "检验项要求值复制对比")
basic-server/src/main/java/com/ruoyi/basic/controller/StructureTestObjectPartController.java
@@ -8,10 +8,7 @@
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
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 org.springframework.web.bind.annotation.*;
/**
@@ -29,7 +26,7 @@
    private StructureTestObjectPartService structureTestObjectPartService;
    @Operation(summary = "根据检验对象id查询零件")
    @PostMapping("/selectByTestObjectId")
    @GetMapping("/selectByTestObjectId")
    public Result selectByTestObjectId(Page page,StructureTestObjectPart structureTestObjectPart){
        return Result.success(structureTestObjectPartService.selectByTestObjectId(page,structureTestObjectPart));
    }
@@ -49,7 +46,7 @@
    }
    @Operation(summary = "删除检验对象零件")
    @PostMapping("/deleteTestObjectPart")
    @DeleteMapping("/deleteTestObjectPart")
    public Result deleteTestObjectPart(Integer id) {
        structureTestObjectPartService.removeById(id);
        return Result.success();
basic-server/src/main/java/com/ruoyi/basic/dto/AddStandardTreeNodeDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.basic.dto;
import lombok.Data;
/**
 * æ–°å¢žæ ‡å‡†æ ‘节点请求
 */
@Data
public class AddStandardTreeNodeDto {
    /**
     * çˆ¶èŠ‚ç‚¹è·¯å¾„ï¼šä¸ºç©ºè¡¨ç¤ºæ–°å¢žè¡Œä¸šï¼›ä¸ºå•ä¸ªè¡Œä¸šåç§°è¡¨ç¤ºåœ¨è¯¥è¡Œä¸šä¸‹æ–°å¢žæ ‡å‡†
     */
    private String parentTree;
    private String name;
}
basic-server/src/main/java/com/ruoyi/basic/dto/IfsInventoryQuantityCheckDto.java
@@ -14,7 +14,7 @@
 * @Date 2024/8/28
 */
@Data
public class IfsInventoryQuantityCheckDto  implements Serializable {
public class IfsInventoryQuantityCheckDto implements Serializable {
    private Integer id;
basic-server/src/main/java/com/ruoyi/basic/dto/IfsInventoryQuantityDto.java
@@ -79,4 +79,7 @@
    @Schema(description = "检验人")
    private String userName;
    @Schema(description = "销售订单分类")
    private String orderType;
}
basic-server/src/main/java/com/ruoyi/basic/dto/IfsInventoryQuantitySupplierDto.java
@@ -40,6 +40,9 @@
    @Schema(description = "样品编号")
    private String sampleCode;
    @Schema(description = "销售订单分类名称")
    private String orderTypeName;
    // è¿›åŽ‚
    @Schema(description = "进厂订单id")
    private Integer enterOrderId;
@@ -53,6 +56,9 @@
    @Schema(description = "手动上传报告地址")
    private String enterUrlS;
    @Schema(description = "进厂报告审批状态(1:批准通过,0:批准不通过)")
    private Integer enterRatifyStatus;
    // å­£åº¦
    @Schema(description = "季度订单id")
    private Integer quarterOrderId;
@@ -65,6 +71,9 @@
    @Schema(description = "手动上传报告地址")
    private String quarterUrlS;
    @Schema(description = "季度检验报告审批状态(1:批准通过,0:批准不通过)")
    private Integer quarterRatifyStatus;
    private Integer orderState;
@@ -121,4 +130,7 @@
    @Schema(description = "免检")
    private Integer isExemption;
    @Schema(description = "原材料id(导出用)")
    private String ids;
}
basic-server/src/main/java/com/ruoyi/basic/dto/InventoryDetailDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
package com.ruoyi.basic.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.Date;
@Data
public class InventoryDetailDTO {
    // æ¥è‡ª ifs_inventory_quantity
    @Schema(description = "ifs_inventory_quantityID")
    private Integer id;
    @Schema(description = "零件描述")
    private String partDesc;
    @Schema(description = "SN号")
    private String lotBatchNo;
    @Schema(description = "零件号")
    private String partNo;
    // æ¥è‡ª ifs_part_props_record
    @Schema(description = "绝缘颜色")
    private String insulationColor;
    @Schema(description = "护套颜色")
    private String outerColor;
    @Schema(description = "载具编号")
    private String drumNo;
    @Schema(description = "起始米标")
    private String startMeterMark;
    @Schema(description = "截止米标")
    private String endMeterMark;
    // æ¥è‡ª ins_order
    @Schema(description = "入库时间")
    private Date updateTime;
    @Schema(description = "检测结论")
    private Integer insState;
    // é€»è¾‘计算字段:检验人 (COALESCE åŽçš„结果)
    @Schema(description = "检测人员")
    private String inspectorName;
}
basic-server/src/main/java/com/ruoyi/basic/dto/SampleDto.java
@@ -1,5 +1,6 @@
package com.ruoyi.basic.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@@ -13,11 +14,13 @@
    private String value;
    @Schema(description = "零件号")
    private String partNo;
    // æ ·å“è‹±æ–‡
    @Schema(description = "样品英文")
    private String sampleEn;
    @Schema(description = "产品")
    private List<ModelDto> children;
}
basic-server/src/main/java/com/ruoyi/basic/dto/StandardLibraryTreeNodeDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.ruoyi.basic.dto;
import lombok.Data;
import java.util.List;
/**
 * æ ‡å‡†åº“固定两级树节点(行业 -> æ ‡å‡†ï¼‰
 */
@Data
public class StandardLibraryTreeNodeDto {
    private Integer id;
    private String label;
    private String value;
    private String code;
    private String sampleEn;
    private Integer standardMethodId;
    private String standardCode;
    private String standardName;
    private List<StandardLibraryTreeNodeDto> children;
}
basic-server/src/main/java/com/ruoyi/basic/dto/StandardLibraryTreeRowDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.ruoyi.basic.dto;
import lombok.Data;
/**
 * æ ‡å‡†åº“两级树查询的扁平行结果(行业 + æ ‡å‡†ï¼‰
 */
@Data
public class StandardLibraryTreeRowDto {
    private Integer industryId;
    private String industryName;
    private Integer industrySort;
    private Integer standardId;
    private Integer standardMethodId;
    private String standardCode;
    private String standardName;
    private String standardNameEn;
    private String standardLabel;
    private Integer standardSort;
}
basic-server/src/main/java/com/ruoyi/basic/dto/StandardTreeTemplateBindingDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.ruoyi.basic.dto;
import lombok.Data;
import java.util.List;
@Data
public class StandardTreeTemplateBindingDto {
    private Integer standardTreeId;
    private List<TemplateBindingItemDto> templates;
}
basic-server/src/main/java/com/ruoyi/basic/dto/StandardTreeTemplateBindingVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.basic.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class StandardTreeTemplateBindingVo {
    @Schema(description = "模板ID")
    private Integer templateId;
    @Schema(description = "模板名称")
    private String name;
    @Schema(description = "检验项目")
    private String number;
    @Schema(description = "备注")
    private String remark;
    @Schema(description = "排序")
    private Integer sort;
    @Schema(description = "设备ID集合")
    private List<Integer> deviceIds = new ArrayList<>();
}
basic-server/src/main/java/com/ruoyi/basic/dto/TemplateBindingItemDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.basic.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class TemplateBindingItemDto {
    @Schema(description = "模板ID")
    private Integer templateId;
    @Schema(description = "排序")
    private Integer sort;
    @Schema(description = "设备ID集合")
    private List<Integer> deviceIds = new ArrayList<>();
}
basic-server/src/main/java/com/ruoyi/basic/dto/TemplateInspectionItemDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.ruoyi.basic.dto;
import lombok.Data;
/** åŽŸå§‹è®°å½•æ¨¡æ¿ä¸­æ ‡è®°ä¸ºâ€œæ£€éªŒé¡¹â€çš„ä¸€è¡Œã€‚ */
@Data
public class TemplateInspectionItemDto {
    private Integer templateId;
    private Integer templateSort;
    private Integer templateRowIndex;
    private String inspectionItem;
}
basic-server/src/main/java/com/ruoyi/basic/dto/UpdateStandardTreeNodeDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.basic.dto;
import lombok.Data;
/**
 * ä¿®æ”¹æ ‡å‡†æ ‘节点请求
 */
@Data
public class UpdateStandardTreeNodeDto {
    /**
     * çˆ¶èŠ‚ç‚¹è·¯å¾„ï¼šä¸ºç©ºè¡¨ç¤ºä¿®æ”¹è¡Œä¸šï¼›ä¸ºè¡Œä¸šåç§°è¡¨ç¤ºä¿®æ”¹è¯¥è¡Œä¸šä¸‹çš„æ ‡å‡†
     */
    private String parentTree;
    private String oldLabel;
    private String name;
}
basic-server/src/main/java/com/ruoyi/basic/mapper/CertificationMapper.java
@@ -10,5 +10,5 @@
public interface CertificationMapper extends BaseMapper<Certification> {
    //查询资质明细列表
    IPage<Certification> getCertificationDetail(Page page, @Param("ew") QueryWrapper<Certification> ew);
    IPage<Certification> getCertificationDetail(Page page, @Param("param") Certification certification);
}
basic-server/src/main/java/com/ruoyi/basic/mapper/IfsInventoryQuantityMapper.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.basic.dto.IfsInventoryQuantityDto;
import com.ruoyi.basic.pojo.IfsInventoryQuantity;
import com.ruoyi.basic.vo.IfsInventoryQuantityVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -24,7 +25,7 @@
     * @param ifsInventoryId
     * @return
     */
    int selectReportCountById(@Param("ifsInventoryId") Integer ifsInventoryId);
    int selectReportCountById(@Param("ifsInventoryId") Long ifsInventoryId);
    /**
@@ -39,4 +40,10 @@
                          @Param("supplierName") String supplierName,
                          @Param("startOfNextQuarter") LocalDateTime startOfNextQuarter,
                          @Param("endOfQuarter") LocalDateTime endOfQuarter);
    List<IfsInventoryQuantityVO> selectSplitOrderList(@Param("partNo")String partNo,
                                                      @Param("lineNo")String lineNo,
                                                      @Param("releaseNo")String releaseNo,
                                                      @Param("receiptNo")Integer receiptNo,
                                                      @Param("orderNo")String orderNo);
}
basic-server/src/main/java/com/ruoyi/basic/mapper/SealMapper.java
@@ -12,6 +12,6 @@
public interface SealMapper extends BaseMapper<Seal> {
    IPage<Seal>selectSeal(Page page, @Param("ew") QueryWrapper<Seal> ew);
    List<Laboratory> selectLaboratory (Integer labId);
    List<Laboratory> selectLaboratory (@Param("labId") Integer labId);
}
basic-server/src/main/java/com/ruoyi/basic/mapper/StandardMethodAttachmentMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
package com.ruoyi.basic.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.basic.pojo.StandardMethodAttachment;
public interface StandardMethodAttachmentMapper extends BaseMapper<StandardMethodAttachment> {
}
basic-server/src/main/java/com/ruoyi/basic/mapper/StandardMethodIndustryMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
package com.ruoyi.basic.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.basic.pojo.StandardMethodIndustry;
public interface StandardMethodIndustryMapper extends BaseMapper<StandardMethodIndustry> {
}
basic-server/src/main/java/com/ruoyi/basic/mapper/StandardMethodListMapper.java
ÎļþÒÑɾ³ý
basic-server/src/main/java/com/ruoyi/basic/mapper/StandardMethodMapper.java
@@ -3,9 +3,12 @@
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.basic.pojo.StandardMethodList;
import com.ruoyi.framework.mybatis_config.MyBaseMapper;
import com.ruoyi.basic.pojo.StandardMethod;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author Administrator
@@ -17,7 +20,20 @@
    IPage<StandardMethod> selectStandardMethodList(Page page, @Param("ew") QueryWrapper<StandardMethod> ew);
    StandardMethod selectStandMethodById(Integer id);
    StandardMethod selectStandMethodById(@Param("id") Integer id);
    List<StandardMethodList> selectStandardMethodLists(@Param("tree") String tree);
    List<StandardMethodList> selectStandardMethodListsByNull(@Param("tree") String tree);
    List<StandardMethodList> selectStandardMethodLists3(@Param("tree") String tree);
    List<StandardMethodList> selectStandardMethodListsByIndustry(@Param("industry") String industry);
    List<StandardMethodList> selectListEnum();
    Integer getStandardMethodId(@Param("code") String code);
}
basic-server/src/main/java/com/ruoyi/basic/mapper/StandardProductListMapper.java
@@ -62,6 +62,12 @@
                        @Param("endIndex") Integer endIndex,
                        @Param("methodId") Integer methodId,
                        @Param("tree") String tree);
    /**
     * æ‰¹é‡æ·»åŠ æ ‡å‡†
     * @param productLists
     */
    void saveBatchProductLists(@Param("productLists") List<StandardProductList> productLists);
}
basic-server/src/main/java/com/ruoyi/basic/mapper/StandardTemplateMapper.java
@@ -17,14 +17,22 @@
    IPage<StandardTemplate> selectStandardTemplatePageList(Page page, @Param("ew") QueryWrapper<StandardTemplate> ew);
    StandardTemplate getStandTempIdByName(String name);
    StandardTemplate getStandTempIdByName(@Param("name") String name);
    /**
     * æŸ¥è¯¢åŽ‹ç¼©åŽçš„æ•°æ®
     * @param templateId
     * @return
     */
    String selectCompressThing(Integer templateId);
    String selectCompressThing(@Param("templateId") Integer templateId);
    /**
     * ç»‘定该模板检验项参数统计
     *
     * @param templateId
     * @return
     */
    int countBindTemplateItemParameter(@Param("templateId") Integer templateId);
}
basic-server/src/main/java/com/ruoyi/basic/mapper/StandardTreeMapper.java
@@ -6,12 +6,14 @@
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 com.ruoyi.basic.vo.IfsInventoryQuantityVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Set;
/**
 * @author Administrator
@@ -19,27 +21,56 @@
 * @createDate 2024-03-01 15:06:44
 * @Entity com.ruoyi.basic.pojo.StandardTree
 */
@Mapper
public interface StandardTreeMapper extends BaseMapper<StandardTree> {
    List<FactoryDto> selectStandardTreeList();
    List<StandardLibraryTreeRowDto> selectStandardLibraryTree();
    List<StandardTree> selectStandardTreeList2(String sampleType);
    /**
     * è¡Œä¸šæ”¹åï¼šçº§è”更新标准库配置中的行业名称,并重建两级规范路径
     */
    int updateProductListIndustry(@Param("oldName") String oldName, @Param("newName") String newName);
    /**
     * æ ‡å‡†æ”¹åï¼šçº§è”更新标准库配置中的标准名称,并重建两级规范路径
     */
    int updateProductListStandard(@Param("industry") String industry, @Param("oldName") String oldName, @Param("newName") String newName);
    /**
     * è¡Œä¸šæ”¹åï¼šçº§è”更新未完成订单的行业名称
     */
    int updateInsOrderIndustry(@Param("oldName") String oldName, @Param("newName") String newName);
    int updateInsSampleIndustry(@Param("oldName") String oldName, @Param("newName") String newName);
    int updateInsProductIndustry(@Param("oldName") String oldName, @Param("newName") String newName);
    /**
     * æ ‡å‡†æ”¹åï¼šçº§è”更新未完成订单的标准名称
     */
    int updateInsOrderStandard(@Param("industry") String industry, @Param("oldName") String oldName, @Param("newName") String newName);
    int updateInsSampleStandard(@Param("industry") String industry, @Param("oldName") String oldName, @Param("newName") String newName);
    int updateInsProductStandard(@Param("industry") String industry, @Param("oldName") String oldName, @Param("newName") String newName);
    StandardProductList selectStandardProductById(Integer id);
    List<StandardProductList> getStandardProductListBySample(String sampleType);
    List<StandardMethodList> getStandardMethodListBySample(String sampleType);
    List<StandardProductList> selectStandardProductListByTree(@Param("tree") String tree, @Param("sample") String sample, @Param("model") String model, @Param("trees") String trees, @Param("laboratory") String laboratory);
    List<StandardProductList> selectStandardProductListByTree(String tree, String sample, String model, String trees, String laboratory);
    List<StandardProductList> selectStandardProductListByTree2(@Param("tree") String tree, @Param("sample") String sample, @Param("model") String model, @Param("trees") String trees, @Param("laboratory") String laboratory);
    List<StandardProductList> selectStandardProductListByTree2(String tree, String sample, String model, String trees, String laboratory);
    /**
     * æŒ‰è¡Œä¸šæŸ¥è¯¢åŸºç¡€æ£€éªŒé¡¹ï¼Œç”Ÿæˆä¸¤çº§æ ‡å‡†é…ç½®ï¼ˆsample=标准、model=NULL、tree=规范路径)
     */
    List<StandardProductList> selectStandardProductListByIndustry(@Param("industry") String industry, @Param("standard") String standard, @Param("tree") String tree);
    List<SampleTypeDto> getStandardTree2();
    List<SampleDto> getStandardTree3(String sampleType);
    String getLaboratory(String str);
@@ -51,8 +82,8 @@
    List<FactoryDto> selectStandardTreeListByPartNo(@Param("partNo") String partNo);
    IPage<IfsInventoryQuantity> selectIfsPage(IPage<IfsInventoryQuantity> page,
                                              @Param("ew") QueryWrapper<IfsInventoryQuantity> ew);
    IPage<IfsInventoryQuantityVO> selectIfsPage(IPage<IfsInventoryQuantity> page,
                                                @Param("ew") QueryWrapper<IfsInventoryQuantity> ew);
    IPage<IfsInventoryQuantityDto> getIfsByStateOne(IPage<IfsInventoryQuantityDto> page,
                                                    @Param("ew") QueryWrapper<IfsInventoryQuantityDto> ew);
@@ -85,6 +116,27 @@
     */
    IPage<IfsInventoryQuantitySupplierDto> getIfsByQuarter(Page<IfsInventoryQuantitySupplierDto> page, @Param("ew") QueryWrapper<IfsInventoryQuantitySupplierDto> ew, @Param("beginDeclareDate") String beginDeclareDate, @Param("endDeclareDate")String endDeclareDate);
    /**
     * æ‰¹é‡æŸ¥è¯¢æ ‘
     * @param sampleTypeValues
     * @return
     */
    List<SampleDto> getStandardTree3Batch(@Param("sampleTypeValues") Set<String> sampleTypeValues);
    /**
     * æŸ¥è¯¢æ ‘
     * @param sampleType
     * @return
     */
    List<SampleDto> getStandardTree3(@Param("sampleType") String sampleType);
    /**
     * æ ¹æ®åŽŸææ–™id列表查询原材料信息
     * @param ifsIds
     * @return
     */
    List<IfsInventoryQuantitySupplierDto> getIfsByIds(@Param("ifsIds") List<String> ifsIds);
}
basic-server/src/main/java/com/ruoyi/basic/mapper/StandardTreeTemplateBindingMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
package com.ruoyi.basic.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.basic.pojo.StandardTreeTemplateBinding;
/** æ ‡å‡†æ¨¡æ¿ç»‘定 Mapper。 */
public interface StandardTreeTemplateBindingMapper extends BaseMapper<StandardTreeTemplateBinding> {
}
basic-server/src/main/java/com/ruoyi/basic/mapper/StandardTreeTemplateDeviceMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.ruoyi.basic.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.basic.pojo.StandardTreeTemplateDevice;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/** æ ‡å‡†æ¨¡æ¿é»˜è®¤è®¾å¤‡ Mapper。 */
public interface StandardTreeTemplateDeviceMapper extends BaseMapper<StandardTreeTemplateDevice> {
    List<Integer> selectExistingDeviceIds(@Param("deviceIds") List<Integer> deviceIds);
}
basic-server/src/main/java/com/ruoyi/basic/mapper/StructureItemParameterMapper.java
@@ -25,6 +25,12 @@
    List<TestItemDto> getItemTree();
    int removeNoSample(@Param("sample") String sample);
    /**
     * æŸ¥è¯¢è®¾å¤‡ä¿¡æ¯
     * @param managementNumberList
     * @return
     */
    List<Integer> selectDeviceIdsByNumber(@Param("managementNumberList") List<String> managementNumberList);
}
basic-server/src/main/java/com/ruoyi/basic/pojo/Certification.java
@@ -69,4 +69,8 @@
    @Schema(description = "资质附件地址")
    private String fileUrl;
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
}
basic-server/src/main/java/com/ruoyi/basic/pojo/IfsInventoryQuantity.java
@@ -18,7 +18,7 @@
@ExcelIgnoreUnannotated
public class IfsInventoryQuantity  implements Serializable {
    @TableId(type = IdType.AUTO)
    private Integer id;
    private Long id;
    @Schema(description = "域")
@@ -36,6 +36,12 @@
    @Schema(description = "接收号")
    private Integer receiptNo;
    @Schema(description = "订单类型(01raw:原材料,02wg:外购成品)")
    private String orderType;
    @Schema(description = "物料属性,用于区分铜、铝导体等零件")
    private String materialProp;
    @ExcelProperty(index = 3, value = "零件号")
    @Schema(description = "零件号")
@@ -207,4 +213,7 @@
    // æ˜¯å¦æ˜¯è¿‡æœŸææ–™: 0否, 1:是"
    @Schema(description = "物料类型")
    private Integer isExpire;
    @Schema(description = "是否为拆分订单(1:是,0:否)")
    private Integer isSplitOrder;
}
basic-server/src/main/java/com/ruoyi/basic/pojo/Laboratory.java
@@ -39,11 +39,15 @@
    @Schema(description = "地址")
    private String address;
    @Schema(description = "行业排序")
    private Integer sort;
    @Schema(description = "创建人")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @Schema(description = "创建人")
    @TableField(select = false,exist = false)
    private String createUserName;
    @Schema(description = "修改人id")
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardMethod.java
@@ -7,6 +7,7 @@
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
/**
 * æ ‡å‡†æ–¹æ³•
@@ -26,6 +27,18 @@
    @Schema(description = "检验对象")
    private String structureTestObjectId;
    /** æ ‡å‡†åº“一级行业ID(仅接口交互,不落standard_method表) */
    @TableField(exist = false)
    private List<Integer> industryIds;
    /** å·²ç»‘定行业名称(列表展示) */
    @TableField(exist = false)
    private String industryNames;
    /** é™„件数量(列表展示) */
    @TableField(exist = false)
    private Integer attachmentCount;
    /**
     * æ ‡å‡†ç¼–号
     */
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardMethodAttachment.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@TableName("standard_method_attachment")
public class StandardMethodAttachment {
    @TableId(type = IdType.AUTO)
    private Long id;
    private Integer standardMethodId;
    private String fileName;
    private String fileUrl;
    private Integer sort;
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardMethodIndustry.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@TableName("standard_method_industry")
public class StandardMethodIndustry {
    @TableId(type = IdType.AUTO)
    private Long id;
    private Integer standardMethodId;
    private Integer industryId;
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardMethodList.java
@@ -12,7 +12,6 @@
 * æ ‡å‡†æ ‘下的标准列表
 * @TableName standard_method_list
 */
@TableName(value ="standard_method_list")
@Data
public class StandardMethodList implements Serializable {
    /**
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardProductList.java
@@ -2,8 +2,8 @@
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import tools.jackson.databind.annotation.JsonSerialize;
import tools.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@@ -153,7 +153,7 @@
    @Schema(description = "型号")
    private String model;
    @Schema(description = "型号")
    @Schema(description = "模板id")
    private Integer templateId;
    @Schema(description = "")
@@ -187,6 +187,7 @@
    private String tree;
    @Schema(description = "检验项id")
    private Integer structureItemParameterId;
    @Schema(description = "检验项分类")
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardProductListSupplierAsk.java
@@ -2,8 +2,8 @@
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import tools.jackson.databind.annotation.JsonSerialize;
import tools.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardTemplate.java
@@ -6,6 +6,7 @@
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
@@ -73,4 +74,10 @@
     */
    @Schema(description = "模板编号")
    private String number;
    /**
     * ä»·æ ¼(元)
     */
    @Schema(description = "ä»·æ ¼(元)")
    private BigDecimal price;
}
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardTree.java
@@ -62,6 +62,14 @@
    @Length(max= 255,message="编码长度不能超过255")
    private String model;
    /**
    * æ ‡å‡†æŽ’序
    */
    @Schema(description = "标准排序")
    private Integer sort;
    /** æ ‡å‡†ç»´æŠ¤ID;规范化二级标准使用 */
    private Integer standardMethodId;
    /**
    *
    */
    @Schema(description = "")
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardTreeTemplateBinding.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.time.LocalDateTime;
/** æ ‡å‡†ï¼ˆäºŒçº§èŠ‚ç‚¹ï¼‰ä¸ŽåŽŸå§‹è®°å½•æ¨¡æ¿çš„ç»‘å®šå…³ç³»ã€‚ */
@Data
@TableName("standard_tree_template_binding")
public class StandardTreeTemplateBinding {
    @TableId(type = IdType.AUTO)
    private Integer id;
    private Integer standardTreeId;
    private Integer templateId;
    private Integer sort;
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardTreeTemplateDevice.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.time.LocalDateTime;
/** æ ‡å‡†ä¸‹åŽŸå§‹è®°å½•æ¨¡æ¿ä¸Žé»˜è®¤è®¾å¤‡çš„ç»‘å®šå…³ç³»ã€‚ */
@Data
@TableName("standard_tree_template_device")
public class StandardTreeTemplateDevice {
    @TableId(type = IdType.AUTO)
    private Integer id;
    private Integer standardTreeId;
    private Integer templateId;
    private Integer deviceId;
    private Integer sort;
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}
basic-server/src/main/java/com/ruoyi/basic/pojo/StructureItemParameter.java
@@ -117,5 +117,11 @@
    @Schema(description = "收费标准(元/次)")
    private String rates;
    @Schema(description = "设备id")
    private String deviceIds;
    @Schema(description = "抽检类型, 1:月度, 2:季度, 3:年度")
    private String spotCheckType;
}
basic-server/src/main/java/com/ruoyi/basic/service/StandardMethodListService.java
ÎļþÒÑɾ³ý
basic-server/src/main/java/com/ruoyi/basic/service/StandardMethodService.java
@@ -4,10 +4,14 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.basic.pojo.StandardMethod;
import com.ruoyi.basic.pojo.StandardMethodList;
import com.ruoyi.basic.pojo.StandardMethodAttachment;
import com.ruoyi.basic.pojo.Laboratory;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.List;
import java.util.Map;
/**
* @author Administrator
@@ -20,11 +24,22 @@
    List<StandardMethod> selectStandardMethods();
    int addStandardMethod(StandardMethod standardMethod);
    Integer addStandardMethod(StandardMethod standardMethod);
    int delStandardMethod(Integer id);
    int upStandardMethod(StandardMethod standardMethod);
    void inputExcel(MultipartFile file) throws IOException;
    Map<String, List<?>> selectsStandardMethodByFLSSM(String tree);
    List<StandardMethodList> selectStandardMethodEnum();
    List<StandardMethodAttachment> selectAttachments(Integer standardMethodId);
    StandardMethodAttachment uploadAttachment(Integer standardMethodId, MultipartFile file);
    boolean deleteAttachment(Long id);
    List<Laboratory> selectIndustryOptions();
}
basic-server/src/main/java/com/ruoyi/basic/service/StandardProductListService.java
@@ -1,6 +1,6 @@
package com.ruoyi.basic.service;
import com.alibaba.fastjson2.JSONArray;
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;
@@ -20,11 +20,18 @@
    int upStandardProductList(StandardProductList list);
    int delStandardProduct(JSONArray list);
    List<StandardProductList> selectStandardProductList(InsSampleReceiveDto insSample);
    Map<String, Object> selectStandardProductListByMethodId(Integer id, String tree, Integer page);
    /**
     * æ ¹æ®æ£€éªŒæ ‡å‡†å’Œæ ‡å‡†æ ‘节点生成检验项目,并同步该节点下已保存的项目配置。
     *
     * <p>该方法会删除目标节点(或其子节点)的旧记录后重新批量保存,因此并非只读查询。</p>
     *
     * @param id æ£€éªŒæ ‡å‡† ID
     * @param tree æ ‡å‡†æ ‘路径,使用 {@code " - "} åˆ†éš”层级
     * @return {@code productList} ä¸ºç”ŸæˆåŽçš„æ£€éªŒé¡¹ç›®åˆ—表,{@code total} ä¸ºåˆ—表数量
     */
    Map<String, Object> selectStandardProductListByMethodId(Integer id, String tree, Integer page, String keyword);
    IPage<StandardProductList> selectStandardProductByMethodId(Integer id, String tree, Integer page, String laboratory, String item, String items);
basic-server/src/main/java/com/ruoyi/basic/service/StandardProductListService2.java
ÎļþÒÑɾ³ý
basic-server/src/main/java/com/ruoyi/basic/service/StandardTreeService.java
@@ -1,8 +1,13 @@
package com.ruoyi.basic.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.basic.dto.FactoryDto;
import com.ruoyi.basic.dto.AddStandardTreeNodeDto;
import com.ruoyi.basic.dto.SampleTypeDto;
import com.ruoyi.basic.dto.StandardLibraryTreeNodeDto;
import com.ruoyi.basic.dto.UpdateStandardTreeNodeDto;
import com.ruoyi.basic.dto.StandardTreeTemplateBindingDto;
import com.ruoyi.basic.dto.StandardTreeTemplateBindingVo;
import com.ruoyi.basic.dto.TemplateInspectionItemDto;
import com.ruoyi.basic.pojo.StandardTree;
import org.springframework.web.multipart.MultipartFile;
@@ -16,37 +21,29 @@
*/
public interface StandardTreeService extends IService<StandardTree> {
    List<FactoryDto> selectStandardTreeList();
    List<StandardLibraryTreeNodeDto> selectStandardTreeList();
    int addStandardTree(StandardTree standardTree);
    int addStandardTree(AddStandardTreeNodeDto dto);
    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);
    boolean updateTreeSort(List<StandardLibraryTreeNodeDto> list);
    int updateStandardTree(StandardTree standardTree);
    int updateStandardTree(UpdateStandardTreeNodeDto dto);
    List<StandardTreeTemplateBindingVo> selectTemplateBindings(Integer standardTreeId);
    boolean saveTemplateBindings(StandardTreeTemplateBindingDto dto);
    List<TemplateInspectionItemDto> selectTemplateInspectionItems(Integer standardTreeId);
}
basic-server/src/main/java/com/ruoyi/basic/service/StructureItemParameterService.java
@@ -2,7 +2,15 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.basic.pojo.StructureItemParameter;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
public interface StructureItemParameterService extends IService<StructureItemParameter> {
    void removeNoSample(String sample);
    /**
     * å¯¼å…¥æ£€éªŒé¡¹ç›®
     * @param file
     */
    void importEquipData(MultipartFile file) throws IOException;
}
basic-server/src/main/java/com/ruoyi/basic/service/impl/CapacityScopeServiceImpl.java
@@ -33,8 +33,6 @@
@AllArgsConstructor
public class CapacityScopeServiceImpl extends ServiceImpl<StructureItemParameterMapper, StructureItemParameter> implements CapacityScopeService {
    private LaboratoryMapper laboratoryMapper;
    private StructureItemParameterMapper structureItemParameterMapper;
    private StructureTestObjectMapper structureTestObjectMapper;
@@ -102,12 +100,14 @@
        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));
        if (CollectionUtils.isNotEmpty(productIds)) {
            productPartMapper.delete(Wrappers.<ProductPart>lambdaQuery()
                    .in(ProductPart::getProductId, productIds));
        // åˆ é™¤äº§å“ç»´æŠ¤
        productMapper.delete(Wrappers.<Product>lambdaQuery()
                .in(Product::getId, productIds));
            // åˆ é™¤äº§å“ç»´æŠ¤
            productMapper.delete(Wrappers.<Product>lambdaQuery()
                    .in(Product::getId, productIds));
        }
        return structureTestObjectMapper.deleteById(id);
    }
basic-server/src/main/java/com/ruoyi/basic/service/impl/CertificationServiceImpl.java
@@ -12,7 +12,9 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@Service
@AllArgsConstructor
@@ -26,7 +28,7 @@
    //查询资质明细列表
    @Override
    public IPage<Certification> getCertificationDetail(Page page, Certification certification) {
        return  certificationMapper.getCertificationDetail(page, QueryWrappers.queryWrappers(certification));
        return  certificationMapper.getCertificationDetail(page, certification);
    }
    //添加资质明细列表
@@ -38,7 +40,7 @@
    //删除资质明细列表
    @Override
    public int delCertificationDetail(String ids) {
        List<Integer> list = JSON.parseArray(ids,Integer.class);
        List<Integer> list = Arrays.stream(ids.split(",")).map(Integer::parseInt).collect(Collectors.toList());
        return certificationMapper.deleteBatchIds(list);
    }
basic-server/src/main/java/com/ruoyi/basic/service/impl/LaboratoryServiceImpl.java
@@ -1,14 +1,19 @@
package com.ruoyi.basic.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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.basic.mapper.StructureTestObjectMapper;
import com.ruoyi.basic.pojo.StructureTestObject;
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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@@ -23,6 +28,9 @@
    private LaboratoryMapper laboratoryMapper;
    @Autowired
    private StructureTestObjectMapper structureTestObjectMapper;
    @Override
    public IPage<Laboratory> selectItemParameter(Page page, Laboratory itemParameter) {
        return laboratoryMapper.selectItemParameter(page, QueryWrappers.queryWrappers(itemParameter));
@@ -35,6 +43,13 @@
    @Override
    public int delParameter(Integer id) {
        // åˆ¤æ–­æ˜¯å¦ç»‘定对象
        QueryWrapper<StructureTestObject> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("laboratory_id",id);
        List<StructureTestObject> structureTestObjectList = structureTestObjectMapper.selectList(queryWrapper);
        if(!CollectionUtils.isEmpty(structureTestObjectList)){
            throw new RuntimeException("已绑定对象,禁止删除");
        }
        return laboratoryMapper.deleteById(id);
    }
basic-server/src/main/java/com/ruoyi/basic/service/impl/ProductSupplierDensityServiceImpl.java
@@ -32,15 +32,6 @@
        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);
    }
@@ -49,15 +40,6 @@
        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/StandardMethodListServiceImpl.java
ÎļþÒÑɾ³ý
basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardMethodServiceImpl.java
@@ -7,22 +7,39 @@
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.basic.pojo.StandardMethodList;
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.mapper.StandardMethodIndustryMapper;
import com.ruoyi.basic.mapper.StandardMethodAttachmentMapper;
import com.ruoyi.basic.mapper.LaboratoryMapper;
import com.ruoyi.basic.mapper.StandardTreeMapper;
import com.ruoyi.basic.mapper.StandardTreeTemplateBindingMapper;
import com.ruoyi.basic.pojo.StandardMethod;
import com.ruoyi.basic.pojo.StandardMethodIndustry;
import com.ruoyi.basic.pojo.StandardMethodAttachment;
import com.ruoyi.basic.pojo.Laboratory;
import com.ruoyi.basic.pojo.StandardTree;
import com.ruoyi.basic.pojo.StandardTreeTemplateBinding;
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 com.ruoyi.basic.utils.StandardTreePath;
import com.ruoyi.basic.utils.StandardTreePathParser;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.exception.base.BaseException;
import java.io.File;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.CompletableFuture;
@@ -32,22 +49,63 @@
 * @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;
    private StandardProductListMapper standardProductListMapper;
    private StandardProductListService standardProductListService;
    StructureItemParameterMapper structureItemParameterMapper;
    StructureItemParameterService structureItemParameterService;
    private StructureItemParameterMapper structureItemParameterMapper;
    private StructureItemParameterService structureItemParameterService;
    private StandardMethodIndustryMapper standardMethodIndustryMapper;
    private StandardMethodAttachmentMapper standardMethodAttachmentMapper;
    private LaboratoryMapper laboratoryMapper;
    private StandardTreeMapper standardTreeMapper;
    private StandardTreeTemplateBindingMapper standardTreeTemplateBindingMapper;
    @Value("${file.path}")
    private String filePath;
    @Value("${wordUrl}")
    private String wordUrl;
    /**
     * ä¸šåŠ¡ä¾èµ–ç”±æž„é€ å™¨æ³¨å…¥ï¼›æ–‡ä»¶è·¯å¾„ç”± @Value ä»Žé…ç½®è¯»å–,不能参与 Lombok çš„全参构造器,
     * å¦åˆ™ Spring ä¼šæŠŠ String è¯¯è®¤ä¸ºéœ€è¦æ³¨å…¥çš„ Bean。
     */
    public StandardMethodServiceImpl(StandardMethodMapper standardMethodMapper,
                                     StandardProductListMapper standardProductListMapper,
                                     StandardProductListService standardProductListService,
                                     StructureItemParameterMapper structureItemParameterMapper,
                                     StructureItemParameterService structureItemParameterService,
                                     StandardMethodIndustryMapper standardMethodIndustryMapper,
                                     StandardMethodAttachmentMapper standardMethodAttachmentMapper,
                                     LaboratoryMapper laboratoryMapper,
                                     StandardTreeMapper standardTreeMapper,
                                     StandardTreeTemplateBindingMapper standardTreeTemplateBindingMapper) {
        this.standardMethodMapper = standardMethodMapper;
        this.standardProductListMapper = standardProductListMapper;
        this.standardProductListService = standardProductListService;
        this.structureItemParameterMapper = structureItemParameterMapper;
        this.structureItemParameterService = structureItemParameterService;
        this.standardMethodIndustryMapper = standardMethodIndustryMapper;
        this.standardMethodAttachmentMapper = standardMethodAttachmentMapper;
        this.laboratoryMapper = laboratoryMapper;
        this.standardTreeMapper = standardTreeMapper;
        this.standardTreeTemplateBindingMapper = standardTreeTemplateBindingMapper;
    }
    @Override
    public IPage<StandardMethod> selectStandardMethodList(Page page, StandardMethod standardMethod) {
        return standardMethodMapper.selectStandardMethodList(page, QueryWrappers.queryWrappers(standardMethod));
        IPage<StandardMethod> result = standardMethodMapper.selectStandardMethodList(page, QueryWrappers.queryWrappers(standardMethod));
        for (StandardMethod method : result.getRecords()) {
            method.setIndustryIds(selectIndustryIds(method.getId()));
        }
        return result;
    }
    @Override
@@ -56,25 +114,169 @@
    }
    @Override
    public int addStandardMethod(StandardMethod standardMethod) {
        int insert = standardMethodMapper.insert(standardMethod);
        return insert;
    @Transactional(rollbackFor = Exception.class)
    public Integer addStandardMethod(StandardMethod standardMethod) {
        standardMethod.setStructureTestObjectId(null);
        standardMethodMapper.insert(standardMethod);
        syncIndustries(standardMethod, Collections.<Integer>emptySet());
        return standardMethod.getId();
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int delStandardMethod(Integer id) {
        int i = standardMethodMapper.deleteById(id);
        return i;
        StandardMethod method = standardMethodMapper.selectById(id);
        if (method == null) {
            throw new BaseException("标准不存在");
        }
        for (Integer industryId : selectIndustryIds(id)) {
            removeIndustryTree(method, industryId);
        }
        standardMethodIndustryMapper.delete(Wrappers.<StandardMethodIndustry>lambdaQuery()
                .eq(StandardMethodIndustry::getStandardMethodId, id));
        standardMethodAttachmentMapper.delete(Wrappers.<StandardMethodAttachment>lambdaQuery()
                .eq(StandardMethodAttachment::getStandardMethodId, id));
        return standardMethodMapper.deleteById(id);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int upStandardMethod(StandardMethod standardMethod) {
        StandardMethod oldStandardMethod = standardMethodMapper.selectById(standardMethod.getId());
        if (oldStandardMethod == null) {
            throw new BaseException("标准不存在");
        }
        if (!oldStandardMethod.getCode().equals(standardMethod.getCode())) {
            CompletableFuture.supplyAsync(() -> replaceMethod(oldStandardMethod.getCode(), standardMethod.getCode()));
        }
        int i = standardMethodMapper.updateById(standardMethod);
        syncIndustries(standardMethod, new LinkedHashSet<>(selectIndustryIds(oldStandardMethod.getId())));
        return i;
    }
    private List<Integer> selectIndustryIds(Integer methodId) {
        List<StandardMethodIndustry> list = standardMethodIndustryMapper.selectList(
                Wrappers.<StandardMethodIndustry>lambdaQuery()
                        .eq(StandardMethodIndustry::getStandardMethodId, methodId));
        List<Integer> ids = new ArrayList<>();
        for (StandardMethodIndustry item : list) {
            ids.add(item.getIndustryId());
        }
        return ids;
    }
    private void syncIndustries(StandardMethod method, Set<Integer> oldIds) {
        Set<Integer> newIds = method.getIndustryIds() == null ? new LinkedHashSet<Integer>()
                : new LinkedHashSet<>(method.getIndustryIds());
        for (Integer industryId : newIds) {
            if (industryId == null || laboratoryMapper.selectById(industryId) == null) {
                throw new BaseException("行业不存在");
            }
        }
        for (Integer oldId : oldIds) {
            if (!newIds.contains(oldId)) {
                removeIndustryTree(method, oldId);
                standardMethodIndustryMapper.delete(Wrappers.<StandardMethodIndustry>lambdaQuery()
                        .eq(StandardMethodIndustry::getStandardMethodId, method.getId())
                        .eq(StandardMethodIndustry::getIndustryId, oldId));
            }
        }
        for (Integer industryId : newIds) {
            Laboratory lab = laboratoryMapper.selectById(industryId);
            Long count = standardMethodIndustryMapper.selectCount(Wrappers.<StandardMethodIndustry>lambdaQuery()
                    .eq(StandardMethodIndustry::getStandardMethodId, method.getId())
                    .eq(StandardMethodIndustry::getIndustryId, industryId));
            if (count == 0) {
                StandardMethodIndustry relation = new StandardMethodIndustry();
                relation.setStandardMethodId(method.getId());
                relation.setIndustryId(industryId);
                standardMethodIndustryMapper.insert(relation);
            }
            StandardTree tree = standardTreeMapper.selectOne(Wrappers.<StandardTree>lambdaQuery()
                    .eq(StandardTree::getLaboratory, lab.getLaboratoryName())
                    .eq(StandardTree::getStandardMethodId, method.getId())
                    .isNull(StandardTree::getSampleType).isNull(StandardTree::getModel));
            if (tree == null) {
                tree = new StandardTree();
                tree.setLaboratory(lab.getLaboratoryName());
                tree.setSample(buildLabel(method));
                tree.setStandardMethodId(method.getId());
                tree.setSort(0);
                standardTreeMapper.insert(tree);
            } else if (!buildLabel(method).equals(tree.getSample())) {
                StandardTree update = new StandardTree();
                update.setId(tree.getId());
                update.setSample(buildLabel(method));
                standardTreeMapper.updateById(update);
            }
        }
    }
    private void removeIndustryTree(StandardMethod method, Integer industryId) {
        Laboratory lab = laboratoryMapper.selectById(industryId);
        if (lab == null) return;
        StandardTree tree = standardTreeMapper.selectOne(Wrappers.<StandardTree>lambdaQuery()
                .eq(StandardTree::getLaboratory, lab.getLaboratoryName())
                .eq(StandardTree::getStandardMethodId, method.getId())
                .isNull(StandardTree::getSampleType).isNull(StandardTree::getModel));
        if (tree != null) {
            standardTreeTemplateBindingMapper.delete(Wrappers.<StandardTreeTemplateBinding>lambdaQuery()
                    .eq(StandardTreeTemplateBinding::getStandardTreeId, tree.getId()));
            standardProductListMapper.delete(Wrappers.<StandardProductList>lambdaQuery()
                    .eq(StandardProductList::getLaboratory, lab.getLaboratoryName())
                    .eq(StandardProductList::getSample, tree.getSample())
                    .isNull(StandardProductList::getSampleType).isNull(StandardProductList::getModel));
            standardTreeMapper.deleteById(tree.getId());
        }
    }
    private String buildLabel(StandardMethod method) {
        return method.getCode().trim();
    }
    @Override
    public List<StandardMethodAttachment> selectAttachments(Integer standardMethodId) {
        return standardMethodAttachmentMapper.selectList(Wrappers.<StandardMethodAttachment>lambdaQuery()
                .eq(StandardMethodAttachment::getStandardMethodId, standardMethodId)
                .orderByAsc(StandardMethodAttachment::getSort, StandardMethodAttachment::getId));
    }
    @Override
    public StandardMethodAttachment uploadAttachment(Integer standardMethodId, MultipartFile file) {
        if (standardMethodMapper.selectById(standardMethodId) == null) throw new BaseException("标准不存在");
        if (file == null || file.isEmpty() || file.getSize() > 200L * 1024 * 1024)
            throw new BaseException("附件不能为空且不能超过200MB");
        String originalName = file.getOriginalFilename();
        if (originalName == null || !originalName.matches("(?i).+\\.(jpg|jpeg|png|gif|doc|docx|xls|xlsx|ppt|pptx|pdf|zip|rar)$"))
            throw new BaseException("不支持的附件格式");
        try {
            boolean image = originalName.matches("(?i).+\\.(jpg|jpeg|png|gif)$");
            File directory = new File(image ? filePath : wordUrl);
            if (!directory.exists()) directory.mkdirs();
            String fileUrl = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmssSSS")) + "-" + originalName;
            file.transferTo(new File(directory, fileUrl));
            StandardMethodAttachment attachment = new StandardMethodAttachment();
            attachment.setStandardMethodId(standardMethodId);
            attachment.setFileName(originalName);
            attachment.setFileUrl(fileUrl);
            attachment.setSort(selectAttachments(standardMethodId).size());
            standardMethodAttachmentMapper.insert(attachment);
            return attachment;
        } catch (IOException e) {
            throw new BaseException("附件上传失败");
        }
    }
    @Override
    public boolean deleteAttachment(Long id) {
        return standardMethodAttachmentMapper.deleteById(id) > 0;
    }
    @Override
    public List<Laboratory> selectIndustryOptions() {
        return laboratoryMapper.selectList(Wrappers.<Laboratory>lambdaQuery()
                .select(Laboratory::getId, Laboratory::getLaboratoryName, Laboratory::getSort)
                .orderByAsc(Laboratory::getSort, Laboratory::getId));
    }
    //编辑method后全部替换
@@ -128,26 +330,6 @@
        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) {
@@ -185,76 +367,30 @@
        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));
                        }
                    }
                }
            });
    @Override
    public Map<String, List<?>> selectsStandardMethodByFLSSM(String tree) {
        if (tree == null || tree.trim().isEmpty()) {
            return Collections.emptyMap();
        }
        if (!addList.isEmpty()) {
            // æ–°å¢ž
            baseMapper.insertBatchSomeColumn(addList);
        StandardTreePath path = StandardTreePathParser.parse(tree);
        String industry = path.getIndustry();
        List<StandardMethodList> standardMethodLists = new ArrayList<>(standardMethodMapper.selectStandardMethodListsByIndustry(industry));
        // æŒ‰ ID åŽ»é‡ï¼Œä¿æŒç¨³å®šæŽ’åº
        Map<Integer, StandardMethodList> byId = new LinkedHashMap<>();
        for (StandardMethodList m : standardMethodLists) {
            byId.putIfAbsent(m.getId(), m);
        }
        if (!deleteListId.isEmpty()) {
            // åˆ é™¤
            baseMapper.deleteBatchIds(deleteListId);
        }
        if (!updateList.isEmpty()) {
            // æ›´æ–°
            updateList.forEach(i -> {
                baseMapper.updateById(i);
            });
        }
        Map<String, List<?>> map = new HashMap<>();
        map.put("standardMethodList", new ArrayList<>(byId.values()));
        return map;
    }
}
    @Override
    public List<StandardMethodList> selectStandardMethodEnum() {
        return standardMethodMapper.selectListEnum();
    }
}
basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardProductListService2Impl.java
ÎļþÒÑɾ³ý
basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardProductListServiceImpl.java
@@ -1,7 +1,6 @@
package com.ruoyi.basic.service.impl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.*;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -10,7 +9,6 @@
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;
@@ -18,9 +16,9 @@
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 com.ruoyi.basic.utils.StandardTreePath;
import com.ruoyi.basic.utils.StandardTreePathParser;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -45,8 +43,6 @@
    private StandardTreeMapper standardTreeMapper;
    private StandardProductListService2 standardProductListService2;
    private IfsInventoryQuantityMapper ifsInventoryQuantityMapper;
    private StandardProductListSupplierAskMapper standardProductListSupplierAskMapper;
@@ -57,20 +53,39 @@
        return standardProductListMapper.updateById(list);
    }
    @Override
    public int delStandardProduct(JSONArray list) {
        return standardProductListMapper.deleteBatchIds(list);
    }
    @Override
    public List<StandardProductList> selectStandardProductList(InsSampleReceiveDto insSample) {
        // æ˜¯å¦æ²¡æœ‰äº§å“
        if (insSample == null || insSample.getStandardMethodListId() == null) {
            throw new BaseException("检验标准不能为空");
        }
        // æ–°ç–†æ–°èšä¸¤çº§æ ‘优先按“行业 + æ ‡å‡†â€è§„范路径查询;无法解析时保留历史五级逻辑。
        boolean twoLevelOrder = false;
        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) {
        List<StandardProductList> list = Collections.emptyList();
        if (StringUtils.isNotBlank(insSample.getFactory())) {
            try {
                StandardTreePath path = StandardTreePathParser.parse(insSample.getFactory());
                if (path.getStandard() != null) {
                    String canonicalTree = StandardTreePathParser.canonical(path.getIndustry(), path.getStandard());
                    list = standardProductListMapper.selectDetail2(
                            insSample.getStandardMethodListId(), 1, canonicalTree, insSample.getIsCableTag());
                    insSample.setLaboratory(path.getIndustry());
                    insSample.setSampleType(null);
                    insSample.setSample(path.getStandard());
                    insSample.setModel(null);
                    twoLevelOrder = true;
                }
            } catch (BaseException ignored) {
                // åŽ†å²äº”çº§è·¯å¾„ç»§ç»­èµ°åŽŸæœ‰å…¼å®¹æŸ¥è¯¢ã€‚
            }
        }
        if (!twoLevelOrder) {
            list = standardProductListMapper.selectDetail(insSample.getStandardMethodListId(), 1, model, insSample.getIsCableTag());
        }
        if (!twoLevelOrder && list.size() == 0) {
            if (Objects.equals(insSample.getFactory(), "") || insSample.getFactory() == null) {
                return null;
            }
@@ -92,8 +107,8 @@
                }
            }
        }
        String[] split1 = insSample.getFactory().split(" - ");
        if (!isNoSample) {
        if (!twoLevelOrder && !isNoSample) {
            String[] split1 = insSample.getFactory().split(" - ");
            //判断长度
            if (split1.length > 4) {
                if (ObjectUtils.isNotEmpty(split1[3])) {
@@ -103,9 +118,14 @@
                }
            }
        }
        final boolean currentTwoLevelOrder = twoLevelOrder;
        list = list.stream().filter(a -> {
                    try {
                        if (a.getSection() != null && !Objects.equals(a.getSection(), "")) {
                            // ä¸¤çº§ä¸‹å•不再输入型号,不能因无法计算型号区间而丢弃整个检验项。
                            if (currentTwoLevelOrder && StringUtils.isBlank(modelNum)) {
                                return true;
                            }
                            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); // å¯¼ä½“材质
@@ -139,7 +159,7 @@
                    }
                    return true;
                }).peek(standardProductList -> {
                    // todo: åˆ¤æ–­æ˜¯å¦æ˜¯åŽŸæä¸‹å•, éœ€è¦å•ŠæŠŠé¢œè‰²ç»‘å®šåˆ°è¯•æ ·é¢œè‰²çš„è¦æ±‚å€¼ä¸Š
                    //判断是否是原材下单, éœ€è¦å•ŠæŠŠé¢œè‰²ç»‘å®šåˆ°è¯•æ ·é¢œè‰²çš„è¦æ±‚å€¼ä¸Š
                    if (StringUtils.isNotBlank(insSample.getPartNo())) {
                        // åˆ¤æ–­æ˜¯å¦æœ‰è¿™ä¸ªå­—段且是文本类型
                        if (StringUtils.isNotBlank(standardProductList.getInspectionItem())
@@ -263,243 +283,151 @@
    @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("操作太快,系统传参错误!!!!");
    public Map<String, Object> selectStandardProductListByMethodId(Integer id, String tree, Integer page, String keyword) {
        if (id == null) {
            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]));
        StandardTreePath path = StandardTreePathParser.parse(tree);
        if (path.getStandard() == null) {
            throw new BaseException("请选择标准节点");
        }
        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()
        String canonicalTree = StandardTreePathParser.canonical(path.getIndustry(), path.getStandard());
        List<StandardProductList> generated = standardTreeMapper.selectStandardProductListByIndustry(
                path.getIndustry(), path.getStandard(), canonicalTree);
        List<StandardProductList> saved = standardProductListMapper.selectList(
                Wrappers.<StandardProductList>lambdaQuery()
                        .eq(StandardProductList::getStandardMethodListId, id)
                        .eq(StandardProductList::getTree, tree));
            } else {
                standardProductListMapper.delete(Wrappers.<StandardProductList>lambdaUpdate()
                        .eq(StandardProductList::getStandardMethodListId, id)
                        .like(StandardProductList::getTree, tree));
            }
                        .eq(StandardProductList::getTree, canonicalTree)
                        .orderByAsc(StandardProductList::getSort));
            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());
                    }
                }
        Map<Integer, StandardProductList> savedByParameterId = new HashMap<>();
        for (StandardProductList item : saved) {
            if (item.getStructureItemParameterId() != null) {
                savedByParameterId.put(item.getStructureItemParameterId(), item);
            }
            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;
        Integer userId = SecurityUtils.getUserId().intValue();
        for (StandardProductList item : generated) {
            applySingleRadiusDefault(item);
            StandardProductList old = savedByParameterId.get(item.getStructureItemParameterId());
            if (old != null && sameInspectionItem(old, item)) {
                mergeSavedConfiguration(old, item);
            } else {
                int num1 = extractNumber(field1);
                int num2 = extractNumber(field2);
                return Integer.compare(num1, num2);
                item.setId(IdWorker.getId());
                item.setState(id == 0 ? 1 : 0);
            }
            item.setFactory(null);
            item.setLaboratory(path.getIndustry());
            item.setSampleType(null);
            item.setSample(path.getStandard());
            item.setModel(null);
            item.setTree(canonicalTree);
            item.setCreateUser(userId);
            item.setUpdateUser(userId);
            item.setStandardMethodListId(id);
        }
        standardProductListMapper.delete(Wrappers.<StandardProductList>lambdaQuery()
                .eq(StandardProductList::getStandardMethodListId, id)
                .eq(StandardProductList::getTree, canonicalTree));
        if (CollectionUtils.isNotEmpty(generated)) {
            baseMapper.saveBatchProductLists(generated);
        }
        generated.sort((left, right) -> {
            int leftSort = left.getSort() == null ? Integer.MAX_VALUE : left.getSort();
            int rightSort = right.getSort() == null ? Integer.MAX_VALUE : right.getSort();
            if (leftSort != rightSort) {
                return Integer.compare(leftSort, rightSort);
            }
            return compareManHourGroup(left.getManHourGroup(), right.getManHourGroup());
        });
          // æŒ‰ç…§ç´¢å¼•排序
        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());
        String search = keyword == null ? "" : keyword.trim().toLowerCase(Locale.ROOT);
        List<StandardProductList> filtered = generated.stream()
                .filter(item -> search.isEmpty()
                        || containsIgnoreCase(item.getInspectionItem(), search)
                        || containsIgnoreCase(item.getInspectionItemSubclass(), search))
                .collect(Collectors.toList());
        int total = filtered.size();
        int currentPage = page == null || page < 1 ? 1 : page;
        int fromIndex = Math.min((currentPage - 1) * 100, total);
        int toIndex = Math.min(fromIndex + 100, total);
        Map<String, Object> map = new HashMap<>();
        map.put("productList", new ArrayList<>(filtered.subList(fromIndex, toIndex)));
        map.put("total", total);
        return map;
    }
    private int extractNumber(String s) {
        // ä»Žå­—符串中提取数字的逻辑,这里假设字段的格式是 "text<number>"
        String number = s;
        if (!s.matches("\\d+")) {
            number = s.replaceAll("\\D", "");
    private boolean sameInspectionItem(StandardProductList left, StandardProductList right) {
        return Objects.equals(left.getInspectionItem(), right.getInspectionItem())
                && Objects.equals(defaultString(left.getInspectionItemSubclass()), defaultString(right.getInspectionItemSubclass()));
    }
    private void applySingleRadiusDefault(StandardProductList item) {
        String radiusList = item.getRadiusList();
        if (StringUtils.isBlank(radiusList) || "null".equals(radiusList) || "\"\"".equals(radiusList)) {
            return;
        }
        return Integer.parseInt(number);
        try {
            List<String> values = JSON.parseArray(radiusList, String.class);
            if (values != null && values.size() == 1) {
                item.setRadius(values.get(0));
            }
        } catch (Exception ignored) {
            // åŽ†å²è„æ•°æ®ä¸å½±å“æ£€éªŒé¡¹åˆ—è¡¨ç”Ÿæˆã€‚
        }
    }
    private void mergeSavedConfiguration(StandardProductList old, StandardProductList target) {
        target.setId(old.getId());
        target.setSort(old.getSort());
        target.setState(old.getState() == null ? 0 : old.getState());
        if (StringUtils.isNotBlank(old.getMethodS())) {
            target.setMethodS(old.getMethodS());
            target.setMethod(old.getMethodS());
        }
        if (StringUtils.isNotBlank(old.getRadius())) target.setRadius(old.getRadius());
        if (StringUtils.isNotBlank(old.getRates())) target.setRates(old.getRates());
        if (StringUtils.isNotBlank(old.getAsk())) target.setAsk(old.getAsk());
        if (StringUtils.isNotBlank(old.getTell())) target.setTell(old.getTell());
        if (StringUtils.isNotBlank(old.getPrice())) target.setPrice(old.getPrice());
        if (StringUtils.isNotBlank(old.getManHour())) target.setManHour(old.getManHour());
        if (StringUtils.isNotBlank(old.getSection())) target.setSection(old.getSection());
        if (StringUtils.isNotBlank(old.getCores())) target.setCores(old.getCores());
        if (StringUtils.isNotBlank(old.getConductorMaterial())) target.setConductorMaterial(old.getConductorMaterial());
        if (StringUtils.isNotBlank(old.getConductorType())) target.setConductorType(old.getConductorType());
        if (old.getTemplateId() != null) target.setTemplateId(old.getTemplateId());
    }
    private int compareManHourGroup(String left, String right) {
        boolean leftEmpty = StringUtils.isBlank(left);
        boolean rightEmpty = StringUtils.isBlank(right);
        if (leftEmpty && rightEmpty) return 0;
        if (leftEmpty) return 1;
        if (rightEmpty) return -1;
        return Integer.compare(extractNumber(left), extractNumber(right));
    }
    private boolean containsIgnoreCase(String value, String search) {
        return value != null && value.toLowerCase(Locale.ROOT).contains(search);
    }
    private String defaultString(String value) {
        return value == null ? "" : value;
    }
    private int extractNumber(String s) {
        String number = s == null ? "" : s.replaceAll("\\D", "");
        if (number.isEmpty()) {
            return Integer.MAX_VALUE;
        }
        try {
            return Integer.parseInt(number);
        } catch (NumberFormatException ignored) {
            return Integer.MAX_VALUE;
        }
    }
    @Override
@@ -583,7 +511,7 @@
    @Override
    public void resetTreeDragBatch(List<StandardProductList> standardProductLists) {
        standardProductListService2.updateBatchById(standardProductLists);
        this.updateBatchById(standardProductLists);
    }
    /**
basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardTemplateServiceImpl.java
@@ -6,11 +6,14 @@
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.mapper.StandardTreeTemplateBindingMapper;
import com.ruoyi.basic.pojo.StandardTemplate;
import com.ruoyi.basic.pojo.StandardTreeTemplateBinding;
import com.ruoyi.basic.service.StandardTemplateService;
import com.ruoyi.common.numgen.NumberGenerator;
import com.ruoyi.common.utils.GZipUtil;
import com.ruoyi.common.utils.QueryWrappers;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
@@ -29,6 +32,8 @@
    private StandardTemplateMapper standardTemplateMapper;
    private StandardTreeTemplateBindingMapper standardTreeTemplateBindingMapper;
    private final NumberGenerator<StandardTemplate> numberGenerator;
@@ -45,12 +50,25 @@
                    StandardTemplate::getNumber);
            standardTemplate.setNumber(giveCode);
        }
        if (standardTemplate.getPrice() == null) {
            standardTemplate.setPrice(java.math.BigDecimal.ZERO);
        }
        if (StringUtils.isNotBlank(standardTemplate.getThing())) {
            standardTemplate.setThing(GZipUtil.compress(standardTemplate.getThing()));
        } else {
            standardTemplate.setThing(null);
        }
        return standardTemplateMapper.insert(standardTemplate);
    }
    @Override
    public int upStandardTemplate(StandardTemplate standardTemplate) {
        if(standardTemplate.getThing().equals("")){
        if (standardTemplate.getPrice() == null) {
            standardTemplate.setPrice(java.math.BigDecimal.ZERO);
        }
        if (StringUtils.isNotBlank(standardTemplate.getThing())) {
            standardTemplate.setThing(GZipUtil.compress(standardTemplate.getThing()));
        } else {
            standardTemplate.setThing(null);
        }
        return standardTemplateMapper.updateById(standardTemplate);
@@ -58,12 +76,23 @@
    @Override
    public int delStandardTemplate(Integer id) {
        // åˆ¤æ–­æ˜¯å¦è¢«ç»‘定
        int count = standardTemplateMapper.countBindTemplateItemParameter(id);
        if (count > 0) {
            throw new RuntimeException("该模板已绑定检验项目参数,禁止删除");
        }
        Long bindingCount = standardTreeTemplateBindingMapper.selectCount(Wrappers.<StandardTreeTemplateBinding>lambdaQuery()
                .eq(StandardTreeTemplateBinding::getTemplateId, id));
        if (bindingCount > 0) {
            throw new RuntimeException("该模板已绑定标准库,禁止删除");
        }
        return standardTemplateMapper.deleteById(id);
    }
    @Override
    public List<StandardTemplate> getStandardTemplate() {
        return standardTemplateMapper.selectList(Wrappers.<StandardTemplate>lambdaQuery().select(StandardTemplate::getId,StandardTemplate::getName));
        return standardTemplateMapper.selectList(Wrappers.<StandardTemplate>lambdaQuery()
                .select(StandardTemplate::getId, StandardTemplate::getName, StandardTemplate::getNumber, StandardTemplate::getRemark));
    }
    @Override
@@ -74,19 +103,8 @@
        if(standardTemplate==null){
            return null;
        }else{
            return standardTemplate.getThing();
            return GZipUtil.uncompress(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
@@ -116,6 +134,9 @@
        // æŸ¥è¯¢æ—§æ¨¡æ¿
        StandardTemplate standardTemplate = baseMapper.selectById(newTemplate.getId());
        newTemplate.setThing(standardTemplate.getThing());
        if (newTemplate.getPrice() == null) {
            newTemplate.setPrice(java.math.BigDecimal.ZERO);
        }
        if (StringUtils.isBlank(newTemplate.getNumber())) {
            String giveCode = numberGenerator.generateNumberWithPrefix(5,
basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardTreeServiceImpl.java
@@ -1,38 +1,53 @@
package com.ruoyi.basic.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.poi.excel.ExcelUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson.JSON;
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.AddStandardTreeNodeDto;
import com.ruoyi.basic.dto.SampleTypeDto;
import com.ruoyi.basic.dto.StandardLibraryTreeNodeDto;
import com.ruoyi.basic.dto.StandardLibraryTreeRowDto;
import com.ruoyi.basic.dto.UpdateStandardTreeNodeDto;
import com.ruoyi.basic.dto.StandardTreeTemplateBindingDto;
import com.ruoyi.basic.dto.StandardTreeTemplateBindingVo;
import com.ruoyi.basic.dto.TemplateBindingItemDto;
import com.ruoyi.basic.dto.TemplateInspectionItemDto;
import com.ruoyi.basic.mapper.LaboratoryMapper;
import com.ruoyi.basic.mapper.StandardProductListMapper;
import com.ruoyi.basic.mapper.StandardTreeMapper;
import com.ruoyi.basic.mapper.StandardTreeTemplateBindingMapper;
import com.ruoyi.basic.mapper.StandardTreeTemplateDeviceMapper;
import com.ruoyi.basic.mapper.StructureItemParameterMapper;
import com.ruoyi.basic.mapper.StructureTestObjectMapper;
import com.ruoyi.basic.pojo.Laboratory;
import com.ruoyi.basic.pojo.StandardProductList;
import com.ruoyi.basic.pojo.StandardTemplate;
import com.ruoyi.basic.pojo.StandardTree;
import com.ruoyi.basic.pojo.StandardTemplate;
import com.ruoyi.basic.pojo.StandardTreeTemplateBinding;
import com.ruoyi.basic.pojo.StandardTreeTemplateDevice;
import com.ruoyi.basic.pojo.StructureItemParameter;
import com.ruoyi.basic.pojo.StructureTestObject;
import com.ruoyi.basic.service.*;
import com.ruoyi.basic.service.StandardTreeService;
import com.ruoyi.basic.service.StandardTemplateService;
import com.ruoyi.basic.utils.StandardTreePath;
import com.ruoyi.basic.utils.StandardTreePathParser;
import com.ruoyi.basic.utils.StandardTemplateInspectionItemParser;
import com.ruoyi.common.exception.base.BaseException;
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.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
import java.util.Objects;
import java.util.HashSet;
import java.util.Comparator;
import java.util.Set;
import java.util.stream.Collectors;
/**
 * @author Administrator
@@ -47,110 +62,161 @@
    private StandardTreeMapper standardTreeMapper;
    private StandardMethodListService standardMethodListService;
    private StandardProductListMapper standardProductListMapper;
    private StandardProductListService standardProductListService;
    private StructureItemParameterMapper structureItemParameterMapper;
    private StructureTestObjectMapper structureTestObjectMapper;
    private LaboratoryMapper laboratoryMapper;
    private StandardTreeTemplateBindingMapper standardTreeTemplateBindingMapper;
    private StandardTreeTemplateDeviceMapper standardTreeTemplateDeviceMapper;
    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()));
//                    }
                }
    public List<StandardLibraryTreeNodeDto> selectStandardTreeList() {
        List<StandardLibraryTreeRowDto> rows = standardTreeMapper.selectStandardLibraryTree();
        List<StandardLibraryTreeNodeDto> industries = new ArrayList<>();
        Map<Integer, StandardLibraryTreeNodeDto> industryMap = new LinkedHashMap<>();
        for (StandardLibraryTreeRowDto row : rows) {
            StandardLibraryTreeNodeDto industry = industryMap.get(row.getIndustryId());
            if (industry == null) {
                industry = new StandardLibraryTreeNodeDto();
                industry.setId(row.getIndustryId());
                industry.setLabel(row.getIndustryName());
                industry.setValue(row.getIndustryName());
                industry.setCode("[1]");
                industry.setChildren(new ArrayList<>());
                industryMap.put(row.getIndustryId(), industry);
                industries.add(industry);
            }
            if (row.getStandardId() != null) {
                StandardLibraryTreeNodeDto standard = new StandardLibraryTreeNodeDto();
                standard.setId(row.getStandardId());
                standard.setLabel(row.getStandardCode());
                standard.setValue(row.getStandardLabel());
                standard.setCode("[2]");
                standard.setSampleEn(row.getStandardNameEn());
                standard.setStandardMethodId(row.getStandardMethodId());
                standard.setStandardCode(row.getStandardCode());
                standard.setStandardName(row.getStandardName());
                standard.setChildren(null);
                industry.getChildren().add(standard);
            }
        }
        return factoryDtos;
        return industries;
    }
    @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());
    public int addStandardTree(AddStandardTreeNodeDto dto) {
        if (dto == null) {
            throw new BaseException("标准树路径格式错误");
        }
        StandardTree tree = standardTreeMapper.selectOne(wrapper);
        if (tree != null) {
            throw new BaseException("该型号已存在");
        String name = StandardTreePathParser.normalizeNodeName(dto.getName());
        if (StringUtils.isBlank(dto.getParentTree())) {
            // æ–°å¢žè¡Œä¸šèŠ‚ç‚¹
            Long count = laboratoryMapper.selectCount(Wrappers.<Laboratory>lambdaQuery()
                    .eq(Laboratory::getLaboratoryName, name));
            if (count > 0) {
                throw new BaseException("行业名称已存在");
            }
            Laboratory laboratory = new Laboratory();
            laboratory.setLaboratoryName(name);
            laboratory.setSort(0);
            return laboratoryMapper.insert(laboratory);
        }
        return standardTreeMapper.insert(standardTree);
        throw new BaseException("二级标准请在“标准维护”中通过行业绑定进行维护");
        /*
        // åœ¨è¡Œä¸šä¸‹æ–°å¢žæ ‡å‡†èŠ‚ç‚¹
        StandardTreePath path = StandardTreePathParser.parse(dto.getParentTree());
        if (path.getStandard() != null) {
            throw new BaseException("标准节点下不能继续新增");
        }
        String industry = path.getIndustry();
        Long labCount = laboratoryMapper.selectCount(Wrappers.<Laboratory>lambdaQuery()
                .eq(Laboratory::getLaboratoryName, industry));
        if (labCount == 0) {
            throw new BaseException("行业不存在");
        }
        Long stdCount = standardTreeMapper.selectCount(Wrappers.<StandardTree>lambdaQuery()
                .eq(StandardTree::getLaboratory, industry)
                .eq(StandardTree::getSample, name)
                .isNull(StandardTree::getSampleType)
                .isNull(StandardTree::getModel));
        if (stdCount > 0) {
            throw new BaseException("该行业下标准名称已存在");
        }
        StandardTree tree = new StandardTree();
        tree.setLaboratory(industry);
        tree.setSample(name);
        tree.setFactory(null);
        tree.setSampleType(null);
        tree.setModel(null);
        tree.setSort(0);
        return standardTreeMapper.insert(tree);
        */
    }
    @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;*/
        StandardTreePath path = StandardTreePathParser.parse(tree);
        String industry = path.getIndustry();
        String standard = path.getStandard();
        if (standard != null) {
            throw new BaseException("二级标准请在“标准维护”中通过行业绑定进行维护");
        }
        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) {
        if (standard == null) {
            // åˆ é™¤è¡Œä¸šï¼šè¡Œä¸šä¸‹ä»æœ‰æ ‡å‡†æ—¶æ‹’绝删除
            Long count = standardTreeMapper.selectCount(Wrappers.<StandardTree>lambdaQuery()
                    .eq(StandardTree::getLaboratory, industry)
                    .isNull(StandardTree::getSampleType)
                    .isNull(StandardTree::getModel));
            if (count > 0) {
                throw new BaseException("该行业下仍有标准,请先删除标准");
            }
            try {
                standardProductList.setSampleType(trees[2]);
            } catch (Exception e) {
            Laboratory laboratory = laboratoryMapper.selectOne(Wrappers.<Laboratory>lambdaQuery()
                    .eq(Laboratory::getLaboratoryName, industry));
            if (laboratory == null) {
                throw new BaseException("行业不存在");
            }
            try {
                standardProductList.setSample(trees[3]);
            } catch (Exception e) {
            Long objectCount = structureTestObjectMapper.selectCount(Wrappers.<StructureTestObject>lambdaQuery()
                    .eq(StructureTestObject::getLaboratoryId, laboratory.getId()));
            if (objectCount > 0) {
                throw new BaseException("该行业已绑定检测对象,禁止删除");
            }
            try {
                standardProductList.setModel(trees[4]);
            } catch (Exception e) {
            int deleted = laboratoryMapper.delete(Wrappers.<Laboratory>lambdaQuery()
                    .eq(Laboratory::getLaboratoryName, industry));
            if (deleted == 0) {
                throw new BaseException("行业不存在");
            }
            standardProductListMapper.insert(standardProductList);
            return deleted;
        }
        // åˆ é™¤æ ‡å‡†åŠå…¶æ ‡å‡†åº“配置(不可达,保留历史实现说明)
        StandardTree standardTree = standardTreeMapper.selectOne(Wrappers.<StandardTree>lambdaQuery()
                .eq(StandardTree::getLaboratory, industry)
                .eq(StandardTree::getSample, standard)
                .isNull(StandardTree::getSampleType)
                .isNull(StandardTree::getModel));
        if (standardTree == null) {
            throw new BaseException("标准不存在");
        }
        standardTreeTemplateBindingMapper.delete(Wrappers.<StandardTreeTemplateBinding>lambdaQuery()
                .eq(StandardTreeTemplateBinding::getStandardTreeId, standardTree.getId()));
        standardTreeTemplateDeviceMapper.delete(Wrappers.<StandardTreeTemplateDevice>lambdaQuery()
                .eq(StandardTreeTemplateDevice::getStandardTreeId, standardTree.getId()));
        standardTreeMapper.deleteById(standardTree.getId());
        standardProductListMapper.delete(Wrappers.<StandardProductList>lambdaQuery()
                .eq(StandardProductList::getLaboratory, industry)
                .eq(StandardProductList::getSample, standard)
                .isNull(StandardProductList::getSampleType)
                .isNull(StandardProductList::getModel));
        return 1;
    }
@@ -162,7 +228,7 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int upStandardProducts(Map<String, Object> product) {
        List<Integer> ids = JSON.parseArray(product.get("ids") + "", Integer.class);
        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()));
@@ -177,359 +243,262 @@
    }
    @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) + "");
                }
    public boolean updateTreeSort(List<StandardLibraryTreeNodeDto> list) {
        List<StandardTree> trees = new ArrayList<>();
        int industrySort = 0;
        for (StandardLibraryTreeNodeDto industry : list) {
            Laboratory lab = new Laboratory();
            lab.setId(industry.getId());
            lab.setSort(industrySort);
            laboratoryMapper.updateById(lab);
            industrySort++;
                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++;
            List<StandardLibraryTreeNodeDto> children = industry.getChildren();
            if (children != null) {
                int standardSort = 0;
                for (StandardLibraryTreeNodeDto standard : children) {
                    StandardTree tree = new StandardTree();
                    tree.setId(standard.getId());
                    tree.setSort(standardSort);
                    trees.add(tree);
                    standardSort++;
                }
            }
        }
        structureTestObjectService.updateBatchById(testObjects);
        if (!trees.isEmpty()) {
            this.updateBatchById(trees);
        }
        return true;
    }
    /**
     * ä¿®æ”¹æ ‡å‡†æ•°
     * @param standardTree
     * @return
     * ä¿®æ”¹æ ‡å‡†æ ‘节点名
     */
    @Override
    public int updateStandardTree(StandardTree standardTree) {
        // ä¿®æ”¹åç§°åŒ¹é…çš„æ ‡å‡†æ ‘下的检验项目
        // æŸ¥è¯¢æ‰€æœ‰å¯¹è±¡+名称的树
    @Transactional(rollbackFor = Exception.class)
    public int updateStandardTree(UpdateStandardTreeNodeDto dto) {
        if (dto == null) {
            throw new BaseException("标准树路径格式错误");
        }
        String name = StandardTreePathParser.normalizeNodeName(dto.getName());
        String oldLabel = StandardTreePathParser.normalizeNodeName(dto.getOldLabel());
        if (StringUtils.isBlank(dto.getParentTree())) {
            return updateIndustry(oldLabel, name);
        }
        throw new BaseException("二级标准请在“标准维护”中通过行业绑定进行维护");
    }
        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);
    private int updateIndustry(String oldName, String newName) {
        if (Objects.equals(oldName, newName)) {
            return ensureIndustryExists(oldName);
        }
        Long count = laboratoryMapper.selectCount(Wrappers.<Laboratory>lambdaQuery()
                .eq(Laboratory::getLaboratoryName, newName));
        if (count > 0) {
            throw new BaseException("行业名称已存在");
        }
        Laboratory old = laboratoryMapper.selectOne(Wrappers.<Laboratory>lambdaQuery()
                .eq(Laboratory::getLaboratoryName, oldName));
        if (old == null) {
            throw new BaseException("行业不存在");
        }
        Laboratory update = new Laboratory();
        update.setId(old.getId());
        update.setLaboratoryName(newName);
        if (laboratoryMapper.updateById(update) == 0) {
            throw new BaseException("行业不存在");
        }
        // çº§è”标准树规范化记录
        standardTreeMapper.update(null, Wrappers.<StandardTree>lambdaUpdate()
                .eq(StandardTree::getLaboratory, oldName)
                .isNull(StandardTree::getSampleType)
                .isNull(StandardTree::getModel)
                .set(StandardTree::getLaboratory, newName));
        // çº§è”标准库配置
        standardTreeMapper.updateProductListIndustry(oldName, newName);
        // çº§è”基础检验项
        structureItemParameterMapper.update(null, Wrappers.<StructureItemParameter>lambdaUpdate()
                .eq(StructureItemParameter::getLaboratory, oldName)
                .set(StructureItemParameter::getLaboratory, newName));
        // çº§è”未完成订单
        standardTreeMapper.updateInsOrderIndustry(oldName, newName);
        standardTreeMapper.updateInsSampleIndustry(oldName, newName);
        standardTreeMapper.updateInsProductIndustry(oldName, newName);
        return 1;
    }
    private int updateStandard(String industry, String oldName, String newName) {
        if (Objects.equals(oldName, newName)) {
            return ensureStandardExists(industry, oldName);
        }
        Long count = standardTreeMapper.selectCount(Wrappers.<StandardTree>lambdaQuery()
                .eq(StandardTree::getLaboratory, industry)
                .eq(StandardTree::getSample, newName)
                .isNull(StandardTree::getSampleType)
                .isNull(StandardTree::getModel));
        if (count > 0) {
            throw new BaseException("该行业下标准名称已存在");
        }
        StandardTree old = standardTreeMapper.selectOne(Wrappers.<StandardTree>lambdaQuery()
                .eq(StandardTree::getLaboratory, industry)
                .eq(StandardTree::getSample, oldName)
                .isNull(StandardTree::getSampleType)
                .isNull(StandardTree::getModel));
        if (old == null) {
            throw new BaseException("标准不存在");
        }
        StandardTree update = new StandardTree();
        update.setId(old.getId());
        update.setSample(newName);
        if (standardTreeMapper.updateById(update) == 0) {
            throw new BaseException("标准不存在");
        }
        // çº§è”标准库配置
        standardTreeMapper.updateProductListStandard(industry, oldName, newName);
        // çº§è”未完成订单
        standardTreeMapper.updateInsOrderStandard(industry, oldName, newName);
        standardTreeMapper.updateInsSampleStandard(industry, oldName, newName);
        standardTreeMapper.updateInsProductStandard(industry, oldName, newName);
        return 1;
    }
    private int ensureIndustryExists(String industry) {
        Long count = laboratoryMapper.selectCount(Wrappers.<Laboratory>lambdaQuery()
                .eq(Laboratory::getLaboratoryName, industry));
        if (count == 0) {
            throw new BaseException("行业不存在");
        }
        return 1;
    }
    private int ensureStandardExists(String industry, String standard) {
        Long count = standardTreeMapper.selectCount(Wrappers.<StandardTree>lambdaQuery()
                .eq(StandardTree::getLaboratory, industry)
                .eq(StandardTree::getSample, standard)
                .isNull(StandardTree::getSampleType)
                .isNull(StandardTree::getModel));
        if (count == 0) {
            throw new BaseException("标准不存在");
        }
        return 1;
    }
    @Override
    public List<StandardTreeTemplateBindingVo> selectTemplateBindings(Integer standardTreeId) {
        ensureTwoLevelStandard(standardTreeId);
        List<StandardTreeTemplateBinding> bindings = standardTreeTemplateBindingMapper.selectList(
                Wrappers.<StandardTreeTemplateBinding>lambdaQuery()
                        .eq(StandardTreeTemplateBinding::getStandardTreeId, standardTreeId)
                        .orderByAsc(StandardTreeTemplateBinding::getSort, StandardTreeTemplateBinding::getId));
        Map<Integer, List<Integer>> deviceIdsByTemplate = standardTreeTemplateDeviceMapper.selectList(
                        Wrappers.<StandardTreeTemplateDevice>lambdaQuery()
                                .eq(StandardTreeTemplateDevice::getStandardTreeId, standardTreeId)
                                .orderByAsc(StandardTreeTemplateDevice::getSort,
                                        StandardTreeTemplateDevice::getId))
                .stream().collect(Collectors.groupingBy(
                        StandardTreeTemplateDevice::getTemplateId,
                        LinkedHashMap::new,
                        Collectors.mapping(StandardTreeTemplateDevice::getDeviceId, Collectors.toList())));
        List<StandardTreeTemplateBindingVo> result = new ArrayList<>();
        for (StandardTreeTemplateBinding binding : bindings) {
            StandardTemplate template = standardTemplateService.getById(binding.getTemplateId());
            if (template == null) {
                continue;
            }
            standardProductListService.updateBatchById(standardProductLists);
            StandardTreeTemplateBindingVo vo = new StandardTreeTemplateBindingVo();
            vo.setTemplateId(template.getId());
            vo.setName(template.getName());
            vo.setNumber(template.getNumber());
            vo.setRemark(template.getRemark());
            vo.setSort(binding.getSort());
            vo.setDeviceIds(deviceIdsByTemplate.getOrDefault(template.getId(), new ArrayList<>()));
            result.add(vo);
        }
        return result;
    }
        // ä¿®æ”¹æ ‡å‡†æ•°æ£€éªŒé¡¹ç›®
        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());
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean saveTemplateBindings(StandardTreeTemplateBindingDto dto) {
        if (dto == null || dto.getStandardTreeId() == null) {
            throw new BaseException("标准不能为空");
        }
        return standardTreeMapper.update(null, wrapper);
        ensureTwoLevelStandard(dto.getStandardTreeId());
        List<TemplateBindingItemDto> templates = dto.getTemplates() == null ? new ArrayList<>() : dto.getTemplates();
        Set<Integer> templateIds = new HashSet<>();
        Set<Integer> allDeviceIds = new HashSet<>();
        List<StandardTreeTemplateBinding> bindings = new ArrayList<>();
        int index = 0;
        for (TemplateBindingItemDto item : templates) {
            if (item == null || item.getTemplateId() == null || !templateIds.add(item.getTemplateId())) {
                throw new BaseException("原始记录模板不能重复绑定");
            }
            StandardTemplate template = standardTemplateService.getById(item.getTemplateId());
            if (template == null) {
                throw new BaseException("原始记录模板不存在");
            }
            StandardTreeTemplateBinding binding = new StandardTreeTemplateBinding();
            binding.setStandardTreeId(dto.getStandardTreeId());
            binding.setTemplateId(item.getTemplateId());
            binding.setSort(item.getSort() == null ? index : item.getSort());
            bindings.add(binding);
            if (item.getDeviceIds() != null) {
                allDeviceIds.addAll(item.getDeviceIds().stream()
                        .filter(Objects::nonNull).collect(Collectors.toSet()));
            }
            index++;
        }
        if (!allDeviceIds.isEmpty()) {
            List<Integer> requestedDeviceIds = new ArrayList<>(allDeviceIds);
            if (standardTreeTemplateDeviceMapper.selectExistingDeviceIds(requestedDeviceIds).size()
                    != requestedDeviceIds.size()) {
                throw new BaseException("所选设备不存在,请刷新设备列表后重试");
            }
        }
        standardTreeTemplateDeviceMapper.delete(Wrappers.<StandardTreeTemplateDevice>lambdaQuery()
                .eq(StandardTreeTemplateDevice::getStandardTreeId, dto.getStandardTreeId()));
        standardTreeTemplateBindingMapper.delete(Wrappers.<StandardTreeTemplateBinding>lambdaQuery()
                .eq(StandardTreeTemplateBinding::getStandardTreeId, dto.getStandardTreeId()));
        for (int bindingIndex = 0; bindingIndex < bindings.size(); bindingIndex++) {
            StandardTreeTemplateBinding binding = bindings.get(bindingIndex);
            standardTreeTemplateBindingMapper.insert(binding);
            TemplateBindingItemDto item = templates.get(bindingIndex);
            List<Integer> deviceIds = item.getDeviceIds() == null ? new ArrayList<>()
                    : item.getDeviceIds().stream().filter(Objects::nonNull).distinct()
                            .collect(Collectors.toList());
            for (int deviceIndex = 0; deviceIndex < deviceIds.size(); deviceIndex++) {
                StandardTreeTemplateDevice relation = new StandardTreeTemplateDevice();
                relation.setStandardTreeId(dto.getStandardTreeId());
                relation.setTemplateId(item.getTemplateId());
                relation.setDeviceId(deviceIds.get(deviceIndex));
                relation.setSort(deviceIndex);
                standardTreeTemplateDeviceMapper.insert(relation);
            }
        }
        return true;
    }
    @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));
    public List<TemplateInspectionItemDto> selectTemplateInspectionItems(Integer standardTreeId) {
        List<StandardTreeTemplateBindingVo> bindings = selectTemplateBindings(standardTreeId);
        List<TemplateInspectionItemDto> result = new ArrayList<>();
        for (StandardTreeTemplateBindingVo binding : bindings) {
            List<TemplateInspectionItemDto> items = StandardTemplateInspectionItemParser.parse(binding.getTemplateId(),
                    binding.getSort(), standardTemplateService.getStandTempThingById(binding.getTemplateId()));
            result.addAll(items);
        }
        result.sort(Comparator.comparing(TemplateInspectionItemDto::getTemplateSort)
                .thenComparing(TemplateInspectionItemDto::getTemplateRowIndex));
        return result;
    }
    @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));
    private StandardTree ensureTwoLevelStandard(Integer standardTreeId) {
        StandardTree standardTree = this.getById(standardTreeId);
        if (standardTree == null || StringUtils.isBlank(standardTree.getSample())
                || standardTree.getSampleType() != null || standardTree.getModel() != null) {
            throw new BaseException("请选择标准库二级标准");
        }
        return standardTree;
    }
    @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
@@ -1,14 +1,34 @@
package com.ruoyi.basic.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.poi.excel.ExcelUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.mapper.StructureItemParameterMapper;
import com.ruoyi.basic.pojo.StandardTemplate;
import com.ruoyi.basic.pojo.StructureItemParameter;
import com.ruoyi.basic.service.StandardTemplateService;
import com.ruoyi.basic.service.StructureItemParameterService;
import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.system.service.ISysDictTypeService;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import jakarta.annotation.Resource;
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;
@Service
@AllArgsConstructor
@@ -16,9 +36,261 @@
    @Resource
    private StructureItemParameterMapper structureItemParameterMapper;
    @Resource
    private ISysDictTypeService dictTypeService;
    @Resource
    private StandardTemplateService standardTemplateService;
    /**
     *
     * @param file
     */
    @Override
    public void removeNoSample(String sample) {
        structureItemParameterMapper.removeNoSample("\""+sample+"\"");
    public void importEquipData(MultipartFile file) throws IOException {
        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 = this.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";
                    // ç»‘定设备
                    if (list1.get(28) == null) {
                        str.setRates(null);
                    } else {
                        // æŸ¥è¯¢è®¾å¤‡ä¿¡æ¯
                        List<String> managementNumberList = StrUtil.split(list1.get(28).toString(), ';');
                        if (CollectionUtils.isNotEmpty(managementNumberList)) {
                            List<Integer> deviceIds = structureItemParameterMapper.selectDeviceIdsByNumber(managementNumberList);
                            if (CollectionUtils.isNotEmpty(deviceIds)) {
                                str.setDeviceIds(CollUtil.join(deviceIds, ","));
                            }
                        }
                    }
                }
                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) + "");
                }
                // æŠ½æ ·ç±»åž‹
                if (list1.get(27) != null){
                    String spotCheckType = list1.get(27).toString();
                    if (ObjectUtils.isNotEmpty(spotCheckType)) {
                        List<SysDictData> enums = dictTypeService.selectDictDataByName("抽检类型")
                                .stream().filter(sysDictData -> sysDictData.getDictLabel().equals(spotCheckType)).collect(Collectors.toList());
                        str.setSpotCheckType(enums.get(0).getDictValue());
                    }
                }else {
                    str.setSpotCheckType(null);
                }
                lists.add(str);
            }
        });
        try {
            this.saveOrUpdateBatch(lists);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("服务端报错");
        }
    }
}
basic-server/src/main/java/com/ruoyi/basic/utils/StandardTemplateInspectionItemParser.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,108 @@
package com.ruoyi.basic.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.basic.dto.TemplateInspectionItemDto;
import com.ruoyi.common.exception.base.BaseException;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/** è§£æž Luckysheet åŽŸå§‹è®°å½•æ¨¡æ¿ä¸­çš„â€œæ£€éªŒé¡¹â€æ ‡è®°ã€‚ */
public final class StandardTemplateInspectionItemParser {
    private static final String INSPECTION_ITEM_MARK = "检验项";
    private StandardTemplateInspectionItemParser() {
    }
    public static List<TemplateInspectionItemDto> parse(Integer templateId, Integer templateSort, String thing) {
        if (!StringUtils.hasText(thing)) {
            throw new BaseException("原始记录模板内容不能为空");
        }
        JSONArray sheets;
        try {
            JSONObject root = JSON.parseObject(thing);
            sheets = root == null ? null : root.getJSONArray("data");
            if (sheets == null) {
                sheets = JSON.parseArray(thing);
            }
        } catch (Exception e) {
            throw new BaseException("原始记录模板格式错误");
        }
        List<TemplateInspectionItemDto> result = new ArrayList<>();
        Set<Integer> rows = new HashSet<>();
        if (sheets == null) {
            throw new BaseException("原始记录模板格式错误");
        }
        for (Object sheetObject : sheets) {
            JSONObject sheet = (JSONObject) sheetObject;
            JSONArray cells = sheet.getJSONArray("celldata");
            if (cells == null) {
                continue;
            }
            for (Object cellObject : cells) {
                JSONObject cell = (JSONObject) cellObject;
                JSONObject value = cell.getJSONObject("v");
                if (value == null || !isInspectionItem(value)) {
                    continue;
                }
                Integer row = cell.getInteger("r");
                String item = getCellText(value);
                if (row == null || !StringUtils.hasText(item)) {
                    throw new BaseException("“检验项”标记所在单元格必须填写检验项名称");
                }
                if (!rows.add(row)) {
                    throw new BaseException("同一模板行只能配置一个“检验项”标记");
                }
                TemplateInspectionItemDto dto = new TemplateInspectionItemDto();
                dto.setTemplateId(templateId);
                dto.setTemplateSort(templateSort);
                dto.setTemplateRowIndex(row);
                dto.setInspectionItem(item.trim());
                result.add(dto);
            }
        }
        result.sort(Comparator.comparing(TemplateInspectionItemDto::getTemplateRowIndex));
        return result;
    }
    /**
     * è¯»å– Luckysheet å•元格文本,兼容普通文本和 inlineStr å¯Œæ–‡æœ¬ã€‚
     */
    private static String getCellText(JSONObject value) {
        String text = value.getString("v");
        if (StringUtils.hasText(text)) {
            return text;
        }
        text = value.getString("m");
        if (StringUtils.hasText(text)) {
            return text;
        }
        JSONObject cellType = value.getJSONObject("ct");
        JSONArray segments = cellType == null ? null : cellType.getJSONArray("s");
        if (segments == null || segments.isEmpty()) {
            return text;
        }
        StringBuilder richText = new StringBuilder();
        for (Object segmentObject : segments) {
            if (segmentObject instanceof JSONObject) {
                String segmentText = ((JSONObject) segmentObject).getString("v");
                if (segmentText != null) {
                    richText.append(segmentText);
                }
            }
        }
        return richText.toString();
    }
    private static boolean isInspectionItem(JSONObject value) {
        JSONObject ps = value.getJSONObject("ps");
        return ps != null && INSPECTION_ITEM_MARK.equals(ps.getString("value"));
    }
}
basic-server/src/main/java/com/ruoyi/basic/utils/StandardTreePath.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.basic.utils;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
 * æ ‡å‡†æ ‘路径解析结果
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class StandardTreePath {
    private String industry;
    private String standard;
}
basic-server/src/main/java/com/ruoyi/basic/utils/StandardTreePathParser.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,78 @@
package com.ruoyi.basic.utils;
import com.ruoyi.common.exception.base.BaseException;
import java.util.regex.Pattern;
/**
 * æ ‡å‡†æ ‘固定两级路径解析工具。
 *
 * å…¼å®¹å‰ç«¯ä¼ é€’的两种叶子路径:
 * æ ‡å‡†åº“侧:行业 - null - æ ‡å‡†
 * ä¸‹å•侧:行业 -  - æ ‡å‡†
 * ç»Ÿä¸€è§£æžä¸º industry = ç¬¬ä¸€ä¸ªæœ‰æ•ˆæ®µï¼Œstandard = æœ€åŽä¸€ä¸ªæœ‰æ•ˆæ®µã€‚
 */
public final class StandardTreePathParser {
    private static final String SEPARATOR = " - ";
    private static final String NULL_MARKER = "null";
    private StandardTreePathParser() {
    }
    /**
     * è§£æžè·¯å¾„为行业 + æ ‡å‡†ã€‚标准可能为 null(表示仅行业节点)。
     */
    public static StandardTreePath parse(String tree) {
        if (tree == null || tree.trim().isEmpty()) {
            throw new BaseException("标准树路径格式错误");
        }
        String[] parts = tree.split(Pattern.quote(SEPARATOR), -1);
        for (int i = 0; i < parts.length; i++) {
            parts[i] = parts[i].trim();
        }
        if (parts.length == 1) {
            validateSegment(parts[0]);
            return new StandardTreePath(parts[0], null);
        }
        if (parts.length == 2) {
            validateSegment(parts[0]);
            validateSegment(parts[1]);
            return new StandardTreePath(parts[0], parts[1]);
        }
        if (parts.length == 3 && (parts[1].isEmpty() || NULL_MARKER.equals(parts[1]))) {
            validateSegment(parts[0]);
            validateSegment(parts[2]);
            return new StandardTreePath(parts[0], parts[2]);
        }
        throw new BaseException("标准树路径格式错误");
    }
    /**
     * ç”Ÿæˆè§„范路径:行业 - null - æ ‡å‡†
     */
    public static String canonical(String industry, String standard) {
        String normalizedIndustry = trim(industry);
        String normalizedStandard = trim(standard);
        validateSegment(normalizedIndustry);
        validateSegment(normalizedStandard);
        return normalizedIndustry + SEPARATOR + NULL_MARKER + SEPARATOR + normalizedStandard;
    }
    private static String trim(String value) {
        return value == null ? "" : value.trim();
    }
    public static String normalizeNodeName(String value) {
        String normalized = trim(value);
        validateSegment(normalized);
        return normalized;
    }
    private static void validateSegment(String value) {
        if (value == null || value.isEmpty() || NULL_MARKER.equals(value) || value.contains(SEPARATOR)) {
            throw new BaseException("标准树路径格式错误");
        }
    }
}
basic-server/src/main/java/com/ruoyi/basic/vo/IfsInventoryQuantityVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package com.ruoyi.basic.vo;
import com.ruoyi.basic.pojo.IfsInventoryQuantity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
 * åŽŸææ–™æŠ¥æ£€vo
 */
@Data
public class IfsInventoryQuantityVO extends IfsInventoryQuantity {
    /**
     * æ£€éªŒå•id
     */
    @Schema(description = "检验单id")
    private Integer insOrderId;
    /**
     * æ£€éªŒç»“果(0:不合格,1:合格)
     */
    @Schema(description = "检验结果(0:不合格,1:合格)")
    private Integer insResult;
    /**
     * åŒæ­¥çŠ¶æ€ï¼ˆ0:未同步,1:已同步)
     */
    @Schema(description = "同步状态(0:未同步,1:已同步)")
    private Integer syncStatus;
    /**
     * æ‰¹æ¬¡å·æ˜¯å¦é‡å¤æŠ¥æ£€
     */
    @Schema(description = "批次号是否重复报检")
    private Boolean lotBatchNoHasRepeat;
}
basic-server/src/main/resources/mapper/CertificationMapper.xml
@@ -2,18 +2,13 @@
<!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 * FROM certification
        <where>
            create_time IN (
            SELECT MAX( create_time ) FROM certification WHERE create_time IS NOT NULL GROUP BY NAME )
            <if test="param.name != null and param.name != ''">
                AND name like concat('%',#{param.name},'%')
            </if>
        </where>
    </select>
</mapper>
basic-server/src/main/resources/mapper/IfsInventoryQuantityMapper.xml
@@ -71,4 +71,28 @@
          and iiq.supplier_name = #{supplierName}
          and iiq.receiver_date between #{startOfNextQuarter} and #{endOfQuarter}
    </select>
    <select id="selectSplitOrderList" resultType="com.ruoyi.basic.vo.IfsInventoryQuantityVO">
        select
            iiq.*,
            io.id AS ins_order_id,
            io.ins_result,
            isor.sync_status
        from ifs_inventory_quantity iiq
                 join ifs_split_order_record isor
                      on iiq.update_batch_no = isor.lot_batch_no
                          and iiq.order_no=isor.order_no
                          and iiq.line_no=isor.line_no
                          and iiq.release_no=isor.release_no
                          and iiq.receipt_no=isor.receipt_no
                          and iiq.part_no=isor.part_no
                 left join ins_order io on iiq.id=io.ifs_inventory_id
        where iiq.order_no=#{orderNo}
          and iiq.part_no=#{partNo}
          and iiq.line_no=#{lineNo}
          and iiq.release_no=#{releaseNo}
          and iiq.receipt_no=#{receiptNo}
          and iiq.is_split_order=1
          and (iiq.is_finish != 1 or isor.sync_status != 1)
          and (io.id is null or io.is_exemption != 1)
    </select>
</mapper>
basic-server/src/main/resources/mapper/SealMapper.xml
@@ -4,8 +4,8 @@
        "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
        select * from (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) a
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
basic-server/src/main/resources/mapper/StandardMethodListMapper.xml
ÎļþÒÑɾ³ý
basic-server/src/main/resources/mapper/StandardMethodMapper.xml
@@ -21,7 +21,6 @@
                sm.code,
                sm.name,
                sm.structure_test_object_id,
                sto.specimen_name sample_type,
                sm.remark,
                u1.name create_user_name,
                sm.create_time,
@@ -31,11 +30,14 @@
                sm.field,
                sm.name_en,
                sm.is_use,
                sm.qualification_id
                sm.qualification_id,
                COALESCE((SELECT GROUP_CONCAT(l.laboratory_name ORDER BY COALESCE(l.sort, 0), l.id SEPARATOR '、')
                          FROM standard_method_industry smi JOIN laboratory l ON l.id = smi.industry_id
                          WHERE smi.standard_method_id = sm.id), '') industry_names,
                (SELECT COUNT(*) FROM standard_method_attachment sma WHERE sma.standard_method_id = sm.id) attachment_count
                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 != ''">
@@ -64,4 +66,49 @@
                 left join structure_test_object sto on sm.structure_test_object_id = sto.id
        where sm.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="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="selectStandardMethodListsByIndustry" resultType="com.ruoyi.basic.pojo.StandardMethodList">
        select sm.id, sm.code, sm.name, sm.remark
        from standard_method sm
                 inner join standard_method_industry smi on smi.standard_method_id = sm.id
                 inner join laboratory l on l.id = smi.industry_id
        where sm.is_use = 1
          and sm.is_product = 1
          and l.laboratory_name = #{industry}
        order by sm.id
    </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/StandardProductListMapper.xml
@@ -27,6 +27,19 @@
            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
    </resultMap>
    <!-- æ‰¹é‡æ·»åŠ æ£€æµ‹æ ‡å‡† -->
    <insert id="saveBatchProductLists">
        INSERT INTO standard_product_list (id, inspection_item, inspection_item_en, inspection_item_subclass, inspection_item_subclass_en, factory, laboratory, sample_type, sample, model, son_laboratory, unit, price, man_hour, man_hour_group, inspection_item_type, inspection_value_type, checkout_number, section, cores, method, method_s, man_day, bsm, ask, tell, standard_method_list_id, template_id, state, dic, tree, structure_item_parameter_id, inspection_item_class, inspection_item_class_en, radius, radius_list, rates, sort, conductor_material, conductor_type)
        VALUES
        <foreach item="item" collection="productLists" open="(" separator="),(" close=")">
            #{item.id}, #{item.inspectionItem}, #{item.inspectionItemEn}, #{item.inspectionItemSubclass}, #{item.inspectionItemSubclassEn}, #{item.factory}, #{item.laboratory}, #{item.sampleType}, #{item.sample}, #{item.model}, #{item.sonLaboratory}, #{item.unit}, #{item.price}, #{item.manHour}, #{item.manHourGroup}, #{item.inspectionItemType}, #{item.inspectionValueType}, #{item.checkoutNumber}, #{item.section}, #{item.cores}, #{item.method}, #{item.methodS}, #{item.manDay}, #{item.bsm}, #{item.ask}, #{item.tell}, #{item.standardMethodListId}, #{item.templateId}, #{item.state}, #{item.dic}, #{item.tree}, #{item.structureItemParameterId},
            #{item.inspectionItemClass}, #{item.inspectionItemClassEn}, #{item.radius}, #{item.radiusList}, #{item.rates}, #{item.sort}, #{item.conductorMaterial}, #{item.conductorType}
        </foreach>
    </insert>
    <update id="updateSection">
        UPDATE standard_product_list
        SET price=#{productList.price},
basic-server/src/main/resources/mapper/StandardTemplateMapper.xml
@@ -17,7 +17,7 @@
    <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
        select st.id, st.name,st.number, st.price, 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
@@ -36,5 +36,9 @@
        WHERE id = #{templateId}
    </select>
    <select id="countBindTemplateItemParameter">
        SELECT COUNT(*) FROM structure_item_parameter WHERE template_id = #{templateId}
    </select>
</mapper>
basic-server/src/main/resources/mapper/StandardTreeMapper.xml
@@ -10,6 +10,8 @@
        <result property="sampleType" column="sample_type" jdbcType="VARCHAR"/>
        <result property="sample" column="sample" jdbcType="VARCHAR"/>
        <result property="model" column="model" jdbcType="VARCHAR"/>
        <result property="sort" column="sort" jdbcType="INTEGER"/>
        <result property="standardMethodId" column="standard_method_id" jdbcType="INTEGER"/>
        <result property="createUser" column="create_user" jdbcType="INTEGER"/>
        <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
        <result property="updateUser" column="update_user" jdbcType="INTEGER"/>
@@ -89,24 +91,106 @@
        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 id="selectStandardLibraryTree" resultType="com.ruoyi.basic.dto.StandardLibraryTreeRowDto">
        SELECT l.id                                      AS industry_id,
               l.laboratory_name                         AS industry_name,
               l.sort                                    AS industry_sort,
               st.id                                     AS standard_id,
               sm.id                                     AS standard_method_id,
               sm.code                                   AS standard_code,
               sm.name                                   AS standard_name,
               sm.name_en                                AS standard_name_en,
               CONCAT(sm.code, ' - ', sm.name)           AS standard_label,
               st.sort                                   AS standard_sort
        FROM laboratory l
        LEFT JOIN standard_tree st
               ON st.laboratory = l.laboratory_name
              AND st.sample_type IS NULL
              AND st.model IS NULL
              AND st.standard_method_id IS NOT NULL
              AND EXISTS (SELECT 1 FROM standard_method sm0
                          WHERE sm0.id = st.standard_method_id
                            AND sm0.is_product = 1 AND sm0.is_use = 1)
        LEFT JOIN standard_method sm ON sm.id = st.standard_method_id
        ORDER BY COALESCE(l.sort, 0), l.id,
                 COALESCE(st.sort, 0), st.id
    </select>
    <update id="updateProductListIndustry">
        UPDATE standard_product_list
        SET laboratory = #{newName},
            tree = CASE WHEN sample_type IS NULL AND model IS NULL AND sample IS NOT NULL
                        THEN CONCAT(#{newName}, ' - null - ', sample)
                        ELSE tree END
        WHERE laboratory = #{oldName}
    </update>
    <update id="updateProductListStandard">
        UPDATE standard_product_list
        SET sample = #{newName},
            tree = CONCAT(#{industry}, ' - null - ', #{newName})
        WHERE laboratory = #{industry}
          AND sample = #{oldName}
          AND sample_type IS NULL
          AND model IS NULL
    </update>
    <update id="updateInsOrderIndustry">
        UPDATE ins_order
        SET laboratory = #{newName}
        WHERE laboratory = #{oldName}
          AND (state IS NULL OR state NOT IN (3, -1))
          AND (ins_state IS NULL OR ins_state != 5)
    </update>
    <update id="updateInsSampleIndustry">
        UPDATE ins_sample s
        JOIN ins_order o ON o.id = s.ins_order_id
        SET s.laboratory = #{newName}
        WHERE s.laboratory = #{oldName}
          AND (o.state IS NULL OR o.state NOT IN (3, -1))
          AND (o.ins_state IS NULL OR o.ins_state != 5)
    </update>
    <update id="updateInsProductIndustry">
        UPDATE ins_product p
        JOIN ins_sample s ON s.id = p.ins_sample_id
        JOIN ins_order o ON o.id = s.ins_order_id
        SET p.laboratory = #{newName}
        WHERE p.laboratory = #{oldName}
          AND (o.state IS NULL OR o.state NOT IN (3, -1))
          AND (o.ins_state IS NULL OR o.ins_state != 5)
    </update>
    <update id="updateInsOrderStandard">
        UPDATE ins_order
        SET sample = #{newName}
        WHERE laboratory = #{industry}
          AND sample = #{oldName}
          AND (state IS NULL OR state NOT IN (3, -1))
          AND (ins_state IS NULL OR ins_state != 5)
    </update>
    <update id="updateInsSampleStandard">
        UPDATE ins_sample s
        JOIN ins_order o ON o.id = s.ins_order_id
        SET s.sample = #{newName}
        WHERE s.laboratory = #{industry}
          AND s.sample = #{oldName}
          AND (o.state IS NULL OR o.state NOT IN (3, -1))
          AND (o.ins_state IS NULL OR o.ins_state != 5)
    </update>
    <update id="updateInsProductStandard">
        UPDATE ins_product p
        JOIN ins_sample s ON s.id = p.ins_sample_id
        JOIN ins_order o ON o.id = s.ins_order_id
        SET p.sample = #{newName}
        WHERE p.laboratory = #{industry}
          AND p.sample = #{oldName}
          AND (o.state IS NULL OR o.state NOT IN (3, -1))
          AND (o.ins_state IS NULL OR o.ins_state != 5)
    </update>
    <select id="selectStandardProductById" resultType="com.ruoyi.basic.pojo.StandardProductList">
        select inspection_item,
@@ -154,17 +238,9 @@
           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,
        select ''                          factory,
               l.laboratory_name laboratory,
               sto.specimen_name sample_type,
               p.name            sample
@@ -202,6 +278,44 @@
        order by inspection_item_class, inspection_item, id asc
    </select>
    <select id="selectStandardProductListByIndustry" resultType="com.ruoyi.basic.pojo.StandardProductList">
        select 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 as 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 as state,
               null as model,
               #{standard} as sample,
               #{tree} as tree,
               id as structure_item_parameter_id,
               radius_list,
               rates
        from structure_item_parameter
        where (laboratory is null
            or laboratory = ''
            or laboratory = #{industry})
        order by inspection_item_class, inspection_item, id asc
    </select>
    <select id="getStandardTree2" resultMap="SampleTypeDto">
        select sto.specimen_name sample_type,
               p.name            sample,
@@ -210,14 +324,6 @@
                 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">
@@ -253,7 +359,7 @@
        where name = #{name}
    </select>
    <select id="selectStandardTreeListByPartNo" resultMap="FactoryDto">
        select '中天科技检测中心' factory,
        select ''                 factory,
               l.laboratory_name  laboratory,
               sto.specimen_name  sample_type,
               p.name             sample,
@@ -296,10 +402,12 @@
                     ir1.id                                      enter_report_id,
                     ir1.url                                     enter_url,
                     ir1.url_s                                   enter_url_s,
                     ir1.is_ratify                               enter_ratify_status,
                     io2.id                                      quarter_order_id,
                     ir2.id                                      quarter_report_id,
                     ir2.url                                     quarter_url,
                     ir2.url_s                                   quarter_url_s,
                     ir2.is_ratify                               quarter_ratify_status,
                     group_concat(distinct isa.sample_code, ' ')          sample_code,
                     group_concat(distinct isa.sample, ' ')               sample_name,
                     group_concat(distinct isa.model, ' ')                sample_model,
@@ -330,13 +438,15 @@
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
        order by send_time desc
    </select>
    <select id="selectIfsPage" resultType="com.ruoyi.basic.pojo.IfsInventoryQuantity">
    <select id="selectIfsPage" resultType="com.ruoyi.basic.vo.IfsInventoryQuantityVO">
        SELECT * from ifs_inventory_quantity ifs
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
        ORDER BY declare_date DESC
    </select>
    <select id="selectIfsInventoryQuantity" resultType="com.ruoyi.basic.dto.IfsInventoryQuantityCheckDto">
        SELECT * from ifs_inventory_quantity ifs
@@ -348,19 +458,20 @@
        select * from (<include refid="getIfsOrder"/>
        <where>
            <if test="beginDeclareDate != null and beginDeclareDate != '' and endDeclareDate != null and endDeclareDate != ''">
                send_time between #{beginDeclareDate} and #{endDeclareDate}
                declare_date between #{beginDeclareDate} and #{endDeclareDate}
            </if>
        </where>
        ) a
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
        order by send_time desc
    </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}
                    declare_date between #{beginDeclareDate} and #{endDeclareDate}
                </if>
            </where>
        ) a
@@ -373,7 +484,7 @@
        <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}
                and  declare_date between #{beginDeclareDate} and #{endDeclareDate}
            </if>
        </where>
        ) a
@@ -381,4 +492,34 @@
            ${ew.customSqlSegment}
        </if>
    </select>
    <select id="getStandardTree3Batch" resultType="com.ruoyi.basic.dto.SampleDto">
        select model label,
               model value
        from standard_tree
        where sample is null
        <if test="sampleTypeValues != null and sampleTypeValues.size() > 0">
            and sample_type in
            <foreach item="item" collection="sampleTypeValues" open="(" separator="," close=")">
                #{item}
            </foreach>
        </if>
    </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>
    <!-- æ ¹æ®åŽŸææ–™id列表查询原材料信息 -->
    <select id="getIfsByIds" resultType="com.ruoyi.basic.dto.IfsInventoryQuantitySupplierDto">
        <include refid="getIfsOrder"/>
        where id in
        <foreach item="id" collection="ifsIds" open="(" separator="," close=")">
            #{id}
        </foreach>
    </select>
</mapper>
basic-server/src/main/resources/mapper/StandardTreeTemplateDeviceMapper.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.StandardTreeTemplateDeviceMapper">
    <select id="selectExistingDeviceIds" resultType="java.lang.Integer">
        select id from device where id in
        <foreach collection='deviceIds' item='deviceId' open='(' separator=',' close=')'>
            #{deviceId}
        </foreach>
    </select>
</mapper>
basic-server/src/main/resources/mapper/StructureItemParameterMapper.xml
@@ -3,11 +3,7 @@
        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,
@@ -40,7 +36,9 @@
        inspection_item_class_en,
        code,
        radius_list,
        rates
        rates,
        device_ids,
        spot_check_type
        from (select *,
        CASE
        WHEN INSTR(sample, ',') > 0 THEN
@@ -108,6 +106,13 @@
        from structure_test_object sto
                 left join product p on p.object_id = sto.id
    </select>
    <select id="selectDeviceIdsByNumber" resultType="java.lang.Integer">
        select id from device
        where management_number in
        <foreach item="item" collection="managementNumberList" open="(" separator="),(" close=")">
            #{item}
        </foreach>
    </select>
    <resultMap id="itemDto" type="com.ruoyi.basic.dto.TestItemDto">
        <result column="sId" property="id"/>
basic-server/src/main/resources/mapper/StructureTestMapper.xml
@@ -31,6 +31,7 @@
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
</mapper>
inspect-server/pom.xml
@@ -29,12 +29,62 @@
            <artifactId>ruoyi-system</artifactId>
        </dependency>
        <!--业务模块-->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>basic-server</artifactId>
        </dependency>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>performance-server</artifactId>
        </dependency>
        <!-- MyBatis-Plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-spring-boot4-starter</artifactId>
        </dependency>
        <!-- Excel å·¥å…· -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
        </dependency>
        <!-- hutool å·¥å…·ç±» -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
        </dependency>
        <!-- fastjson v1 API å…¼å®¹åŒ… -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
        </dependency>
        <!-- poi-tl:Word æŠ¥è¡¨æ¨¡æ¿å¡«å…… -->
        <dependency>
            <groupId>com.deepoove</groupId>
            <artifactId>poi-tl</artifactId>
        </dependency>
        <!-- word è½¬ pdf -->
        <dependency>
            <groupId>com.aspose</groupId>
            <artifactId>aspose-words</artifactId>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
        </dependency>
        <!-- MockMultipartFile:XWPFDocument åŒ…装成 MultipartFile æ—¶ä½¿ç”¨ -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
        </dependency>
        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
inspect-server/src/main/java/com/ruoyi/basic/pojo/InsSample.java
ÎļþÒÑɾ³ý
inspect-server/src/main/java/com/ruoyi/inspect/controller/DataAnalysisController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,127 @@
package com.ruoyi.inspect.controller;
import com.ruoyi.basic.dto.IfsInventoryQuantitySupplierDto;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.inspect.dto.DataAnalysisDto;
import com.ruoyi.inspect.service.DataAnalysisService;
import com.ruoyi.inspect.vo.DeviationAnalyzeVo;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * @Author zhuo
 * @Date 2024/10/16
 */
@RequestMapping("/dataAnalysis")
@RestController
@AllArgsConstructor
@Tag(name = "数据分析")
public class DataAnalysisController {
    private DataAnalysisService dataAnalysisService;
    /**
     * æŸ¥è¯¢åŽŸææ–™æŸ±çŠ¶ç»Ÿè®¡
     * @param dataAnalysisDto
     * @return
     */
    @Operation(summary = "查询原材料柱状统计")
    @GetMapping("/getRawPassRateByBarChart")
    public Result getRawPassRateByBarChart(DataAnalysisDto dataAnalysisDto) {
        return Result.success(dataAnalysisService.getRawPassRateByBarChart(dataAnalysisDto));
    }
    /**
     * æŸ¥è¯¢åŽŸææ–™æŸ±çŠ¶ç»Ÿè®¡
     * @param dataAnalysisDto
     * @return
     */
    @Operation(summary = "查询原材料合格率饼状态")
    @GetMapping("/getRawPassRateByCake")
    public Result getRawPassRateByCake(DataAnalysisDto dataAnalysisDto) {
        return Result.success(dataAnalysisService.getRawPassRateByCake(dataAnalysisDto));
    }
    /**
     * æŸ¥è¯¢åŽŸææ–™é¡¹
     * @param dataAnalysisDto
     * @return
     */
    @Operation(summary = "查询原材料项")
    @GetMapping("/getRawItemNames")
    public Result getRawItemNames(DataAnalysisDto dataAnalysisDto) {
        return Result.success(dataAnalysisService.getRawItemNames(dataAnalysisDto));
    }
    /**
     * æŸ¥è¯¢åŽŸææ–™é¡¹æ£€åˆ†æž
     * @param dataAnalysisDto
     * @return
     */
    @Operation(summary = "查询原材料项检分析")
    @PostMapping("/getRawProductAnalysis")
    public Result getRawProductAnalysis(@RequestBody DataAnalysisDto dataAnalysisDto) {
        return Result.success(dataAnalysisService.getRawProductAnalysis(dataAnalysisDto));
    }
    /**
     * æŸ¥è¯¢åŽŸææ–™é¡¹æ£€åˆ†æžåˆ—è¡¨
     * @param dataAnalysisDto
     * @return
     */
    @Operation(summary = "查询原材料项检分析列表")
    @PostMapping("/getRawProductAnalysisAllList")
    public Result<List<IfsInventoryQuantitySupplierDto>> getRawProductAnalysisAllList(@RequestBody DataAnalysisDto dataAnalysisDto) {
        return Result.success(dataAnalysisService.getRawProductAnalysisAllList(dataAnalysisDto));
    }
    /**
     * æŸ¥è¯¢åŽŸææ–™é¡¹æ£€åˆ†æžåˆ—è¡¨
     * @param dataAnalysisDto
     * @return
     */
    @Operation(summary = "查询原材料项检分析合格率")
    @PostMapping("/getRawProductAnalysisRawPass")
    public Result getRawProductAnalysisRawPass(@RequestBody DataAnalysisDto dataAnalysisDto) {
        return Result.success(dataAnalysisService.getRawProductAnalysisRawPass(dataAnalysisDto));
    }
    /**
     * æŸ¥è¯¢åŽŸææ–™é¡¹æ£€å’ŒåŽ‚å®¶æ•°æ®å¯¹æ¯”
     * @param dataAnalysisDto
     * @return
     */
    @Operation(summary = "查询原材料项检和厂家数据对比")
    @PostMapping("/getRawSupplierCompare")
    public Result<DeviationAnalyzeVo> getRawSupplierCompare(@RequestBody DataAnalysisDto dataAnalysisDto) {
        return Result.success(dataAnalysisService.getRawSupplierCompare(dataAnalysisDto));
    }
    /**
     * æŸ¥è¯¢æœ¬æœˆä¸Žä¸Šä¸ªæœˆåˆæ ¼çŽ‡å¯¹æ¯”
     * @param dataAnalysisDto
     * @return
     */
    @Operation(summary = "查询本月与上个月合格率对比")
    @GetMapping("/getRawUpMonth")
    public Result getRawUpMonth(DataAnalysisDto dataAnalysisDto) {
        return Result.success(dataAnalysisService.getRawUpMonth(dataAnalysisDto));
    }
    /**
     * æŸ¥è¯¢æ£€éªŒé¡¹ç±»åž‹é¥¼å›¾
     * @param dataAnalysisDto
     * @return
     */
    @Operation(summary = "查询检验项类型饼图")
    @GetMapping("/getOrderTypeCookie")
    public Result getOrderTypeCookie(DataAnalysisDto dataAnalysisDto) {
        return Result.success(dataAnalysisService.getOrderTypeCookie(dataAnalysisDto));
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/controller/FinishProductSpotCheckController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,198 @@
package com.ruoyi.inspect.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.inspect.dto.IfsStockQueryDTO;
import com.ruoyi.inspect.dto.SpotCheckQuarterDto;
import com.ruoyi.inspect.dto.SpotCheckYearDto;
import com.ruoyi.inspect.service.FinishProductSpotCheckService;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import jakarta.servlet.http.HttpServletResponse;
import java.util.Map;
/**
 * @Author zhuo
 * @Date 2024/9/29
 */
@RequestMapping("/finishProductSpotCheck")
@RestController
@AllArgsConstructor
@Tag(name = "成品抽样")
public class FinishProductSpotCheckController {
    private FinishProductSpotCheckService finishProductSpotCheckService;
    /**
     * æŸ¥è¯¢ifs库存数量
     *
     * @param ifsStockQueryDTO
     * @return
     */
    @Operation(summary = "查询ifs成品库存")
    @PostMapping("/getIfsStock")
    public Result getIfsStock(@RequestBody IfsStockQueryDTO ifsStockQueryDTO) {
        return finishProductSpotCheckService.getIfsStockReport(ifsStockQueryDTO);
    }
    /********************************************************  å­£åº¦æŠ½æ ·  ********************************************************/
    /**
     * æ–°å¢žå­£åº¦æŠ½æ£€
     *
     * @param spotCheckQuarterDto
     * @return
     */
    @Operation(summary = "新增季度抽检")
    @PostMapping("/addQuarter")
    public Result addQuarter(@RequestBody SpotCheckQuarterDto spotCheckQuarterDto) {
        return Result.success(finishProductSpotCheckService.addQuarter(spotCheckQuarterDto));
    }
    /**
     * æŸ¥è¯¢å­£åº¦æŠ½æ ·è¯¦æƒ…
     *
     * @param quarterId
     * @return
     */
    @Operation(summary = "查询季度抽样详情")
    @GetMapping("/getQuarter")
    public Result getQuarter(Integer quarterId) {
        return Result.success(finishProductSpotCheckService.getQuarter(quarterId));
    }
    /**
     * å­£åº¦æŠ½æ ·åˆ—表
     * @return
     * @throws Exception
     */
    @Operation(summary = "季度抽样列表")
    @GetMapping("/getQuarterPage")
    public Result getQuarterPage(Page page, SpotCheckQuarterDto spotCheckQuarter) throws Exception {
        return Result.success(finishProductSpotCheckService.getQuarterPage(page, spotCheckQuarter));
    }
    /**
     * æ–°å¢žå­£åº¦æŠ½æ£€
     *
     * @param quarterId
     * @return
     */
    @Operation(summary = "删除季度检验")
    @DeleteMapping("/deleteQuarter")
    public Result deleteQuarter(Integer quarterId) {
        return Result.success(finishProductSpotCheckService.deleteQuarter(quarterId));
    }
    /**
     * æˆå“ä¸‹å•界面查询季度信息
     *
     * @return
     */
    @Operation(summary = "成品下单界面查询季度信息")
    @GetMapping("/getQuarterOnOrder")
    public Result getQuarterOnOrder() {
        return Result.success(finishProductSpotCheckService.getQuarterOnOrder());
    }
    /**
     * æˆå“ä¸‹å•界面查询季度信息
     *
     * @return
     */
    @Operation(summary = "修改季度检验")
    @PostMapping("/updateQuarterOnOrder")
    public Result updateQuarterOnOrder(@RequestBody SpotCheckQuarterDto spotCheckQuarterDto) {
        return Result.success(finishProductSpotCheckService.updateQuarterOnOrder(spotCheckQuarterDto));
    }
    /**
     * æˆå“ä¸‹å•界面查询季度信息
     *
     * @return
     */
    @Operation(summary = "提交最终季度报告")
    @GetMapping("/finalReportQuarter")
    public void finalReportQuarter(Integer quarterId, HttpServletResponse response) {
        finishProductSpotCheckService.finalReportQuarter(quarterId, response);
    }
    /********************************************************  å¹´åº¦æŠ½æ ·  ********************************************************/
    /**
     * æ–°å¢žå¹´åº¦æŠ½æ ·
     *
     * @param spotCheckYearDto
     * @return
     */
    @Operation(summary = "新增年度抽样")
    @PostMapping("/addSpotCheckYear")
    public Result addSpotCheckYear(@RequestBody SpotCheckYearDto spotCheckYearDto) {
        return Result.success(finishProductSpotCheckService.addSpotCheckYear(spotCheckYearDto));
    }
    /**
     * æŸ¥è¯¢å­£åº¦æŠ½æ ·è¯¦æƒ…
     *
     * @param yearId
     * @return
     */
    @Operation(summary = "查询年度抽样详情")
    @GetMapping("/getSpotCheckYear")
    public Result getSpotCheckYear(Integer yearId) {
        return Result.success(finishProductSpotCheckService.getSpotCheckYear(yearId));
    }
    /**
     * å­£åº¦æŠ½æ ·åˆ—表
     * @return
     * @throws Exception
     */
    @Operation(summary = "年度抽样列表列表")
    @GetMapping("/getSpotCheckYearPage")
    public Result getSpotCheckYearPage(Page page, SpotCheckYearDto spotCheckYear) throws Exception {
        return Result.success(finishProductSpotCheckService.getSpotCheckYearPage(page, spotCheckYear));
    }
    /**
     * åˆ é™¤å¹´åº¦æŠ½æ ·
     *
     * @param yearId
     * @return
     */
    @Operation(summary = "删除年度抽样")
    @DeleteMapping("/deleteSpotCheckYear")
    public Result deleteSpotCheckYear(Integer yearId) {
        return Result.success(finishProductSpotCheckService.deleteSpotCheckYear(yearId));
    }
    /**
     * æˆå“ä¸‹å•界面查询季度信息
     *
     * @return
     */
    @Operation(summary = "修改年度检验")
    @PostMapping("/updateSpotCheckYear")
    public Result updateSpotCheckYear(@RequestBody SpotCheckYearDto spotCheckYearDto) {
        return Result.success(finishProductSpotCheckService.updateSpotCheckYear(spotCheckYearDto));
    }
    /**
     * æˆå“ä¸‹å•界面查询季度信息
     *
     * @return
     */
    @Operation(summary = "生成最终年度报告")
    @GetMapping("/finalReportSpotCheckYear")
    public Result finalReportSpotCheckYear(Integer yearId, HttpServletResponse response) {
        return Result.success(finishProductSpotCheckService.finalReportSpotCheckYear(yearId, response));
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/controller/IfsOrderInspectionController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
package com.ruoyi.inspect.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.dto.IfsInventoryQuantitySupplierDto;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.inspect.service.IfsOrderInspectionService;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.beans.factory.annotation.Autowired;
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;
/**
 * ifs销售订单报检controller
 */
@RestController
@RequestMapping("/ifsOrderInspection")
public class IfsOrderInspectionController {
    @Autowired
    private IfsOrderInspectionService ifsOrderInspectionService;
    @Operation(summary = "销售订单报检查询全部")
    @PreAuthorize("@ss.hasPermi('get:Ifs:ByAll')")
    @GetMapping("/getIfsByAll")
    public Result getIfsByAll(Page page, IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto){
        return Result.success(ifsOrderInspectionService.getIfsByOver(page, ifsInventoryQuantityDto));
    }
    @Operation(summary = "销售订单报检查看已完成信息")
    @GetMapping("/getIfsByFinish")
    public Result getIfsByFinish(Page page, IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto) {
        ifsInventoryQuantityDto.setIsFinish(1);
        return Result.success(ifsOrderInspectionService.getIfsByOver(page, ifsInventoryQuantityDto));
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/controller/IfsPartPropsRecordController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.ruoyi.inspect.controller;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.inspect.dto.IfsPartPropsRecordDTO;
import com.ruoyi.inspect.service.IfsPartPropsRecordService;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
 * ifs零件属性controller
 */
@Tag(name = "ifs零件属性")
@RestController
@RequestMapping("/ifsPartProps")
public class IfsPartPropsRecordController {
    @Autowired
    private IfsPartPropsRecordService ifsPartPropsRecordService;
    @Operation(summary = "新增或保存零件属性")
    @PostMapping("/saveOrUpdateProps")
    public Result saveOrUpdateProps(@RequestBody  IfsPartPropsRecordDTO ifsPartPropsRecord){
        return Result.success(ifsPartPropsRecordService.saveOrUpdateProps(ifsPartPropsRecord));
    }
    @Operation(summary = "查询ifs订单的零件属性记录")
    @GetMapping("/getOneByIfsId/{ifsId}")
    public Result getOneByIfsId(@PathVariable("ifsId") Long ifsId){
        return Result.success(ifsPartPropsRecordService.getOneByIfsId(ifsId));
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/controller/InformationNotificationController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
package com.ruoyi.inspect.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.system.service.InformationNotificationService;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
/**
 * <p>
 * æ¶ˆæ¯é€šçŸ¥ å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-04-23 02:14:30
 */
@Tag(name = "消息通知")
@RestController
@RequestMapping("/informationNotification")
public class InformationNotificationController {
    @Autowired
    private InformationNotificationService informationNotificationService;
    @Operation(summary = "消息通知-滚动分页查询")
    @GetMapping("page")
    public Result<?> getPage(Long size, Long current, String messageType) {
        return Result.success(informationNotificationService.getPage(new Page<>(current, size), messageType));
    }
    @Operation(summary = "消息通知-滚动查询")
    @GetMapping("msgRoll")
    public Result<?> msgRoll(Page page) {
        return Result.success(informationNotificationService.msgRoll(page));
    }
    @Operation(summary = "消息通知-点击详情触发修改状态为已读")
    @PostMapping("triggerModificationStatusToRead")
    public Result<?> triggerModificationStatusToRead(@RequestBody Map<String, Integer> params) {
        Integer id = params.get("id");
        informationNotificationService.triggerModificationStatusToRead(id);
        return Result.success();
    }
    @Operation(summary = "消息通知-标记所有信息为已读/删除所有已读消息")
    @PostMapping("informationReadOrDelete/{isMarkAllInformationRead}")
    public Result<?> markAllInformationReadOrDeleteAllReadMessages(@PathVariable("isMarkAllInformationRead") Boolean isMarkAllInformationRead) {
        informationNotificationService.markAllInformationReadOrDeleteAllReadMessages(isMarkAllInformationRead);
        return Result.success();
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,284 @@
package com.ruoyi.inspect.controller;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.dto.InventoryDetailDTO;
import com.ruoyi.basic.mapper.IfsInventoryQuantityMapper;
import com.ruoyi.basic.pojo.IfsInventoryQuantity;
import com.ruoyi.basic.pojo.StandardProductList;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.inspect.dto.*;
import com.ruoyi.inspect.pojo.InsOrder;
import com.ruoyi.inspect.pojo.InsOrderTemplate;
import com.ruoyi.inspect.pojo.InsProduct;
import com.ruoyi.inspect.pojo.InsSample;
import com.ruoyi.inspect.service.InsOrderService;
import com.ruoyi.inspect.service.InsOrderTemplateService;
import com.ruoyi.inspect.service.InsProductService;
import com.ruoyi.inspect.service.InsSampleService;
import com.ruoyi.inspect.vo.InsOrderPrintingVo;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import lombok.AllArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import jakarta.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@RestController
@AllArgsConstructor
@RequestMapping("/insOrder")
@Tag(name = "检验单模块")
public class InsOrderController {
    private InsOrderService insOrderService;
    private InsSampleService insSampleService;
    private InsProductService insProductService;
    private IfsInventoryQuantityMapper ifsInventoryQuantityMapper;
    private InsOrderTemplateService insOrderTemplateService;
    //获取检验下单数据
    @Operation(summary = "查询单位检验单")
    @GetMapping("/selectInsOrderParameter")
    public Result selectInsOrderParameter(Page page, SampleOrderDto sampleOrderDto) {
        return Result.success(insOrderService.selectInsOrderParameter(page, sampleOrderDto));
    }
    @Operation(summary = "外购下单成品标签打印")
    @PostMapping("/labelOutsideOrderPrinting")
    public Result<List<InventoryDetailDTO>> labelOutsideOrderPrinting(@RequestBody Map<String, Object> param) {
        List<Integer> ids = (List<Integer>) param.get("ids");
        return Result.success(insOrderService.labelOutsideOrderPrinting(ids));
    }
    //用于检验下单区别查看所有订单和只查看同一个委托单位的订单
    @Operation(summary = "查询所有检验单")
    @GetMapping("/selectAllInsOrderParameter")
    public Result selectAllInsOrderParameter() {
        return Result.success();
    }
    @Operation(summary = "检验分配")
    @PostMapping("/upInsOrder")
    public Result<?> upInsOrder(Integer orderId, Integer sampleId, String appointed, Integer userId,String sonLaboratory) {
        return Result.fail("请在样品接收页面选择主检验人后提交检验");
    }
    @Operation(summary = "添加检验下单数据")
    @PreAuthorize("@ss.hasPermi('add:insOrder')")
    @PostMapping("/addInsOrder")
    public Result<?> addInsOrder(@RequestBody InsPlaceOrderDto insPlaceOrderDto) {
        if (insPlaceOrderDto.getStandardTreeId() != null) {
            return Result.success(insOrderService.addNewJuInsOrder(insPlaceOrderDto));
        }
        return Result.success(insOrderService.addInsOrder(insPlaceOrderDto.getSampleList(), insPlaceOrderDto.getInsOrder()));
    }
    @Operation(summary = "查询订单最长预计时间")
    @GetMapping("/selectOrderManDay")
    public Result<?> selectOrderManDay(Integer id) {
        int day = insProductService.selectOrderManDay(id);
        return Result.success(LocalDateTime.now().plusHours(day).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
    }
    @Operation(summary = "查询检验下单内容详情")
    @GetMapping("/getInsOrder")
    public Result<?> getInsOrder(Integer orderId) {
        return Result.success(insOrderService.getInsOrder(orderId));
    }
    @Operation(summary = "审核检验单进行状态修改")
    @PostMapping("/upInsOrderOfState")
    public Result<?> upInsOrderOfState(@RequestBody InsOrder insOrder) {
        return Result.success(insOrderService.upInsOrderOfState(insOrder));
    }
    @Operation(summary = "添加检验单模板")
    @PostMapping("/addInsOrderTemplate")
    public Result<?> addInsOrderTemplate(@RequestBody InsOrderTemplate insOrderTemplate) {
        return Result.success(insOrderTemplateService.addInsOrderTemplate(insOrderTemplate));
    }
    @Operation(summary = "查询检验单模板")
    @GetMapping("/selectInsOrderTemplate")
    public Result<?> selectInsOrderTemplate(String company) {
        return Result.success(insOrderTemplateService.selectInsOrderTemplate(company));
    }
    @Operation(summary = "通过检验单模板id获取检验单模板内容")
    @GetMapping("/selectInsOrderTemplateById")
    public Result<?> selectInsOrderTemplateById(Integer id) {
        return Result.success(insOrderTemplateService.selectInsOrderTemplateById(id));
    }
    @Operation(summary = "删除检验单模板")
    @DeleteMapping("/delInsOrderTemplate")
    public Result<?> delInsOrderTemplate(Integer id) {
        return Result.success(insOrderTemplateService.delInsOrderTemplate(id));
    }
    @Operation(summary = "通过检验单查询检验数据(数据查看)")
    @GetMapping("/selectSampleAndProductByOrderId")
    public Result<?> selectSampleAndProductByOrderId(Page page, SampleProductDto2 sampleProductDto){
        return Result.success(insOrderService.selectSampleAndProductByOrderId(page, sampleProductDto));
    }
    @Operation(summary = "撤销")
    @PostMapping("/updateStatus")
    public Result<?> updateStatus(@RequestBody Map<String, Object> param) {
        Integer id = (Integer) param.get("id");
        insOrderService.updateStatus(id);
        return Result.success();
    }
    //待检的撤销的查询待检项目
    @GetMapping("/selectNoProducts")
    public Result<?> selectNoProducts(Page page, InsProduct insProduct,Integer orderId ,String ids){
        return Result.success(insProductService.selectNoProducts(page, insProduct,orderId,ids));
    }
    //撤销审核,查询撤销的检测项
    @GetMapping("/getRevocationInsProductList")
    public Result<?> getRevocationInsProductList(@RequestParam("orderId") Integer orderId){
        return Result.success(insProductService.getRevocationInsProductList(orderId));
    }
    @Operation(summary = "待检的撤销")
    @PostMapping("/updateInspected")
    public Result<?> updateInspected(@RequestBody Map<String, Object> param){
        Integer orderId = (Integer) param.get("orderId");
        String ids = (String) param.get("ids");
        Integer typeSource = (Integer) param.get("typeSource");
        if(Objects.nonNull(typeSource) && typeSource == 1){
            Long ifsInventoryId = Long.parseLong(param.get("ifsInventoryId").toString());
            ifsInventoryQuantityMapper.update(null,new LambdaUpdateWrapper<IfsInventoryQuantity>()
                    .set(IfsInventoryQuantity::getState,0)
                    .eq(IfsInventoryQuantity::getId,ifsInventoryId));
            insOrderService.update(null,new LambdaUpdateWrapper<InsOrder>().set(InsOrder::getState,-1).eq(InsOrder::getId,orderId)); // æ’¤é”€
        }
        insProductService.updateInspected(orderId,ids);
        return Result.success();
    }
    @Operation(summary = "审核待检撤销")
    @PostMapping("/checkUpdate")
    public Result<?> checkUpdate(@RequestBody Map<String, Object> param){
        Integer orderId = (Integer) param.get("orderId");
        Integer state = (Integer) param.get("state");
        insProductService.checkUpdate(orderId,state);
        return Result.success();
    }
    @Operation(summary = "获取ifs订单")
    @GetMapping("/getIfsOrder")
    public Result<?> getIfsOrder() {
        HashMap<String, Object> map = new HashMap<>();
        map.put("LOCATION_NO","1302");
        map.put("STATE_DB","To be Inspected");
        insOrderService.getIfsOrder(map,false);
        return Result.success();
    }
    @Operation(summary = "修改订单单号")
    @PostMapping("/updateEntrustCode")
    public Result<?> updateEntrustCode(@RequestBody InsOrder insOrder) {
        insOrderService.updateEntrustCode(insOrder);
        return Result.success();
    }
    @Operation(summary = "查询不合格复测信息")
    @GetMapping("/getRetestResult")
    public Result<?> getRetestResult(Integer insProductId) {
        return Result.success(insOrderService.getRetestResult(insProductId));
    }
    @Operation(summary = "修改委托编号")
    @PostMapping("/updateOrderEntrustCode")
    public Result<?> updateOrderEntrustCode(@RequestBody InsOrder insOrder) {
        insOrderService.updateOrderEntrustCode(insOrder);
        return Result.success();
    }
    @Operation(summary = "修改检验下单内容")
    @PostMapping("/updateInsOrder")
    public Result<?> updateInsOrder(@RequestBody InsOrderUpdateDto insOrderUpdateDto) {
        return Result.success(insOrderService.updateInsOrder(insOrderUpdateDto));
    }
    @Operation(summary = "删除退回订单")
    @DeleteMapping("/delInsOrder")
    public Result<?> delInsOrder(Integer insOrderId) {
        // æŸ¥è¯¢è®¢å•
        InsOrder order = insOrderService.getById(insOrderId);
        if (!(order.getState().equals(2) || order.getState().equals(3))) {
            throw new ErrorException("只有退回订单才能删除");
        }
        return Result.success(insOrderService.removeById(insOrderId));
    }
    @Operation(summary = "成品标签打印")
    @PostMapping("/labelOrderPrinting")
    public Result<List<InsOrderPrintingVo>> labelOrderPrinting(@RequestBody Map<String, Object> param) {
        List<Integer> ids = (List<Integer>) param.get("ids");
        return Result.success(insOrderService.labelOrderPrinting(ids));
    }
    @Operation(summary = "根据订单id查询样品")
    @GetMapping("/getSampleByOrderId")
    public Result<List<InsSample>> getSampleByOrderId(Integer insOrderId) {
        return Result.success(insSampleService.getSampleByOrderId(insOrderId));
    }
    @Operation(summary = "根据样品id查询检验项树")
    @GetMapping("/getProductTreeBySampleId")
    public Result<List<StandardProductList>> getProductTreeBySampleId(Integer insSampleId) {
        return Result.success(insOrderService.getProductTreeBySampleId(insSampleId));
    }
    @Operation(summary = "添加遗漏的检验项")
    @PostMapping("/addOmitOrderProduct")
    public Result addOmitOrderProduct(@RequestBody OmitOrderProductDto omitOrderProductDto) {
        return Result.success(insOrderService.addOmitOrderProduct(omitOrderProductDto));
    }
    @Operation(summary = "成品检验单全部信息导出")
    @GetMapping("/rawAllInsOrderExport")
    public void rawAllInsOrderExport(SampleOrderDto sampleOrderDto, HttpServletResponse response){
        insOrderService.rawAllInsOrderExport(sampleOrderDto,response);
    }
    @Operation(summary = "修改样品型号")
    @PostMapping("/updateSampleModel")
    public Result<?> updateSampleModel(@RequestBody List<InsSample> insSampleList) {
        for (InsSample insSample : insSampleList) {
            insOrderService.updateSampleModel(insSample);
        }
        return Result.success();
    }
    @Operation(summary = "查询当前时间是否没有该检测项的抽样计划")
    @PostMapping("/judgeNotSpotCheckOrder")
    public Result<?> judgeNotSpotCheckOrder(@RequestBody InsPlaceOrderDto insPlaceOrderDto) {
        return insOrderService.judgeNotSpotCheckOrder(insPlaceOrderDto.getSampleList(), insPlaceOrderDto.getInsOrder());
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderPlanController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,303 @@
package com.ruoyi.inspect.controller;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
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.inspect.dto.InsOrderPlanDTO;
import com.ruoyi.inspect.dto.InsOrderPlanProductDto;
import com.ruoyi.inspect.dto.InsProductBindingDto;
import com.ruoyi.inspect.dto.SaveInsContextDto;
import com.ruoyi.inspect.dto.SaveOrderDevicesDto;
import com.ruoyi.inspect.dto.SaveTemplateContextDto;
import com.ruoyi.inspect.dto.VerifyPlanDto;
import com.ruoyi.inspect.dto.WriteInspectionConditionDto;
import com.ruoyi.inspect.pojo.InsOrder;
import com.ruoyi.inspect.pojo.InsOrderFactoryVerify;
import com.ruoyi.inspect.pojo.InsOrderFile;
import com.ruoyi.inspect.pojo.InsProduct;
import com.ruoyi.inspect.service.InsOrderFileService;
import com.ruoyi.inspect.service.InsOrderPlanService;
import com.ruoyi.inspect.service.InsOrderRatesService;
import com.ruoyi.inspect.service.InsProductService;
import com.ruoyi.performance.dto.AuxiliaryOutputWorkingHoursTemporaryDto;
import com.ruoyi.performance.pojo.AuxiliaryOutputWorkingHoursTemporary;
import com.ruoyi.performance.service.AuxiliaryOutputWorkingHoursTemporaryService;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import lombok.AllArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * æ£€éªŒä»»åŠ¡-控制层
 */
@RestController
@RequestMapping("/insOrderPlan")
@Tag(name = "检验任务")
@AllArgsConstructor
public class InsOrderPlanController {
    private InsOrderPlanService insOrderPlanService;
    private InsOrderFileService insOrderFileService;
    private InsProductService insProductService;
    private AuxiliaryOutputWorkingHoursTemporaryService auxiliaryOutputWorkingHoursTemporaryService;
    @Operation(summary = "获取检验任务列表")
    @GetMapping("/selectInsOrderPlanList")
    public Result selectInsOrderPlanList(Page page, InsOrderPlanDTO insOrderPlanDTO){
        return Result.success(insOrderPlanService.selectInsOrderPlanList(page, insOrderPlanDTO));
    }
    @Operation(summary = "检验单详情-任务切换")
    @GetMapping("/inspectionOrderDetailsTaskSwitching")
    public Result inspectionOrderDetailsTaskSwitching(Page page, InsOrderPlanDTO insOrderPlanDTO) throws Exception {
        return Result.success(insOrderPlanService.inspectionOrderDetailsTaskSwitching(page, insOrderPlanDTO));
    }
    @Operation(summary = "认领任务计划")
    @PostMapping("/claimInsOrderPlan")
    public Result claimInsOrderPlan(@RequestBody InsOrderPlanDTO data) {
        return Result.success(insOrderPlanService.claimInsOrderPlan(data));
    }
    @Operation(summary = "查询检验操作")
    @GetMapping("/doInsOrder")
    public Result<?> doInsOrder(Integer id, String laboratory) {
        return Result.success(insOrderPlanService.doInsOrder(id, laboratory));
    }
    @Operation(summary = "获取检验项目和模板内容")
    @GetMapping("/getInsProduct")
    public Result<?> getInsProduct(InsOrderPlanProductDto insOrderPlanProductDto) {
        return Result.success(insOrderPlanService.getInsProduct(insOrderPlanProductDto));
    }
    @Operation(summary = "任务交接")
    @PostMapping("/upPlanUser")
    public Result<?> upPlanUser(Integer userId, Integer orderId, String sonLaboratory) {
        return Result.success(insOrderPlanService.upPlanUser(userId, orderId, sonLaboratory));
    }
    @Operation(summary = "判断交接的试验室")
    @GetMapping("/upPlanUser2")
    public Result<?> upPlanUser2(Integer orderId) {
        return Result.success(insOrderPlanService.upPlanUser2(orderId));
    }
    @Operation(summary = "复核检验任务")
    @PostMapping("/verifyPlan")
    public Result<?> verifyPlan(@RequestBody VerifyPlanDto verifyPlanDto) {
        return Result.success(insOrderPlanService.rawMaterialVerifyPlan(verifyPlanDto));
    }
    @Operation(summary = "校验检验任务提交")
    @PostMapping("/checkSubmitPlan")
    public Result<?> checkSubmitPlan(Integer orderId, String laboratory) {
        return Result.success(insOrderPlanService.checkSubmitPlan(orderId, laboratory));
    }
    @Operation(summary = "检验任务提交")
    @PostMapping("/submitPlan")
    public Result<?> submitPlan(Integer orderId, String laboratory, Integer verifyUser, String entrustCode, Boolean registerInsResults) {
        int num = insOrderPlanService.submitPlan(orderId, laboratory, verifyUser, entrustCode, registerInsResults);
        return num == 1 ? Result.success() : Result.fail("提交失败,部分项目还未进行检验");
    }
    @Operation(summary = "保存检验内容")
    @PostMapping("/saveInsContext")
    public Result<?> saveInsContext(@RequestBody SaveInsContextDto saveInsContextDto) {
        insOrderPlanService.saveInsContext(saveInsContextDto);
        return Result.success();
    }
    @Operation(summary = "按模板坐标保存新聚原始记录")
    @PostMapping("/saveTemplateContext")
    public Result<?> saveTemplateContext(@RequestBody SaveTemplateContextDto saveTemplateContextDto) {
        insOrderPlanService.saveTemplateContext(saveTemplateContextDto);
        return Result.success();
    }
    @Operation(summary = "查询检验单选择的设备")
    @GetMapping("/orderDevices")
    public Result<?> getOrderDevices(Integer orderId) {
        return Result.success(insOrderPlanService.getOrderDeviceIds(orderId));
    }
    @Operation(summary = "保存检验单选择的设备")
    @PutMapping("/orderDevices")
    public Result<?> saveOrderDevices(@RequestBody SaveOrderDevicesDto saveOrderDevicesDto) {
        insOrderPlanService.saveOrderDevices(saveOrderDevicesDto);
        return Result.success();
    }
    @Operation(summary = "查看检验单下的附件列表")
    @GetMapping("/getFileList")
    public Result<?> getFileList(Page page, InsOrderFile insOrderFile) throws Exception {
        return Result.success(insOrderPlanService.getFileList(page, insOrderFile));
    }
    @Operation(summary = "上传附件")
    @PreAuthorize("@ss.hasPermi('upload:order:file')")
    @PostMapping("/uploadFile")
    public Result<?> taskUploadFile(Integer orderId, MultipartFile file) {
        return Result.success(insOrderPlanService.uploadFile(orderId, file));
    }
    @Operation(summary = "删除附件")
    @PreAuthorize("@ss.hasPermi('del:order:file')")
    @DeleteMapping("/delfile")
    public Result<?> delfile(Integer id) {
        return Result.success(insOrderFileService.removeById(id));
    }
    @Operation(summary = "下载附件")
    @GetMapping("/downFile")
    public Result<?> downFile(Integer id) {
        InsOrderFile insOrderFile = insOrderFileService.getById(id);
        HashMap<String, Object> map = new HashMap<>();
        map.put("type", insOrderFile.getType());
        map.put("fileUrl", insOrderFile.getFileUrl());
        return Result.success(map);
    }
    @Operation(summary = "填写温度与湿度")
    @PostMapping("/write")
    public Result<?> write(@RequestBody WriteInspectionConditionDto dto) {
        return Result.success(insProductService.write(dto));
    }
    @Operation(summary = "电缆配置,查看配置标识")
    @GetMapping("/getCableTag")
    public Result<?> getCableTag(Integer id, String laboratory) {
        return Result.success(insOrderPlanService.getCableTag(id, laboratory));
    }
    @Operation(summary = "原材料,查看配置标识")
    @GetMapping("/getRawMaterialTag")
    public Result<?> getRawMaterialTag(Integer id, String laboratory) {
        return Result.success(insOrderPlanService.getRawMaterialTag(id, laboratory));
    }
    @Operation(summary = "查看重复标识")
    @GetMapping("/getRepetitionTag")
    public Result<?> getRepetitionTag(Integer id, String laboratory, String cableTag) {
        return Result.success(insOrderPlanService.getRepetitionTag(id, laboratory, cableTag));
    }
    @Operation(summary = "新增不合格复测信息")
    @PostMapping("/addUnqualifiedRetest")
    public Result<?> addDisqualificationRetest(@RequestBody List<InsProduct> insProductsList) {
        return Result.success(insOrderPlanService.addDisqualificationRetest(insProductsList));
    }
    @Operation(summary = "获取不合格复测数据")
    @GetMapping("/getInsProductUnqualifiedRetest")
    public Result<?> getInsProductUnqualifiedRetest(InsOrderPlanProductDto insOrderPlanProductDto) {
        return Result.success(insOrderPlanService.getInsProductUnqualifiedRetest(insOrderPlanProductDto));
    }
    /**
     *
     * @return
     */
    @Operation(summary = "保存 ä¸åˆæ ¼å¤æµ‹æ£€éªŒå†…容")
    @PostMapping("/saveUnqualifiedContext")
    public Result<?> saveUnqualifiedContext(@RequestBody SaveInsContextDto saveInsContextDto) {
        Map<String, Object> param2 = JSON.parseObject(saveInsContextDto.getParam(), Map.class);
        insOrderPlanService.saveUnqualifiedContext(param2, saveInsContextDto.getCurrentTable(), saveInsContextDto.getSampleId(), saveInsContextDto.getOrderId(), saveInsContextDto.getSonLaboratory());
        return Result.success();
    }
    @Operation(summary = "查询原材料进货验证")
    @GetMapping("/getFactoryVerify")
    public Result<?> getFactoryVerify(Integer insOrderId) {
        return Result.success(insOrderPlanService.getFactoryVerify(insOrderId));
    }
    @Operation(summary = "保存原材料进货验证")
    @PostMapping("/addFactoryVerify")
    public Result<?> addFactoryVerify(@RequestBody InsOrderFactoryVerify factoryVerify) {
        return Result.success(insOrderPlanService.addFactoryVerify(factoryVerify));
    }
    @Operation(summary = "修改检验项内容")
    @PreAuthorize("@ss.hasPermi('update:product:onPlan')")
    @PostMapping("/updateProductOnPlan")
    public Result<?> updateProductOnPlan(@RequestBody InsProduct insProduct) {
        insProductService.updateById(insProduct);
        return Result.success();
    }
    @Operation(summary = "根据检验项id查询检验项树信息")
    @GetMapping("/getProductTreeByProductId")
    public Result<List<InsProduct>> getProductTreeByProductId(Integer productId) {
        return Result.success(insProductService.getProductTreeByProductId(productId));
    }
    @Operation(summary = "特殊检验项绑定")
    @PostMapping("/bindingProductTreeByProductId")
    public Result<?> bindingProductTreeByProductId(@RequestBody InsProductBindingDto insProductBindingDto) {
        return Result.success(insProductService.bindingProductTreeByProductId(insProductBindingDto));
    }
    @Operation(summary = "特殊检验项绑定查询")
    @GetMapping("/getBindingProductByProductId")
    public Result<List<InsProduct>> getBindingProductByProductId(Integer productId) {
        return Result.success(insProductService.list(Wrappers.<InsProduct>lambdaQuery()
                .eq(InsProduct::getBindingProductId, productId)
                .orderByAsc(InsProduct::getSort)));
    }
    @Operation(summary = "删除特殊检验项绑定信息")
    @DeleteMapping("/delProductTreeByProductId")
    public Result<?> delProductTreeByProductId(Integer productId) {
        return Result.success(insProductService.removeBindingProductTree(productId));
    }
    /**
     * æ ¹æ®è®¢å•查询工时详情
     * @return
     */
    @Operation(summary = "根据订单查询工时详情")
    @PreAuthorize("@ss.hasPermi('get:working:hours:byOrder')")
    @GetMapping("/getWorkingHoursByOrderId")
    public Result<IPage<AuxiliaryOutputWorkingHoursTemporaryDto>> getWorkingHoursByOrderId(Page page, AuxiliaryOutputWorkingHoursTemporaryDto workingHoursTemporary) {
        return Result.success(auxiliaryOutputWorkingHoursTemporaryService.getWorkingHoursByOrderId(page, workingHoursTemporary));
    }
    /**
     * ä¿®æ”¹å·¥æ—¶è¯¦æƒ…
     * @return
     */
    @Operation(summary = "修改工时详情")
    @PreAuthorize("@ss.hasPermi('update:order:workingHours')")
    @PostMapping("/updateWorkingHours")
    public Result updateWorkingHours(@RequestBody AuxiliaryOutputWorkingHoursTemporary workingHoursTemporary) {
        return Result.success(auxiliaryOutputWorkingHoursTemporaryService.updateById(workingHoursTemporary));
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderRatesController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
package com.ruoyi.inspect.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.inspect.dto.SampleOrderDto;
import com.ruoyi.inspect.service.InsOrderRatesService;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
/**
 * è®¢å•费用表
 *
 * @author zhuo
 * @since 2025-02-28
 */
@Tag(name = "订单费用信息")
@RestController
@RequestMapping("/insOrderRates")
public class InsOrderRatesController  {
    @Resource
    private InsOrderRatesService insOrderRatesService;
    /**
     * æŸ¥è¯¢è®¢å•列表
     * @param page
     * @param sampleOrderDto
     * @return
     */
    @Operation(summary = "查询订单列表")
    @GetMapping("/selectRatesPage")
    public Result selectInsOrderRates(Page page, SampleOrderDto sampleOrderDto) {
        return Result.success(insOrderRatesService.selectInsOrderRates(page, sampleOrderDto));
    }
    /**
     * æŸ¥è¯¢è®¢å•列表
     * @param insOrderId
     * @return
     */
    @Operation(summary = "查询订单费用详情")
    @GetMapping("/selectRatesDetail")
    public Result selectRatesDetail(Page page, Integer insOrderId) {
        return Result.success(insOrderRatesService.selectTemplateRatesDetail(page, insOrderId));
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/controller/InsProductDeviationWarningController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
package com.ruoyi.inspect.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
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.inspect.dto.InsProductDeviationWarningDto;
import com.ruoyi.inspect.dto.SampleOrderDto;
import com.ruoyi.inspect.pojo.InsProductDeviationWarningDetail;
import com.ruoyi.inspect.service.InsProductDeviationWarningDetailService;
import com.ruoyi.inspect.service.InsProductDeviationWarningService;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
 * <p>
 * æ£€éªŒé¡¹åå·®é¢„警主表 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author
 * @since 2025-03-28 02:18:02
 */
@RestController
@RequestMapping("/insProductDeviationWarning")
@AllArgsConstructor
@Tag(name = "检验项偏差预警")
public class InsProductDeviationWarningController {
    private InsProductDeviationWarningService insProductDeviationWarningService;
    private InsProductDeviationWarningDetailService insProductDeviationWarningDetailService;
    /**
     * æŸ¥è¯¢é¢„警列表
     * @param page
     * @return
     * @throws Exception
     */
    @Operation(summary = "查询预警列表")
    @GetMapping("/selectDeviationWarningPage")
    public Result<IPage<InsProductDeviationWarningDto>> selectDeviationWarningPage(Page page, InsProductDeviationWarningDto deviationWarningDto) {
        return Result.success(insProductDeviationWarningService.selectDeviationWarningPage(page, deviationWarningDto));
    }
    /**
     * æŸ¥è¯¢é¢„警详情
     * @return
     * @throws Exception
     */
    @Operation(summary = "查询预警详情")
    @GetMapping("/selectDeviationWarning")
    public Result<List<InsProductDeviationWarningDetail>> selectDeviationWarning(Integer deviationWarningId){
        return Result.success(insProductDeviationWarningDetailService.list(Wrappers.<InsProductDeviationWarningDetail>lambdaQuery()
                .eq(InsProductDeviationWarningDetail::getDeviationWarningId, deviationWarningId)));
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/controller/InsReportController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,205 @@
package com.ruoyi.inspect.controller;
import cn.hutool.core.io.FileUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.dto.IfsInventoryQuantitySupplierDto;
import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.annotation.PersonalScope;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.inspect.dto.ReportPageDto;
import com.ruoyi.inspect.service.InsOrderPlanService;
import com.ruoyi.inspect.service.InsReportService;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Map;
import java.util.Objects;
import java.util.Scanner;
@RestController
@RequestMapping("/insReport")
@Tag(name = "检验报告")
public class InsReportController {
    @Resource
    private InsReportService insReportService;
    @Resource
    private InsOrderPlanService insOrderPlanService;
    @Value("${wordUrl}")
    private String wordUrl;
    @Operation(summary = "查询检验报告数据")
    @GetMapping("/pageInsReport")
    @PreAuthorize("@ss.hasPermi('business:reportPreparation')")
    @PersonalScope(permsName = "business:reportPreparation", objectName = ReportPageDto.class, paramName = "createOrderUser")
    public Result pageInsReport(Page page, ReportPageDto reportPageDto){
        return Result.success(insReportService.pageInsReport(page, reportPageDto));
    }
    @Operation(summary = "报告上传")
    @PostMapping("/inReport")
    public Result inReport(MultipartFile file, Integer id) {
        String urlString;
        String pathName;
        try {
            String path = wordUrl;
            File realpath = new File(path);
            if (!realpath.exists()) {
                realpath.mkdirs();
            }
            pathName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) + "_" + file.getOriginalFilename();
            urlString = realpath + "/" + pathName;
            file.transferTo(new File(urlString));
            return Result.success(insReportService.inReport("/word/" + pathName, id));
        } catch (Exception e) {
            throw new ErrorException("文件上传失败");
        }
    }
    @Operation(summary = "报告还原")
    @PostMapping("/upReportUrl")
    public Result upReportUrl(@RequestBody Map<String, Object> param) {
        Integer id = (Integer) param.get("id");
        return Result.success(insReportService.upReportUrl(id));
    }
    @Operation(summary = "报告在线编制")
    @GetMapping("/upReportFile")
    public Result upReportFile() {
        return Result.success();
    }
    @Operation(summary = "提交")
    @PostMapping("/writeReport")
    public Result writeReport(@RequestBody Map<String, Object> param) {
        Integer id = (Integer) param.get("id");
        Integer userId = (Integer) param.get("userId");
        return Result.success(insReportService.writeReport(id, userId, null));
    }
    /**
     * @param userId éœ€è¦çš„æ‰¹å‡†äºº
     * @return
     */
    @Operation(summary = "审核")
    @PostMapping("/examineReport")
    public Result examineReport(@RequestBody Map<String, Object> param) {
        Integer id = (Integer) param.get("id");
        Integer isExamine = (Integer) param.get("isExamine");
        String examineTell = (String) param.get("examineTell");
        Integer userId = (Integer) param.get("userId");
        return Result.success(insReportService.examineReport(id, isExamine, examineTell, userId));
    }
    @Operation(summary = "批准")
    @PostMapping("/ratifyReport")
    public Result ratifyReport(@RequestBody Map<String, Object> param) {
        Integer id = (Integer) param.get("id");
        Integer isRatify = (Integer) param.get("isRatify");
        String ratifyTell = (String) param.get("ratifyTell");
        return Result.success(insReportService.ratifyReport(id, isRatify, ratifyTell));
    }
    @Anonymous
    @RequestMapping("/onlyOffice/save")
    public void saveFile(@RequestParam String fileName, HttpServletRequest request, HttpServletResponse response) {
        PrintWriter writer = null;
        try {
            writer = response.getWriter();
            // èŽ·å–ä¼ è¾“çš„json数据
            Scanner scanner = new Scanner(request.getInputStream()).useDelimiter("\\A");
            String body = scanner.hasNext() ? scanner.next() : "";
            JSONObject jsonObject = JSONObject.parseObject(body);
            if (jsonObject.containsKey("url")) {
                String jsonArray = jsonObject.get("lastsave").toString(); // æ›´æ–°æ—¶é—´
                String fileUrl = jsonObject.get("url").toString(); // æ›´æ–°æ–‡ä»¶url
                HttpUtil.downloadFile(fileUrl, FileUtil.file(wordUrl + "/" + fileName));
            }
        } catch (Exception e) {
            e.printStackTrace();
            writer.write("{\"error\":-1}");
            return;
        }
        /*
         * status = 1,我们给onlyOffice的服务返回{"error":"0"}的信息。
         * è¿™æ ·onlyOffice会认为回调接口是没问题的,这样就可以在线编辑文档了,否则的话会弹出窗口说明
         */
        if (Objects.nonNull(writer)) {
            writer.write("{\"error\":0}");
        }
    }
    @Operation(summary = "报告批量下载")
    @GetMapping("/downAll")
    public Result downAll(String ids) {
        return Result.success(insReportService.downAll(ids));
    }
    @Operation(summary = "报告下载(reportType:0检测报告,1检验报告)")
    @GetMapping("/download")
    @PreAuthorize("@ss.hasPermi('business:reportPreparation')")
    @PersonalScope(permsName = "business:reportPreparation", objectName = ReportPageDto.class, paramName = "createOrderUser")
    public void download(Integer id, Integer reportType, ReportPageDto reportPageDto, HttpServletResponse response) {
        insReportService.download(id, reportType, reportPageDto.getCreateOrderUser(), response);
    }
    @Operation(summary = "重新生成报告")
    @PostMapping("/regenerate")
//    @PreAuthorize("@ss.hasPermi('business:reportPreparation')")
    @PersonalScope(permsName = "business:reportPreparation", objectName = ReportPageDto.class, paramName = "createOrderUser")
    public Result regenerate(@RequestBody ReportPageDto reportPageDto) {
        insOrderPlanService.regenerateReport(reportPageDto.getId(), reportPageDto.getCreateOrderUser());
        return Result.success();
    }
    @Operation(summary = "报告批量上传")
    @PostMapping("/upAll")
    public Result upAll(MultipartFile file) throws IOException {
        return Result.success(insReportService.upAll(file));
    }
    /**
     * é€€å›žåˆ°æ£€éªŒä»»åŠ¡
     * @param id
     * @return
     */
    @Operation(summary = "退回到检验任务")
    @PostMapping("/sendBackTask")
    public Result sendBackTask(@RequestBody Map<String, Object> param){
        Integer id = (Integer) param.get("id");
        return Result.success(insReportService.sendBackTask(id));
    }
    /**
     * æŠ¥å‘Šå¯¼å‡º
     * @param dto
     * @param response
     * @throws Exception
     */
    @Operation(summary = "报告导出")
    @GetMapping("/reportAllExport")
    @PreAuthorize("@ss.hasPermi('business:reportPreparation')")
    @PersonalScope(permsName = "business:reportPreparation", objectName = ReportPageDto.class, paramName = "createOrderUser")
    public void reportAllExport(ReportPageDto dto, HttpServletResponse response) throws Exception {
        insReportService.reportAllExport(dto,response);
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/controller/InsSampleReceiptController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
package com.ruoyi.inspect.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.inspect.dto.SampleReceiptActionDto;
import com.ruoyi.inspect.dto.SampleReceiptQueryDto;
import com.ruoyi.inspect.service.InsSampleReceiptService;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import jakarta.servlet.http.HttpServletResponse;
@RestController
@RequestMapping("/insSampleReceipt")
@Tag(name = "样品接收")
@AllArgsConstructor
public class InsSampleReceiptController {
    private final InsSampleReceiptService insSampleReceiptService;
    @Operation(summary = "样品接收分页")
    @GetMapping("/page")
    public Result page(Page<?> page, SampleReceiptQueryDto query) {
        return Result.success(insSampleReceiptService.page(page, query));
    }
    @Operation(summary = "样品接收详情")
    @GetMapping("/{id}")
    public Result detail(@PathVariable Integer id) {
        return Result.success(insSampleReceiptService.detail(id));
    }
    @Operation(summary = "提交检验")
    @PostMapping("/submit")
    public Result submit(@RequestBody SampleReceiptActionDto dto) {
        insSampleReceiptService.submit(dto);
        return Result.success();
    }
    @Operation(summary = "拒收样品")
    @PostMapping("/reject")
    public Result reject(@RequestBody SampleReceiptActionDto dto) {
        insSampleReceiptService.reject(dto);
        return Result.success();
    }
    @Operation(summary = "样品接收导出")
    @GetMapping("/export")
    public void export(SampleReceiptQueryDto query, HttpServletResponse response) {
        insSampleReceiptService.export(query, response);
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/controller/InsUnqualifiedHandlerController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,82 @@
package com.ruoyi.inspect.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.inspect.dto.UnqualifiedHandlerDto;
import com.ruoyi.inspect.pojo.InsUnqualifiedHandlerFile;
import com.ruoyi.inspect.service.InsUnqualifiedHandlerFileService;
import com.ruoyi.inspect.service.InsUnqualifiedHandlerService;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.HashMap;
@RestController
@Tag(name = "不合格处理管理")
@RequestMapping("/unqualifiedHandler")
@AllArgsConstructor
@Slf4j
public class InsUnqualifiedHandlerController {
    private final InsUnqualifiedHandlerService unqualifiedHandlerService;
    private final InsUnqualifiedHandlerFileService unqualifiedHandlerFileService;
    @Operation(summary = "查询")
    @GetMapping("/page")
    public Result pageByUnqualified(Page page, UnqualifiedHandlerDto unqualifiedHandlerDto){
        return Result.success(unqualifiedHandlerService.pageList(page, unqualifiedHandlerDto));
    }
    @Operation(summary = "附件上传")
    @PostMapping("/uploadFileByUnqualified")
    public Result<?> uploadFileByUnqualified(Long handlerId, MultipartFile file) {
        return Result.success(unqualifiedHandlerFileService.uploadFile(handlerId, file));
    }
    @Operation(summary = "新增不合格处理")
    @PostMapping("/addUnqualifiedHandler")
    public Result addUnqualifiedHandler(@RequestBody UnqualifiedHandlerDto unqualifiedHandlerDto){
        return Result.success(unqualifiedHandlerService.addUnqualifiedHandler(unqualifiedHandlerDto));
    }
    @Operation(summary = "编辑不合格处理")
    @PostMapping("/updateUnqualifiedHandler")
    public Result updateUnqualifiedHandler(@RequestBody UnqualifiedHandlerDto unqualifiedHandlerDto){
        return Result.success(unqualifiedHandlerService.updateUnqualifiedHandler(unqualifiedHandlerDto));
    }
    @Operation(summary = "查看不合格处理界面")
    @GetMapping("/getUnqualifiedHandler")
    public Result getUnqualifiedHandler(Integer id){
        return Result.success(unqualifiedHandlerService.getUnqualifiedHandler(id));
    }
    @Operation(summary = "删除不合格处理")
    @DeleteMapping("/deleteUnqualifiedHandler")
    public Result deleteUnqualifiedHandler(Integer id) {
        return Result.success(unqualifiedHandlerService.deleteUnqualifiedHandler(id));
    }
    @Operation(summary = "下载附件")
    @GetMapping("/downFile")
    public Result<?> oaDownFile(Integer id) {
        InsUnqualifiedHandlerFile insUnqualifiedHandlerFile = unqualifiedHandlerFileService.getById(id);
        HashMap<String, Object> map = new HashMap<>();
        map.put("type", insUnqualifiedHandlerFile.getType());
        map.put("fileUrl", insUnqualifiedHandlerFile.getFileUrl());
        return Result.success(map);
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/controller/OutsourcingFinishProductInspectionController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
package com.ruoyi.inspect.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.dto.IfsInventoryQuantityDto;
import com.ruoyi.basic.dto.IfsInventoryQuantitySupplierDto;
import com.ruoyi.basic.pojo.IfsInventoryQuantity;
import com.ruoyi.common.annotation.PersonalScope;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.inspect.service.OutsourcingFinishProductInspectionService;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.beans.factory.annotation.Autowired;
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;
/**
 * å¤–购成品检验controller
 */
@RestController
@RequestMapping("/outsourcingFinishProduct")
public class OutsourcingFinishProductInspectionController {
    @Autowired
    private OutsourcingFinishProductInspectionService outsourcingFinishProductInspectionService;
    @Operation(summary = "仓库报检查询")
    @GetMapping("/getWarehouseSubmit")
    public Result getWarehouseSubmit(Page page, IfsInventoryQuantity ifsInventoryQuantity) {
        return Result.success(outsourcingFinishProductInspectionService.getWarehouseSubmit(page, ifsInventoryQuantity));
    }
    @Operation(summary = "外购成品检验查询检验中")
    @GetMapping("/getIfsByStateOne")
    @PreAuthorize("@ss.hasPermi('business:order')")
    @PersonalScope(permsName = "business:order", objectName = IfsInventoryQuantityDto.class, paramName = "createUser")
    public Result getIfsByStateOne(Page page, IfsInventoryQuantityDto ifsInventoryQuantityDto){
        return Result.success(outsourcingFinishProductInspectionService.getIfsByStateOne(page, ifsInventoryQuantityDto));
    }
    @Operation(summary = "外购成品检验查询已检验")
    @GetMapping("/getIfsByOver")
    @PreAuthorize("@ss.hasPermi('business:order')")
    @PersonalScope(permsName = "business:order", objectName = IfsInventoryQuantitySupplierDto.class, paramName = "createUser")
    public Result getIfsByOver(Page page, IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto){
        return Result.success(outsourcingFinishProductInspectionService.getIfsByOver(page, ifsInventoryQuantityDto));
    }
    @Operation(summary = "原材料报检查询全部")
    @PreAuthorize("@ss.hasPermi('get:Ifs:ByAll')")
    @GetMapping("/getIfsByAll")
    public Result getIfsByAll(Page page, IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto){
        return Result.success(outsourcingFinishProductInspectionService.getIfsByOver(page, ifsInventoryQuantityDto));
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/controller/RawMaterialOrderController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,367 @@
package com.ruoyi.inspect.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.dto.IfsInventoryQuantityCheckDto;
import com.ruoyi.basic.dto.IfsInventoryQuantityDto;
import com.ruoyi.basic.dto.IfsInventoryQuantitySupplierDto;
import com.ruoyi.basic.pojo.IfsInventoryQuantity;
import com.ruoyi.common.annotation.PersonalScope;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.enums.OrderType;
import com.ruoyi.common.utils.WxCpUtils;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.inspect.dto.InsPlaceOrderDto;
import com.ruoyi.inspect.dto.OrderSplitDTO;
import com.ruoyi.inspect.pojo.RawMaterialOrderTemplate;
import com.ruoyi.inspect.service.InsOrderService;
import com.ruoyi.inspect.service.RawMaterialOrderService;
import com.ruoyi.inspect.service.RawMaterialOrderTemplateService;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import lombok.AllArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.File;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
 * @Author zhuo
 * @Date 2024/7/31
 */
@RequestMapping("/rawMaterialOrder")
@RestController
@AllArgsConstructor
@Tag(name = "原材料下单")
public class RawMaterialOrderController {
    private InsOrderService insOrderService;
    private RawMaterialOrderService rawMaterialOrderService;
    private RawMaterialOrderTemplateService rawMaterialOrderTemplateService;
    @Operation(summary = "更具零件号获取标准树")
    @GetMapping("/selectStandardTreeListByPartNo")
    public Result selectStandardTreeListByPartNo(String partNo) {
        return rawMaterialOrderService.selectStandardTreeListByPartNo(partNo);
    }
    @Operation(summary = "原材料检验查询代下单")
    @GetMapping("/getPurchaseOrder")
    public Result getPurchaseOrder(Page page, IfsInventoryQuantityCheckDto ifsInventoryQuantity){
        return Result.success(rawMaterialOrderService.selectIfsInventoryQuantity(page, ifsInventoryQuantity));
    }
    @Operation(summary = "原材料检验查询检验中")
    @GetMapping("/getIfsByStateOne")
    @PreAuthorize("@ss.hasPermi('business:order')")
    @PersonalScope(permsName = "business:order", objectName = IfsInventoryQuantityDto.class, paramName = "createUser")
    public Result getIfsByStateOne(Page page, IfsInventoryQuantityDto ifsInventoryQuantityDto){
        return Result.success(rawMaterialOrderService.getIfsByStateOne(page, ifsInventoryQuantityDto));
    }
    @Operation(summary = "原材料检验查询已检验")
    @GetMapping("/getIfsByOver")
    @PreAuthorize("@ss.hasPermi('business:order')")
    @PersonalScope(permsName = "business:order", objectName = IfsInventoryQuantitySupplierDto.class, paramName = "createUser")
    public Result getIfsByOver(Page page, IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto){
        return Result.success(rawMaterialOrderService.getIfsByOver(page, ifsInventoryQuantityDto));
    }
    @Operation(summary = "添加原材料检验单模板")
    @PostMapping("/addRawMaterOrderTemplate")
    public Result<?> addRawMaterOrderTemplate(@RequestBody RawMaterialOrderTemplate rawMaterialOrderTemplate) {
        return Result.success(rawMaterialOrderTemplateService.addRawMaterOrderTemplate(rawMaterialOrderTemplate));
    }
    @Operation(summary = "查询原材料检验单模板列表")
    @GetMapping("/selectRawMaterOrderTemplate")
    public Result<?> selectRawMaterOrderTemplate(String partNo) {
        return Result.success(rawMaterialOrderTemplateService.selectRawMaterOrderTemplate(partNo));
    }
    @Operation(summary = "通过原材料检验单模板id获取检验单模板内容")
    @GetMapping("/selectRawMaterOrderTemplateById")
    public Result<?> selectRawMaterOrderTemplateById(Integer id) {
        return Result.success(rawMaterialOrderTemplateService.selectRawMaterOrderTemplateById(id));
    }
    @Operation(summary = "删除原材料检验单模板")
    @DeleteMapping("/delRawMaterOrderTemplate")
    public Result<?> delRawMaterOrderTemplate(Integer id) {
        return Result.success(rawMaterialOrderTemplateService.delRawMaterOrderTemplate(id));
    }
    /**
     * æŠ¥æ£€æ‰¹é‡
     * @param param åŽŸææ–™id
     * @return
     */
    @Operation(summary = "报检批量")
    @PostMapping("/inspectionReport")
    public Result<?> inspectionReport(@RequestBody Map<String, Object> param) {
        List<Long> ids = (List<Long>) param.get("ids");
        String orderType = Objects.nonNull(param.get("orderType"))?param.get("orderType").toString():"";
        String materialProp = Objects.nonNull(param.get("materialProp"))?param.get("materialProp").toString():"";
        if(!OrderType.validateValue(orderType)){
            throw new ErrorException("批量报检失败,非法的销售订单分类枚举");
        }
        return Result.success(rawMaterialOrderService.inspectionReport(ids,orderType,materialProp));
    }
    /**
     * å–消报检
     * @param param
     * @return
     */
    @Operation(summary = "撤销报检")
    @PostMapping("/revokeInspectionReport")
    public Result<?> revokeInspectionReport(@RequestBody Map<String, Object> param) {
        Long id = Long.parseLong(param.get("id").toString());
        return Result.success(rawMaterialOrderService.revokeInspectionReport(id));
    }
    /**
     * æ‰“印标签查询
     * @param param åŽŸææ–™id
     * @return
     */
    @Operation(summary = "打印标签查询")
    @PostMapping("/printLabel")
    public Result<?> printLabel(@RequestBody Map<String, Object> param) {
        List<Integer> ids = (List<Integer>) param.get("ids");
        return Result.success(rawMaterialOrderService.printLabel(ids));
    }
    /**
     * æŠ¥æ£€
     * @param ifsInventoryQuantity åŽŸææ–™
     * @return
     */
    @Operation(summary = "报检")
    @PostMapping("/inspectionReportOne")
    public Result<?> inspectionReportOne(@RequestBody IfsInventoryQuantity ifsInventoryQuantity) {
        return Result.success(rawMaterialOrderService.inspectionReportOne(ifsInventoryQuantity));
    }
    /**
     * èŽ·å–é“œäº§ä¸šé“¾æ£€æµ‹æ•°æ®
     * @param id åŽŸææ–™id
     * @return
     */
    @Operation(summary = "获取铜产业链检测数据")
    @GetMapping("/getIndustryChain")
    public Result<?> getIndustryChain(Integer id) {
        return Result.success(rawMaterialOrderService.getIndustryChain(id));
    }
    /**
     * åŽŸææ–™æ’¤é”€
     * @param param
     * @return
     */
    @Operation(summary = "原材料撤销下单")
    @GetMapping("/repealRawOrder")
    public Result<?> repealRawOrder(@RequestBody Map<String, Object> param){
        Long ifsInventoryId = Long.parseLong(param.get("ifsInventoryId").toString());
        return Result.success(rawMaterialOrderService.repealRawOrder(ifsInventoryId));
    }
    @Operation(summary = "原材料下单免检")
    @PostMapping("/addExemptionOrder")
    public Result<?> addExemptionOrder(@RequestBody InsPlaceOrderDto insPlaceOrderDto) {
        return Result.success(rawMaterialOrderService.addExemptionOrder(insPlaceOrderDto.getSampleList(), insPlaceOrderDto.getInsOrder()));
    }
    @Operation(summary = "仓库报检查询")
    @GetMapping("/getWarehouseSubmit")
    public Result getWarehouseSubmit(Page page, IfsInventoryQuantity ifsInventoryQuantity) {
        return Result.success(rawMaterialOrderService.getWarehouseSubmit(page, ifsInventoryQuantity));
    }
    /**
     * å–消报检
     * @param id
     * @return
     */
    @Operation(summary = "删除原材料报检信息")
    @DeleteMapping("/delIfsInventory")
    public Result<?> delIfsInventory(Integer id) {
        return Result.success(rawMaterialOrderService.delIfsInventory(id));
    }
    /**
     * åŽŸææ–™ä¸‹å•æ”¾è¡Œ
     * @param param
     * @return
     */
    @Operation(summary = "原材料下单放行免检")
    @PostMapping("/rawOrderRelease")
    public Result<?> rawOrderRelease(@RequestBody Map<String, Object> param){
        Long ifsInventoryId = Long.parseLong(param.get("ifsInventoryId").toString());
        String partDetail = (String) param.get("partDetail");
        return Result.success(rawMaterialOrderService.rawOrderRelease(ifsInventoryId, partDetail));
    }
    /**
     * åŽŸææ–™ä¸‹å•é€šçŸ¥å…æ£€æˆ–è€…å¤šæ¬¡æ£€éªŒ
     * @param ifsInventoryId
     * @return
     */
    @Operation(summary = "原材料下单通知免检或者多次检验")
    @GetMapping("/notificationRawOrder")
    public Result<?> notificationRawOrder(Long ifsInventoryId){
        return Result.success(rawMaterialOrderService.notificationRawOrder(ifsInventoryId));
    }
    @Operation(summary = "原材料报检查询全部")
    @PreAuthorize("@ss.hasPermi('get:Ifs:ByAll')")
    @GetMapping("/getIfsByAll")
    public Result getIfsByAll(Page page, IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto){
        ifsInventoryQuantityDto.setOrderType(OrderType.RAW.getValue());
        return Result.success(rawMaterialOrderService.getIfsByOver(page, ifsInventoryQuantityDto));
    }
    @Operation(summary = "新增原材料报检信息")
    @PostMapping("/addIfsInventoryQuantity")
    public Result addIfsInventoryQuantity(@RequestBody IfsInventoryQuantity ifsInventoryQuantity) {
        rawMaterialOrderService.addIfsInventoryQuantity(ifsInventoryQuantity);
        return Result.success();
    }
    @Operation(summary = "原材料下单查看已完成信息")
    @GetMapping("/getIfsByFinish")
    public Result getIfsByFinish(Page page, IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto) throws Exception {
        ifsInventoryQuantityDto.setIsFinish(1);
        ifsInventoryQuantityDto.setOrderType(OrderType.RAW.getValue());
        return Result.success(rawMaterialOrderService.getIfsByOver(page, ifsInventoryQuantityDto));
    }
    @Operation(summary = "微信发送文件测试")
    @GetMapping("/wxSend")
    public Result wxSend(String user, String content, String filePath) throws Exception {
        WxCpUtils.inform(user, content, new File(filePath));
        return Result.success();
    }
    @Operation(summary = "铜单丝下单")
    @PostMapping("/addRawCopperOrder")
    public Result<?> addRawCopperOrder(@RequestBody InsPlaceOrderDto insPlaceOrderDto) {
        return Result.success(insOrderService.addRawCopperOrder(insPlaceOrderDto.getSampleList(), insPlaceOrderDto.getCopperInsOrder()));
    }
    @Operation(summary = "铜单丝下单免检")
    @PostMapping("/addRawCopperOrderExemptionOrder")
    public Result<?> addRawCopperOrderExemptionOrder(@RequestBody InsPlaceOrderDto insPlaceOrderDto) {
        return Result.success(rawMaterialOrderService.addRawCopperOrderExemptionOrder(insPlaceOrderDto.getSampleList(), insPlaceOrderDto.getCopperInsOrder()));
    }
    /**
     * è®©æ­¥æ”¾è¡Œ
     * @param param
     * @return
     */
    @Operation(summary = "让步放行")
    @PostMapping("/concessionRelease")
    public Result<?> concessionRelease(@RequestBody Map<String, Object> param){
        Long ifsInventoryId = Long.parseLong(param.get("ifsInventoryId").toString());
        return Result.success(rawMaterialOrderService.concessionRelease(ifsInventoryId));
    }
    /**
     * åŽŸææ–™è¿›åŽ‚æ’¤é”€ä¸‹å•
     * @param param
     * @return
     */
    @Operation(summary = "原材料进厂撤销下单")
    @PostMapping("/repealEnterRawOrder")
    public Result<?> repealEnterRawOrder(@RequestBody Map<String, Object> param){
        Integer enterOrderId = (Integer) param.get("enterOrderId");
        return Result.success(rawMaterialOrderService.repealEnterRawOrder(enterOrderId));
    }
    /**
     * åŽŸææ–™å­£åº¦æ’¤é”€ä¸‹å•
     * @param param
     * @return
     */
    @Operation(summary = "原材料季度撤销下单")
    @PostMapping("/repealQuarterRawOrder")
    public Result<?> repealQuarterRawOrder(@RequestBody Map<String, Object> param){
        Integer quarterOrderId = (Integer) param.get("quarterOrderId");
        return Result.success(rawMaterialOrderService.repealQuarterRawOrder(quarterOrderId));
    }
    @Operation(summary = "全部信息导出")
    @GetMapping("/rawAllExport")
    public void rawAllExport(IfsInventoryQuantitySupplierDto dto, HttpServletResponse response) throws Exception {
        rawMaterialOrderService.rawAllExport(dto,response);
    }
    @Operation(summary = "原材料检验查询季度检验")
    @GetMapping("/getIfsByQuarter")
    @PreAuthorize("@ss.hasPermi('business:order')")
    @PersonalScope(permsName = "business:order", objectName = IfsInventoryQuantitySupplierDto.class, paramName = "createUser")
    public Result getIfsByQuarter(Page page, IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto){
        return Result.success(rawMaterialOrderService.getIfsByQuarter(page, ifsInventoryQuantityDto));
    }
    /**
     * æå‰å…¥åº“
     * @param param
     * @return
     */
    @Operation(summary = "提前入库")
    @PostMapping("/advancedGodown")
    public Result<?> advancedGodown(@RequestBody Map<String, Object> param){
        Long ifsInventoryId = Long.parseLong(param.get("ifsInventoryId").toString());
        return Result.success(rawMaterialOrderService.advancedGodown(ifsInventoryId));
    }
    /**
     * ä¸‹è½½è®¢å•拆分导入模板
     */
    @Operation(summary = "下载订单拆分导入模板")
    @GetMapping("/downloadTemplate")
    public void downloadTemplate(HttpServletResponse response){
        rawMaterialOrderService.downloadTemplate(response);
    }
    /**
     * ä¸‹è½½è®¢å•拆分导入模板
     */
    @Operation(summary = "导入订单拆分数据")
    @PostMapping("/importSplitOrderData")
    public Result importSplitOrderData(@RequestParam(value = "file") MultipartFile file, @RequestParam("ifsId") Long ifsId, HttpServletRequest request){
        return rawMaterialOrderService.importSplitOrderData(file,ifsId,request);
    }
    /**
     * ç¡®è®¤æ‹†åˆ†è®¢å•
     */
    @Operation(summary = "确认拆分订单")
    @PostMapping("/confirmSplitOrder")
    public Result confirmSplitOrder(@RequestBody OrderSplitDTO orderSplitDTO){
        return Result.success(rawMaterialOrderService.confirmSplitOrder(orderSplitDTO));
    }
    /**
     * æ ¹æ®ifsId查询下单数量
     */
    @Operation(summary = "根据ifsId查询下单数量")
    @GetMapping("/getOrderCountByIfsId/{ifsId}")
    public Result getOrderCountByIfsId(@PathVariable("ifsId") Long ifsId){
        return Result.success(rawMaterialOrderService.getOrderCountByIfsId(ifsId));
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/controller/ReportController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.ruoyi.inspect.controller;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.inspect.service.ReportService;
import com.ruoyi.performance.dto.AuxiliaryOriginalHoursLookDto;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
@RestController
@AllArgsConstructor
@RequestMapping("/report")
@Tag(name = "报表模块")
public class ReportController {
    private ReportService reportService;
    @Operation(summary = "查询日历任务图")
    @GetMapping("/calendarWorkByWeek")
    public Result calendarWorkByWeek(){
        return Result.success(reportService.calendarWorkByWeek());
    }
    @Operation(summary = "当前用户工时统计")
    @GetMapping("/currentUserWorkHourCount")
    public Result currentUserWorkHourCount(AuxiliaryOriginalHoursLookDto dto){
        return Result.success(reportService.currentUserWorkHourCount(dto));
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/controller/WarehouseController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,103 @@
package com.ruoyi.inspect.controller;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.inspect.pojo.Warehouse;
import com.ruoyi.inspect.pojo.WarehouseShelf;
import com.ruoyi.inspect.service.WarehouseService;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
@RequestMapping("/warehouse")
@RestController
@AllArgsConstructor
@Tag(name = "样品管理")
public class WarehouseController {
    private WarehouseService warehouseService;
    @Operation(summary = "添加仓库")
    @PostMapping("/addWarehouse")
    public Result addWarehouse(@RequestBody Warehouse warehouse) {
        return Result.success(warehouseService.addWarehouse(warehouse));
    }
    @Operation(summary = "查询仓库")
    @GetMapping("/selectWarehouse")
    public Result selectWarehouse() {
        return Result.success(warehouseService.selectWarehouse());
    }
    @PostMapping("/addShelf")
    @Operation(summary = "添加货架")
    public Result addShelf(@RequestBody WarehouseShelf warehouseShelf) {
        return Result.success(warehouseService.addShelf(warehouseShelf));
    }
    @Operation(summary = "删除仓库")
    @DeleteMapping("/delWarehouse")
    public Result delWarehouse(Integer id) {
        return Result.success(warehouseService.delWarehouse(id));
    }
    @Operation(summary = "修改仓库")
    @PostMapping("/upWarehouse")
    public Result upWarehouse(@RequestBody Warehouse warehouse) {
        return Result.success(warehouseService.upWarehouse(warehouse));
    }
    @Operation(summary = "删除货架")
    @DeleteMapping("/delShelf")
    public Result delShelf(Integer id) {
        return Result.success(warehouseService.delShelf(id));
    }
    @Operation(summary = "修改货架")
    @PostMapping("/upShelf")
    public Result upShelf(@RequestBody WarehouseShelf warehouseShelf) {
        return Result.success(warehouseService.upShelf(warehouseShelf));
    }
    @Operation(summary = "查询货架下的存放信息")
    @GetMapping("/getWarehouse")
    public Result getWarehouse(Integer shelfId) {
        return Result.success(warehouseService.getWarehouse(shelfId));
    }
    @Operation(summary = "样品入库")
    @PostMapping("/inWarehouse")
    public Result inWarehouse(@RequestBody Map<String, String> param) {
        String trees = param.get("trees");
        String sampleCode = param.get("sampleCode");
        return Result.success(warehouseService.inWarehouse(trees, sampleCode));
    }
    @PostMapping("/outWarehouse")
    @Operation(summary = "样品出库")
    public Result outWarehouse(@RequestBody Map<String, String> param) {
        String sampleCode = param.get("sampleCode");
        return Result.success(warehouseService.outWarehouse(sampleCode));
    }
    @Operation(summary = "查询样品详细记录")
    @GetMapping("/getSampleRecord")
    public Result getSampleRecord(Integer id) {
        return Result.success(warehouseService.getSampleRecord(id));
    }
    @Operation(summary = "通过样品编号进行检索")
    @GetMapping("/searchSampleId")
    public Result searchSampleId(String sampleCode) {
        return Result.success(warehouseService.searchSampleId(sampleCode));
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/CopperInsOrderDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package com.ruoyi.inspect.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.inspect.pojo.InsOrder;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * é“œå•丝下单信息
 *
 * @Author zhuo
 * @Date 2024/9/13
 */
@Data
public class CopperInsOrderDto extends InsOrder {
    @Schema(description = "到货数量")
    private BigDecimal qtyArrived;
    @Schema(description = "单位")
    private String buyUnitMeas;
    @Schema(description = "供应商名称")
    private String supplierName;
    @Schema(description = "批号")
    private String updateBatchNo;
    @Schema(description = "接收时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime declareDate;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/CostStatisticsDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
package com.ruoyi.inspect.dto;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
public class CostStatisticsDto{
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ExcelProperty(value ={"样品登记表","日期"})
    private LocalDateTime createTime;
    @ExcelProperty(value ={"样品登记表","检验编号"})
    private String entrustCode;
    @ExcelProperty(value ={"样品登记表","样品名称"})
    private String sample;
    @ExcelProperty(value ={"样品登记表","规格型号"})
    private String model;
    @ExcelProperty(value ={"样品登记表","样品数量"})
    private Integer num;
    @ExcelProperty(value ={"样品登记表","总价"})
    private BigDecimal price;
    @ExcelProperty(value ={"样品登记表","试验项目"})
    private String inspectionItem;
    @ExcelProperty(value ={"样品登记表","委托单位"})
    private String company;
    @ExcelProperty(value ={"样品登记表","委托人"})
    private String name;
    @ExcelProperty(value ={"样品登记表","生产单位"})
    private String production;
    @ExcelProperty(value ={"样品登记表","工程名称"})
    private String engineering;
    @ExcelIgnore
    private Integer createUser;
    @ExcelIgnore
    private Integer insSampleId;
    @ExcelIgnore
    private Double cost;//工时
    @TableField(exist = false,select = false)
    @ExcelIgnore
    private String dates;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/DataAnalysisDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package com.ruoyi.inspect.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
/**
 * @Author zhuo
 * @Date 2024/10/16
 */
@Data
public class DataAnalysisDto {
    @Schema(description = "时间类型, 1:本周, 2:本月, 3:本年")
    private String dateType;
    @Schema(description = "检测类型, 1:进厂检验, 2:季度检验")
    private String orderType;
    @Schema(description = "开始时间")
    private String beginDate;
    @Schema(description = "结束时间")
    private String endDate;
    @Schema(description = "样品名称")
    private String sampleName;
    @Schema(description = "型号")
    private String modelName;
    @Schema(description = "供应商名称")
    private String supplierName;
    @Schema(description = "分组类型, 0: é»˜è®¤æŒ‰ç…§æ ·å“åŒºåˆ† 1: åŒä¸€åނ家, åŒä¸€åž‹å·, ä¸åŒæ‰¹æ¬¡, 2 : åŒä¸€åž‹å·, ä¸åŒåނ家")
    private String groupType;
    @Schema(description = "选择的检验项名称")
    private List<String> itemNames;
    @Schema(description = "订单id")
    private List<Integer> orderIds;
    @Schema(description = "厂家数据")
    private List<String> supplierDataList;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/EnterFactoryReport.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
package com.ruoyi.inspect.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
 * @Author zhuo
 * @Date 2024/8/12
 */
@Data
public class EnterFactoryReport {
    @Schema(description = "材料名称")
    private String sample;
    @Schema(description = "到货数量")
    private String qtyArrived;
    @Schema(description = "抽检数量")
    private String quantity;
    @Schema(description = "规格型号")
    private String partDesc;
    @Schema(description = "材料厂家")
    private String supplierName;
    @Schema(description = "批号")
    private String lotBatchNo;
    @Schema(description = "检测编号")
    private String code;
    /**
     * å¤–护颜色
     */
    @Schema(description = "外护颜色")
    private String outerColor;
    /**
     * æ£€éªŒå‘˜
     */
    @Schema(description = "检验员")
    private String inspector;
    /**
     * æ£€éªŒæ—¥æœŸ
     */
    @Schema(description = "检验日期")
    private String inspectDate;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/HistoryDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.ruoyi.inspect.dto;
import com.ruoyi.inspect.pojo.WarehouseHistory;
import lombok.Data;
@Data
public class HistoryDto extends WarehouseHistory {
    private String createUserName;
    private String warehouseCode;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/IfsPartPropsRecordDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.ruoyi.inspect.dto;
import com.ruoyi.inspect.pojo.IfsPartPropsRecord;
import lombok.Data;
@Data
public class IfsPartPropsRecordDTO extends IfsPartPropsRecord {
    private String partNo;
    private String lotBatchNo;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/IfsStockQueryDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
package com.ruoyi.inspect.dto;
import lombok.Data;
@Data
public class IfsStockQueryDTO {
    private String partNo;
    private String partDescription; // é›¶ä»¶æè¿°
    private String partDesc;
    private String locNo; // åº“位号
    private String locDesc; // åº“位描述
    private String lotBatchNo; // æ‰¹å·
    private String wdrNo; // WDR编号
    private String warehouse; // ä»“库
    private String quantityFlag; // æ•°é‡æ ‡è¯†(现有数量)
    private String locationGroup; // åº“位组
    private String locationGroupDesc; // åº“位组描述
    private String reelNumber; // è½½å…·ç¼–号
    private String startMeter; // èµ·å§‹ç±³æ ‡
    private String endMeter; // æˆªæ­¢ç±³æ ‡
    private String outerColor; // å¤–护颜色
    private String insulationColor; // ç»ç¼˜é¢œè‰²
    private String otcOrderNo; // ç‰©æ–™å±žæ€§é‡Œé¢çš„OTC订单号
    private String mpsNo; // ç”Ÿäº§è®¡åˆ’号
    private String letteringInfo; // å°å­—信息
    private String sStockQuantity; // åº“存数量2
    private String availableStockQuantity; // å¯ç”¨åº“存数量
    private String sAvailableStockQuantity; // åº“用库存数量2
    private String sunit; // å•位2
    private String stockSource; // æ¥æº
    private String inspInstorageTime; // æ£€æµ‹å…¥åº“日期
    private String testRemark; // æ£€æµ‹å¤‡æ³¨
    private String grossWeight; // æ¯›é‡
    private String netWeight; // å‡€é‡
    private String packingManner; // åŒ…装方式
    private String cylinderNumber; //打圈个数
    private String systemNo; //系统号
    private String remark; //备注
    private String customerName; //客户名称
    private String reserveQuantity; //预留数量
    private String lengthRequirement; // åˆ¤æ–­è¦æ±‚
    private String inSource;//入库来源
    private String splitQuality;//分割预留数量
    //接口 getIfsStockReport ç”¨åˆ°çš„字段
    private String attr23;//入库来源
    private String attr6;//otc订单号
    private String attr21;//客户名称
    private String attr4;//外护颜色
    private String attr5;//绝缘颜色
    private String attr8;//印字信息
    private String lot_batch_no;//批次号
    private String location_no;//库位号
    private String attr17;//包装方式
    private String attr1;//载具编号
    //接口queryColReservedInfoStd ç”¨åˆ°çš„两个字段
    private String cotcOrderNo; // è¡¨é‡Œé¢çš„OTC订单号
    private String cotcLineNo; // è¡¨é‡Œé¢çš„OTC行号
    private Boolean isAll;//是否查询全部库存
    private Long page;
    private Long limit;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/InsOrderDeviceRecordDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.inspect.dto;
import com.ruoyi.inspect.pojo.InsOrderDeviceRecord;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
 * @Author zhuo
 * @Date 2024/12/22
 */
@Data
public class InsOrderDeviceRecordDto extends InsOrderDeviceRecord {
    @Schema(description = "设备编号")
    private String managementNumber;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/InsOrderPlanDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package com.ruoyi.inspect.dto;
import com.ruoyi.basic.pojo.IfsInventoryQuantity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
@Data
public class InsOrderPlanDTO extends IfsInventoryQuantity implements Serializable {
    @Schema(description = "检验任务主键id")
    private Long insSampleId;
    @Schema(description = "用户id")
    private Long userId;
    @Schema(description = "状态(检验处理)")
    private Integer state;
    @Schema(description = "子实验室")
    private String sonLaboratory;
    @Schema(description = "检验状态")
    private String insState;
    @Schema(description = "委托编号")
    private String entrustCode;
    @Schema(description = "检验类型")
    private Integer typeSource;
    @Schema(description = "是否复核")
    private Integer isCheck;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/InsOrderPlanProductDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package com.ruoyi.inspect.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
 * æ£€éªŒä»»åŠ¡æ£€éªŒé¡¹æŸ¥è¯¢æ¡ä»¶
 *
 * @Author zhuo
 * @Date 2024/11/29
 */
@Data
public class InsOrderPlanProductDto {
    @Schema(description = "样品id")
    private Integer id;
    @Schema(description = "类型")
    private Integer type;
    @Schema(description = "试验室")
    private String laboratory;
    @Schema(description = "电缆配置标识")
    private String cableTag;
    @Schema(description = "原材料批次标识")
    private String rawMaterialTag;
    @Schema(description = "成品下单重复标识")
    private String repetitionTag;
    @Schema(description = "不合格复测重复次数")
    private String retestTag;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/InsOrderUpdateDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.inspect.dto;
import com.ruoyi.inspect.pojo.InsOrder;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
/**
 * @Author zhuo
 * @Date 2024/11/29
 */
@Data
public class InsOrderUpdateDto {
    @Schema(description = "订单修改对象")
    private InsOrder insOrder;
    @Schema(description = "检测样品对象")
    private List<SampleProductDto> sampleProduct;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/InsPlaceOrderDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package com.ruoyi.inspect.dto;
import com.ruoyi.inspect.pojo.InsOrder;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
/**
 * ä¸‹å•对象
 *
 * @Author zhuo
 * @Date 2025/2/19
 */
@Data
public class InsPlaceOrderDto{
    @Schema(description = "样品")
    private List<SampleProductDto> sampleList;
    @Schema(description = "订单信息")
    private InsOrder insOrder;
    @Schema(description = "标准库二级标准ID(新聚单样品下单)")
    private Integer standardTreeId;
    @Schema(description = "样品编号(新聚单样品下单)")
    private String sampleCode;
    @Schema(description = "下单时保留的原始记录模板")
    private List<OrderTemplateSelectionDto> templateList;
    @Schema(description = "铜单丝订单")
    private CopperInsOrderDto copperInsOrder;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/InsProductAnalysisDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.inspect.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
 * æ£€æµ‹é¡¹åˆ†æžç»“果数据
 *
 * @Author zhuo
 * @Date 2025/3/26
 */
@Data
public class InsProductAnalysisDto {
    @Schema(description = "检测项id")
    private Integer insProductId;
    @Schema(description = "检测结果")
    @TableField("`last_value`")
    private String lastValue;
    @Schema(description = "订单id")
    private Integer insOrderId;
    @Schema(description = "样品id")
    private Integer insSampleId;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/InsProductBindingDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.inspect.dto;
import com.ruoyi.inspect.pojo.InsProduct;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
/**
 * @Author zhuo
 * @Date 2024/11/29
 */
@Data
public class InsProductBindingDto {
    @Schema(description = "需要绑定的id")
    private Integer insProductId;
    @Schema(description = "需要绑定的检验项")
    private List<InsProduct> insProductBindingList;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/InsProductDeviationWarningDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.inspect.dto;
import com.ruoyi.inspect.pojo.InsProductDeviationWarning;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
 * @Author zhuo
 * @Date 2025/3/28
 */
@Data
public class InsProductDeviationWarningDto extends InsProductDeviationWarning {
    @Schema(description = "样品")
    private String sampleName;
    @Schema(description = "型号")
    private String sampleModel;
    @Schema(description = "检验项")
    private String inspectionItemName;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/InsReportExport.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,79 @@
package com.ruoyi.inspect.dto;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
 * @Author zhuo
 * @Date 2025/4/18
 */
@Data
@ExcelIgnoreUnannotated
public class InsReportExport {
    @ExcelProperty(value = "报告编号")
    @Schema(description = "委托编号")
    private String code;
    @ExcelProperty(value = "报告类型")
    @Schema(description = "报告类型")
    private String reportTypeName;
    @ExcelProperty(value = "下单类型")
    @Schema(description = "下单类型")
    private String typeSource;
    @ExcelProperty(value = "检验类型")
    @Schema(description = "检验类型")
    private String orderType;
    @ExcelProperty(value = "创建时间")
    @Schema(description = "创建时间")
    private String createTime;
    @ExcelProperty(value = "提交人")
    @Schema(description = "提交人")
    private String writeUserName;
    @ExcelProperty(value = "提交时间")
    @Schema(description = "提交时间")
    private String writeTime;
    @ExcelProperty(value = "提交状态")
    @Schema(description = "提交状态")
    private String state;
    @ExcelProperty(value = "审核人")
    @Schema(description = "审核人")
    private String examineUser;
    @ExcelProperty(value = "审核时间")
    @Schema(description = "审核时间")
    private String examineTime;
    @ExcelProperty(value = "审核状态")
    @Schema(description = "审核状态")
    private String isExamine;
    @ExcelProperty(value = "审核备注")
    @Schema(description = "审核备注")
    private String examineTell;
    @ExcelProperty(value = "批准人")
    @Schema(description = "批准人")
    private String ratifyUser;
    @ExcelProperty(value = "批准时间")
    @Schema(description = "批准时间")
    private String ratifyTime;
    @ExcelProperty(value = "批准状态")
    @Schema(description = "批准状态")
    private String isRatify;
    @ExcelProperty(value = "批准备注")
    @Schema(description = "批准备注")
    private String ratifyTell;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/InsulatingDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.inspect.dto;
import com.ruoyi.inspect.pojo.InsProduct;
import lombok.Data;
import java.util.List;
@Data
public class InsulatingDto {
    // æ–¹æ³•id
    private Integer standardMethodListId;
    // èŠ¯æ•°
    private List<String> num;
    // æ£€éªŒé¡¹
    private List<InsProduct> insProduct;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/OmitOrderProductDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.inspect.dto;
import com.ruoyi.inspect.pojo.InsProduct;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
/**
 * @Author zhuo
 * @Date 2024/12/12
 */
@Data
public class OmitOrderProductDto {
    @Schema(description = "需要添加的样品Id")
    private Integer insSampleId;
    @Schema(description = "需要绑定的检验项")
    private List<InsProduct> insProductBindingList;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/OrderSplitDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
package com.ruoyi.inspect.dto;
import com.ruoyi.inspect.excel.OrderSplitExcelData;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
 * è®¢å•拆分dto
 */
@Data
public class OrderSplitDTO implements Serializable {
    /**
     * ifs订单主键id
     */
    @Schema(description = "ifs订单主键id")
    private Long ifsId;
    /**
     *拆分详情列表
     */
    @Schema(description = "拆分详情列表")
    private List<OrderSplitExcelData> splitDetailList;
    /**
     *是否同步到MES
     */
    @Schema(description = "是否同步到MES")
    private Boolean pushToMes;
    @Schema(description = "物料属性,用于区分铜、铝导体等材料")
    private String materialProp;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/OrderTemplateSelectionDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.inspect.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/** ä¸‹å•时保留的原始记录模板。 */
@Data
public class OrderTemplateSelectionDto {
    @Schema(description = "模板ID")
    private Integer templateId;
    @Schema(description = "模板展示及生成顺序")
    private Integer sort;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/ProcurementSuppliesListEDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
package com.ruoyi.inspect.dto;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class ProcurementSuppliesListEDto {
    @TableId(value = "id", type = IdType.AUTO)
    @Schema(description = "编号")
    @ExcelProperty("编号")
    private Long id;
    @Schema(description = "耗材类型")
    @ExcelProperty("类别")
    private String consumablesType;
    @Schema(description = "货号")
    @ExcelProperty("货号")
    private String itemNumber;
    @Schema(description = "耗材名称")
    @ExcelProperty("名称")
    private String consumablesName;
    @Schema(description = "规格")
    @ExcelProperty("规格")
    private String specifications;
    @Schema(description = "计量单位")
    @ExcelProperty("计量单位")
    private String unit;
    @Schema(description = "库存下限")
    @ExcelProperty("库存下限")
    private Integer lowerLimit;
    @Schema(description = "备注")
    @ExcelProperty("备注")
    private String remark;
    @Schema(description = "当前库存数量")
    @ExcelProperty("当前库存")
    private Integer currentAmount;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/ProductResultDto2.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.inspect.dto;
import com.ruoyi.inspect.pojo.InsProduct;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class ProductResultDto2 extends InsProduct {
    @Schema(description = "检验设备")
    private String equipValue;
    @Schema(description = "检验人")
    private String updateUserName;
    @Schema(description = "委托编号")
    private String entrustCode;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/RawMaterialStandardTreeDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.ruoyi.inspect.dto;
import com.ruoyi.basic.dto.ModelDto;
import com.ruoyi.basic.dto.SampleDto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
/**
 * @Author zhuo
 * @Date 2024/7/31
 */
@Data
public class RawMaterialStandardTreeDto {
    @Schema(description = "树名称")
    private String treeName;
    @Schema(description = "树名称")
    private String code;
    @Schema(description = "树名称")
    private String label;
    @Schema(description = "树名称")
    private String value;
    @Schema(description = "产品")
    private List<SampleDto> children1;
    @Schema(description = "型号")
    private List<ModelDto> children2;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/ReportPageDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package com.ruoyi.inspect.dto;
import com.ruoyi.inspect.pojo.InsReport;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
@Data
public class ReportPageDto extends InsReport implements Serializable {
    @Schema(description = "委托编号")
    private String entrustCode;
    @Schema(description = "提交人")
    private String writeUserName;
    @Schema(description = "批准人")
    private String ratifyUser;
    @Schema(description = "审核人")
    private String examineUser;
    @Schema(description = "下单类别")
    private Integer typeSource;
    @Schema(description = "物料属性")
    private String materialProp;
    @Schema(description = "检验类别")
    private String orderType;
    @Schema(description = "原材料id")
    private Integer ifsInventoryId;
    @Schema(description = "是否复核通过")
    private String queryStatus;
    @Schema(description = "是否是铜材, 0否, 1是")
    private Integer isCopper;
    @Schema(description = "实验室")
    private String sonLaboratory;
    @Schema(description = "只看自己标识")
    private Integer createOrderUser;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleOrderDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,106 @@
package com.ruoyi.inspect.dto;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.inspect.pojo.InsOrder;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
 * @author gaoaoy
 * @version 1.0.0
 * @create 2024/3/14 18:46
 **/
@Data
@ExcelIgnoreUnannotated
public class SampleOrderDto extends InsOrder {
    @Schema(description = "检验对象")
    private String sampleType;
    @ExcelProperty(index = 2, value = "样品名称")
    @Schema(description = "样品名称")
    private String sampleName;
    @ExcelProperty(index = 3, value = "样品型号")
    @Schema(description = "样品型号")
    private String sampleModel;
    @Schema(description = "指派检验人id")
    private String assign;
    @ExcelProperty(index = 4, value = "样品数量")
    @Schema(description = "样品数量")
    private Integer sampleNum;
    @Schema(description = "样品编号")
    private String sampleCode;
    @ExcelProperty(index = 8, value = "检验进度%")
    @Schema(description = "检验进度%")
    private String insProgress;
    @Schema(description = "报告id")
    private String reportId;
    @Schema(description = "系统生成报告地址")
    @TableField("`url`")
    private String url;
    @Schema(description = "手动上传报告地址")
    private String urlS;
    @Schema(description = "下单人姓名")
    private String name;
    @ExcelProperty(index = 5, value = "检验人")
    @Schema(description = "检验人")
    private String testingName;
    /**
     * (报告导出)紧急程度 ï¼ˆ0普通 1优先 2紧急)
     */
    @ExcelProperty(index = 6, value = "紧急程度")
    @Schema(description = "紧急程度 ï¼ˆ0普通 1优先 2紧急)")
    private String typeString;
    /**
     * (报告导出)检验结果
     */
    @ExcelProperty(index = 10, value = "检验结果")
    @Schema(description = "检验结果")
    private String insResultString;
    /**
     * (报告导出)不合格项目
     */
    @Schema(description = "不合格项")
    @ExcelProperty(index = 13, value = "不合格项")
    private String unqualifiedItem;
    /**
     * (报告导出)下单时间
     */
    @ExcelProperty(index = 11, value = "下单时间")
    @Schema(description = "下单时间")
    private String createTimeString;
    @Schema(description = "子实验室")
    private String sonLaboratory;
    @Schema(description = "样品名称(原材料取样品字段,成品取报告展示字段)")
    private String sampleStr;
    @Schema(description = "总价")
    private String totalPrice;
    @Schema(description = "订单id(导出用)")
    private String ids;
    @Schema(description = "拒收原因")
    private String sampleRejectRemark;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleProductDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.ruoyi.inspect.dto;
import com.ruoyi.inspect.pojo.InsProduct;
import com.ruoyi.inspect.pojo.InsSample;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@Data
public class SampleProductDto extends InsSample {
    @Schema(description = "检验项目")
    private List<InsProduct> insProduct;
    @Schema(description = "子样品配置")
    private List<SampleProductDto> childSampleList;
    @Schema(description = "电缆配置对象")
    private InsulatingDto insulating;
    @Schema(description = "辅助线芯配置")
    private InsulatingDto auxiliaryWireCore;
    @Schema(description = "检验人")
    private String checkName;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleProductDto2.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,124 @@
package com.ruoyi.inspect.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.TreeMap;
@Data
public class SampleProductDto2 implements Serializable {
    @Schema(description = "样品id")
    private Integer id;
    @Schema(description = "检验项id")
    private Integer insProductId;
    @Schema(description = "样品编号")
    private String sampleCode;
    @Schema(description = "样品名称")
    private String sample;
    @Schema(description = "检验项分类")
    private String inspectionItemClass;
    @Schema(description = "检验项分类英文")
    private String inspectionItemClassEN;
    @Schema(description = "检验项")
    private String inspectionItem;
    @Schema(description = "检验项英文")
    private String inspectionItemEn;
    @Schema(description = "检验子项")
    private String inspectionItemSubclass;
    @Schema(description = "检验子项英文")
    private String inspectionItemSubclassEn;
    @Schema(description = "单位")
    private String unit;
    @Schema(description = "样品型号")
    private String model;
    @Schema(description = "样品状态")
    private Integer insState;
    @Schema(description = "实验室")
    private String sonLaboratory;
    @Schema(description = "检验项类型")
    private String inspectionItemType;
    @Schema(description = "检验值类型")
    private String inspectionValueType;
    @Schema(description = "要求值")
    private String ask;
    @Schema(description = "试验要求")
    private String tell;
    @Schema(description = "检验结果")
    private String lastValue;
    @Schema(description = "结果判定")
    private Integer insResult;
    @Schema(description = "检验人")
    private String checkName;
    @Schema(description = "检验日期")
    private String checkTime;
    @Schema(description = "设备值")
    private String equipValue;
    @Schema(description = "序号")
    private String index;
    @Schema(description = "样品名称(整体)")
    private String inspectionName;
    @Schema(description = "条件")
    private String radius;
    @Schema(description = "检验结果列表")
    private List<String> lastValueList;
    @Schema(description = "检验结果列表")
    private List<Integer> insResultList;
    @Schema(description = "最终结果")
    private String finalResult;
    @Schema(description = "原材料id")
    private Integer ifsInventoryId;
    @Schema(description = "检验单类型")
    private String orderType;
    @Schema(description = "检验单类型")
    private Integer quantity;
    @Schema(description = "检验单类型")
    private Integer sort;
    @Schema(description = "电缆标识")
    private String cableTag;
    @Schema(description = "唯一结果值")
    private LinkedHashSet<String> tellSet;
    @Schema(description = "电缆标识内容集合")
    private TreeMap<String, String> cableTagValueMap;
    @Schema(description = "电缆标识结果集合")
    private TreeMap<String, Integer> cableTagResultMap;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleProductExportDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,128 @@
package com.ruoyi.inspect.dto;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.TreeMap;
/**
 * @Author zhuo
 * @Date 2024/11/30
 */
@Data
public class SampleProductExportDto {
    @Schema(description = "样品id")
    private Integer id;
    @Schema(description = "产品id")
    private Integer insProductId;
    @Schema(description = "样品编号")
    private String sampleCode;
    @Schema(description = "样品名称")
    private String sample;
    @Schema(description = "检验项分类")
    private String inspectionItemClass;
    private String inspectionItemClassEN;
    @Schema(description = "检验项")
    private String inspectionItem;
    private String inspectionItemEn;
    @Schema(description = "检验子项")
    private String inspectionItemSubclass;
    private String inspectionItemSubclassEn;
    @Schema(description = "单位")
    private String unit;
    @Schema(description = "样品型号")
    private String model;
    @Schema(description = "样品状态")
    private Integer insState;
    @Schema(description = "实验室")
    private String sonLaboratory;
    @Schema(description = "检验项类型")
    private String inspectionItemType;
    @Schema(description = "检验值类型")
    private String inspectionValueType;
    @Schema(description = "要求值")
    private String ask;
    @Schema(description = "试验要求")
    private String tell;
    @Schema(description = "检验结果")
    private String lastValue;
    @Schema(description = "结果判定")
    private Integer insResult;
    @Schema(description = "检验人")
    private String checkName;
    @Schema(description = "检验日期")
    private String checkTime;
    @Schema(description = "序号")
    private String index;
    @Schema(description = "名称")
    private String inspectionName;
    //条件
    private String radius;
    // æ£€éªŒç»“果列表
    private List<String> lastValueList;
    // æ£€éªŒç»“果列表
    private List<Integer> insResultList;
    //最终结果
    private String finalResult;
    //原材料id
    private Integer ifsInventoryId;
    //检验单类型
    private String orderType;
    //检验单类型
    private Integer quantity;
    //检验单类型
    private Integer sort;
    //电缆标识
    private String cableTag;
    // å”¯ä¸€ç»“果值
    private LinkedHashSet<String> tellSet;
    // ç”µç¼†æ ‡è¯†å†…容集合
    private TreeMap<String, String> cableTagValueMap;
    // ç”µç¼†æ ‡è¯†ç»“果集合
    private TreeMap<String, Integer> cableTagResultMap;
    // æ£€éªŒé¡¹å’Œæ¡ä»¶åˆå¹¶å…³è”
    public String getInspectionItemRadius() {
        if (StringUtils.isBlank(radius)) {
            return inspectionItem;
        }
        return inspectionItem + radius;
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleProductRawAnalysisDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.ruoyi.inspect.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
 * @Author zhuo
 * @Date 2024/10/17
 */
@Data
public class SampleProductRawAnalysisDto {
    @Schema(description = "样品id")
    private Integer insSampleId;
    @Schema(description = "检验项id")
    private Integer insProductId;
    @Schema(description = "样品编号")
    private String sampleCode;
    @Schema(description = "检验项名称")
    private String inspectionItem;
    @Schema(description = "检验结果")
    private String lastValue;
    @Schema(description = "合格判断, 1:合格, 0:不合格, 3:不判定")
    private Integer insResult;
    @Schema(description = "批次号")
    private String updateBatchNo;
    @Schema(description = "厂家名称")
    private String supplierName;
    @Schema(description = "样品名称")
    private String sample;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleReceiptActionDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.inspect.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class SampleReceiptActionDto {
    @Schema(description = "样品接收记录ID")
    private Integer receiptId;
    @Schema(description = "主检验人ID")
    private Integer mainInspectorId;
    @Schema(description = "接收备注,拒收时为拒收备注")
    private String remark;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleReceiptPageDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
package com.ruoyi.inspect.dto;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@ExcelIgnoreUnannotated
public class SampleReceiptPageDto {
    @Schema(description = "样品接收记录ID")
    private Integer receiptId;
    @Schema(description = "委托单ID")
    private Integer orderId;
    @Schema(description = "样品ID")
    private Integer sampleId;
    @Schema(description = "样品接收状态 0待接收 1已提交检验 2已拒收 3已取消")
    private Integer status;
    @ExcelProperty(value = "样品名称", index = 0)
    @Schema(description = "样品名称")
    private String sampleName;
    @ExcelProperty(value = "样品编号", index = 1)
    @Schema(description = "样品编号")
    private String sampleCode;
    @ExcelProperty(value = "检测项目", index = 2)
    @Schema(description = "检测项目")
    private String inspectionItem;
    @ExcelProperty(value = "委托编号", index = 3)
    @Schema(description = "委托编号")
    private String entrustCode;
    @ExcelProperty(value = "方法标准", index = 4)
    @Schema(description = "方法标准")
    private String methodStandard;
    @Schema(description = "主检验人ID")
    private Integer mainInspectorId;
    @ExcelProperty(value = "主检人签字", index = 5)
    @Schema(description = "主检验人姓名")
    private String mainInspectorName;
    @ExcelProperty(value = "备注", index = 6)
    @Schema(description = "接收备注")
    private String remark;
    @ExcelProperty(value = "拒收备注", index = 7)
    @Schema(description = "拒收备注")
    private String rejectRemark;
    @Schema(description = "接收处理时间")
    private LocalDateTime receiveTime;
    @Schema(description = "接收处理人")
    private String receiveUserName;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleReceiptQueryDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.inspect.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class SampleReceiptQueryDto {
    @Schema(description = "样品接收状态 0待接收 1已提交检验 2已拒收 3已取消")
    private Integer status;
    @Schema(description = "委托编号")
    private String entrustCode;
    @Schema(description = "样品编号")
    private String sampleCode;
    @Schema(description = "样品名称")
    private String sampleName;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/SaveInsContextDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.inspect.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
 * ä¿å­˜æ¨¡æ¿ä¼ å‚
 */
@Data
public class SaveInsContextDto {
    @Schema(description = "模板内容")
    private String param;
    @Schema(description = "当前模板id")
    private Integer currentTable;
    @Schema(description = "当前样品id")
    private Integer sampleId;
    @Schema(description = "当前订单id")
    private Integer orderId;
    @Schema(description = "子试验室")
    private String sonLaboratory;
    @Schema(description = "是否没有检验值")
    private Integer isNoTestValue;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/SaveOrderDevicesDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.ruoyi.inspect.dto;
import lombok.Data;
import java.util.List;
/** æ£€éªŒå•概况中的设备选择。 */
@Data
public class SaveOrderDevicesDto {
    private Integer orderId;
    private List<Integer> deviceIds;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/SaveTemplateContextDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.inspect.dto;
import lombok.Data;
import java.util.Map;
/** æ–°èšåŽŸå§‹è®°å½•æ¨¡æ¿æŒ‰åæ ‡ä¿å­˜ã€‚ */
@Data
public class SaveTemplateContextDto {
    private Integer orderId;
    private Integer sampleId;
    private Integer templateId;
    private Map<String, Object> values;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/SpotCheckQuarterDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.inspect.dto;
import com.ruoyi.inspect.pojo.SpotCheckQuarter;
import com.ruoyi.inspect.pojo.SpotCheckQuarterItem;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
/**
 * @Author zhuo
 * @Date 2024/10/10
 */
@Data
public class SpotCheckQuarterDto extends SpotCheckQuarter {
    @Schema(description = "季度抽检详情")
    private List<SpotCheckQuarterItem> quarterItems;
    @Schema(description = "创建人")
    private String createUserName;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/SpotCheckYearDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.inspect.dto;
import com.ruoyi.inspect.pojo.SpotCheckYear;
import com.ruoyi.inspect.pojo.SpotCheckYearItem;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
/**
 * @Author zhuo
 * @Date 2024/10/10
 */
@Data
public class SpotCheckYearDto extends SpotCheckYear {
    @Schema(description = "年度抽样详情")
    private List<SpotCheckYearItem> yearItems;
    @Schema(description = "创建人")
    private String createUserName;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/TemplateRateDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.inspect.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class TemplateRateDto {
    @Schema(description = "检验项目")
    private String number;
    @Schema(description = "模板名称")
    private String name;
    @Schema(description = "ä»·æ ¼(元)")
    private BigDecimal price;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/UnqualifiedHandlerDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,148 @@
package com.ruoyi.inspect.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.inspect.pojo.InsUnqualifiedHandler;
import com.ruoyi.inspect.pojo.InsUnqualifiedHandlerFile;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@Data
public class UnqualifiedHandlerDto extends InsUnqualifiedHandler implements Serializable {
    @Schema(description = "域")
    private String contract;
    @Schema(description = "订单号")
    private String orderNo;
    @Schema(description = "行号")
    private String lineNo;
    @Schema(description = "下达号")
    private String releaseNo;
    @Schema(description = "接收号")
    private Integer receiptNo;
    @Schema(description = "零件号")
    private String partNo;
    @Schema(description = "零件描述")
    private String partDesc;
    @Schema(description = "状态描述")
    private String status;
    @Schema(description = "状态")
    private String statusDB;
    @Schema(description = "抵达的采购数量")
    private BigDecimal qtyArrived;
    @Schema(description = "已检验的购买数量")
    private BigDecimal qtyInspected;
    @Schema(description = "要检验的采购数量")
    private BigDecimal qtyToInspect;
    @Schema(description = "供应商编号")
    private String supplierId;
    @Schema(description = "供应商名称")
    private String supplierName;
    @Schema(description = "抵达的库存数量")
    private BigDecimal invQtyInStore;
    @Schema(description = "抵达的采购数量")
    private BigDecimal purQtyInStore;
    @Schema(description = "配置标识")
    private String configurationId;
    @Schema(description = "批号")
    private String lotBatchNo;
    @Schema(description = "wdr号")
    private String waivDevRejNo;
    @Schema(description = "活动序列")
    private String activitySeq;
    @Schema(description = "序列号")
    private String serialNo;
    @Schema(description = "库位号")
    private String locationNo;
    @Schema(description = "版本号")
    private String engChgLevel;
    @Schema(description = "接收人")
    private String receiver;
    @Schema(description = "接收人姓名")
    private String receiverName;
    @Schema(description = "采购员")
    private String buyerCode;
    @Schema(description = "采购员姓名")
    private String buyerName;
    @Schema(description = "实际到货日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime arriveDate;
    @Schema(description = "实际交货日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime deliveryDate;
    @Schema(description = "生产日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime productDate;
    @Schema(description = "失效日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime invalidDate;
    @Schema(description = "审批日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime approvedDate;
    @Schema(description = "采购申请创建人")
    private String reqCeater;
    @Schema(description = "采购申请创建人姓名")
    private String reqCeaterName;
    @Schema(description = "采购订单行备注")
    private String lineRemarks;
    @Schema(description = "采购单位")
    private String buyUnitMeas;
    private Integer isSource;
    private Integer number;
    private Integer state;
    @Schema(description = "接收时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime receiverDate;
    @Schema(description = "附件列表")
    private List<InsUnqualifiedHandlerFile> unqualifiedHandlerFiles;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/VerifyPlanDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.inspect.dto;
import lombok.Data;
/** æ£€éªŒå¤æ ¸æäº¤å‚数。 */
@Data
public class VerifyPlanDto {
    private Integer orderId;
    private String laboratory;
    /** 1 é€šè¿‡ï¼›0 é€€å›žã€‚ */
    private Integer type;
    private String tell;
    private Integer userId;
    /** æ–°èšæ£€éªŒå•整体结论:1 åˆæ ¼ï¼Œ0 ä¸åˆæ ¼ã€‚ */
    private Integer insResult;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/WarehouseCellAndSampleDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.inspect.dto;
import com.ruoyi.inspect.pojo.InsSample;
import com.ruoyi.inspect.pojo.WarehouseCell;
import lombok.Data;
import java.util.List;
@Data
public class WarehouseCellAndSampleDto extends WarehouseCell {
    private List<InsSample> samples;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/WarehouseDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.inspect.dto;
import com.ruoyi.inspect.pojo.Warehouse;
import com.ruoyi.inspect.pojo.WarehouseShelf;
import lombok.Data;
import java.util.List;
@Data
public class WarehouseDto extends Warehouse {
    List<WarehouseShelf> warehouseShelfList;
}
inspect-server/src/main/java/com/ruoyi/inspect/dto/WriteInspectionConditionDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,69 @@
package com.ruoyi.inspect.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import java.time.LocalDate;
import java.util.List;
/** ä¿å­˜è®¢å•级备注或模板级检验条件。 */
@Data
public class WriteInspectionConditionDto {
    private Integer id;
    private Integer templateId;
    private String remark;
    private String temperature;
    private String humidity;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate detectionTime;
    private String detectionPlace;
    private List<Integer> deviceIds;
    private Integer insResult;
    @JsonIgnore
    private boolean temperaturePresent;
    @JsonIgnore
    private boolean humidityPresent;
    @JsonIgnore
    private boolean detectionTimePresent;
    @JsonIgnore
    private boolean detectionPlacePresent;
    @JsonIgnore
    private boolean deviceIdsPresent;
    @JsonIgnore
    private boolean insResultPresent;
    public void setTemperature(String temperature) {
        this.temperature = temperature;
        this.temperaturePresent = true;
    }
    public void setHumidity(String humidity) {
        this.humidity = humidity;
        this.humidityPresent = true;
    }
    public void setDetectionTime(LocalDate detectionTime) {
        this.detectionTime = detectionTime;
        this.detectionTimePresent = true;
    }
    public void setDetectionPlace(String detectionPlace) {
        this.detectionPlace = detectionPlace;
        this.detectionPlacePresent = true;
    }
    public void setDeviceIds(List<Integer> deviceIds) {
        this.deviceIds = deviceIds;
        this.deviceIdsPresent = true;
    }
    public void setInsResult(Integer insResult) {
        this.insResult = insResult;
        this.insResultPresent = true;
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/event/NewJuOrderPlacedEvent.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.inspect.event;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
 * æ–°èšç›´ç»‘模板下单成功事件。
 */
@Data
@AllArgsConstructor
public class NewJuOrderPlacedEvent {
    private Integer insOrderId;
}
inspect-server/src/main/java/com/ruoyi/inspect/excel/OrderSplitExcelData.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,107 @@
package com.ruoyi.inspect.excel;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
/**
 * åŽŸææ–™æŠ¥æ£€ï¼šè®¢å•æ‹†åˆ†å¯¼å…¥æ¨¡æ¿å¯¹è±¡
 */
@Data
public class OrderSplitExcelData implements Serializable {
    /**
     * é›¶ä»¶ç¼–号
     */
    @ExcelProperty(index = 0,value = "零件编号")
    @Schema(description = "零件编号")
    private String partNo;
    /**
     * ç³»ç»Ÿç¼–号
     */
    @ExcelProperty(index = 1,value = "系统编号")
    @Schema(description = "系统编号 ")
    private String systemNo;
    /**
     * è§„æ ¼
     */
    @ExcelProperty(index = 2,value = "规格")
    @Schema(description = "规格")
    private String spec;
    /**
     * é›¶ä»¶æ‰¹å·
     */
    @ExcelProperty(index = 3,value = "零件批号")
    @Schema(description = "零件批号")
    private String lotBatchNo;
    /**
     * åº“存数量1
     */
    @ExcelProperty(index = 4,value = "库存数量1")
    @Schema(description = "库存数量1(用于对接mes分盘计算)")
    private BigDecimal length;
    /**
     * åº“存数量2
     */
    @ExcelProperty(index = 5,value = "库存数量2")
    @Schema(description = "库存数量2(ifs对于的库存数量)")
    private BigDecimal qtyStock;
    /**
     * ç»ç¼˜é¢œè‰²
     */
    @ExcelProperty(index = 6,value = "绝缘颜色")
    @Schema(description = "绝缘颜色")
    private String insulationColor;
    /**
     * å¤–护颜色
     */
    @ExcelProperty(index = 7,value = "外护颜色")
    @Schema(description = "外护颜色")
    private String outerColor;
    /**
     * å°å­—信息
     */
    @ExcelProperty(index = 8,value = "印字信息")
    @Schema(description = "印字信息")
    private String letteringInfo;
    /**
     * ç›˜å·
     */
    @ExcelProperty(index = 9,value = "盘号")
    @Schema(description = "盘号")
    private String drumNo;
    /**
     * åº“位编号
     */
    @ExcelProperty(index = 10,value = "库位编号")
    @Schema(description = "库位编号")
    private String locationNo;
    /**
     * åº“位来源
     */
    @ExcelProperty(index = 11,value = "库位来源")
    @Schema(description = "库位来源")
    private String stockSource;
    /**
     * å¤‡æ³¨
     */
    @ExcelProperty(index = 12,value = "备注")
    @Schema(description = "备注")
    private String remark;
}
inspect-server/src/main/java/com/ruoyi/inspect/excel/OrderSplitExcelListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,146 @@
package com.ruoyi.inspect.excel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.ruoyi.basic.pojo.IfsInventoryQuantity;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
@Slf4j
public class OrderSplitExcelListener extends AnalysisEventListener<Map<Integer,Object>> {
    //表头模板
    private static final String HEAD_TEMPLATE = "[零件编号, ç³»ç»Ÿç¼–号, è§„æ ¼, é›¶ä»¶æ‰¹å·, åº“存数量1, åº“存数量2, ç»ç¼˜é¢œè‰², å¤–护颜色, å°å­—信息, ç›˜å·, åº“位编号, åº“位来源, å¤‡æ³¨]";
    AtomicInteger index = new AtomicInteger(0);//符合表格模板的行数
    @Getter
    List<OrderSplitExcelData> dataList = new ArrayList<>();//导入的数据列表
    IfsInventoryQuantity ifsInventoryQuantity;//对应报检ifs信息
    public String errorMsg = "";
    public OrderSplitExcelListener(IfsInventoryQuantity ifsInventoryQuantity) {
        this.ifsInventoryQuantity = ifsInventoryQuantity;
    }
    AtomicReference<String> prePartLotBatchNo = new AtomicReference<>("");//上一条数据的零件批号
    AtomicReference<BigDecimal> storeQty2Sum = new AtomicReference<>(BigDecimal.ZERO);//导入数据库存数量2的总和
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        String temp = headMap.values().toString();
        if(StringUtils.equals(HEAD_TEMPLATE,temp)){
            index.getAndIncrement();
        }
    }
    @Override
    public void invoke(Map<Integer,Object> mapData, AnalysisContext analysisContext) {
        Integer currentRowNum = analysisContext.getCurrentRowNum();
        OrderSplitExcelData data = transformExcelData(mapData, currentRowNum);
        if(Objects.nonNull(data)){
            dataList.add(data);
        }
    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        if(index.get()==0){
            throw new RuntimeException("文件内容格式与模板不符");
        }
        if(storeQty2Sum.get().compareTo(ifsInventoryQuantity.getPurQtyInStore())>0){
            throw new RuntimeException("库存数量2不能大于报检零件的抵达采购数量");
        }
    }
    /**
     * æ ¡éªŒæ•°æ®
     * @param mapData
     * @param rowNumber
     */
    private void validateRowData(Map<Integer,Object> mapData,Integer rowNumber){
        String rowStr = "</br>第"+(rowNumber+1)+"行:";
        List<String> errorMsgList = new ArrayList<>();
        //零件编号
        if(Objects.isNull(mapData.get(0))){
            errorMsgList.add("零件编号不能为空");
        }else if(!StringUtils.equals(mapData.get(0).toString(),ifsInventoryQuantity.getPartNo())){
            errorMsgList.add("零件编号与报检零件不一致");
        }
        //零件批号
        if(Objects.isNull(mapData.get(3))){
            errorMsgList.add("零件批号不能为空");
        }else if(StringUtils.equals(mapData.get(3).toString(),ifsInventoryQuantity.getLotBatchNo())){
            errorMsgList.add("零件批号与报检零件批号相同");
        }else if(StringUtils.equals(prePartLotBatchNo.get(),mapData.get(3).toString())){
            errorMsgList.add("零件批号存在重复");
        }
        prePartLotBatchNo.getAndSet(mapData.get(3).toString());
        //库存数量2
        if(Objects.isNull(mapData.get(5))){
            errorMsgList.add("库存数量2不能为空");
        }else{
            BigDecimal storeQty2 = BigDecimal.ZERO;
            try{
                storeQty2 = new BigDecimal(mapData.get(5).toString());
            }catch (Exception e){
                errorMsgList.add("库存数量2格式异常");
            }
            if(storeQty2.compareTo(ifsInventoryQuantity.getPurQtyInStore())>0){
                errorMsgList.add("库存数量2不能大于报检零件的抵达采购数量");
            }
            BigDecimal oldSum = storeQty2Sum.get();
            storeQty2Sum.getAndSet(oldSum.add(storeQty2));
        }
        //库位编号
        if(Objects.isNull(mapData.get(10))){
            errorMsgList.add("库位编号不能为空");
        }else if(!StringUtils.equals(mapData.get(10).toString(),ifsInventoryQuantity.getLocationNo())){
            errorMsgList.add("库位编号与报检零件的库位编号不一致");
        }
        if(!errorMsgList.isEmpty()){
            String errorStr = String.join(";",errorMsgList);
            errorMsg+= rowStr + errorStr ;
        }
    }
    /**
     * è½¬æ¢excel导入行数据
     * @param mapData
     * @return
     */
    private OrderSplitExcelData transformExcelData(Map<Integer,Object> mapData,Integer rowNumber){
        validateRowData(mapData,rowNumber);
        if(StringUtils.isBlank(errorMsg)){
            OrderSplitExcelData data = new OrderSplitExcelData();
            data.setPartNo(mapData.get(0).toString());
            data.setSystemNo(Objects.isNull(mapData.get(1))?"":mapData.get(1).toString());
            data.setSpec(Objects.isNull(mapData.get(2))?"":mapData.get(2).toString());
            data.setLotBatchNo(Objects.isNull(mapData.get(3))?"":mapData.get(3).toString());
            data.setLength(new BigDecimal(mapData.get(4).toString()));
            data.setQtyStock(new BigDecimal(mapData.get(5).toString()));
            data.setInsulationColor(Objects.isNull(mapData.get(6))?"":mapData.get(6).toString());
            data.setOuterColor(Objects.isNull(mapData.get(7))?"":mapData.get(7).toString());
            data.setLetteringInfo(Objects.isNull(mapData.get(8))?"":mapData.get(8).toString());
            data.setDrumNo(Objects.isNull(mapData.get(9))?"":mapData.get(9).toString());
            data.setLocationNo(Objects.isNull(mapData.get(10))?"":mapData.get(10).toString());
            data.setStockSource(Objects.isNull(mapData.get(11))?"":mapData.get(11).toString());
            data.setRemark(Objects.isNull(mapData.get(12))?"":mapData.get(12).toString());
            return data;
        }
        return null;
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/DataAnalysisMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
package com.ruoyi.inspect.mapper;
import com.ruoyi.basic.dto.IfsInventoryQuantitySupplierDto;
import com.ruoyi.inspect.dto.DataAnalysisDto;
import com.ruoyi.inspect.vo.RawMaterialSupplierVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
 * æ•°æ®åˆ†æž
 *
 * @Author zhuo
 * @Date 2024/10/16
 */
@Mapper
public interface DataAnalysisMapper {
    /**
     * èŽ·å–æœ¬å‘¨çš„åŽŸææ–™ä¿¡æ¯
     * @return
     */
    List<Map<String, Object>> getRawPassRateByBarChartByWeek(@Param("dto") DataAnalysisDto dataAnalysisDto);
    /**
     * èŽ·å–æœ¬æœˆçš„åŽŸææ–™ä¿¡æ¯
     * @return
     */
    List<Map<String, Object>> getRawPassRateByBarChartByDay(@Param("dto") DataAnalysisDto dataAnalysisDto);
    /**
     * èŽ·å–æœ¬å¹´çš„åŽŸææ–™ä¿¡æ¯
     * @return
     */
    List<Map<String, Object>> getRawPassRateByBarChartByYear(@Param("dto") DataAnalysisDto dataAnalysisDtor);
    /**
     * æŸ¥çœ‹åŽŸææ–™é¥¼çŠ¶å›¾
     * @return
     */
    Map<String, Object> getRawPassRateByCake(@Param("dto") DataAnalysisDto dataAnalysisDto);
    /**
     * æŸ¥è¯¢æ£€æµ‹é¡¹é›†åˆ
     * @param dataAnalysisDto
     * @return
     */
    List<IfsInventoryQuantitySupplierDto> getRawProductAnalysisAllSample(@Param("dto") DataAnalysisDto dataAnalysisDto);
    /**
     * æŸ¥è¯¢æ‰€æœ‰çš„
     * @param dataAnalysisDto
     * @return
     */
    List<IfsInventoryQuantitySupplierDto> getRawProductAnalysisList(@Param("dto") DataAnalysisDto dataAnalysisDto);
    List<RawMaterialSupplierVo> getItemValueByOrderIds(@Param("insOrderIds") List<Integer> insOrderIds, @Param("itemName") String itemName);
    /**
     * æŸ¥è¯¢æœ¬æœˆä¸Žä¸Šæœˆåˆæ ¼çŽ‡å¯¹æ¯”
     * @return
     */
    List<Map<String, Object>> getRawUpMonth();
    /**
     * æŸ¥è¯¢æ£€éªŒé¡¹ç±»åž‹é¥¼å›¾
     * @return
     */
    Map<String, Object> getOrderTypeCookie();
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/IfsPartPropsRecordMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.inspect.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.inspect.pojo.IfsPartPropsRecord;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* @author 27233
* @description é’ˆå¯¹è¡¨ã€ifs_part_props_record(ifs订单零件属性记录表)】的数据库操作Mapper
* @createDate 2025-10-23 15:00:34
* @Entity com.ruoyi.inspect.pojo.IfsPartPropsRecord
*/
@Mapper
public interface IfsPartPropsRecordMapper extends BaseMapper<IfsPartPropsRecord> {
    Long selectCountByPartNoAndLotBatchNo(@Param("partNo") String partNo, @Param("lotBatchNo") String lotBatchNo);
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/IfsSplitOrderRecordMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.inspect.mapper;
import com.ruoyi.inspect.pojo.IfsSplitOrderRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* @author 27233
* @description é’ˆå¯¹è¡¨ã€ifs_split_order_record(ifs原材料订单拆分记录表)】的数据库操作Mapper
* @createDate 2025-10-29 16:39:41
* @Entity com.ruoyi.inspect.pojo.IfsSplitOrderRecord
*/
@Mapper
public interface IfsSplitOrderRecordMapper extends BaseMapper<IfsSplitOrderRecord> {
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderDeviceRecordMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package com.ruoyi.inspect.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.inspect.dto.InsOrderDeviceRecordDto;
import com.ruoyi.inspect.pojo.InsOrderDeviceRecord;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Set;
/**
 * cnas设备使用记录表(DeviceRecord)$desc
 *
 * @author makejava
 * @since 2024-12-21 11:11:01
 */
public interface InsOrderDeviceRecordMapper extends BaseMapper<InsOrderDeviceRecord> {
    /**
     * æŸ¥è¯¢è®¾å¤‡ä½¿ç”¨è®°å½•
     * @param insOrderId
     * @return
     */
    List<InsOrderDeviceRecordDto> selectDeviceNumber(@Param("insOrderId") Integer insOrderId);
    /**
     * æ ¹æ®ç¼–号查询设备id
     * @param deviceNumbers
     * @return
     */
    List<Integer> selectDeviceIdsByNumbers(@Param("deviceNumbers") Set<String> deviceNumbers);
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderFactoryVerifyItemMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.inspect.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.inspect.pojo.InsOrderFactoryVerifyItem;
import org.apache.ibatis.annotations.Mapper;
/**
 * åŽŸææ–™åŽ‚å®¶è¿›è´§éªŒè¯æ£€éªŒé¡¹
 *
 * @author zhuo
 * @since 2024-09-26
 */
@Mapper
public interface InsOrderFactoryVerifyItemMapper extends BaseMapper<InsOrderFactoryVerifyItem> {
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderFactoryVerifyMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.inspect.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.inspect.pojo.InsOrderFactoryVerify;
import org.apache.ibatis.annotations.Mapper;
/**
 * åŽŸææ–™åŽ‚å®¶è¿›è´§éªŒè¯
 *
 * @author zhuo
 * @since 2024-09-26
 */
@Mapper
public interface InsOrderFactoryVerifyMapper extends BaseMapper<InsOrderFactoryVerify> {
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderFileMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.inspect.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.inspect.pojo.InsOrderFile;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * æ£€éªŒå•下的附件列表 Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-06-06 10:08:21
 */
public interface InsOrderFileMapper extends BaseMapper<InsOrderFile> {
    IPage<InsOrderFile> getFileList(@Param("page") Page page, @Param("ew") QueryWrapper<InsOrderFile> ew, @Param("insOrderId") Integer insOrderId);
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,177 @@
package com.ruoyi.inspect.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.InventoryDetailDTO;
import com.ruoyi.basic.pojo.StructureTestObject;
import com.ruoyi.inspect.dto.SampleOrderDto;
import com.ruoyi.inspect.dto.SampleProductDto2;
import com.ruoyi.inspect.dto.SampleProductExportDto;
import com.ruoyi.inspect.pojo.InsOrder;
import com.ruoyi.inspect.vo.IfsOrderVO;
import com.ruoyi.inspect.vo.InsOrderPrintingVo;
import com.ruoyi.inspect.vo.SampleDefectsFatherVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
 * @author gaoaoy
 * @description é’ˆå¯¹è¡¨ã€ins_order(检验下单)】的数据库操作Mapper
 * @createDate 2024-03-12 16:17:55
 * @Entity com.yuanchu.mom.pojo.InsOrder
 */
@Mapper
public interface InsOrderMapper extends BaseMapper<InsOrder> {
    //获取检验下单数据
    IPage<SampleOrderDto> selectInsOrderPage(@Param("page") IPage<InsOrder> page, @Param("ew") QueryWrapper<SampleOrderDto> ew, @Param("laboratory") String laboratory, @Param("isOrderAll") String isOrderAll, @Param("receiptSubmitted") String receiptSubmitted);
    String getLaboratoryCode(@Param("name") String name);
    IPage<SampleProductDto2> selectSampleAndProductByOrderId(@Param("page") IPage<SampleProductDto2> page, @Param("ew") QueryWrapper<SampleProductDto2> ew, @Param("id") Integer id);
    List<Map<String, String>> selectDeviceListByIds(@Param("deviceIds") Set<Integer> deviceIds);
    List<SampleDefectsFatherVo> selectSampleDefects(Page page, @Param("inspectionItems") String inspectionItems, @Param("orderNumber") String orderNumber);
    String getStandardMethodCode(@Param("id") Integer id);
    String getStandardMethodReportText(@Param("id") Integer id);
    String getStandardMethodReportTextByCode(@Param("code") String code);
    int updateStatus(@Param("id") Integer id);
    String selLaboratoryCode(@Param("laboratory") String laboratory);
    List<Map<Integer, Object>> selectReportModelByOrderId(@Param("id") Integer id, @Param("laboratory") String laboratory);
    String seldepLimsId(@Param("depLimsId") Integer depLimsId);
    /**
     * æŸ¥è¯¢æ£€éªŒç»“æžœ
     *
     * @param ids
     * @return
     */
    List<SampleProductExportDto> selectSampleBySampleId(@Param("ids") List<Integer> ids);
    /**
     * èŽ·å–æ‰¹é‡æ£€éªŒçš„æ€»æ•°
     *
     * @param id
     * @return
     */
    int selectSampleMax(@Param("id") Integer id);
    /**
     * èŽ·å–çº¿èŠ¯é¢œè‰²
     *
     * @param id
     * @return
     */
    List<String> selectSampleCableTag(@Param("id") Integer id);
    /**
     *
     * @param orderId
     * @return
     */
    int selectSampleItemS(@Param("orderId") Integer orderId);
    /**
     * åªæŸ¥è¯¢é»˜è®¤ç¬¬ä¸€ä¸ªçš„产品
     *
     * @param id
     * @return
     */
    List<SampleProductExportDto> selectSampleBySampleIdOne(@Param("id") Integer id);
    /**
     * æŸ¥è¯¢æ—¥åކ图
     *
     * @param
     * @return
     */
    List<Map<String, Object>> selectCalendarWorkByWeek(@Param("day") Integer day);
    /**
     *
     * @param partNo
     * @return
     */
    StructureTestObject selectProductByPartNo(@Param("partNo") String partNo);
    /**
     *
     * @param partNo
     * @return
     */
    StructureTestObject selectByPartNo(@Param("partNo") String partNo);
    /**
     * æˆå“æ ‡ç­¾æ‰“印
     *
     * @param ids
     * @return
     */
    List<InsOrderPrintingVo> labelOrderPrinting(@Param("ids") List<Integer> ids);
    /**
     * å¤–购产品标签打印
     *
     * @param ids
     * @return
     */
    List<InventoryDetailDTO> labelOutsideOrderPrinting(@Param("ids") List<Integer> ids);
    /**
     * æŸ¥è¯¢å¯¼å‡ºä¿¡æ¯
     *
     * @return
     */
    List<SampleOrderDto> rawAllInsOrderExport(@Param("ew") QueryWrapper<SampleOrderDto> ew, @Param("laboratory") String laboratory, @Param("isOrderAll") String isOrderAll);
    /**
     * æ ¹æ®è®¢å•查询试验室
     *
     * @param insOrderId
     * @return
     */
    String selectLaboratoryByOrderId(@Param("insOrderId") Integer insOrderId);
    /**
     * æŸ¥è¯¢è®¢å•信息
     *
     * @param insSampleId
     * @return
     */
    InsOrder selectFirstSubmit(@Param("insSampleId") Integer insSampleId);
    /**
     * æ ¹æ®è®¢å•id查询订单导出信息
     *
     * @param orderIds
     * @return
     */
    List<SampleOrderDto> getInsOrderExportByIds(@Param("orderIds") List<String> orderIds);
    /**
     * æŸ¥è¯¢å½“前时间是否有该检测项的抽样计划订单
     *
     * @param itmeId    æ ·å“Id
     * @param startTime å¼€å§‹æ—¶é—´
     * @param endTime   ç»“束时间
     * @return
     */
    Integer selectNotSpotCheckOrder(@Param("itmeId") Integer itmeId, @Param("startTime") String startTime, @Param("endTime") String endTime);
    IfsOrderVO selectOrderInfoById(@Param("id") Integer id);
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderRatesMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.ruoyi.inspect.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.inspect.dto.SampleOrderDto;
import com.ruoyi.inspect.dto.TemplateRateDto;
import com.ruoyi.inspect.pojo.InsOrderRates;
import org.apache.ibatis.annotations.Param;
/**
 * è®¢å•费用表
 *
 * @author zhuo
 * @since 2025-02-28
 */
public interface InsOrderRatesMapper extends BaseMapper<InsOrderRates> {
    /**
     * æŸ¥è¯¢è®¢å•费用列表
     * @return
     */
    IPage<SampleOrderDto> selectInsOrderRates(Page page, @Param("ew") QueryWrapper<SampleOrderDto> ew);
    /**
     * æŸ¥è¯¢è®¢å•费用详情(模板价格)
     * @return
     */
    IPage<TemplateRateDto> selectTemplateRatesDetail(Page page, @Param("insOrderId") Integer insOrderId);
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderStandardTemplateMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.inspect.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.inspect.pojo.InsOrderStandardTemplate;
import org.apache.ibatis.annotations.Mapper;
/**
 * è®¢å•标准模板复制
 *
 * @author zhuo
 * @since 2024-11-05
 */
@Mapper
public interface InsOrderStandardTemplateMapper extends BaseMapper<InsOrderStandardTemplate> {
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderStateMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.inspect.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.inspect.pojo.InsOrderState;
/**
* @author admin
* @description é’ˆå¯¹è¡¨ã€ins_order_state】的数据库操作Mapper
* @createDate 2024-04-01 11:44:50
* @Entity com.yuanchu.mom.pojo.InsOrderState
*/
public interface InsOrderStateMapper extends BaseMapper<InsOrderState> {
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderTemplateDeviceMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.inspect.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.inspect.pojo.InsOrderTemplateDevice;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface InsOrderTemplateDeviceMapper extends BaseMapper<InsOrderTemplateDevice> {
    List<Integer> selectExistingDeviceIds(@Param("deviceIds") List<Integer> deviceIds);
    List<Integer> selectDeviceIdsByOrderId(@Param("orderId") Integer orderId);
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderTemplateMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.inspect.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.inspect.pojo.InsOrderTemplate;
/**
* @author Administrator
* @description é’ˆå¯¹è¡¨ã€ins_order_template】的数据库操作Mapper
* @createDate 2024-03-18 14:14:54
* @Entity com.yuanchu.mom.pojo.InsOrderTemplate
*/
public interface InsOrderTemplateMapper extends BaseMapper<InsOrderTemplate> {
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsProductDeviationWarningDetailMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.inspect.mapper;
import com.ruoyi.inspect.pojo.InsProductDeviationWarningDetail;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
 * <p>
 * æ£€éªŒé¡¹åå·®é¢„警详情表 Mapper æŽ¥å£
 * </p>
 *
 * @author
 * @since 2025-03-28 02:18:58
 */
public interface InsProductDeviationWarningDetailMapper extends BaseMapper<InsProductDeviationWarningDetail> {
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsProductDeviationWarningMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.inspect.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.inspect.dto.InsProductDeviationWarningDto;
import com.ruoyi.inspect.pojo.InsProductDeviationWarning;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * æ£€éªŒé¡¹åå·®é¢„警主表 Mapper æŽ¥å£
 * </p>
 *
 * @author
 * @since 2025-03-28 02:18:02
 */
public interface InsProductDeviationWarningMapper extends BaseMapper<InsProductDeviationWarning> {
    /**
     * æŸ¥çœ‹é¢„警列表
     * @param page
     * @return
     */
    IPage<InsProductDeviationWarningDto> selectDeviationWarningPage(@Param("page") Page page, @Param("ew") QueryWrapper<InsProductDeviationWarningDto> ew);
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsProductMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,88 @@
package com.ruoyi.inspect.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.inspect.dto.InsProductAnalysisDto;
import com.ruoyi.inspect.dto.ProductResultDto2;
import com.ruoyi.inspect.dto.SampleProductRawAnalysisDto;
import com.ruoyi.inspect.pojo.InsProduct;
import com.ruoyi.inspect.pojo.InsProductDeviationWarningDetail;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* @author Administrator
* @description é’ˆå¯¹è¡¨ã€ins_product(检验项目)】的数据库操作Mapper
* @createDate 2024-03-08 09:45:03
* @Entity com.yuanchu.mom.pojo.InsProduct
*/
@Mapper
public interface InsProductMapper extends BaseMapper<InsProduct> {
    int selectOrderManDay(@Param("orderId") Integer orderId);
    Map<String, String> selectUserById(@Param("userId") Integer userId);
    List<ProductResultDto2> getProductAndResult(@Param("sampleId") Integer sampleId);
    int updateInspected(@Param("id") Integer id);
    List<InsProduct> selectFiberInsProduct(@Param("ids") List<Integer> ids, @Param("laboratory") String laboratory);
    IPage<InsProduct> selectNoProducts(@Param("page") Page page, @Param("orderId") Integer orderId, @Param("noIds") List<Integer> noIds);
    int selectInsProductCountByOrderId(@Param("orderId") Integer orderId);
    /**
     * æ ¹æ®æ ·å“id查询检验项目
     * @param sampleIds
     * @return
     */
    List<SampleProductRawAnalysisDto> selectListBySampleIds(@Param("sampleIds") List<Integer> sampleIds);
    /**
     * æŸ¥è¯¢æ‰€æœ‰çš„æ£€éªŒé¡¹
     * @param sampleIds
     * @return
     */
    List<String> selectItemNameBySampleIds(@Param("sampleIds") List<Integer> sampleIds);
    /**
     * æ ¹æ®è®¢å•id查询不合格项
     * @param orderId
     * @return
     */
    List<String> selectUnqualifiedList(@Param("orderId") Integer orderId);
    /**
     * æŸ¥è¯¢åˆ¤æ–­æ˜¯å¦æœ‰ä¸åˆ¤å®šé¡¹ç›®,和全都是判定项
     * @param orderId
     * @return
     */
    int selectNoJudge(@Param("orderId") Integer orderId);
    /**
     * æ ¹æ®è®¢å•查询产品信息
     * @param orderId
     * @return
     */
    List<InsProduct> selectProductByOrderId(Integer orderId);
    /**
     * æŸ¥è¯¢åŒä¸€åž‹å·, åŒä¸€åނ家, åŒä¸€æ£€æµ‹é¡¹çš„æ£€æµ‹æ•°æ®
     * @param insProduct
     * @param supplierName
     * @return
     */
    List<InsProductDeviationWarningDetail> selectAnalysis(@Param("insProduct") InsProduct insProduct, @Param("supplierName") String supplierName);
    List<InsProduct> getRevocationInsProductList(@Param("ids") List<Integer> ids);
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsProductResultMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.inspect.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.inspect.pojo.InsProductResult;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * @author Administrator
 * @description é’ˆå¯¹è¡¨ã€ins_product_result(检验项目的结果)】的数据库操作Mapper
 * @createDate 2024-03-28 10:29:37
 * @Entity com.yuanchu.mom.pojo.InsProductResult
 */
public interface InsProductResultMapper extends BaseMapper<InsProductResult> {
    List<InsProductResult> selDetail(@Param("ips") List<Integer> ips);
    /**
     * æ ¹æ®è®¢å•id查询检验结果
     * @param orderId
     * @return
     */
    List<InsProductResult> selectResultByOrderId(@Param("orderId") Integer orderId);
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsProductUserMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.inspect.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.inspect.pojo.InsProductUser;
/**
* @author z1292
* @description é’ˆå¯¹è¡¨ã€ins_product_user(检验项目的人员检验记录)】的数据库操作Mapper
* @createDate 2024-04-17 13:42:44
* @Entity com.yuanchu.mom.pojo.InsProductUser
*/
public interface InsProductUserMapper extends BaseMapper<InsProductUser> {
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsReportMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,53 @@
package com.ruoyi.inspect.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.inspect.dto.InsReportExport;
import com.ruoyi.inspect.dto.ReportPageDto;
import com.ruoyi.inspect.pojo.InsReport;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author Administrator
* @description é’ˆå¯¹è¡¨ã€ins_report(检验报告)】的数据库操作Mapper
* @createDate 2024-03-17 22:10:02
* @Entity com.yuanchu.mom.pojo.InsReport
*/
public interface InsReportMapper extends BaseMapper<InsReport> {
    /**
     * æŸ¥è¯¢æ£€éªŒä»»åŠ¡
     * @param userId å½“前登录人id
     * @param queryStatus  çŠ¶æ€
     * @param createOrderUser  æ˜¯å¦æ˜¯åªæœ‰æŸ¥çœ‹è‡ªå·±çš„æƒé™
     * @return
     */
    IPage<ReportPageDto> pageInsReport(IPage<ReportPageDto> page,
                                       @Param("ew") QueryWrapper<ReportPageDto> ew,
                                       @Param("laboratory") String laboratory,
                                       @Param("userId") Integer userId,
                                       @Param("queryStatus") String queryStatus,
                                       @Param("createOrderUser") Integer createOrderUser);
    String getLaboratoryByName(@Param("name") String name, @Param("type") String type);
    /** æŒ‰æŠ¥å‘Šç¼–制列表相同的数据范围查询可下载的报告。 */
    InsReport selectDownloadableReport(@Param("id") Integer id,
                                       @Param("createOrderUser") Integer createOrderUser);
    /**
     * æŠ¥å‘ŠæŠ¥è¡¨å¯¼å‡º
     * @return
     */
    List<InsReportExport> reportAllExport(@Param("ew") QueryWrapper<ReportPageDto> ew,
                                          @Param("userId") Integer userId,
                                          @Param("queryStatus") String queryStatus,
                                          @Param("createOrderUser") Integer createOrderUser);
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsSampleMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,137 @@
package com.ruoyi.inspect.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.inspect.dto.InsOrderPlanDTO;
import com.ruoyi.inspect.dto.SampleProductDto;
import com.ruoyi.inspect.pojo.InsProduct;
import com.ruoyi.inspect.pojo.InsSample;
import com.ruoyi.inspect.vo.InsOrderPlanTaskSwitchVo;
import com.ruoyi.inspect.vo.InsOrderPlanVO;
import com.ruoyi.inspect.vo.SampleVo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* @author Administrator
* @description é’ˆå¯¹è¡¨ã€ins_sample(检验样品)】的数据库操作Mapper
* @createDate 2024-03-14 17:14:57
* @Entity com.yuanchu.mom.pojo.InsSample
*/
public interface InsSampleMapper extends BaseMapper<InsSample> {
    IPage<InsOrderPlanVO> findInsSampleAndOrder(Page page,
                                                @Param("ew") QueryWrapper<InsOrderPlanDTO> ew,
                                                @Param("userName") String userName ,
                                                @Param("userId") Integer userId,
                                                @Param("sonLaboratory") String sonLaboratory,
                                                @Param("laboratory") String laboratory,
                                                @Param("isCheck") Integer isCheck);
    IPage<InsOrderPlanTaskSwitchVo> inspectionOrderDetailsTaskSwitching(Page page, @Param("ew") QueryWrapper<InsOrderPlanDTO> ew, @Param("userId") Integer userId, @Param("sonLaboratory") String sonLaboratory, @Param("laboratory") String laboratory);
    List<SampleProductDto> selectSampleProductListByOrderId(@Param("id") Integer id);
    List<SampleProductDto> selectSampleProductListByOrderId2(@Param("id") Integer id);
    Map<String,Object> selectInsOrder(@Param("id") Integer id);
    List<SampleProductDto> getInsOrderAndSample(@Param("id") Integer id, @Param("laboratory") String laboratory);
    String getSampleEn(@Param("sample") String sample);
    /**
     * å¯èƒ½æ²¡æœ‰äº§å“ç›´æŽ¥å°±æ˜¯å¯¹è±¡
     * @param sample
     * @return
     */
    String getSampleEnByObject(@Param("sample") String sample);
    /**
     * æ ·å“
     * @param id
     * @param laboratory
     * @return
     */
    List<InsProduct> getInsProduct1(@Param("id") Integer id, @Param("laboratory") String laboratory, @Param("cableTag") String cableTag, @Param("repetitionTag") String repetitionTag);
    /**
     * åŽŸææ–™
     * @param id
     * @param laboratory
     * @param rawMaterialTag
     * @return
     */
    List<InsProduct> getInsProduct6(@Param("id") Integer id, @Param("laboratory") String laboratory, @Param("rawMaterialTag") String rawMaterialTag);
    SampleVo getDetailById(@Param("sampleId") Integer sampleId);
    String selMethodById(@Param("sampleId") Integer sampleId);
    /**
     * ç”µç¼†é…ç½®æŸ¥çœ‹é…ç½®æ ‡è¯†
     * @param id
     * @param laboratory
     * @return
     */
    List<Map<String, Object>> getCableTag(@Param("id") Integer id, @Param("laboratory") String laboratory);
    /**
     * åŽŸææ–™æŸ¥çœ‹é…ç½®æ ‡è¯†
     * @param id
     * @param laboratory
     * @return
     */
    List<Map<String, Object>> getRawMaterialTag(@Param("id") Integer id, @Param("laboratory") String laboratory);
    /**
     * æŸ¥çœ‹é‡å¤æ ‡è¯†
     * @param id
     * @param laboratory
     * @return
     */
    List<Map<String, Object>> getRepetitionTag(@Param("id") Integer id, @Param("laboratory") String laboratory, @Param("cableTag") String cableTag);
    List<SampleProductDto> selectExemptionByOrderId(@Param("id") Integer id);
    /**
     * æŸ¥è¯¢åŽ‚å®¶å¯†åº¦(有型号)
     * @param sample
     * @param production
     * @return
     */
    String selectSupplierDensityModel(@Param("sample") String sample, @Param("production") String production, @Param("model") String model);
    /**
     * æŸ¥è¯¢åŽ‚å®¶å¯†åº¦(没型号)
     * @param sample
     * @param production
     * @return
     */
    String selectSupplierDensity(@Param("sample") String sample, @Param("production") String production);
    /**
     * æŸ¥è¯¢æ£€éªŒé¡¹æ£€éªŒç»“æžœ
     * @param itemIds
     * @return
     */
    List<InsProduct> selectProductResult(@Param("itemIds") List<Integer> itemIds);
    /**
     * æ ¹æ®è®¢å•id查询样品
     * @param insOrderId
     * @return
     */
    List<InsSample> getSampleByOrderId(Integer insOrderId);
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsSampleReceiptMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.ruoyi.inspect.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.inspect.dto.SampleReceiptPageDto;
import com.ruoyi.inspect.dto.SampleReceiptQueryDto;
import com.ruoyi.inspect.pojo.InsSampleReceipt;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface InsSampleReceiptMapper extends BaseMapper<InsSampleReceipt> {
    IPage<SampleReceiptPageDto> selectPage(Page<?> page, @Param("query") SampleReceiptQueryDto query);
    SampleReceiptPageDto selectDetail(@Param("id") Integer id);
    InsSampleReceipt selectForUpdate(@Param("id") Integer id);
    int insertIgnore(@Param("orderId") Integer orderId, @Param("sampleId") Integer sampleId);
    List<SampleReceiptPageDto> selectExportList(@Param("query") SampleReceiptQueryDto query);
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsSampleUserMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.inspect.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.inspect.pojo.InsSampleUser;
import com.ruoyi.inspect.vo.InsSampleUserVO;
import org.apache.ibatis.annotations.Param;
/**
* @author Administrator
* @description é’ˆå¯¹è¡¨ã€ins_sample_user(样品负责人记录)】的数据库操作Mapper
* @createDate 2024-03-14 17:12:02
* @Entity com.yuanchu.mom.pojo.InsSampleUser
*/
public interface InsSampleUserMapper extends BaseMapper<InsSampleUser> {
    InsSampleUserVO selectUserNameByOrderId(@Param("orderId") Integer orderId);
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsUnqualifiedHandlerFileMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.inspect.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.inspect.pojo.InsUnqualifiedHandlerFile;
import org.apache.ibatis.annotations.Mapper;
/**
* @author 27233
* @description é’ˆå¯¹è¡¨ã€ins_unqualified_handler_file(不合格处理附件记录表)】的数据库操作Mapper
* @createDate 2024-07-31 13:38:38
* @Entity com.yuanchu.mom.pojo.InsUnqualifiedHandlerFile
*/
@Mapper
public interface InsUnqualifiedHandlerFileMapper extends BaseMapper<InsUnqualifiedHandlerFile> {
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsUnqualifiedHandlerMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.inspect.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.inspect.dto.UnqualifiedHandlerDto;
import com.ruoyi.inspect.pojo.InsUnqualifiedHandler;
import com.ruoyi.inspect.vo.UnqualifiedHandlerVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* @author 27233
* @description é’ˆå¯¹è¡¨ã€ins_unqualified_handler(不合格处理表)】的数据库操作Mapper
* @createDate 2024-07-31 13:38:14
* @Entity com.yuanchu.mom.pojo.InsUnqualifiedHandler
*/
@Mapper
public interface InsUnqualifiedHandlerMapper extends BaseMapper<InsUnqualifiedHandler> {
    IPage<UnqualifiedHandlerVO> selectPageList(IPage<UnqualifiedHandlerVO> page, @Param("ew")QueryWrapper<UnqualifiedHandlerDto> ew);
    UnqualifiedHandlerVO findById(@Param("id") Long id);
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsUnqualifiedRetestProductMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package com.ruoyi.inspect.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.inspect.pojo.InsProduct;
import com.ruoyi.inspect.pojo.InsUnqualifiedRetestProduct;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * ä¸åˆæ ¼æ£€éªŒé¡¹ç›®å¤æµ‹
 * @author é·Ÿ
 * @since 2024-09-03
 */
@Mapper
public interface InsUnqualifiedRetestProductMapper extends BaseMapper<InsUnqualifiedRetestProduct> {
    /**
     * æŸ¥è¯¢ä¸åˆæ ¼å†…容
     * @param ids
     * @return
     */
    List<InsUnqualifiedRetestProduct> selectRetestProduct(@Param("ids") List<Integer> ids);
    // æ ·å“
    List<InsProduct> getInsProductUnqualifiedRetest1(@Param("id") Integer id, @Param("laboratory") String laboratory, @Param("cableTag") String cableTag, @Param("repetitionTag") String repetitionTag, @Param("retestTag") String retestTag);
    // åŽŸææ–™ä¸‹å•
    List<InsProduct> getInsProductUnqualifiedRetest6(@Param("id") Integer id, @Param("laboratory") String laboratory, @Param("rawMaterialTag") String rawMaterialTag , @Param("retestTag") String retestTag);
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsUnqualifiedRetestResultMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.inspect.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.inspect.pojo.InsUnqualifiedRetestResult;
import org.apache.ibatis.annotations.Mapper;
/**
 * ä¸åˆæ ¼å¤æµ‹æ£€éªŒé¡¹ç›®çš„结果
 *
 * @author zhuo
 * @since 2024-09-03
 */
@Mapper
public interface InsUnqualifiedRetestResultMapper extends BaseMapper<InsUnqualifiedRetestResult> {
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/RawMaterialOrderTemplateMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.inspect.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.inspect.pojo.RawMaterialOrderTemplate;
import org.apache.ibatis.annotations.Mapper;
/**
 * åŽŸææ–™ä¸‹å•æ¨¡æ¿
 *
 * @author zhuo
 * @since 2024-08-05
 */
@Mapper
public interface RawMaterialOrderTemplateMapper extends BaseMapper<RawMaterialOrderTemplate> {
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/SpotCheckQuarterItemMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.inspect.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.inspect.pojo.SpotCheckQuarterItem;
import org.apache.ibatis.annotations.Mapper;
/**
 * å­£åº¦æŠ½æ ·è®¡åˆ’详情表
 *
 * @author zhuo
 * @since 2024-10-09
 */
@Mapper
public interface SpotCheckQuarterItemMapper extends BaseMapper<SpotCheckQuarterItem> {
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/SpotCheckQuarterMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package com.ruoyi.inspect.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.inspect.dto.SpotCheckQuarterDto;
import com.ruoyi.inspect.pojo.SpotCheckQuarter;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
 * å­£åº¦æŠ½æ ·è®¡åˆ’
 *
 * @author zhuo
 * @since 2024-10-09
 */
@Mapper
public interface SpotCheckQuarterMapper extends BaseMapper<SpotCheckQuarter> {
    /**
     * å­£åº¦æŠ½æ ·åˆ†é¡µæŸ¥è¯¢
     * @param page
     * @param ew
     * @return
     */
    IPage<SpotCheckQuarterDto> getQuarterPage(Page page, @Param("ew") QueryWrapper<SpotCheckQuarterDto> ew);
    /**
     * æˆå“ä¸‹å•界面查询季度信息
     * @return
     */
    List<Map<String, Object>> getQuarterOnOrder();
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/SpotCheckYearItemMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.inspect.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.inspect.pojo.SpotCheckYearItem;
import org.apache.ibatis.annotations.Mapper;
/**
 * å¹´åº¦æŠ½æ ·è®¡åˆ’详情表
 *
 * @author zhuo
 * @since 2024-10-10
 */
@Mapper
public interface SpotCheckYearItemMapper extends BaseMapper<SpotCheckYearItem> {
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/SpotCheckYearMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.ruoyi.inspect.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.inspect.dto.SpotCheckYearDto;
import com.ruoyi.inspect.pojo.SpotCheckYear;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * å¹´åº¦æŠ½æ ·è®¡åˆ’
 *
 * @author zhuo
 * @since 2024-10-10
 */
@Mapper
public interface SpotCheckYearMapper extends BaseMapper<SpotCheckYear> {
    /**
     * æŸ¥è¯¢å¹´åº¦æŠ½æ ·åˆ—表
     * @param page
     * @param ew
     * @return
     */
    IPage<SpotCheckYearDto> getSpotCheckYearPage(Page page, @Param("ew") QueryWrapper<SpotCheckYearDto> ew);
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/WarehouseCellMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.inspect.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.inspect.dto.WarehouseCellAndSampleDto;
import com.ruoyi.inspect.pojo.WarehouseCell;
import java.util.List;
/**
* @author z1292
* @description é’ˆå¯¹è¡¨ã€warehouse_cell(货架单元格)】的数据库操作Mapper
* @createDate 2024-04-06 12:12:12
* @Entity com.yuanchu.mom.pojo.WarehouseCell
*/
public interface WarehouseCellMapper extends BaseMapper<WarehouseCell> {
    List<WarehouseCellAndSampleDto> getWarehouse(Integer shelfId);
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/WarehouseHistoryMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.ruoyi.inspect.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.inspect.dto.HistoryDto;
import com.ruoyi.inspect.pojo.WarehouseHistory;
import java.util.List;
/**
* @author z1292
* @description é’ˆå¯¹è¡¨ã€warehouse_history(出入库记录)】的数据库操作Mapper
* @createDate 2024-04-06 12:12:12
* @Entity com.yuanchu.mom.pojo.WarehouseHistory
*/
public interface WarehouseHistoryMapper extends BaseMapper<WarehouseHistory> {
    String getUserNameById(Integer userId);
    List<HistoryDto> getHistoryListBySampleId(Integer sampleId);
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/WarehouseMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.inspect.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.inspect.dto.WarehouseDto;
import com.ruoyi.inspect.pojo.Warehouse;
import java.util.List;
/**
* @author z1292
* @description é’ˆå¯¹è¡¨ã€warehouse(仓库)】的数据库操作Mapper
* @createDate 2024-04-06 12:12:12
* @Entity com.yuanchu.mom.pojo.Warehouse
*/
public interface WarehouseMapper extends BaseMapper<Warehouse> {
    List<WarehouseDto> selectWarehouseList();
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/WarehouseShelfMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.inspect.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.inspect.pojo.WarehouseShelf;
/**
* @author z1292
* @description é’ˆå¯¹è¡¨ã€warehouse_shelf(货架)】的数据库操作Mapper
* @createDate 2024-04-06 12:12:12
* @Entity com.yuanchu.mom.pojo.WarehouseShelf
*/
public interface WarehouseShelfMapper extends BaseMapper<WarehouseShelf> {
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/IfsPartPropsRecord.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,67 @@
package com.ruoyi.inspect.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
/**
 * ifs订单零件属性记录表
 * @TableName ifs_part_props_record
 */
@TableName(value ="ifs_part_props_record")
@Data
public class IfsPartPropsRecord implements Serializable {
    /**
     * ä¸»é”®id
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * ifs订单id
     */
    private Long ifsInventoryId;
    /**
     * è½½å…·ç¼–号
     */
    private String drumNo;
    /**
     * èµ·å§‹ç±³æ ‡
     */
    private BigDecimal startMeterMark;
    /**
     * æˆªæ­¢ç±³æ ‡
     */
    private BigDecimal endMeterMark;
    /**
     * ç»ç¼˜é¢œè‰²
     */
    private String insulationColor;
    /**
     * å¤–护颜色
     */
    private String outerColor;
    /**
     * å°å­—信息
     */
    private String letteringInfo;
    /**
     * ifs零件属性更新标识
     */
    private Boolean partPropsFlag;
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/IfsSplitOrderRecord.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,161 @@
package com.ruoyi.inspect.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
 * ifs原材料订单拆分记录表
 * @TableName ifs_split_order_record
 */
@TableName(value ="ifs_split_order_record")
@Data
public class IfsSplitOrderRecord implements Serializable {
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
    public static final int DIGIT = 6;//系统编号生成位数
    public static final String PREFIX ="WG";//系统编号生成前缀
    /**
     * ä¸»é”®id
     */
    @Schema(description = "主键id")
    @TableId
    private Long id;
    /**
     * é”€å”®è®¢å•号
     */
    @Schema(description = "销售订单号")
    private String orderNo;
    /**
     * è¡Œå·
     */
    @Schema(description = "行号")
    private String lineNo;
    /**
     * ä¸‹è¾¾å·
     */
    @Schema(description = "下达号")
    private String releaseNo;
    /**
     * æŽ¥æ”¶å·
     */
    @Schema(description = "接收号")
    private Integer receiptNo;
    /**
     * é›¶ä»¶å·
     */
    @Schema(description = "零件号")
    private String partNo;
    /**
     * ç³»ç»Ÿç¼–号
     */
    @Schema(description = "系统编号")
    private String systemNo;
    /**
     * è§„æ ¼
     */
    @Schema(description = "规格")
    private String spec;
    /**
     * é›¶ä»¶æ‰¹å·
     */
    @Schema(description = "零件批号")
    private String lotBatchNo;
    /**
     * åº“存数量1(用于对接mes分盘计算)
     */
    @Schema(description = "库存数量1(用于对接mes分盘计算)")
    private BigDecimal length;
    /**
     * åº“存数量2(ifs对于的库存数量)
     */
    @Schema(description = "库存数量2(ifs对于的库存数量)")
    private BigDecimal qtyStock;
    /**
     * ç»ç¼˜é¢œè‰²
     */
    @Schema(description = "绝缘颜色")
    private String insulationColor;
    /**
     * å¤–护颜色
     */
    @Schema(description = "外护颜色")
    private String outerColor;
    /**
     * å°å­—信息
     */
    @Schema(description = "印字信息")
    private String letteringInfo;
    /**
     * ç›˜å·
     */
    @Schema(description = "盘号")
    private String drumNo;
    /**
     * åº“位号
     */
    @Schema(description = "库位号")
    private String locationNo;
    /**
     * åº“位来源
     */
    @Schema(description = "库位来源")
    private String stockSource;
    /**
     * å¤‡æ³¨
     */
    @Schema(description = "备注")
    private String remark;
    /**
     * åŒæ­¥çŠ¶æ€ï¼ˆ0:未同步,1:已同步)
     */
    @Schema(description = "同步状态(0:未同步,1:已同步)")
    private Integer syncStatus;
    @Schema(description = "创建人")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @Schema(description = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @Schema(description = "修改人")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @Schema(description = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrder.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,262 @@
package com.ruoyi.inspect.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.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
* æ£€éªŒä¸‹å•
* @TableName ins_order
*/
@Data
@TableName("ins_order")
@ExcelIgnoreUnannotated
public class InsOrder implements Serializable {
    @Schema(description = "主键")
    @TableId(type = IdType.AUTO)
    private Integer id;
    @ExcelProperty(index = 0, value = "委托编号")
    @Schema(description = "委托编号")
    private String entrustCode;
    @Schema(description = "外部委托编号")
    private String outEntrustCode;
    @Schema(description = "检验类别")
    private String orderType;
    @Schema(description = "下单客户")
    private String custom;
    @ExcelProperty(index = 1, value = "委托单位")
    @Schema(description = "委托单位")
    private String company;
    @Schema(description = "联系方式")
    private String phone;
    @Schema(description = "工厂域")
    private String code;
    @Schema(description = "紧急程度 ï¼ˆ0普通 1优先 2紧急)")
    private Integer type;
    @ExcelProperty(index = 9, value = "约定时间%")
    @Schema(description = "约定时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate appointed;
    @Schema(description = "检验结果, 0 ä¸åˆæ ¼, 1合格")
    private Integer insResult;
    @Schema(description = "样品处理方式")
    private Integer processing;
    @Schema(description = "是否留样")
    private Integer isLeave;
    @Schema(description = "状态:-1:原材料撤回 0:待审核 1:样品接收/检验处理 2:退回 3:撤销 4:已检验 5:作废")
    private Integer state;
    @ExcelProperty(index = 7, value = "备注")
    @Schema(description = "备注")
    private String remark;
    @Schema(description = "备注英文")
    private String remarkEn;
    @Schema(description = "OTC订单号")
    private String otcCode;
    @Schema(description = "下单人")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @Schema(description = "下单时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @Schema(description = "下发时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime sendTime;
    @Schema(description = "")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @Schema(description = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    @Schema(description = "下单人id")
    private Integer userId;
    @Schema(description = "是否有配套样品")
    private Integer mating;
    @Schema(description = "检验状态(0:待检验 1:检验中 2:已检验 3:待复核 4:复核未通过 5:复核通过)")
    private Integer insState;
    @Schema(description = "检验工厂")
    private String factory;
    @Schema(description = "实验室名称")
    private String laboratory;
    @Schema(description = "样品类型")
    private String sampleType;
    @Schema(description = "样品名称")
    private String sample;
    @Schema(description = "检验时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime insTime;
    @Schema(description = "退回理由")
    private String tell;
    @Schema(description = "报告发送方式 1: è‡ªå–, 0:其他")
    private Integer send;
    @Schema(description = "来样方式")
    private String formType;
    @Schema(description = "审核时间")
    private LocalDateTime examineTime;
    @Schema(description = "工程名称")
    private String engineering;
    @Schema(description = "工程名称英文")
    private String engineeringEn;
    @Schema(description = "生产单位")
    private String production;
    @Schema(description = "生产单位英文")
    private String productionEn;
    @Schema(description = "客户单位id")
    private Long companyId;
    @Schema(description = "委托人id")
    private Integer prepareUserId;
    @ExcelProperty(index = 12, value = "委托人")
    @Schema(description = "委托人")
    private String prepareUser;
    @Schema(description = "委托人英文")
    private String prepareUserEn;
    @Schema(description = "委托人工号")
    private String prepareCode;
    @Schema(description = "是否审核撤销")
    private Integer isRevocation;
    @Schema(description = "审核撤销的项目id")
    private String revocationInsProductIds;
    @Schema(description = "是否为原材料 1 æ˜¯ 0 å¦")
    private Integer typeSource;
    @Schema(description = "原材料id")
    private Long ifsInventoryId;
    @Schema(description = "抽查数量")
    private String testQuantity;
    @Schema(description = "零件描述")
    private String partDetail;
    @Schema(description = "是否是免检, 0否 1是")
    private Integer isExemption;
    @Schema(description = "温度")
    private String temperature;
    @Schema(description = "湿度")
    private String humidity;
    @TableField(exist = false)
    @Schema(description = "当前填写环境条件的模板ID")
    private Integer templateId;
    @Schema(description = "样品状态")
    private String sampleStatus;
    @Schema(description = "送样日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate sampleDate;
    @Schema(description = "生产日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate productionDate;
    @Schema(description = "生产批号")
    private String productionBatch;
    @Schema(description = "季度抽样项目id")
    private Integer quarterItemId;
    @Schema(description = "样品名称(报告展示字段)")
    private String sampleView;
    @Schema(description = "样品名称引文(报告展示字段)")
    private String sampleViewEn;
    @Schema(description = "是否是第一次提交0否1是")
    private Integer isFirstSubmit;
    @Schema(description = "第一次提交时间")
    private LocalDateTime firstSubmitDate;
    @Schema(description = "首次保存检验模板值时间")
    private LocalDateTime firstInspectDate;
    @Schema(description = "分包内容 0无 1有")
    private Integer subcontractType;
    @Schema(description = "分包单位信息")
    private String subcontractCompany;
    @Schema(description = "样品处置 1委托方取回 2检测方处置")
    private Integer sampleDisposal;
    @Schema(description = "对结果评价 0否 1是")
    private Integer resultEvaluation;
    @Schema(description = "报告交付方式 1自取 2快递 3电子传送")
    private Integer reportDelivery;
    @Schema(description = "报告寄送地址")
    private String reportAddress;
    @Schema(description = "收件人及电话")
    private String reportReceiver;
    @Schema(description = "样机员(除了其他成品外这个字段必选,用于企业微信推送)")
    @TableField(exist = false)
    private Integer issueUser;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrderDeviceRecord.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,64 @@
package com.ruoyi.inspect.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
/**
 * cnas设备使用记录表(DeviceRecord)$desc
 *
 * @author makejava
 * @since 2024-12-21 11:11:01
 */
@Data
@TableName("device_record")
public class InsOrderDeviceRecord {
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @Schema(description = "设备id")
    private Integer deviceId;
    @Schema(description = "订单id")
    private Integer insOrderId;
    @Schema(description = "样品编号")
    private String sampleCode;
    @Schema(description = "温度")
    private String temperature;
    @Schema(description = "湿度")
    private String humidity;
    @Schema(description = "使用前0代表不正常1代表正常")
    private Integer useBefore;
    @Schema(description = "使用后0代表不正常1代表正常")
    private Integer useAfter;
    @Schema(description = "异常情况")
    private String abnormal;
    @Schema(description = "使用人id")
    private Integer usePersonId;
    @Schema(description = "使用人")
    private String usePerson;
    @Schema(description = "备注")
    private String remark;
    @Schema(description = "使用开始日期")
    private LocalDateTime useStartDate;
    @Schema(description = "使用结束日期")
    private LocalDateTime useEndDate;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrderFactoryVerify.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,100 @@
package com.ruoyi.inspect.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
/**
 * åŽŸææ–™åŽ‚å®¶è¿›è´§éªŒè¯
 *
 * @author zhuo
 * @since 2024-09-26
 */
@Data
@TableName("ins_order_factory_verify")
public class InsOrderFactoryVerify {
    @Schema(description = "主键")
    @TableId(type = IdType.AUTO)
    private Integer factoryVerifyId;
    @Schema(description = "外键:  ins_order表 id")
    private Integer insOrderId;
    @Schema(description = "委托编号")
    private String entrustCode;
    @Schema(description = "材料厂家")
    private String supplierName;
    @Schema(description = "到货日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime declareDate;
    @Schema(description = "样品名称")
    private String sample;
    @Schema(description = "规格型号")
    private String model;
    @Schema(description = "材料批号")
    private String updateBatchNo;
    @Schema(description = "验证文件编号")
    private String verifyFileCode;
    @Schema(description = "1材料名称")
    private String basicName;
    @Schema(description = "2规格型号")
    private String basicModel;
    @Schema(description = "3材料批号")
    private String basicBatchNo;
    @Schema(description = "4执行标准")
    private String basicStandard;
    @Schema(description = "5生产日期")
    private String basicDate;
    @Schema(description = "6供货数量")
    private String basicNumber;
    @Schema(description = "7材料颜色")
    private String basicColor;
    @Schema(description = "8其他(名称)")
    private String basicOtherValue;
    @Schema(description = "8其他")
    private String basicOther;
    @Schema(description = "创建人id")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @Schema(description = "修改人id")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @Schema(description = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @Schema(description = "更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    @TableField(exist = false,select = false)
    @Schema(description = "验证项目集合")
    private List<InsOrderFactoryVerifyItem>  factoryVerifyItemList;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrderFactoryVerifyItem.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
package com.ruoyi.inspect.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
/**
 * åŽŸææ–™åŽ‚å®¶è¿›è´§éªŒè¯æ£€éªŒé¡¹
 *
 * @author zhuo
 * @since 2024-09-26
 */
@Data
@TableName("ins_order_factory_verify_item")
public class InsOrderFactoryVerifyItem {
    @Schema(description = "主键")
    @TableId(type = IdType.AUTO)
    private Integer factoryVerifyItemId;
    @Schema(description = "外键: è¿›åŽ‚éªŒè¯è¡¨ id")
    private Integer factoryVerifyId;
    @Schema(description = "验证项目")
    private String inspectionItem;
    @Schema(description = "验证结果")
    private String result;
    @Schema(description = "排序")
    @TableField(fill = FieldFill.INSERT)
    private Integer sort;
    @Schema(description = "创建人id")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @Schema(description = "修改人id")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @Schema(description = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @Schema(description = "更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrderFile.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
package com.ruoyi.inspect.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * <p>
 * æ£€éªŒå•下的附件列表
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-06-06 10:08:21
 */
@Getter
@Setter
@TableName("ins_order_file")
@Schema(description = "检验单下的附件列表")
public class InsOrderFile implements Serializable {
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @Schema(description = "关联 æ£€éªŒå•外键id")
    private Integer insOrderId;
    @Schema(description = "类型")
    private Integer type;
    @Schema(description = "附件路径")
    private String fileUrl;
    @Schema(description = "附件名称")
    private String fileName;
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @Schema(description = "上传人")
    @TableField(exist = false, select = false)
    private String name;
    @TableField(fill = FieldFill.INSERT)
    @Schema(description = "上传时间")
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrderRates.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
package com.ruoyi.inspect.pojo;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
 * è®¢å•费用表
 *
 * @author zhuo
 * @since 2025-02-28
 */
@Data
@TableName("ins_order_rates")
public class InsOrderRates {
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @Schema(description = "订单id")
    private Integer insOrderId;
    @Schema(description = "样品id")
    private Integer insSampleId;
    @Schema(description = "检验项id")
    private Integer insProductId;
    @Schema(description = "样品编号")
    private String sampleCode;
    @Schema(description = "样品编号")
    private String entrustCode;
    @Schema(description = "检验项分类")
    private String inspectionItemClass;
    @Schema(description = "检测项目")
    private String inspectionItem;
    @Schema(description = "检验项子类")
    private String inspectionItemSubclass;
    @Schema(description = "电缆标识")
    private String cableTag;
    @Schema(description = "标准价格")
    private String rates;
    @Schema(description = "分组")
    private String manHourGroup;
    @Schema(description = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @Schema(description = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @Schema(description = "创建人id")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @Schema(description = "修改人id")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrderStandardTemplate.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,82 @@
package com.ruoyi.inspect.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
import java.time.LocalDate;
import java.util.Date;
/**
 * è®¢å•标准模板复制
 *
 * @author zhuo
 * @since 2024-11-05
 */
@Data
@TableName(value = "ins_order_standard_template")
public class InsOrderStandardTemplate {
    @TableId(type = IdType.AUTO)
    private Integer id;
    @Schema(description = "模板id")
    private Integer templateId;
    @Schema(description = "订单id")
    private Integer insOrderId;
    @Schema(description = "模板名称")
    private String name;
    @Schema(description = "备注")
    private String remark;
    @Schema(description = "模板结构")
    private String thing;
    @TableField(fill = FieldFill.INSERT)
    @Schema(description = "创建人")
    private Integer createUser;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @Schema(description = "修改人")
    private Integer updateUser;
    @TableField(fill = FieldFill.INSERT)
    @Schema(description = "创建时间")
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @Schema(description = "修改时间")
    private LocalDateTime updateTime;
    @Schema(description = "模板编号")
    private String number;
    @Schema(description = "模板展示及生成顺序")
    private Integer sort;
    @Schema(description = "原始记录已填写单元格,按坐标保存")
    private String recordValues;
    @Schema(description = "该模板检验时的温度")
    private String temperature;
    @Schema(description = "该模板检验时的湿度")
    private String humidity;
    @Schema(description = "检测日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate detectionTime;
    @Schema(description = "检测地点")
    private String detectionPlace;
    @Schema(description = "模板检验结论:0不合格,1合格")
    private Integer insResult;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrderState.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,67 @@
package com.ruoyi.inspect.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 *
 * @TableName ins_order_state
 */
@TableName(value ="ins_order_state")
@Data
public class InsOrderState implements Serializable {
    /**
     *
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    /**
     * å¤–键:ins_order表id
     */
    @TableField(value = "ins_order_id")
    private Integer insOrderId;
    /**
     * å®žéªŒå®¤
     */
    @TableField(value = "laboratory")
    private String laboratory;
    /**
     * æ£€éªŒçŠ¶æ€(0:待检验1:检验中 2:已检验3:待复核4:复核未通过 5:复核通过)
     */
    @TableField(value = "ins_state")
    private Integer insState;
    @Schema(description = "检验时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime insTime;
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @Schema(description = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @Schema(description = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    @Schema(description = "复核人")
    private Integer verifyUser;
    @Schema(description = "复核理由")
    private String verifyTell;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrderTemplate.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package com.ruoyi.inspect.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 *
 * @TableName ins_order_template
 */
@TableName(value ="ins_order_template")
@Data
public class InsOrderTemplate implements Serializable {
    /**
     *
     */
    @Schema(description = "主键")
    @TableId(type = IdType.AUTO)
    private Integer id;
    /**
     * æ¨¡æ¿åç§°
     */
    @Schema(description = "模板名称")
    private String name;
    /**
     * æ¨¡æ¿å†…容
     */
    @Schema(description = "模板内容")
    private String thing;
    @Schema(description = "绑定的标准库二级标准ID")
    private Integer standardTreeId;
    @Schema(description = "创建人")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @Schema(description = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrderTemplateDevice.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.ruoyi.inspect.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/** è®¢å•模板与检验设备关系。 */
@Data
@TableName("ins_order_template_device")
public class InsOrderTemplateDevice {
    @TableId(type = IdType.AUTO)
    private Integer id;
    @Schema(description = "订单ID")
    private Integer insOrderId;
    @Schema(description = "模板ID")
    private Integer templateId;
    @Schema(description = "设备ID")
    private Integer deviceId;
    @Schema(description = "展示顺序")
    private Integer sort;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsProduct.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,225 @@
package com.ruoyi.inspect.pojo;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
/**
 * æ£€éªŒé¡¹ç›®
 *
 * @TableName ins_product
 */
@TableName(value = "ins_product")
@Data
public class InsProduct implements Serializable {
    /**
     * ä¸»é”®id
     */
    @TableId(type = IdType.AUTO)
    private Integer id;
    @Schema(description = "项目参数id")
    private Integer structureItemParameterId;
    @TableField(exist = false,select = false)
    private String sampleCode;
    @Schema(description = "检验项")
    private String inspectionItem;
    @Schema(description = "检验项英文")
    private String inspectionItemEn;
    @Schema(description = "检验项分类")
    private String inspectionItemClass;
    @Schema(description = "检验项分类EN")
    private String inspectionItemClassEn;
    @Schema(description = "检验项子类")
    private String inspectionItemSubclass;
    @Schema(description = "检验项子类英文")
    private String inspectionItemSubclassEn;
    @Schema(description = "工厂")
    private String factory;
    @Schema(description = "实验室")
    private String laboratory;
    @Schema(description = "样品分类")
    private String sampleType;
    @Schema(description = "样品")
    private String sample;
    @Schema(description = "型号")
    private String model;
    @Schema(description = "方法")
    private String methodS;
    @Schema(description = "子实验室")
    private String sonLaboratory;
    @Schema(description = "计量单位")
    private String unit;
    @Schema(description = "单价(元)")
    private BigDecimal price;
    @Schema(description = "工时(H)")
    private BigDecimal manHour;
    @Schema(description = "工时分组")
    private String manHourGroup;
    @Schema(description = "检验项类型")
    private String inspectionItemType;
    @Schema(description = "检验值类型")
    private String inspectionValueType;
    @Schema(description = "设备组")
    private String deviceGroup;
    @Schema(description = "检验次数")
    private Integer checkoutNumber;
    @Schema(description = "区间")
    private String section;
    @Schema(description = "取值类型")
    private String valueType;
    @Schema(description = "方法")
    private String method;
    @Schema(description = "预计时间(h)")
    private Integer manDay;
    @Schema(description = "特殊标识")
    private String bsm;
    @Schema(description = "要求值")
    private String ask;
    @Schema(description = "要求描述")
    private String tell;
    @Schema(description = "最终值")
    @TableField("`last_value`")
    private String lastValue;
    @Schema(description = "合格状态: 1:合格 0:不合格, 3不判定")
    private Integer insResult;
    @Schema(description = "1:有效 0:无效")
    private Integer state;
    @Schema(description = "外键:ins_sample表id")
    private Integer insSampleId;
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @Schema(description = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @Schema(description = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    @Schema(description = "外键:standard_template表id")
    private Integer templateId;
    @Schema(description = "原始记录模板中的检验项行号")
    private Integer templateRowIndex;
    @TableField(exist = false)
    @Schema(description = "模板内容")
    private List<JSONObject> template;
    @TableField(exist = false)
    @Schema(description = "模板内容颜色")
    private Map<String, Object> style;
    @TableField(exist = false)
    @Schema(description = "检验结果对象")
    private InsProductResult insProductResult;
    @TableField(exist = false)
    @Schema(description = "模板名称")
    private String templateName;
    @TableField(exist = false)
    @Schema(description = "订单模板页签顺序")
    private Integer templateSort;
    @TableField(exist = false)
    @Schema(description = "订单模板已填写单元格,按坐标保存")
    private String recordValues;
    @Schema(description = "字典类型")
    private String dic;
    //温度
    private String temperature;
    //湿度
    private String humidity;
    private Integer insFiberId;
    private Integer insFibersId;
    private Integer insBushId;
    @Schema(description = "标准方法id")
    private Integer standardMethodListId;
    //返回的20度常温的计算值(温度循环)
    @TableField(exist = false ,select = false)
    private String complue;
    @Schema(description = "条件")
    private String radius;
    @Schema(description = "收费标准(元/次)")
    private String rates;
    @Schema(description = "电缆配置标识")
    private String cableTag;
    @Schema(description = "原材料配置标识")
    private String rawMaterialTag;
    @Schema(description = "重复标识(一个检验项可能会存在多次)")
    private String repetitionTag;
    @Schema(description = "排序")
    private Integer sort;
    // ç»‘定值不参加展示, åªå‚加计算
    @Schema(description = "是否是绑定值, 0否, 1是")
    private Integer isBinding;
    @Schema(description = "自关联(绑定id)")
    private Integer bindingProductId;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsProductDeviationWarning.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
package com.ruoyi.inspect.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
/**
 * <p>
 * æ£€éªŒé¡¹åå·®é¢„警主表
 * </p>
 *
 * @author
 * @since 2025-03-28 02:18:02
 */
@Getter
@Setter
@TableName("ins_product_deviation_warning")
@Schema(description = "检验项偏差预警主表")
public class InsProductDeviationWarning implements Serializable {
    @TableId(value = "deviation_warning_id", type = IdType.AUTO)
    private Integer deviationWarningId;
    @Schema(description = "订单id")
    private Integer insOrderId;
    @Schema(description = "样品id")
    private Integer insSampleId;
    @Schema(description = "检验项id")
    private Integer insProductId;
    @Schema(description = "订单编号")
    private String entrustCode;
    @Schema(description = "样品编号")
    private String sampleCode;
    @Schema(description = "供应商")
    private String supplierName;
    @Schema(description = "偏差值")
    private String deviationValue;
    @Schema(description = "检测时间")
    private LocalDateTime detectionTime;
    @TableField(fill = FieldFill.INSERT)
    private String createUser;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateUser;
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsProductDeviationWarningDetail.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,75 @@
package com.ruoyi.inspect.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
/**
 * <p>
 * æ£€éªŒé¡¹åå·®é¢„警详情表
 * </p>
 *
 * @author
 * @since 2025-03-28 02:18:58
 */
@Getter
@Setter
@TableName("ins_product_deviation_warning_detail")
@Schema(description = "检验项偏差预警详情表")
public class InsProductDeviationWarningDetail implements Serializable {
    @TableId(value = "deviation_warning_detail_id", type = IdType.AUTO)
    private Integer deviationWarningDetailId;
    @Schema(description = "主表id")
    private Integer deviationWarningId;
    @Schema(description = "订单id")
    private Integer insOrderId;
    @Schema(description = "样品id")
    private Integer insSampleId;
    @Schema(description = "检验项id")
    private Integer insProductId;
    @Schema(description = "订单编号")
    private String entrustCode;
    @Schema(description = "样品编号")
    private String sampleCode;
    @Schema(description = "供应商")
    private String supplierName;
    @Schema(description = "检测值")
    private String testValue;
    @Schema(description = "检测时间")
    private LocalDateTime detectionTime;
    @Schema(description = "是否是问题数据 0: å¦, 1: æ˜¯(平均值获取)")
    private Integer isIssue;
    @Schema(description = "是否是问题数据 0: å¦, 1: æ˜¯ï¼ˆè¦æ±‚值获取)")
    private Integer isIssueAsked;
    @TableField(fill = FieldFill.INSERT)
    private String createUser;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateUser;
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsProductResult.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
package com.ruoyi.inspect.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * æ£€éªŒé¡¹ç›®çš„结果
 * @TableName ins_product_result
 */
@TableName(value ="ins_product_result")
@Data
public class InsProductResult implements Serializable {
    @TableId(type = IdType.AUTO)
    private Integer id;
    @Schema(description = "外键:检验项目id")
    private Integer insProductId;
    @Schema(description = "检验值")
    private String insValue;
    @Schema(description = "计算值")
    private String comValue;
    @Schema(description = "设备值")
    private String equipValue;
    @Schema(description = "设备名称")
    private String equipName;
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @Schema(description = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @Schema(description = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsProductUser.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
package com.ruoyi.inspect.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * æ£€éªŒé¡¹ç›®çš„人员检验记录
 * @TableName ins_product_user
 */
@TableName(value ="ins_product_user")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class InsProductUser implements Serializable {
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    private Integer id;
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @Schema(description = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     * å¤–键:ins_product表id
     */
    private Integer insProductId;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsReport.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,138 @@
package com.ruoyi.inspect.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * æ£€éªŒæŠ¥å‘Š
 * @TableName ins_report
 */
@TableName(value ="ins_report")
@Data
public class InsReport implements Serializable {
    /**
     *
     */
    @Schema(description = "主键")
    @TableId(type = IdType.AUTO)
    private Integer id;
    @Schema(description = "报告编号")
    private String code;
    /**
     * å¤–键:检验单id
     */
    @Schema(description = "检验单id")
    private Integer insOrderId;
    /** 0:检测报告(仅检测数据),1:检验报告(含判定结果) */
    @Schema(description = "报告类型,0:检测报告,1:检验报告")
    private Integer reportType;
    /**
     * ç³»ç»Ÿç”ŸæˆæŠ¥å‘Šåœ°å€
     */
    @Schema(description = "系统生成报告地址")
    private String url;
    /**
     * ç³»ç»Ÿç”Ÿæˆçš„æ£€éªŒæŠ¥å‘Šåœ°å€ï¼›ä¸Ž url å¯¹åº”的检测报告共用同一条审批记录。
     */
    @Schema(description = "检验报告地址")
    private String inspectionUrl;
    /**
     * æ‰‹åŠ¨ä¸Šä¼ æŠ¥å‘Šåœ°å€
     */
    @Schema(description = "手动上传报告地址")
    private String urlS;
    /**
     * ä¸´æ—¶æŠ¥å‘Šåœ°å€
     */
    @Schema(description = "临时报告地址")
    private String tempUrlPdf;
    /**
     * 1:批准 0:不批准
     */
    @Schema(description = "批准状态")
    private Integer isRatify;
    @Schema(description = "批准备注")
    private String ratifyTell;
    /**
     * 1:审核通过 0:审核不通过
     */
    @Schema(description = "审核状态")
    private Integer isExamine;
    @Schema(description = "审核备注")
    private String examineTell;
    /**
     * å¤–键:用户id(提交人)
     */
    @Schema(description = "提交人用户id")
    private Integer writeUserId;
    /**
     * å¤–键:用户id(批准人)
     */
    @Schema(description = "批准人用户id")
    private Integer ratifyUserId;
    /**
     * å¤–键:用户id(审核人)
     */
    @Schema(description = "审核人用户id")
    private Integer examineUserId;
    @Schema(description = "创建人")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @Schema(description = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @Schema(description = "更新人")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @Schema(description = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
     * 1:已提交 0:待提交
     */
    @Schema(description = "提交状态")
    private Integer state;
    @Schema(description = "提交时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime writeTime;
    @Schema(description = "审核时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime examineTime;
    @Schema(description = "批准时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime ratifyTime;
    @Schema(description = "是否是通过的报告, 0:未通过, 1:通过")
    private Integer isPass;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsSample.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,127 @@
package com.ruoyi.inspect.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
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;
    @Schema(description = "样品单位")
    private String unit;
    private Integer cellId;
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @Schema(description = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @Schema(description = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    private Integer parentId;
    @Schema(description = "数量")
    private Integer quantity;
    @Schema(description = "特殊标准方法")
    private String specialStandardMethod;
    @TableField(select = false,exist = false)
    private Integer num=1;
    @Schema(description = "标准方法名称")
    @TableField(select = false,exist = false)
    private String standardMethodName;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsSampleReceipt.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
package com.ruoyi.inspect.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@TableName("ins_sample_receipt")
public class InsSampleReceipt {
    @Schema(description = "主键")
    @TableId(type = IdType.AUTO)
    private Integer id;
    @Schema(description = "委托单ID")
    private Integer insOrderId;
    @Schema(description = "样品ID")
    private Integer insSampleId;
    @Schema(description = "样品接收状态 0待接收 1已提交检验 2已拒收 3已取消")
    private Integer status;
    @Schema(description = "主检验人ID")
    private Integer mainInspectorId;
    @Schema(description = "接收处理人ID")
    private Integer receiveUserId;
    @Schema(description = "接收处理时间")
    private LocalDateTime receiveTime;
    @Schema(description = "提交检验时间")
    private LocalDateTime submitTime;
    @Schema(description = "拒收备注")
    private String rejectRemark;
    @Schema(description = "创建人")
    private Integer createUser;
    @Schema(description = "创建时间")
    private LocalDateTime createTime;
    @Schema(description = "更新人")
    private Integer updateUser;
    @Schema(description = "更新时间")
    private LocalDateTime updateTime;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsSampleUser.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
package com.ruoyi.inspect.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * æ ·å“è´Ÿè´£äººè®°å½•
 * @TableName ins_sample_user
 */
@TableName(value ="ins_sample_user")
@Data
@NoArgsConstructor
public class InsSampleUser implements Serializable {
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    private Integer id;
    /**
     * å¤–键:是订单insOrder表id (????)
     */
    private Integer insSampleId;
    /**
     * å¤–键:用户id è´Ÿè´£äºº
     */
    private Integer userId;
    /**
     * 1:确认 0:未确认
     */
    //1是复核人 0是检验人
    private Integer state;
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @Schema(description = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @Schema(description = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
     * å­è¯•验室
     * @param insSampleId
     * @param userId
     * @param state
     */
    private String sonLaboratory;
    public InsSampleUser(Integer insSampleId, Integer userId, Integer state,String sonLaboratory) {
        this.insSampleId = insSampleId;
        this.userId = userId;
        this.state = state;
        this.sonLaboratory = sonLaboratory;
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsUnqualifiedHandler.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,113 @@
package com.ruoyi.inspect.pojo;
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.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDate;
/**
 * ä¸åˆæ ¼å¤„理表
 * @TableName ins_unqualified_handler
 */
@TableName(value ="ins_unqualified_handler")
@Data
public class InsUnqualifiedHandler implements Serializable {
    /**
     * ä¸»é”®id
     */
    @Schema(description = "主键id")
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * ç¼–号
     */
    @Schema(description = "编号")
    private String no;
    /**
     * æ ‡é¢˜
     */
    @Schema(description = "标题")
    private String headline;
    /**
     * ç‰©æ–™åç§°
     */
    @Schema(description = "物料名称")
    private String materialName;
    /**
     * ç”Ÿäº§æ‰¹æ¬¡
     */
    @Schema(description = "生产批次")
    private String productionBatch;
    /**
     * åˆ°è´§æ•°é‡
     */
    @Schema(description = "到货数量")
    private String cargoQuantity;
    /**
     * è§„格型号
     */
    @Schema(description = "规格型号")
    private String specsModels;
    /**
     * æŠ¥æ£€æ—¥æœŸ
     */
    @Schema(description = "报检日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate inspectTime;
    /**
     * åé¦ˆäºº
     */
    @Schema(description = "反馈人")
    private String feedbackUser;
    /**
     * åé¦ˆæ—¥æœŸ
     */
    @Schema(description = "反馈日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate feedbackTime;
    /**
     * åˆ†ç±»
     */
    @Schema(description = "")
    private String classification;
    /**
     * ä¸åˆæ ¼å½’属
     */
    @Schema(description = "不合格归属")
    private String offGradeAscription;
    /**
     * ä¸åˆæ ¼æè¿°
     */
    @Schema(description = "不合格描述")
    private String unqualifiedDesc;
    /**
     * åŽŸææ–™æ£€éªŒid
     */
    @Schema(description = "原材料检验id")
    private Integer inventoryQuantityId;
    /**
     * åŽŸææ–™æ£€éªŒid
     */
    @Schema(description = "订单id")
    private Integer insOrderId;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsUnqualifiedHandlerFile.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,79 @@
package com.ruoyi.inspect.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * ä¸åˆæ ¼å¤„理附件记录表
 * @TableName ins_unqualified_handler_file
 */
@TableName(value ="ins_unqualified_handler_file")
@Data
public class InsUnqualifiedHandlerFile implements Serializable {
    /**
     * ä¸»é”®id
     */
    @Schema(description = "主键id")
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * ä¸åˆæ ¼å¤„理id
     */
    @Schema(description = "不合格处理id")
    private Long unqualifiedId;
    /**
     * æ–‡ä»¶ç±»åž‹(1:图片 2:文件)
     */
    @Schema(description = "文件类型(1:图片 2:文件)")
    private Integer type;
    /**
     * æ–‡ä»¶ä¸Šä¼ è·¯å¾„
     */
    @Schema(description = "文件上传路径")
    private String fileUrl;
    /**
     * æ–‡ä»¶åç§°
     */
    @Schema(description = "文件名称")
    private String fileName;
    /**
     * åˆ›å»ºäºº
     */
    @Schema(description = "创建人")
    @TableField(fill= FieldFill.INSERT)
    private Integer createUser;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @Schema(description = "创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(fill= FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     * æ›´æ–°äºº
     */
    @Schema(description = "更新人")
    @TableField(fill= FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * æ›´æ–°æ—¶é—´
     */
    @Schema(description = "更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(fill= FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsUnqualifiedRetestProduct.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,148 @@
package com.ruoyi.inspect.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * ä¸åˆæ ¼æ£€éªŒé¡¹ç›®å¤æµ‹
 *
 * @author zhuo
 * @since 2024-09-03
 */
@TableName(value = "ins_unqualified_retest_product")
@Data
public class InsUnqualifiedRetestProduct implements Serializable {
    /**
     * ä¸»é”®id
     */
    @TableId(type = IdType.AUTO)
    private Integer id;
    //外键:ins_product表id
    private Integer insProductId;
    @Schema(description = "项目参数id")
    private Integer structureItemParameterId;
    //检验项
    private String inspectionItem;
    //检验项子类
    private String inspectionItemSubclass;
    //工厂
    private String factory;
    //实验室
    private String laboratory;
    //样品分类
    private String sampleType;
    //样品
    private String sample;
    //型号
    private String model;
    //子实验室
    private String sonLaboratory;
    //计量单位
    private String unit;
    //单价(元)
    private Double price;
    //工时(H)
    private Double manHour;
    //工时分组
    private String manHourGroup;
    //检验项类型
    private String inspectionItemType;
    //检验值类型
    private String inspectionValueType;
    //设备组
    private String deviceGroup;
    //检验次数
    private Integer checkoutNumber;
    //区间
    private String section;
    //取值类型
    private String valueType;
    //方法
    private String method;
    //预计时间(天)
    private Integer manDay;
    //特殊标识
    private String bsm;
    //要求值
    private String ask;
    //要求描述
    private String tell;
    //最终值
    @TableField("`last_value`")
    private String lastValue;
    //1:合格 0:不合格 3: ä¸åˆ¤å®š
    private Integer insResult;
    //1:有效 0:无效
    private Integer state;
    //外键:ins_sample表id
    private Integer insSampleId;
    // åˆ›å»ºäºº
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    //创建时间
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    // ä¿®æ”¹äºº
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    // ä¿®æ”¹æ—¶é—´
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    //外键:standard_template表id
    private Integer templateId;
    //字典类型
    private String dic;
    //方法
    private String methodS;
    //外键
    private Integer insFiberId;
    //外键
    private Integer insFibersId;
    //检验项EN
    private String inspectionItemEn;
    //检验项小类EN
    private String inspectionItemSubclassEn;
    //检验项分类
    private String inspectionItemClass;
    //检验项分类EN
    private String inspectionItemClassEn;
    //外键:标准方法id
    private Integer standardMethodListId;
    //温度
    private String temperature;
    //湿度
    private String humidity;
    //外键(目前只有松套管项目使用)
    private Integer insBushId;
    //范围
    private String radius;
    //电缆标识
    private String cableTag;
    // é‡å¤æ ‡è¯†
    private String repetitionTag;
    //原材料批量标识
    private String rawMaterialTag;
    //复测次数标识
    private String retestTag;
    //排序
    private Integer sort;
    // ç»‘定值不参加展示, åªå‚加计算
    @Schema(description = "是否是绑定值, 0否, 1是")
    private Integer isBinding;
    @Schema(description = "自关联(绑定id)")
    private Integer bindingProductId;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsUnqualifiedRetestResult.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
package com.ruoyi.inspect.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * ä¸åˆæ ¼å¤æµ‹æ£€éªŒé¡¹ç›®çš„结果
 *
 * @author zhuo
 * @since 2024-09-03
 */
@TableName(value = "ins_unqualified_retest_result")
@Data
public class InsUnqualifiedRetestResult implements Serializable {
    @TableId(type = IdType.AUTO)
    private Integer id;
    //外键:不合格检验项目id
    private Integer retestProductId;
    //检验值
    private String insValue;
    //计算值
    private String comValue;
    //设备编码
    private String equipValue;
    //设备名称
    private String equipName;
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @Schema(description = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @Schema(description = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/RawMaterialOrderTemplate.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
package com.ruoyi.inspect.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
/**
 * åŽŸææ–™ä¸‹å•æ¨¡æ¿
 *
 * @author zhuo
 * @since 2024-08-05
 */
@TableName(value = "raw_material_order_template")
@Data
public class RawMaterialOrderTemplate {
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    private Integer id;
    /**
     * æ¨¡æ¿åç§°
     */
    @Schema(description = "模板名称")
    private String name;
    /**
     * æ¨¡æ¿åç§°
     */
    @Schema(description = "零件编号")
    private String partNo;
    /**
     * æ¨¡æ¿å†…容
     */
    @Schema(description = "模板内容")
    private String thing;
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @Schema(description = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/SpotCheckQuarter.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,67 @@
package com.ruoyi.inspect.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * å­£åº¦æŠ½æ ·è®¡åˆ’
 *
 * @author zhuo
 * @since 2024-10-09
 */
@TableName(value = "spot_check_quarter")
@Data
public class SpotCheckQuarter implements Serializable {
    @TableId(type = IdType.AUTO)
    private Integer quarterId;
    @Schema(description = "编号")
    private String quarterNo;
    @Schema(description = "报告生成地址")
    private String fileUrl;
    @Schema(description = "季度完成状态")
    private Integer quarterStatus;
    @Schema(description = "备注")
    private String remark;
    @Schema(description = "编制人")
    private Integer writeUser;
    @Schema(description = "会签人")
    private String countersignUser;
    @Schema(description = "审核人")
    private Integer examineUser;
    @Schema(description = "批准人")
    private Integer ratifyUser;
    @Schema(description = "创建人")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @Schema(description = "修改人id")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @Schema(description = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @Schema(description = "更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/SpotCheckQuarterItem.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,69 @@
package com.ruoyi.inspect.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
/**
 * å­£åº¦æŠ½æ ·è®¡åˆ’详情表
 *
 * @author makejava
 * @since 2024-10-09
 */
@TableName(value ="spot_check_quarter_item")
@Data
public class SpotCheckQuarterItem {
    @TableId(type = IdType.AUTO)
    private Integer quarterItemId;
    @Schema(description = "主表id")
    private Integer quarterId;
    @Schema(description = "产品类型")
    private String productType;
    @Schema(description = "产品型号")
    private String productModel;
    @Schema(description = "责任人")
    private String dutyUser;
    @Schema(description = "抽样数量")
    private String spotCheckNumber;
    @Schema(description = "抽样时间")
    private String spotCheckTime;
    @Schema(description = "试样结论")
    private String result;
    @Schema(description = "取样人员")
    private String samplingUser;
    @Schema(description = "备注")
    private String itemRemark;
    @Schema(description = "创建人id")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @Schema(description = "修改人id")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @Schema(description = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @Schema(description = "更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/SpotCheckYear.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,67 @@
package com.ruoyi.inspect.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * å¹´åº¦æŠ½æ ·è®¡åˆ’
 *
 * @author zhuo
 * @since 2024-10-10
 */
@TableName(value ="spot_check_year")
@Data
public class SpotCheckYear implements Serializable {
    @TableId(type = IdType.AUTO)
    private Integer yearId;
    @Schema(description = "名称")
    private String yearHead;
    @Schema(description = "报告生成地址")
    private String fileUrl;
    @Schema(description = "表格内备注")
    private String tableRemark;
    @Schema(description = "备注")
    private String remark;
    @Schema(description = "编制人")
    private Integer writeUser;
    @Schema(description = "会签人")
    private String countersignUser;
    @Schema(description = "批准人")
    private Integer examineUser;
    @Schema(description = "批准人")
    private Integer ratifyUser;
    @Schema(description = "创建人")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @Schema(description = "修改人id")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @Schema(description = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @Schema(description = "更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/SpotCheckYearItem.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,84 @@
package com.ruoyi.inspect.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
/**
 * å¹´åº¦æŠ½æ ·è®¡åˆ’详情表
 *
 * @author zhuo
 * @since 2024-10-10
 */
@TableName(value = "spot_check_year_item")
@Data
public class SpotCheckYearItem {
    @TableId(type = IdType.AUTO)
    private Integer yearItemId;
    //主表id
    @Schema(description = "主表id")
    private Integer yearId;
    @Schema(description = "类别")
    private String yearType;
    @Schema(description = "一月")
    private String january;
    @Schema(description = "二月")
    private String february;
    @Schema(description = "三月")
    private String march;
    @Schema(description = "四月")
    private String april;
    @Schema(description = "五月")
    private String may;
    @Schema(description = "六月")
    private String june;
    @Schema(description = "七月")
    private String july;
    @Schema(description = "八月")
    private String august;
    @Schema(description = "九月")
    private String september;
    @Schema(description = "十月")
    private String october;
    @Schema(description = "十一月")
    private String november;
    @Schema(description = "十二月")
    private String december;
    @Schema(description = "创建人id")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @Schema(description = "修改人id")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @Schema(description = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @Schema(description = "更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/Warehouse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
package com.ruoyi.inspect.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * ä»“库
 * @TableName warehouse
 */
@TableName(value ="warehouse")
@Data
public class Warehouse implements Serializable {
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    private Integer id;
    /**
     * ä»“库名称
     */
    private String name;
    /**
     *
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/WarehouseCell.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package com.ruoyi.inspect.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * è´§æž¶å•元格
 * @TableName warehouse_cell
 */
@TableName(value ="warehouse_cell")
@Data
public class WarehouseCell implements Serializable {
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    private Integer id;
    /**
     * è¡Œ
     */
    @TableField("`row`")
    private Integer row;
    /**
     * åˆ—
     */
    @TableField("`col`")
    private Integer col;
    /**
     *
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
     * æ˜¯å¦æœ‰æ•ˆ 1:有效 0:无效
     */
    private Integer state;
    /**
     * å¤–检:货架id
     */
    private Integer shelfId;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/WarehouseHistory.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
package com.ruoyi.inspect.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * å‡ºå…¥åº“记录
 * @TableName warehouse_history
 */
@TableName(value ="warehouse_history")
@Data
public class WarehouseHistory implements Serializable {
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    private Integer id;
    private String warehouseCode;
    /**
     * å¤–键:样品id
     */
    private Integer insSampleId;
    /**
     * çŠ¶æ€ï¼š1:入库 2:出库
     */
    private Integer state;
    /**
     *
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
     * å¤–键:单元格id
     */
    private Integer cellId;
}
inspect-server/src/main/java/com/ruoyi/inspect/pojo/WarehouseShelf.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package com.ruoyi.inspect.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * è´§æž¶
 * @TableName warehouse_shelf
 */
@TableName(value ="warehouse_shelf")
@Data
public class WarehouseShelf implements Serializable {
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    private Integer id;
    /**
     * è´§æž¶åç§°
     */
    private String name;
    /**
     * è¡Œ
     */
    @TableField("`row`")
    private Integer row;
    /**
     * åˆ—
     */
    @TableField("`col`")
    private Integer col;
    /**
     *
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
     * å¤–键:仓库id
     */
    private Integer warehouseId;
}
inspect-server/src/main/java/com/ruoyi/inspect/service/DataAnalysisService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,77 @@
package com.ruoyi.inspect.service;
import com.ruoyi.basic.dto.IfsInventoryQuantitySupplierDto;
import com.ruoyi.inspect.dto.DataAnalysisDto;
import com.ruoyi.inspect.vo.DeviationAnalyzeVo;
import com.ruoyi.inspect.vo.RawProductAnalysisVo;
import java.util.List;
import java.util.Map;
/**
 * æ•°æ®åˆ†æž
 *
 * @Author zhuo
 * @Date 2024/10/16
 */
public interface DataAnalysisService {
    /**
     * æŸ¥è¯¢åŽŸææ–™æŸ±çŠ¶ç»Ÿè®¡
     * @return
     */
    List<Map<String, Object>> getRawPassRateByBarChart(DataAnalysisDto dataAnalysisDto);
    /**
     * æŸ¥è¯¢åŽŸææ–™åˆæ ¼çŽ‡é¥¼çŠ¶å›¾
     * @param dataAnalysisDto
     * @return
     */
    Map<String, Object> getRawPassRateByCake(DataAnalysisDto dataAnalysisDto);
    /**
     * æŸ¥è¯¢æ£€éªŒé¡¹åç§°
     * @param dataAnalysisDto
     * @return
     */
    List<String> getRawItemNames(DataAnalysisDto dataAnalysisDto);
    /**
     * æŸ¥è¯¢åŽŸææ–™é¡¹æ£€åˆ†æž
     * @param dataAnalysisDto
     * @return
     */
    RawProductAnalysisVo getRawProductAnalysis(DataAnalysisDto dataAnalysisDto);
    /**
     * æŸ¥è¯¢æ£€æµ‹é¡¹åˆ†æžåˆ—表
     * @param dataAnalysisDto
     * @return
     */
    List<IfsInventoryQuantitySupplierDto> getRawProductAnalysisAllList(DataAnalysisDto dataAnalysisDto);
    /**
     * æŸ¥è¯¢åŽŸææ–™é¡¹æ£€åˆ†æžåˆæ ¼çŽ‡
     * @param dataAnalysisDto
     * @return
     */
    RawProductAnalysisVo getRawProductAnalysisRawPass(DataAnalysisDto dataAnalysisDto);
    /**
     * æŸ¥è¯¢åŽŸææ–™é¡¹æ£€å’ŒåŽ‚å®¶æ•°æ®å¯¹æ¯”
     * @param dataAnalysisDto
     * @return
     */
    DeviationAnalyzeVo getRawSupplierCompare(DataAnalysisDto dataAnalysisDto);
    /**
     * æŸ¥è¯¢æœ¬æœˆä¸Žä¸Šæœˆåˆæ ¼çŽ‡å¯¹æ¯”
     * @param dataAnalysisDto
     * @return
     */
    List<Map<String, Object>> getRawUpMonth(DataAnalysisDto dataAnalysisDto);
    Map<String, Object> getOrderTypeCookie(DataAnalysisDto dataAnalysisDto);
}
inspect-server/src/main/java/com/ruoyi/inspect/service/FinishProductSpotCheckService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,126 @@
package com.ruoyi.inspect.service;
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.inspect.dto.IfsStockQueryDTO;
import com.ruoyi.inspect.dto.SpotCheckQuarterDto;
import com.ruoyi.inspect.dto.SpotCheckYearDto;
import jakarta.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
/**
 * æˆå“æŠ½æ ·
 *
 * @Author zhuo
 * @Date 2024/9/29
 */
public interface FinishProductSpotCheckService {
    /**
     * æŸ¥è¯¢ifs成品库存
     *
     * @return
     */
    Result getIfsStockReport(IfsStockQueryDTO ifsStockQueryDTO);
    /*******************************************************  å­£åº¦æŠ½æ · *******************************************************/
    /**
     * æ–°å¢žå­£åº¦æŠ½æ£€
     * @param spotCheckQuarterDto
     * @return
     */
    boolean addQuarter(SpotCheckQuarterDto spotCheckQuarterDto);
    /**
     * æŸ¥è¯¢å­£åº¦æŠ½æ ·è¯¦æƒ…
     * @param quarterId
     * @return
     */
    SpotCheckQuarterDto getQuarter(Integer quarterId);
    /**
     * å­£åº¦æŠ½æ ·åˆ†é¡µæŸ¥è¯¢
     * @param page
     * @param spotCheckQuarter
     * @return
     */
    IPage<SpotCheckQuarterDto> getQuarterPage(Page page, SpotCheckQuarterDto spotCheckQuarter);
    /**
     * åˆ é™¤å­£åº¦æŠ½æ ·
     * @param quarterId
     * @return
     */
    boolean deleteQuarter(Integer quarterId);
    /**
     * æˆå“ä¸‹å•界面查询季度信息
     * @return
     */
    List<Map<String, Object>> getQuarterOnOrder();
    /**
     * ä¿®æ”¹å­£åº¦æ£€éªŒ
     * @param spotCheckQuarterDto
     * @return
     */
    boolean updateQuarterOnOrder(SpotCheckQuarterDto spotCheckQuarterDto);
    /**
     * ç”Ÿæˆæœ€ç»ˆæŠ¥å‘Š
     * @param quarterId
     * @return
     */
    boolean finalReportQuarter(Integer quarterId, HttpServletResponse response);
    /*******************************************************  å¹´åº¦æŠ½æ · *******************************************************/
    /**
     * æ–°å¢žå¹´åº¦æŠ½æ ·
     * @param spotCheckYearDto
     * @return
     */
    boolean addSpotCheckYear(SpotCheckYearDto spotCheckYearDto);
    /**
     * æŸ¥è¯¢å¹´åº¦æŠ½æ ·è¯¦æƒ…
     * @param yearId
     * @return
     */
    SpotCheckYearDto getSpotCheckYear(Integer yearId);
    /**
     * å¹´åº¦æŠ½æ ·åˆ—表
     * @param page
     * @param spotCheckYear
     * @return
     */
    IPage<SpotCheckYearDto> getSpotCheckYearPage(Page page, SpotCheckYearDto spotCheckYear);
    /**
     * åˆ é™¤å¹´åº¦æŠ½æ ·
     * @param yearId
     * @return
     */
    boolean deleteSpotCheckYear(Integer yearId);
    /**
     * ä¿®æ”¹å¹´åº¦æ£€éªŒ
     * @param spotCheckYearDto
     * @return
     */
    boolean updateSpotCheckYear(SpotCheckYearDto spotCheckYearDto);
    /**
     * ç”Ÿæˆæœ€ç»ˆå¹´åº¦æŠ¥å‘Š
     * @param yearId
     * @return
     */
    boolean finalReportSpotCheckYear(Integer yearId, HttpServletResponse response);
}
inspect-server/src/main/java/com/ruoyi/inspect/service/IfsOrderInspectionService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.inspect.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.dto.IfsInventoryQuantitySupplierDto;
import org.springframework.stereotype.Component;
@Component
public interface IfsOrderInspectionService {
    /**
     * æŸ¥è¯¢å·²æ£€éªŒ
     * @param page
     * @param ifsInventoryQuantityDto
     * @return
     */
    IPage<IfsInventoryQuantitySupplierDto> getIfsByOver(Page<IfsInventoryQuantitySupplierDto> page, IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto);
}
inspect-server/src/main/java/com/ruoyi/inspect/service/IfsPartPropsRecordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.inspect.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.inspect.dto.IfsPartPropsRecordDTO;
import com.ruoyi.inspect.pojo.IfsPartPropsRecord;
/**
* @author 27233
* @description é’ˆå¯¹è¡¨ã€ifs_part_props_record(ifs订单零件属性记录表)】的数据库操作Service
* @createDate 2025-10-23 15:00:34
*/
public interface IfsPartPropsRecordService extends IService<IfsPartPropsRecord> {
    boolean saveOrUpdateProps(IfsPartPropsRecordDTO ifsPartPropsRecord);
    IfsPartPropsRecord getOneByIfsId(Long ifsId);
}
inspect-server/src/main/java/com/ruoyi/inspect/service/IfsSplitOrderRecordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.ruoyi.inspect.service;
import com.ruoyi.inspect.pojo.IfsSplitOrderRecord;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @author 27233
* @description é’ˆå¯¹è¡¨ã€ifs_split_order_record(ifs原材料订单拆分记录表)】的数据库操作Service
* @createDate 2025-10-29 16:39:41
*/
public interface IfsSplitOrderRecordService extends IService<IfsSplitOrderRecord> {
}
inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderDeviceRecordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.ruoyi.inspect.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.inspect.pojo.InsOrderDeviceRecord;
/**
 * @Author zhuo
 * @Date 2024/12/22
 */
public interface InsOrderDeviceRecordService extends IService<InsOrderDeviceRecord> {
}
inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderFactoryVerifyItemService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.inspect.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.inspect.pojo.InsOrderFactoryVerifyItem;
/**
 * åŽŸææ–™åŽ‚å®¶è¿›è´§éªŒè¯æ£€éªŒé¡¹
 *
 * @author zhuo
 * @since 2024-09-26
 */
public interface InsOrderFactoryVerifyItemService extends IService<InsOrderFactoryVerifyItem> {
}
inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderFileService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.inspect.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.inspect.pojo.InsOrderFile;
/**
 * <p>
 * æ£€éªŒå•下的附件列表 æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-06-06 10:08:21
 */
public interface InsOrderFileService extends IService<InsOrderFile> {
}
inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderPlanService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,130 @@
package com.ruoyi.inspect.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.inspect.dto.InsOrderPlanDTO;
import com.ruoyi.inspect.dto.InsOrderPlanProductDto;
import com.ruoyi.inspect.dto.SaveInsContextDto;
import com.ruoyi.inspect.dto.SaveOrderDevicesDto;
import com.ruoyi.inspect.dto.SaveTemplateContextDto;
import com.ruoyi.inspect.dto.VerifyPlanDto;
import com.ruoyi.inspect.pojo.InsOrderFactoryVerify;
import com.ruoyi.inspect.pojo.InsOrderFile;
import com.ruoyi.inspect.pojo.InsProduct;
import com.ruoyi.inspect.vo.InsOrderPlanTaskSwitchVo;
import com.ruoyi.inspect.vo.InsOrderPlanVO;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
import java.util.Map;
/**
 * æ£€éªŒä»»åŠ¡-业务层
 */
public interface InsOrderPlanService {
    IPage<InsOrderPlanVO> selectInsOrderPlanList(Page page, InsOrderPlanDTO insOrderPlanDTO);
    IPage<InsOrderPlanTaskSwitchVo> inspectionOrderDetailsTaskSwitching(Page page, InsOrderPlanDTO insOrderPlanDTO);
    boolean claimInsOrderPlan(InsOrderPlanDTO entity);
    void saveInsContext(SaveInsContextDto saveInsContextDto);
    void saveTemplateContext(SaveTemplateContextDto saveTemplateContextDto);
    List<Integer> getOrderDeviceIds(Integer orderId);
    void saveOrderDevices(SaveOrderDevicesDto saveOrderDevicesDto);
    Map<String, Object> doInsOrder(Integer id, String laboratory);
    int upPlanUser(Integer userId, Integer orderId,String sonLaboratory);
    int submitPlan(Integer orderId, String laboratory, Integer verifyUser, String entrustCode, Boolean registerInsResults);
    List<InsProduct> getInsProduct(InsOrderPlanProductDto insOrderPlanProductDto);
    Map<String,Object> checkSubmitPlan(Integer orderId, String laboratory);
    IPage<InsOrderFile> getFileList(Page page, InsOrderFile insOrderFile);
    int uploadFile(Integer orderId, MultipartFile file);
    List<String> upPlanUser2(Integer orderId);
    int rawMaterialVerifyPlan(Integer orderId, String laboratory, Integer type, String tell, Integer userId);
    int rawMaterialVerifyPlan(VerifyPlanDto verifyPlanDto);
    /**
     * æŒ‰å½“前检验数据重新生成尚未批准的系统报告。
     */
    void regenerateReport(Integer reportId, Integer createOrderUser);
    /**
     * ç”µç¼†é…ç½®. æŸ¥çœ‹æ ‡è¯†
     * @param id
     * @param laboratory
     * @return
     */
    List<Map<String, Object>> getCableTag(Integer id, String laboratory);
    /**
     * åŽŸææ–™æŸ¥çœ‹æ ‡è¯†
     * @param id
     * @param laboratory
     * @return
     */
    List<Map<String, Object>> getRawMaterialTag(Integer id, String laboratory);
    /**
     * æŸ¥çœ‹é‡å¤æ ‡è¯†
     * @param id
     * @param laboratory
     * @return
     */
    List<Map<String, Object>> getRepetitionTag(Integer id, String laboratory, String cableTag);
    /**
     * æ–°å¢žä¸åˆæ ¼å¤æµ‹å†…容给
     * @param ids
     * @return
     */
    boolean addDisqualificationRetest(List<InsProduct> insProductsList);
    /**
     * èŽ·å–ä¸åˆæ ¼å¤æµ‹æ•°æ®
     * @return
     */
    List<InsProduct> getInsProductUnqualifiedRetest(InsOrderPlanProductDto insOrderPlanProductDto);
    /**
     * ä¿å­˜ä¸åˆæ ¼å¤æµ‹æ£€éªŒå†…容
     */
    void saveUnqualifiedContext(Map<String, Object> insContext,Integer currentTable,Integer currentSampleId,Integer orderId,String sonLaboratory);
    /**
     * æŸ¥è¯¢åŽŸææ–™è¿›è´§éªŒè¯
     * @param insOrderId
     * @return
     */
    InsOrderFactoryVerify getFactoryVerify(Integer insOrderId);
    /**
     * ä¿å­˜åŽŸææ–™è¿›è´§éªŒè¯
     * @param factoryVerify
     * @return
     */
    boolean addFactoryVerify(InsOrderFactoryVerify factoryVerify);
    /**
     * ç”Ÿæˆpd临时
     * @param path
     * @return
     */
    String wordToPdfTemp(String path);
}
inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderRatesService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.ruoyi.inspect.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.inspect.dto.SampleOrderDto;
import com.ruoyi.inspect.dto.TemplateRateDto;
import com.ruoyi.inspect.pojo.InsOrderRates;
/**
 * è®¢å•费用表
 *
 * @author zhuo
 * @since 2025-02-28
 */
public interface InsOrderRatesService extends IService<InsOrderRates> {
    /**
     *
     * @param page
     * @param sampleOrderDto
     * @return
     */
    IPage<SampleOrderDto> selectInsOrderRates(Page page, SampleOrderDto sampleOrderDto);
    /**
     * æŸ¥è¯¢è®¢å•费用详情(模板价格)
     * @param page
     * @param insOrderId
     * @return
     */
    IPage<TemplateRateDto> selectTemplateRatesDetail(Page page, Integer insOrderId);
}
inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,144 @@
package com.ruoyi.inspect.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.InventoryDetailDTO;
import com.ruoyi.basic.pojo.IfsInventoryQuantity;
import com.ruoyi.basic.pojo.StandardProductList;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.inspect.pojo.InsOrder;
import com.ruoyi.inspect.pojo.InsSample;
import com.ruoyi.inspect.pojo.InsUnqualifiedRetestProduct;
import com.ruoyi.inspect.dto.*;
import com.ruoyi.inspect.vo.InsOrderPrintingVo;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;
/**
 * @author gaoaoy
 * @description é’ˆå¯¹è¡¨ã€ins_order(检验下单)】的数据库操作Service
 * @createDate 2024-03-12 16:17:55
 */
public interface InsOrderService extends IService<InsOrder> {
    //获取单位检验下单数据
    IPage<SampleOrderDto> selectInsOrderParameter(IPage<InsOrder> page, SampleOrderDto sampleOrderDto);
    //修改检验下单数据
    int upInsOrder(Integer orderId,Integer sampleId, String appointed, Integer userId,String sonLaboratory);
    int addInsOrder(List<SampleProductDto> list, InsOrder insOrder);
    int addNewJuInsOrder(InsPlaceOrderDto insPlaceOrderDto);
    Map<String, Object> getInsOrder(Integer id);
    int upInsOrderOfState(InsOrder insOrder);
    Map<String, Object> getInsOrderAndSample(Integer id, String laboratory);
    IPage<SampleProductDto2> selectSampleAndProductByOrderId(IPage<SampleProductDto2> page, SampleProductDto2 sampleProductDto);
    int updateStatus(Integer id);
    // èŽ·å–ifs库存信息
    void getIfsOrder(Map<String,Object> objectMap,Boolean isSplitOrder);
    /**
     * ä¿®æ”¹è®¢å•单号
     * @param insOrder
     */
    void updateEntrustCode(InsOrder insOrder);
    List<InsUnqualifiedRetestProduct> getRetestResult(Integer insProductId);
    void updateIfsInventoryQuantity(Long id);
    /**
     * é“œæä¸‹å•
     * @param list
     * @param copperInsOrder
     * @return
     */
    int addRawCopperOrder(List<SampleProductDto> list, CopperInsOrderDto copperInsOrder);
    /**
     * ä¿®æ”¹å§”托编号
     * @param insOrder
     */
    void updateOrderEntrustCode(InsOrder insOrder);
    /**
     * ä¿®æ”¹æ£€éªŒä¸‹å•内容
     * @param insOrderUpdateDto
     * @return
     */
    Boolean updateInsOrder(InsOrderUpdateDto insOrderUpdateDto);
    /**
     * æˆå“æ ‡ç­¾æ‰“印
     * @param ids
     * @return
     */
    List<InsOrderPrintingVo> labelOrderPrinting(List<Integer> ids);
    /**
     * å¤–购产品标签打印
     * @param ids
     * @return
     */
    List<InventoryDetailDTO> labelOutsideOrderPrinting(List<Integer> ids);
    /**
     * æ ¹æ®æ ·å“id查询检验项树
     * @param insSampleId
     * @return
     */
    List<StandardProductList> getProductTreeBySampleId(Integer insSampleId);
    /**
     * æ·»åŠ é—æ¼çš„æ£€éªŒé¡¹
     * @param omitOrderProductDto
     * @return
     */
    boolean addOmitOrderProduct(OmitOrderProductDto omitOrderProductDto);
    /**
     * æˆå“æ£€éªŒå•导出
     * @param sampleOrderDto
     * @param response
     */
    void rawAllInsOrderExport(SampleOrderDto sampleOrderDto, HttpServletResponse response);
    /**
     * ä¿®æ”¹æ ·å“åž‹å·
     * @param insSample
     */
    void updateSampleModel(InsSample insSample);
    /**
     * æŸ¥è¯¢å½“前时间是否没有该检测项的抽样计划
     * @param sampleList
     * @param insOrder
     * @return
     */
    Result judgeNotSpotCheckOrder(List<SampleProductDto> sampleList, InsOrder insOrder);
    /**
     * ç§»åº“操作
     * @param one
     * @return
     */
    String moveRawMaterial(IfsInventoryQuantity one);
}
inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderStandardTemplateService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.inspect.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.inspect.pojo.InsOrderStandardTemplate;
/**
 * è®¢å•标准模板复制
 *
 * @author zhuo
 * @since 2024-11-05
 */
public interface InsOrderStandardTemplateService extends IService<InsOrderStandardTemplate> {
}
inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderStateService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.inspect.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.inspect.pojo.InsOrderState;
/**
 * æ£€éªŒä»»åŠ¡çŠ¶æ€
 *
 * @author zhuo
 * @since 2025-02-28
 */
public interface InsOrderStateService extends IService<InsOrderState> {
}
inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderTemplateService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.inspect.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.inspect.pojo.InsOrderTemplate;
import com.ruoyi.inspect.vo.InsOrderTemplateDetailVo;
import java.util.List;
/**
* @author Administrator
* @description é’ˆå¯¹è¡¨ã€ins_order_template】的数据库操作Service
* @createDate 2024-03-18 14:14:54
*/
public interface InsOrderTemplateService extends IService<InsOrderTemplate> {
    int addInsOrderTemplate(InsOrderTemplate insOrderTemplate);
    List<InsOrderTemplate> selectInsOrderTemplate(String company);
    InsOrderTemplateDetailVo selectInsOrderTemplateById(Integer id);
    int delInsOrderTemplate(Integer id);
}
inspect-server/src/main/java/com/ruoyi/inspect/service/InsProductDeviationWarningDetailService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.inspect.service;
import com.ruoyi.inspect.pojo.InsProductDeviationWarningDetail;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 * æ£€éªŒé¡¹åå·®é¢„警详情表 æœåŠ¡ç±»
 * </p>
 *
 * @author
 * @since 2025-03-28 02:18:58
 */
public interface InsProductDeviationWarningDetailService extends IService<InsProductDeviationWarningDetail> {
}
inspect-server/src/main/java/com/ruoyi/inspect/service/InsProductDeviationWarningService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.inspect.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.inspect.dto.InsProductDeviationWarningDto;
import com.ruoyi.inspect.pojo.InsProductDeviationWarning;
import com.baomidou.mybatisplus.extension.service.IService;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * æ£€éªŒé¡¹åå·®é¢„警主表 æœåŠ¡ç±»
 * </p>
 *
 * @author
 * @since 2025-03-28 02:18:02
 */
public interface InsProductDeviationWarningService extends IService<InsProductDeviationWarning> {
    /**
     * æŸ¥è¯¢é¢„警列表
     * @param page
     * @param deviationWarningDto
     * @return
     */
    IPage<InsProductDeviationWarningDto> selectDeviationWarningPage(Page page, InsProductDeviationWarningDto deviationWarningDto);
}
inspect-server/src/main/java/com/ruoyi/inspect/service/InsProductService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
package com.ruoyi.inspect.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.inspect.dto.InsProductBindingDto;
import com.ruoyi.inspect.dto.WriteInspectionConditionDto;
import com.ruoyi.inspect.pojo.InsProduct;
import com.ruoyi.performance.pojo.AuxiliaryOutputWorkingHours;
import java.util.List;
import java.util.Map;
/**
* @author Administrator
* @description é’ˆå¯¹è¡¨ã€ins_product(检验项目)】的数据库操作Service
* @createDate 2024-03-17 23:57:39
*/
public interface InsProductService extends IService<InsProduct> {
    int selectOrderManDay(Integer orderId);
    int updateInspected(Integer id,String ids);
    boolean write(WriteInspectionConditionDto dto);
    IPage<InsProduct> selectNoProducts(Page page, InsProduct insProduct, Integer orderId, String ids);
    void checkUpdate(Integer orderId,Integer state);
    /**
     * æ ¹æ®æ£€éªŒé¡¹id查询检验项树信息
     * @param productId
     * @return
     */
    List<InsProduct> getProductTreeByProductId(Integer productId);
    /**
     * ç‰¹æ®Šæ£€éªŒé¡¹ç»‘定
     * @param insProductBindingDto
     * @return
     */
    boolean bindingProductTreeByProductId(InsProductBindingDto insProductBindingDto);
    /**
     * åˆ é™¤ç‰¹æ®Šæ£€éªŒé¡¹ç»‘定信息
     * @param productId
     * @return
     */
    boolean removeBindingProductTree(Integer productId);
    List<InsProduct> getRevocationInsProductList(Integer orderId);
}
inspect-server/src/main/java/com/ruoyi/inspect/service/InsReportService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
package com.ruoyi.inspect.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.basic.pojo.IfsInventoryQuantity;
import com.ruoyi.inspect.dto.ReportPageDto;
import com.ruoyi.inspect.pojo.InsOrder;
import com.ruoyi.inspect.pojo.InsReport;
import org.springframework.web.multipart.MultipartFile;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;
/**
* @author Administrator
* @description é’ˆå¯¹è¡¨ã€ins_report(检验报告)】的数据库操作Service
* @createDate 2024-03-17 22:10:02
*/
public interface InsReportService extends IService<InsReport> {
    Map<String,Object> pageInsReport(Page page, ReportPageDto reportPageDto);
    void wordToPdf(String path,String sealUrl, boolean isRawMater);
    int inReport(String url, Integer id);
    int upReportUrl(Integer id);
    //提交
    int writeReport(Integer id, Integer userId, Integer submitUserId);
    //审核
    int examineReport(Integer id, Integer isExamine, String examineTell, Integer userId);
    //批准
    int ratifyReport(Integer id, Integer isRatify, String ratifyTell);
    int wordInsertUrl(Map<String, Object> map, String url);
    String downAll(String ids);
    /**
     * å•份报告 Word ä¸‹è½½ï¼ŒreportType:0检测报告,1检验报告;createOrderUser ç”¨äºŽå¤ç”¨æŠ¥å‘Šç¼–制的数据范围。
     */
    void download(Integer id, Integer reportType, Integer createOrderUser, HttpServletResponse response);
    int upAll(MultipartFile file) throws IOException;
    /**
     *
     * @param insOrder æ£€éªŒå•信息
     * @param registerInsResults æ˜¯å¦ç™»è®°æ£€éªŒç»“æžœ
     * @param hasExemption æ˜¯å¦å…æ£€
     */
    void isRawMaterial(InsOrder insOrder,Boolean registerInsResults,Boolean hasExemption);
    Long getUnqualifiedCount(InsOrder insOrder);
    /**
     * é€€å›žåˆ°æ£€éªŒä»»åŠ¡
     * @param id
     * @return
     */
    boolean sendBackTask(Integer id);
    /**
     * æŠ¥å‘Šå¯¼å‡º
     * @param dto
     * @param response
     */
    void reportAllExport(ReportPageDto dto, HttpServletResponse response) throws UnsupportedEncodingException;
}
inspect-server/src/main/java/com/ruoyi/inspect/service/InsSampleReceiptService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.inspect.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.inspect.dto.SampleReceiptActionDto;
import com.ruoyi.inspect.dto.SampleReceiptPageDto;
import com.ruoyi.inspect.dto.SampleReceiptQueryDto;
import com.ruoyi.inspect.pojo.InsSampleReceipt;
import jakarta.servlet.http.HttpServletResponse;
public interface InsSampleReceiptService extends IService<InsSampleReceipt> {
    IPage<SampleReceiptPageDto> page(Page<?> page, SampleReceiptQueryDto query);
    SampleReceiptPageDto detail(Integer id);
    void submit(SampleReceiptActionDto dto);
    void reject(SampleReceiptActionDto dto);
    void export(SampleReceiptQueryDto query, HttpServletResponse response);
}
inspect-server/src/main/java/com/ruoyi/inspect/service/InsSampleService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.inspect.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.inspect.pojo.InsSample;
import java.util.List;
/**
* @author Administrator
* @description é’ˆå¯¹è¡¨ã€ins_sample(检验样品)】的数据库操作Service
* @createDate 2024-03-14 17:14:57
*/
public interface InsSampleService extends IService<InsSample> {
    /**
     * æ ¹æ®è®¢å•id查询样品
     * @param insOrderId
     * @return
     */
    List<InsSample> getSampleByOrderId(Integer insOrderId);
}
inspect-server/src/main/java/com/ruoyi/inspect/service/InsUnqualifiedHandlerFileService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.inspect.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.inspect.pojo.InsUnqualifiedHandlerFile;
import org.springframework.web.multipart.MultipartFile;
/**
* @author 27233
* @description é’ˆå¯¹è¡¨ã€ins_unqualified_handler_file(不合格处理附件记录表)】的数据库操作Service
* @createDate 2024-07-31 13:38:38
*/
public interface InsUnqualifiedHandlerFileService extends IService<InsUnqualifiedHandlerFile> {
    InsUnqualifiedHandlerFile uploadFile(Long handlerId, MultipartFile file);
}
inspect-server/src/main/java/com/ruoyi/inspect/service/InsUnqualifiedHandlerService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.ruoyi.inspect.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.inspect.dto.UnqualifiedHandlerDto;
import com.ruoyi.inspect.pojo.InsUnqualifiedHandler;
import com.ruoyi.inspect.vo.UnqualifiedHandlerVO;
/**
* @author 27233
* @description é’ˆå¯¹è¡¨ã€ins_unqualified_handler(不合格处理表)】的数据库操作Service
* @createDate 2024-07-31 13:38:14
*/
public interface InsUnqualifiedHandlerService extends IService<InsUnqualifiedHandler> {
    IPage<UnqualifiedHandlerVO> pageList(Page page, UnqualifiedHandlerDto unqualifiedHandlerDto);
    boolean addUnqualifiedHandler(UnqualifiedHandlerDto unqualifiedHandlerDto);
    boolean updateUnqualifiedHandler(UnqualifiedHandlerDto unqualifiedHandlerDto);
    UnqualifiedHandlerDto getUnqualifiedHandler(Integer id);
    boolean deleteUnqualifiedHandler(Integer id);
}
inspect-server/src/main/java/com/ruoyi/inspect/service/InsUnqualifiedRetestProductService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.inspect.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.inspect.pojo.InsUnqualifiedRetestProduct;
/**
 * ä¸åˆæ ¼æ£€éªŒé¡¹ç›®å¤æµ‹
 *
 * @author zhuo
 * @since 2024-09-03
 */
public interface InsUnqualifiedRetestProductService extends IService<InsUnqualifiedRetestProduct> {
}
inspect-server/src/main/java/com/ruoyi/inspect/service/OutsourcingFinishProductInspectionService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
package com.ruoyi.inspect.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.dto.IfsInventoryQuantityDto;
import com.ruoyi.basic.dto.IfsInventoryQuantitySupplierDto;
import com.ruoyi.basic.pojo.IfsInventoryQuantity;
import com.ruoyi.basic.vo.IfsInventoryQuantityVO;
import org.springframework.stereotype.Component;
@Component
public interface OutsourcingFinishProductInspectionService {
    /**
     * æŠ¥æ£€æŸ¥è¯¢
     * @param page
     * @param ifsInventoryQuantity
     * @return
     */
    IPage<IfsInventoryQuantityVO> getWarehouseSubmit(Page page, IfsInventoryQuantity ifsInventoryQuantity);
    /**
     * æŸ¥è¯¢å·²æ£€éªŒ
     * @param page
     * @param ifsInventoryQuantityDto
     * @return
     */
    IPage<IfsInventoryQuantitySupplierDto>  getIfsByOver(Page<IfsInventoryQuantitySupplierDto> page, IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto);
    /**
     * æŸ¥è¯¢æ£€éªŒå€¼
     * @param page
     * @param ifsInventoryQuantityDto
     * @return
     */
    IPage<IfsInventoryQuantityDto> getIfsByStateOne(IPage<IfsInventoryQuantityDto> page, IfsInventoryQuantityDto ifsInventoryQuantityDto);
}
inspect-server/src/main/java/com/ruoyi/inspect/service/RawMaterialOrderService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,161 @@
package com.ruoyi.inspect.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.dto.IfsInventoryQuantityCheckDto;
import com.ruoyi.basic.dto.IfsInventoryQuantityDto;
import com.ruoyi.basic.dto.IfsInventoryQuantitySupplierDto;
import com.ruoyi.basic.pojo.IfsInventoryQuantity;
import com.ruoyi.basic.vo.IfsInventoryQuantityVO;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.inspect.dto.CopperInsOrderDto;
import com.ruoyi.inspect.dto.OrderSplitDTO;
import com.ruoyi.inspect.dto.SampleProductDto;
import com.ruoyi.inspect.pojo.InsOrder;
import org.springframework.web.multipart.MultipartFile;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.util.List;
/**
 * @Author zhuo
 * @Date 2024/7/31
 */
public interface RawMaterialOrderService {
    Result selectStandardTreeListByPartNo(String partNo);
    /**
     * æŠ¥æ£€æŸ¥è¯¢
     * @param page
     * @param ifsInventoryQuantity
     * @return
     */
    IPage<IfsInventoryQuantityVO> getWarehouseSubmit(IPage<IfsInventoryQuantity> page, IfsInventoryQuantity ifsInventoryQuantity);
    /**
     * æŸ¥è¯¢æ£€éªŒå€¼
     * @param page
     * @param ifsInventoryQuantityDto
     * @return
     */
    IPage<IfsInventoryQuantityDto> getIfsByStateOne(IPage<IfsInventoryQuantityDto> page, IfsInventoryQuantityDto ifsInventoryQuantityDto);
    int inspectionReport(List<Long> ids,String orderType,String materialProp);
    int revokeInspectionReport(Long id);
    List<IfsInventoryQuantityDto> printLabel(List<Integer> ids);
    int inspectionReportOne(IfsInventoryQuantity ifsInventoryQuantity);
    String getIndustryChain(Integer id);
    /**
     * åŽŸææ–™æ’¤é”€ä¸‹å•
     * @param ifsInventoryId
     * @return
     */
    boolean repealRawOrder(Long ifsInventoryId);
    /**
     * æ·»åŠ å…æ£€è®¢å•
     * @param list
     * @param insOrder
     * @return
     */
    int addExemptionOrder(List<SampleProductDto> list, InsOrder insOrder);
    IPage<IfsInventoryQuantityCheckDto> selectIfsInventoryQuantity(Page<IfsInventoryQuantityCheckDto> page, IfsInventoryQuantityCheckDto ifsInventoryQuantity);
    /**
     * æŸ¥è¯¢å·²æ£€éªŒ
     * @param page
     * @param ifsInventoryQuantityDto
     * @return
     */
    IPage<IfsInventoryQuantitySupplierDto>  getIfsByOver(Page<IfsInventoryQuantitySupplierDto> page, IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto);
    int delIfsInventory(Integer id);
    /**
     * åŽŸææ–™æ”¾è¡Œå…æ£€
     * @param ifsInventoryId
     * @return
     */
    boolean rawOrderRelease(Long ifsInventoryId, String partDetail);
    /**
     * åŽŸææ–™ä¸‹å•é€šçŸ¥å…æ£€æˆ–è€…å¤šæ¬¡æ£€éªŒ
     * @param ifsInventoryId
     * @return
     */
    int notificationRawOrder(Long ifsInventoryId);
    /**
     * æ‰‹åŠ¨æ·»åŠ åŽŸæä¿¡æ¯
     * @param ifsInventoryQuantity
     */
    void addIfsInventoryQuantity(IfsInventoryQuantity ifsInventoryQuantity);
    /**
     * é“œå•丝下单免检
     * @param list
     * @param copperInsOrder
     */
    int addRawCopperOrderExemptionOrder(List<SampleProductDto> list, CopperInsOrderDto copperInsOrder);
    /**
     * è®©æ­¥u放行
     * @param ifsInventoryId
     * @return
     */
    boolean concessionRelease(Long ifsInventoryId);
    /**
     * åŽŸææ–™è¿›åŽ‚æ’¤é”€ä¸‹å•
     * @param enterOrderId
     * @return
     */
    boolean repealEnterRawOrder(Integer enterOrderId);
    /**
     * åŽŸææ–™å­£åº¦æ’¤é”€ä¸‹å•
     * @param quarterOrderId
     * @return
     */
    boolean repealQuarterRawOrder(Integer quarterOrderId);
    /**
     * åŽŸææ–™æŠ¥æ£€å…¨éƒ¨ä¿¡æ¯å¯¼å‡º
     * @param dto
     * @param response
     */
    void rawAllExport(IfsInventoryQuantitySupplierDto dto, HttpServletResponse response) throws UnsupportedEncodingException;
    /**
     * åŽŸææ–™æŸ¥è¯¢å¯ä»¥å­£åº¦æ£€éªŒçš„å†…å®¹
     * @param page
     * @param ifsInventoryQuantityDto
     * @return
     */
    IPage<IfsInventoryQuantitySupplierDto> getIfsByQuarter(Page page, IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto);
    /**
     * advancedGodown
     * @param ifsInventoryId
     * @return
     */
    boolean advancedGodown(Long ifsInventoryId);
    void downloadTemplate(HttpServletResponse response);
    Result importSplitOrderData(MultipartFile file, Long ifsId, HttpServletRequest request);
    boolean confirmSplitOrder(OrderSplitDTO orderSplitDTO);
    Long getOrderCountByIfsId(Long ifsId);
}
inspect-server/src/main/java/com/ruoyi/inspect/service/RawMaterialOrderTemplateService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.ruoyi.inspect.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.inspect.pojo.RawMaterialOrderTemplate;
import java.util.List;
/**
 * åŽŸææ–™ä¸‹å•æ¨¡æ¿
 *
 * @author zhuo
 * @since 2024-08-05
 */
public interface RawMaterialOrderTemplateService extends IService<RawMaterialOrderTemplate> {
    int addRawMaterOrderTemplate(RawMaterialOrderTemplate rawMaterialOrderTemplate);
    List<RawMaterialOrderTemplate> selectRawMaterOrderTemplate(String partNo);
    String selectRawMaterOrderTemplateById(Integer id);
    int delRawMaterOrderTemplate(Integer id);
}
inspect-server/src/main/java/com/ruoyi/inspect/service/ReportService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.ruoyi.inspect.service;
import com.ruoyi.performance.dto.AuxiliaryAllDto;
import com.ruoyi.performance.dto.AuxiliaryOriginalHoursLookDto;
import java.util.Map;
public interface ReportService {
    //首页-->日历任务图
    Map<String, Object> calendarWorkByWeek();
    AuxiliaryAllDto currentUserWorkHourCount(AuxiliaryOriginalHoursLookDto dto);
}
inspect-server/src/main/java/com/ruoyi/inspect/service/SpotCheckQuarterItemService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.inspect.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.inspect.pojo.SpotCheckQuarterItem;
/**
 * å­£åº¦æŠ½æ ·è®¡åˆ’详情表
 *
 * @author zhuo
 * @since 2024-10-09
 */
public interface SpotCheckQuarterItemService extends IService<SpotCheckQuarterItem> {
}
inspect-server/src/main/java/com/ruoyi/inspect/service/SpotCheckYearItemService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.inspect.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.inspect.pojo.SpotCheckYearItem;
/**
 * å¹´åº¦æŠ½æ ·è®¡åˆ’详情表
 *
 * @author zhuo
 * @since 2024-10-10
 */
public interface SpotCheckYearItemService extends IService<SpotCheckYearItem> {
}
inspect-server/src/main/java/com/ruoyi/inspect/service/WarehouseCellService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.ruoyi.inspect.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.inspect.pojo.WarehouseCell;
/**
* @author z1292
* @description é’ˆå¯¹è¡¨ã€warehouse(仓库)】的数据库操作Service
* @createDate 2024-04-06 12:13:57
*/
public interface WarehouseCellService extends IService<WarehouseCell> {
}
inspect-server/src/main/java/com/ruoyi/inspect/service/WarehouseService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
package com.ruoyi.inspect.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.inspect.dto.WarehouseCellAndSampleDto;
import com.ruoyi.inspect.dto.WarehouseDto;
import com.ruoyi.inspect.pojo.Warehouse;
import com.ruoyi.inspect.pojo.WarehouseShelf;
import java.util.List;
import java.util.Map;
/**
* @author z1292
* @description é’ˆå¯¹è¡¨ã€warehouse(仓库)】的数据库操作Service
* @createDate 2024-04-06 12:13:57
*/
public interface WarehouseService extends IService<Warehouse> {
    int addWarehouse(Warehouse warehouse);
    List<WarehouseDto> selectWarehouse();
    int addShelf(WarehouseShelf warehouseShelf);
    int delWarehouse(Integer id);
    int upWarehouse(Warehouse warehouse);
    int delShelf(Integer id);
    int upShelf(WarehouseShelf warehouseShelf);
    List<WarehouseCellAndSampleDto> getWarehouse(Integer shelfId);
    int inWarehouse(String trees, String sampleCode);
    int outWarehouse(String sampleCode);
    Map<String, Object> getSampleRecord(Integer id);
    int searchSampleId(String sampleCode);
}
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/DataAnalysisServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,613 @@
package com.ruoyi.inspect.service.impl;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.ruoyi.basic.dto.IfsInventoryQuantitySupplierDto;
import com.ruoyi.common.constant.InsOrderTypeConstants;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.inspect.dto.DataAnalysisDto;
import com.ruoyi.inspect.dto.SampleProductRawAnalysisDto;
import com.ruoyi.inspect.mapper.DataAnalysisMapper;
import com.ruoyi.inspect.mapper.InsProductMapper;
import com.ruoyi.inspect.service.DataAnalysisService;
import com.ruoyi.inspect.vo.DeviationAnalyzeVo;
import com.ruoyi.inspect.vo.RawMaterialSupplierVo;
import com.ruoyi.inspect.vo.RawProductAnalysisVo;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * æ•°æ®åˆ†æž
 *
 * @Author zhuo
 * @Date 2024/10/16
 */
@Service
@AllArgsConstructor
public class DataAnalysisServiceImpl implements DataAnalysisService {
    private DataAnalysisMapper dataAnalysisMapper;
    private InsProductMapper insProductMapper;
    /**
     * æŸ¥è¯¢åŽŸææ–™æŸ±çŠ¶ç»Ÿè®¡
     * @return searchTime  æ—¶é—´
     * @return passRate  åˆæ ¼çއ
     * @return sum  æ€»æ•°
     */
    @Override
    public List<Map<String, Object>> getRawPassRateByBarChart(DataAnalysisDto dataAnalysisDto) {
        // æ ¼å¼åŒ–字段, é¿å…æŠ¥é”™
        this.formatDataAnalysisDto(dataAnalysisDto);
        // èŽ·å–å½“å‰æ—¥æœŸ
        DateTime now = DateUtil.date();
        if (StrUtil.isNotBlank(dataAnalysisDto.getBeginDate()) && StrUtil.isNotBlank(dataAnalysisDto.getEndDate())) {
            return dataAnalysisMapper.getRawPassRateByBarChartByDay(dataAnalysisDto);
        } else if (dataAnalysisDto.getDateType().equals("1")) {
            // èŽ·å–æœ¬å‘¨çš„å¼€å§‹æ—¶é—´ï¼ˆå‘¨ä¸€ 00:00:00)
            DateTime beginOfWeek = DateUtil.beginOfWeek(now);
            // èŽ·å–æœ¬å‘¨çš„ç»“æŸæ—¶é—´ï¼ˆå‘¨æ—¥ 23:59:59)
            // èŽ·å–æœ¬å‘¨çš„ç»“æŸæ—¶é—´ï¼ˆå‘¨æ—¥ 23:59:59)
            DateTime endOfWeek = DateUtil.endOfWeek(now);
            dataAnalysisDto.setBeginDate(DateUtil.format(beginOfWeek, "yyyy-MM-dd HH:mm:ss"));
            dataAnalysisDto.setEndDate(DateUtil.format(endOfWeek, "yyyy-MM-dd HH:mm:ss"));
            return dataAnalysisMapper.getRawPassRateByBarChartByWeek(dataAnalysisDto);
        } else if (dataAnalysisDto.getDateType().equals("2")) {
            // èŽ·å–å½“å‰æœˆçš„å¼€å§‹æ—¶é—´ï¼ˆæ¯æœˆ1号 00:00:00)
            DateTime beginOfMonth = DateUtil.beginOfMonth(now);
            // èŽ·å–å½“å‰æœˆçš„ç»“æŸæ—¶é—´ï¼ˆæœ¬æœˆæœ€åŽä¸€å¤© 23:59:59)
            DateTime endOfMonth = DateUtil.endOfMonth(now);
            dataAnalysisDto.setBeginDate(DateUtil.format(beginOfMonth, "yyyy-MM-dd HH:mm:ss"));
            dataAnalysisDto.setEndDate(DateUtil.format(endOfMonth, "yyyy-MM-dd HH:mm:ss"));
            return dataAnalysisMapper.getRawPassRateByBarChartByDay(dataAnalysisDto);
        } else if (dataAnalysisDto.getDateType().equals("3")) {
            // èŽ·å–å½“å‰å¹´çš„å¼€å§‹æ—¶é—´ï¼ˆæ¯å¹´1月1日 00:00:00)
            DateTime beginOfYear = DateUtil.beginOfYear(now);
            // èŽ·å–å½“å‰å¹´çš„ç»“æŸæ—¶é—´ï¼ˆæ¯å¹´12月31日 23:59:59)
            DateTime endOfYear = DateUtil.endOfYear(now);
            dataAnalysisDto.setBeginDate(DateUtil.format(beginOfYear, "yyyy-MM-dd HH:mm:ss"));
            dataAnalysisDto.setEndDate(DateUtil.format(endOfYear, "yyyy-MM-dd HH:mm:ss"));
            return dataAnalysisMapper.getRawPassRateByBarChartByYear(dataAnalysisDto);
        }
        return null;
    }
    /**
     * æŸ¥è¯¢åŽŸææ–™é¥¼çŠ¶å›¾
     * @param dataAnalysisDto
     * @return
     * sum          : æ€»æ•°
     * unQualified  : ä¸åˆæ ¼æ•°é‡
     * qualified  : åˆæ ¼æ•°é‡
     * passRate  : åˆæ ¼çއ
     */
    @Override
    public Map<String, Object> getRawPassRateByCake(DataAnalysisDto dataAnalysisDto) {
        // æ ¼å¼åŒ–字段, é¿å…æŠ¥é”™
        this.formatDataAnalysisDto(dataAnalysisDto);
        // èŽ·å–å½“å‰æ—¥æœŸ
        DateTime now = DateUtil.date();
        if (StrUtil.isNotBlank(dataAnalysisDto.getBeginDate()) && StrUtil.isNotBlank(dataAnalysisDto.getEndDate())) {
        } else if (dataAnalysisDto.getDateType().equals("1")) {
            // èŽ·å–æœ¬å‘¨çš„å¼€å§‹æ—¶é—´ï¼ˆå‘¨ä¸€ 00:00:00)
            DateTime beginOfWeek = DateUtil.beginOfWeek(now);
            // èŽ·å–æœ¬å‘¨çš„ç»“æŸæ—¶é—´ï¼ˆå‘¨æ—¥ 23:59:59)
            DateTime endOfWeek = DateUtil.endOfWeek(now);
            dataAnalysisDto.setBeginDate(DateUtil.format(beginOfWeek, "yyyy-MM-dd HH:mm:ss"));
            dataAnalysisDto.setEndDate(DateUtil.format(endOfWeek, "yyyy-MM-dd HH:mm:ss"));
        } else if (dataAnalysisDto.getDateType().equals("2")) {
            // èŽ·å–å½“å‰æœˆçš„å¼€å§‹æ—¶é—´ï¼ˆæ¯æœˆ1号 00:00:00)
            DateTime beginOfMonth = DateUtil.beginOfMonth(now);
            // èŽ·å–å½“å‰æœˆçš„ç»“æŸæ—¶é—´ï¼ˆæœ¬æœˆæœ€åŽä¸€å¤© 23:59:59)
            DateTime endOfMonth = DateUtil.endOfMonth(now);
            dataAnalysisDto.setBeginDate(DateUtil.format(beginOfMonth, "yyyy-MM-dd HH:mm:ss"));
            dataAnalysisDto.setEndDate(DateUtil.format(endOfMonth, "yyyy-MM-dd HH:mm:ss"));
        } else if (dataAnalysisDto.getDateType().equals("3")) {
            // èŽ·å–å½“å‰å¹´çš„å¼€å§‹æ—¶é—´ï¼ˆæ¯å¹´1月1日 00:00:00)
            DateTime beginOfYear = DateUtil.beginOfYear(now);
            // èŽ·å–å½“å‰å¹´çš„ç»“æŸæ—¶é—´ï¼ˆæ¯å¹´12月31日 23:59:59)
            DateTime endOfYear = DateUtil.endOfYear(now);
            dataAnalysisDto.setBeginDate(DateUtil.format(beginOfYear, "yyyy-MM-dd HH:mm:ss"));
            dataAnalysisDto.setEndDate(DateUtil.format(endOfYear, "yyyy-MM-dd HH:mm:ss"));
        }
        return dataAnalysisMapper.getRawPassRateByCake(dataAnalysisDto);
    }
    /**
     * æŸ¥è¯¢æ£€éªŒé¡¹åç§°
     * @param dataAnalysisDto
     * @return
     */
    @Override
    public List<String> getRawItemNames(DataAnalysisDto dataAnalysisDto) {
        // æ ¼å¼åŒ–字段, é¿å…æŠ¥é”™
        this.formatDataAnalysisDto(dataAnalysisDto);
        List<IfsInventoryQuantitySupplierDto> analysisList = dataAnalysisMapper.getRawProductAnalysisAllSample(dataAnalysisDto);
        // æ ¹æ®æ ·å“id查询检测参数
        if (CollectionUtils.isEmpty(analysisList)) {
            return null;
        }
        List<Integer> sampleIds = analysisList.stream().map(IfsInventoryQuantitySupplierDto::getSampleId).collect(Collectors.toList());
        // æŸ¥è¯¢æ£€éªŒé¡¹ç›®
        return insProductMapper.selectItemNameBySampleIds(sampleIds);
    }
    /**
     * æŸ¥è¯¢åŽŸææ–™é¡¹æ£€åˆ†æž
     * @param dataAnalysisDto
     * @return
     */
    @Override
    public RawProductAnalysisVo getRawProductAnalysis(DataAnalysisDto dataAnalysisDto) {
        // æ ¼å¼åŒ–字段, é¿å…æŠ¥é”™
        this.formatDataAnalysisDto(dataAnalysisDto);
        List<IfsInventoryQuantitySupplierDto> analysisList = dataAnalysisMapper.getRawProductAnalysisAllSample(dataAnalysisDto);
        // æ ¹æ®æ ·å“id查询检测参数
        if (CollectionUtils.isEmpty(analysisList)) {
            return null;
        }
        List<Integer> sampleIds = analysisList.stream().map(IfsInventoryQuantitySupplierDto::getSampleId).collect(Collectors.toList());
        // æŸ¥è¯¢æ£€éªŒé¡¹ç›®
        List<SampleProductRawAnalysisDto> sampleProductList = insProductMapper.selectListBySampleIds(sampleIds);
        List<String> itemNames = new ArrayList<>();
        if (CollectionUtils.isNotEmpty(dataAnalysisDto.getItemNames())) {
            itemNames = dataAnalysisDto.getItemNames();
        } else {
            itemNames = insProductMapper.selectItemNameBySampleIds(sampleIds);
        }
        // æ ¹æ®æ ·å“åˆ†ç»„
        List<Map<String, Object>> productList = new ArrayList<>();
        Map<Integer, List<SampleProductRawAnalysisDto>> collect = sampleProductList.stream().collect(Collectors.groupingBy(SampleProductRawAnalysisDto::getInsSampleId));
        List<String> finalItemNames = itemNames;
        collect.forEach((integer, rawAnalysisDtos) -> {
            // æ£€éªŒé¡¹ç›®åç§°è½¬æ¢æˆmap
            Map<String, Object> itemMap = new HashMap<>();
            for (String itemName : finalItemNames) {
                itemMap.put(itemName, null);
            }
            // éåŽ†æ£€éªŒé¡¹
            for (SampleProductRawAnalysisDto rawAnalysisDto : rawAnalysisDtos) {
                itemMap.put(rawAnalysisDto.getInspectionItem(), rawAnalysisDto.getLastValue());
            }
            itemMap.put("product", rawAnalysisDtos.get(0).getSampleCode());
            productList.add(itemMap);
        });
        RawProductAnalysisVo rawProductAnalysisVo = new RawProductAnalysisVo();
        rawProductAnalysisVo.setItemNames(itemNames);
        rawProductAnalysisVo.setProductList(productList);
        return rawProductAnalysisVo;
    }
    /**
     * æŸ¥è¯¢æ£€æµ‹é¡¹åˆ†æžåˆ—表
     * @param dataAnalysisDto
     * @return
     */
    @Override
    public List<IfsInventoryQuantitySupplierDto> getRawProductAnalysisAllList(DataAnalysisDto dataAnalysisDto) {
        // æ ¼å¼åŒ–字段, é¿å…æŠ¥é”™
        this.formatDataAnalysisDto(dataAnalysisDto);
        return dataAnalysisMapper.getRawProductAnalysisList(dataAnalysisDto);
    }
    /**
     * æŸ¥è¯¢é¡¹æ£€åˆ†æžåˆæ ¼çއ
     * @param dataAnalysisDto
     * @return
     */
    @Override
    public RawProductAnalysisVo getRawProductAnalysisRawPass(DataAnalysisDto dataAnalysisDto) {
        // æ ¼å¼åŒ–字段, é¿å…æŠ¥é”™
        this.formatDataAnalysisDto(dataAnalysisDto);
        List<IfsInventoryQuantitySupplierDto> analysisList = dataAnalysisMapper.getRawProductAnalysisAllSample(dataAnalysisDto);
        // æ ¹æ®æ ·å“id查询检测参数
        if (CollectionUtils.isEmpty(analysisList)) {
            return null;
        }
        List<Integer> sampleIds = analysisList.stream().map(IfsInventoryQuantitySupplierDto::getSampleId).collect(Collectors.toList());
        // æŸ¥è¯¢æ£€éªŒé¡¹ç›®
        List<SampleProductRawAnalysisDto> sampleProductList = insProductMapper.selectListBySampleIds(sampleIds);
        List<String> itemNames = new ArrayList<>();
        List<String> finalItemNames = itemNames;
        if (CollectionUtils.isNotEmpty(dataAnalysisDto.getItemNames())) {
            itemNames = dataAnalysisDto.getItemNames();
        } else {
            itemNames = insProductMapper.selectItemNameBySampleIds(sampleIds);
        }
        // åˆ†ç»„
        List<Map<String, Object>> productList = new ArrayList<>();
        Map<String, List<SampleProductRawAnalysisDto>> groupList = new HashMap<>();
        switch (dataAnalysisDto.getGroupType()) {
            case "0":  // é»˜è®¤æ ·å“åŒºåˆ†
                groupList = sampleProductList.stream()
                        .collect(Collectors.groupingBy(SampleProductRawAnalysisDto::getSample));
                break;
            case "1":  // æ‰¹æ¬¡å·åŒºåˆ†
                groupList = sampleProductList.stream()
                        .collect(Collectors.groupingBy(SampleProductRawAnalysisDto::getUpdateBatchNo));
                break;
            case "2":  // åŽ‚å®¶åŒºåˆ†
                groupList = sampleProductList.stream()
                        .collect(Collectors.groupingBy(SampleProductRawAnalysisDto::getSupplierName));
                break;
        }
        groupList.forEach((groupName, rawAnalysisDtos) -> {
            // æŒ‰ç…§æ£€éªŒé¡¹åŒºåˆ†
            // æ£€éªŒé¡¹ç›®åç§°è½¬æ¢æˆmap
            Map<String, Object> itemMap = new HashMap<>();
            for (String itemName : finalItemNames) {
                itemMap.put(itemName, null);
            }
            Map<String, List<SampleProductRawAnalysisDto>> groupItemList = rawAnalysisDtos.stream().collect(Collectors.groupingBy(SampleProductRawAnalysisDto::getInspectionItem));
            groupItemList.forEach((itemName, dtos) -> {
                // ç»Ÿè®¡åˆæ ¼æ€»æ•°
                long qualifiedCount = dtos.stream()
                        .filter(dto -> dto.getInsResult() != null && dto.getInsResult().equals(1))
                        .count();
                long totalCount = dtos.size();
                BigDecimal passRate = new BigDecimal(qualifiedCount).divide(new BigDecimal(totalCount), 4, RoundingMode.HALF_UP)
                        .multiply(new BigDecimal(100))
                        .setScale(2, RoundingMode.HALF_UP);
                itemMap.put(itemName, passRate);
            });
            itemMap.put("product", groupName);
            productList.add(itemMap);
        });
        RawProductAnalysisVo rawProductAnalysisVo = new RawProductAnalysisVo();
        rawProductAnalysisVo.setItemNames(itemNames);
        rawProductAnalysisVo.setProductList(productList);
        return rawProductAnalysisVo;
    }
    @Override
    public DeviationAnalyzeVo getRawSupplierCompare(DataAnalysisDto dataAnalysisDto) {
        // åˆ¤æ–­è®¢å•id是否有五个
        if (CollectionUtils.isEmpty(dataAnalysisDto.getOrderIds()) || dataAnalysisDto.getOrderIds().size() != 5) {
            throw new ErrorException("请选择五条数据");
        }
        if (CollectionUtils.isEmpty(dataAnalysisDto.getItemNames()) || dataAnalysisDto.getItemNames().size() != 1) {
            throw new ErrorException("请选择一个检验项检验项");
        }
        if (CollectionUtils.isNotEmpty(dataAnalysisDto.getSupplierDataList())) {
            if (dataAnalysisDto.getSupplierDataList().size() != 5) {
                throw new ErrorException("厂家数据请输入完整5条");
            }
        }
        List<RawMaterialSupplierVo> rawMaterialSupplierVoList = dataAnalysisMapper.getItemValueByOrderIds(dataAnalysisDto.getOrderIds(), dataAnalysisDto.getItemNames().get(0));
        // åˆ¤æ–­åŽ‚å®¶ææ–™åç§°è§„æ ¼åž‹å·æ˜¯å¦æ˜¯ä¸€æ ·çš„
        RawMaterialSupplierVo rawMaterialSupplierVo = rawMaterialSupplierVoList.get(0);
        for (RawMaterialSupplierVo materialSupplierVo : rawMaterialSupplierVoList) {
            if (!materialSupplierVo.getSupplierName().equals(rawMaterialSupplierVo.getSupplierName()) ||
                    !materialSupplierVo.getSample().equals(rawMaterialSupplierVo.getSample()) ||
                    !materialSupplierVo.getModel().equals(rawMaterialSupplierVo.getModel())) {
                throw new ErrorException("选择的检验信息不匹配");
            }
        }
        List<String> lastValues = rawMaterialSupplierVoList.stream().map(RawMaterialSupplierVo::getLastValue).collect(Collectors.toList());
        // è®¡ç®—本地数据
        Map<String, List<Object>> localData = dataCompute(lastValues);
        DeviationAnalyzeVo deviationAnalyzeVo = new DeviationAnalyzeVo();
        deviationAnalyzeVo.setLocalData(localData.get("data"));
        deviationAnalyzeVo.setLocalULC(localData.get("uclData"));
        deviationAnalyzeVo.setLocalLCL(localData.get("lclData"));
        deviationAnalyzeVo.setLocalAverage(localData.get("averageData"));
        deviationAnalyzeVo.setLocalRange(localData.get("rangeData"));
        // åˆ¤æ–­æ˜¯å¦æœ‰åŽ‚å®¶æ•°æ®
        if (CollectionUtils.isNotEmpty(dataAnalysisDto.getSupplierDataList())) {
            List<String> supplierValues = dataAnalysisDto.getSupplierDataList();
            List<Object> absoluteDeviation = new ArrayList<>();
            List<Object> averageList = new ArrayList<>();
            for (int i = 0; i < lastValues.size(); i++) {
                // åˆ¤æ–­æœ‰å€¼æ˜¯å¦ä¸ºç©º
                if (StringUtils.isNotBlank(lastValues.get(i)) ||
                        StringUtils.isNotBlank(supplierValues.get(i))) {
                    BigDecimal laseValue = new BigDecimal(lastValues.get(i));
                    BigDecimal supplierValue = new BigDecimal(supplierValues.get(i));
                    // è®¡ç®— (B3 - B2)
                    BigDecimal result = laseValue.subtract(supplierValue)
                            .divide(laseValue, 10, RoundingMode.HALF_UP)
                            .abs()
                            .setScale(2, RoundingMode.HALF_UP);
                    absoluteDeviation.add(result);
                } else {
                    absoluteDeviation.add(null);
                }
            }
            // è®¡ç®—平均值
            List<String> stringList = absoluteDeviation.stream()
                    .map(obj -> obj == null ? "null" : obj.toString())
                    .collect(Collectors.toList());
            BigDecimal average = computeAverage(stringList);
            absoluteDeviation.add(average);
            for (int i = 0; i < 5; i++) {
                averageList.add(average);
            }
            // è®¡ç®—厂家数据
            Map<String, List<Object>> supplierData = dataCompute(supplierValues);
            deviationAnalyzeVo.setSupplierData(supplierData.get("data"));
            deviationAnalyzeVo.setSupplierULC(supplierData.get("uclData"));
            deviationAnalyzeVo.setSupplierLCL(supplierData.get("lclData"));
            deviationAnalyzeVo.setSupplierAverage(supplierData.get("averageData"));
            deviationAnalyzeVo.setSupplierRange(supplierData.get("rangeData"));
            deviationAnalyzeVo.setAbsoluteDeviation(absoluteDeviation);
            deviationAnalyzeVo.setAverage(averageList);
        }
        return deviationAnalyzeVo;
    }
    /**
     * æŸ¥è¯¢æœ¬æœˆä¸Žä¸Šæœˆåˆæ ¼çŽ‡å¯¹æ¯”
     * @param dataAnalysisDto
     * @return
     */
    @Override
    public List<Map<String, Object>> getRawUpMonth(DataAnalysisDto dataAnalysisDto) {
        return dataAnalysisMapper.getRawUpMonth();
    }
    /**
     * æŸ¥è¯¢æ£€éªŒé¡¹ç±»åž‹é¥¼å›¾
     * @param dataAnalysisDto
     * @return
     */
    @Override
    public Map<String, Object> getOrderTypeCookie(DataAnalysisDto dataAnalysisDto) {
        return dataAnalysisMapper.getOrderTypeCookie();
    }
    /**
     * è®¡ç®—返回数据
     * @param lastValues
     * @return
     */
    private static Map<String, List<Object>> dataCompute(List<String> lastValues) {
        // å¹³å‡å€¼
        BigDecimal average = computeAverage(lastValues);
        // æ ‡å‡†åå·®
        BigDecimal standardDeviation = computeStandardDeviation(lastValues);
        // ç›¸å¯¹åå·®
        BigDecimal relativeDeviation = standardDeviation.divide(average, 2, RoundingMode.HALF_UP);
        // å¹³å‡ç›¸å¯¹åå·®
        BigDecimal sqrt5 = BigDecimal.valueOf(Math.sqrt(5));
        BigDecimal averageRelativeDeviation = standardDeviation.divide(sqrt5, 2, RoundingMode.HALF_UP);
        // ucl
        BigDecimal ucl = average.add(new BigDecimal("3").multiply(standardDeviation)).setScale(2, RoundingMode.HALF_UP);
        // lcl
        BigDecimal lcl = average.subtract(new BigDecimal("3").multiply(standardDeviation)).setScale(2, RoundingMode.HALF_UP);
        // æžå·®
        BigDecimal range = computeRange(lastValues);
        // æ•°æ®æ‹¼æŽ¥
        // æ£€æµ‹æ•°æ®
        List<Object> data = new ArrayList<>();
        for (String lastValue : lastValues) {
            data.add(lastValue);
        }
        data.add(average);
        data.add(standardDeviation);
        data.add(relativeDeviation);
        data.add(averageRelativeDeviation);
        //ucl
        List<Object> uclData = new ArrayList<>();
        //lcl
        List<Object> lclData = new ArrayList<>();
        //平均值
        List<Object> averageData = new ArrayList<>();
        //极差
        List<Object> rangeData = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            uclData.add(ucl);
            lclData.add(lcl);
            averageData.add(average);
            rangeData.add(range);
        }
        Map<String, List<Object>> map = new HashMap<>();
        map.put("data", data);
        map.put("uclData", uclData);
        map.put("lclData", lclData);
        map.put("averageData", averageData);
        map.put("rangeData", rangeData);
        return map;
    }
    /**
     * è®¡ç®—极差
     * @param lastValues
     * @return
     */
    public static BigDecimal computeRange(List<String> lastValues) {
        int count = 0;
        BigDecimal min = null;
        BigDecimal max = null;
        for (String value : lastValues) {
            if (StrUtil.isNotBlank(value)) {
                BigDecimal bigDecimalValue = new BigDecimal(value);
                if (min == null || bigDecimalValue.compareTo(min) < 0) {
                    min = bigDecimalValue;
                }
                if (max == null || bigDecimalValue.compareTo(max) > 0) {
                    max = bigDecimalValue;
                }
                count++;
            }
        }
        if (count == 0 || min == null || max == null) {
            return BigDecimal.ZERO;
        }
        BigDecimal range = max.subtract(min);
        return range.setScale(2, RoundingMode.HALF_UP);
    }
    /**
     * è®¡ç®—平均值
     * @param values
     * @return
     */
    private static BigDecimal computeAverage(List<String> values) {
        BigDecimal sum = BigDecimal.ZERO;
        int count = 0;
        for (String value : values) {
            if (StrUtil.isNotBlank(value)) {
                BigDecimal number = new BigDecimal(value);
                sum = sum.add(number);
                count++;
            }
        }
        return count == 0 ? BigDecimal.ZERO : sum.divide(BigDecimal.valueOf(count), 2, BigDecimal.ROUND_HALF_UP);
    }
    /**
     * è®¡ç®—标准偏差
     * @return
     */
    private static BigDecimal computeStandardDeviation(List<String> lastValues) {
        int count = 0;
        // å°†å­—符串转换为 BigDecimal åˆ—表
        List<BigDecimal> values = new ArrayList<>();
        for (String value : lastValues) {
            if (StrUtil.isNotBlank(value)) {
                values.add(new BigDecimal(value));
                count++;
            }
        }
        if (count == 0) {
            return BigDecimal.ZERO;
        }
        // è®¡ç®—平均值
        BigDecimal sum = BigDecimal.ZERO;
        for (BigDecimal value : values) {
            sum = sum.add(value);
        }
        BigDecimal mean = sum.divide(new BigDecimal(values.size()), MathContext.DECIMAL128);
        // è®¡ç®—每个数值与平均值的差的平方
        BigDecimal squaredDifferenceSum = BigDecimal.ZERO;
        for (BigDecimal value : values) {
            BigDecimal difference = value.subtract(mean);
            BigDecimal squaredDifference = difference.multiply(difference);
            squaredDifferenceSum = squaredDifferenceSum.add(squaredDifference);
        }
        // è®¡ç®—标准差,注意这里使用的是样本标准差计算公式
        BigDecimal variance = squaredDifferenceSum.divide(new BigDecimal(values.size() - 1), MathContext.DECIMAL128);
        BigDecimal stddev = sqrt(variance);
        // ä¿ç•™ä¸¤ä½å°æ•°
        return stddev.setScale(2, RoundingMode.HALF_UP);
    }
    private static BigDecimal sqrt(BigDecimal value) {
        // ä½¿ç”¨ Heron's method è®¡ç®—平方根
        BigDecimal x = value;
        BigDecimal tolerance = new BigDecimal("1E-10");
        BigDecimal guess = value.divide(BigDecimal.valueOf(2), MathContext.DECIMAL128);
        while (x.subtract(guess).abs().compareTo(tolerance) > 0) {
            x = guess;
            guess = x.add(value.divide(x, MathContext.DECIMAL128)).divide(new BigDecimal("2"), MathContext.DECIMAL128);
        }
        return guess;
    }
    /**
     * *****格式化字段****
     * @param dataAnalysisDto
     */
    private void formatDataAnalysisDto(DataAnalysisDto dataAnalysisDto) {
        // æ ¼å¼è¯å­—段, é¿å…æŠ¥é”™
        if (StrUtil.isBlank(dataAnalysisDto.getOrderType())) {
            dataAnalysisDto.setOrderType("1");
        }
        if (dataAnalysisDto.getOrderType().equals("2")) {
            // å­£åº¦æ£€éªŒ
            dataAnalysisDto.setOrderType(InsOrderTypeConstants.QUARTERLY_TEST);
        } else {
            // è¿›åŽ‚æ£€éªŒ
            dataAnalysisDto.setOrderType(InsOrderTypeConstants.ENTER_THE_FACTORY);
        }
        if (StrUtil.isBlank(dataAnalysisDto.getDateType())) {
            dataAnalysisDto.setDateType("1");
        }
        if (StrUtil.isBlank(dataAnalysisDto.getGroupType())) {
            dataAnalysisDto.setGroupType("0");
        }
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/FinishProductSpotCheckServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,677 @@
package com.ruoyi.inspect.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
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.plugins.pagination.Page;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder;
import com.deepoove.poi.data.Pictures;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.utils.DateImageUtil;
import com.ruoyi.common.utils.api.IfsApiUtils;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.inspect.dto.IfsStockQueryDTO;
import com.ruoyi.inspect.dto.SpotCheckQuarterDto;
import com.ruoyi.inspect.dto.SpotCheckYearDto;
import com.ruoyi.inspect.mapper.SpotCheckQuarterMapper;
import com.ruoyi.inspect.mapper.SpotCheckYearMapper;
import com.ruoyi.inspect.pojo.SpotCheckQuarter;
import com.ruoyi.inspect.pojo.SpotCheckQuarterItem;
import com.ruoyi.inspect.pojo.SpotCheckYear;
import com.ruoyi.inspect.pojo.SpotCheckYearItem;
import com.ruoyi.inspect.service.FinishProductSpotCheckService;
import com.ruoyi.inspect.service.SpotCheckQuarterItemService;
import com.ruoyi.inspect.service.SpotCheckYearItemService;
import com.ruoyi.system.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * æˆå“æŠ½æ ·
 *
 * @Author zhuo
 * @Date 2024/9/29
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class FinishProductSpotCheckServiceImpl implements FinishProductSpotCheckService {
    @Resource
    private IfsApiUtils ifsApiUtils;
    @Resource
    private SpotCheckQuarterMapper spotCheckQuarterMapper;
    @Resource
    private SpotCheckQuarterItemService spotCheckQuarterItemService;
    @Resource
    private SpotCheckYearMapper spotCheckYearMapper;
    @Resource
    private SpotCheckYearItemService spotCheckYearItemService;
    @Value("${wordUrl}")
    private String wordUrl;
    @Value("${file.path}")
    private String imgUrl;
    @Resource
    private UserMapper userMapper;
    public Result getIfsStockReport(IfsStockQueryDTO ifsStockQueryDTO) {
        JSONObject jresult = new JSONObject();
        jresult.put("count", 0);
        jresult.put("data", new JSONArray());
        JSONObject jsonObject = new JSONObject();
        generateIfsStockQueryParams(jsonObject, ifsStockQueryDTO, ifsStockQueryDTO.getPage(), ifsStockQueryDTO.getLimit());
        Result result = ifsApiUtils.getIfsStock(jsonObject.toJSONString());
        if (result.getCode() == 200) {
            JSONObject data = (JSONObject) JSON.toJSON(result.getData());
            JSONArray array = new JSONArray();
            for (int i = 0; i < data.getJSONArray("LIST_INFO").size(); i++) {
                JSONObject listInfo = data.getJSONArray("LIST_INFO").getJSONObject(i);
                array.add(listInfo);
            }
            //获取总数量
            int count = data.getIntValue("TOTAL_RECORD");
            jresult.put("count", count);
            jresult.put("data", array);
        }
        return Result.success(jresult);
    }
    public void generateIfsStockQueryParams(JSONObject result, IfsStockQueryDTO ifsStockQueryDTO, Long pageNo, Long pageSize) {
        result.put("PAGE", pageNo);
        result.put("LIMIT", pageSize);
        result.put("WAREHOUSE", "成品仓库");
        result.put("QUANTITY_FLAG", ">0");
        //表里面的OTC行号
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getCotcOrderNo())) {
            result.put("C_OTC_ORDER_NO", ifsStockQueryDTO.getCotcOrderNo());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getCotcLineNo())) {
            result.put("C_OTC_LINE_NO", ifsStockQueryDTO.getCotcLineNo());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getPartNo())) {
            result.put("PART_NO", ifsStockQueryDTO.getPartNo());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getPartDescription())) {
            result.put("PART_DESC", "%" + ifsStockQueryDTO.getPartDescription() + "%");
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getLocNo())) {
            result.put("LOCATION_NO", ifsStockQueryDTO.getLocNo());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getLocDesc())) {
            result.put("LOCATION_DESC", ifsStockQueryDTO.getLocDesc());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getLotBatchNo())) {
            result.put("LOT_BATCH_NO", ifsStockQueryDTO.getLotBatchNo());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getWdrNo())) {
            result.put("WDR_NO", ifsStockQueryDTO.getWdrNo());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getWarehouse())) {
            result.put("WAREHOUSE", ifsStockQueryDTO.getWarehouse());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getLocationGroup())) {
            result.put("LOCATION_GROUP", ifsStockQueryDTO.getLocationGroup());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getLocationGroupDesc())) {
            result.put("LOCATION_GROUP_DESC", ifsStockQueryDTO.getLocationGroupDesc());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getReelNumber())) {
            result.put("ATTR1", ifsStockQueryDTO.getReelNumber());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getStartMeter())) {
            result.put("ATTR2", ifsStockQueryDTO.getStartMeter());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getEndMeter())) {
            result.put("ATTR3", ifsStockQueryDTO.getEndMeter());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getOuterColor())) {
            result.put("ATTR4", ifsStockQueryDTO.getOuterColor());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getInsulationColor())) {
            result.put("ATTR5", ifsStockQueryDTO.getInsulationColor());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getOtcOrderNo())) {
            result.put("ATTR6", ifsStockQueryDTO.getOtcOrderNo());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getMpsNo())) {
            result.put("ATTR7", ifsStockQueryDTO.getMpsNo());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getLetteringInfo())) {
            result.put("ATTR8", ifsStockQueryDTO.getLetteringInfo());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getSStockQuantity())) {
            result.put("ATTR9", ifsStockQueryDTO.getSStockQuantity());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getSAvailableStockQuantity())) {
            result.put("ATTR10", ifsStockQueryDTO.getSAvailableStockQuantity());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getSunit())) {
            result.put("ATTR11", ifsStockQueryDTO.getSunit());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getStockSource())) {
            result.put("ATTR12", ifsStockQueryDTO.getStockSource());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getInspInstorageTime())) {
            result.put("ATTR13", ifsStockQueryDTO.getInspInstorageTime());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getTestRemark())) {
            result.put("ATTR14", ifsStockQueryDTO.getTestRemark());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getGrossWeight())) {
            result.put("ATTR15", ifsStockQueryDTO.getGrossWeight());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getNetWeight())) {
            result.put("ATTR16", ifsStockQueryDTO.getNetWeight());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getPackingManner())) {
            result.put("ATTR17", ifsStockQueryDTO.getPackingManner());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getCylinderNumber())) {
            result.put("ATTR18", ifsStockQueryDTO.getCylinderNumber());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getRemark())) {
            result.put("ATTR19", ifsStockQueryDTO.getRemark());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getLengthRequirement())) {
            result.put("ATTR20", ifsStockQueryDTO.getLengthRequirement());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getCustomerName())) {
            result.put("ATTR21", ifsStockQueryDTO.getCustomerName());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getSystemNo())) {
            result.put("ATTR22", ifsStockQueryDTO.getSystemNo());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getInSource())) {
            result.put("ATTR23", ifsStockQueryDTO.getInSource());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getSplitQuality())) {
            result.put("ATTR24", ifsStockQueryDTO.getSplitQuality());
        }
        if (StrUtil.isNotBlank(ifsStockQueryDTO.getReserveQuantity())) {
            result.put("QTY_RESERVED", ifsStockQueryDTO.getReserveQuantity());
        }
    }
    /************************************************* å­£åº¦æŠ½æ · ***********************************************************/
    /**
     * æ–°å¢žå­£åº¦æŠ½æ£€
     * @param spotCheckQuarterDto
     * @return
     */
    @Override
    public boolean addQuarter(SpotCheckQuarterDto spotCheckQuarterDto) {
        // æ ¹æ®ç¼–号查询之前的
        SpotCheckQuarter spotCheckQuarter = spotCheckQuarterMapper.selectOne(Wrappers.<SpotCheckQuarter>lambdaQuery()
                .eq(SpotCheckQuarter::getQuarterNo, spotCheckQuarterDto.getQuarterNo())
                .orderByDesc(SpotCheckQuarter::getCreateTime)
                .last("limit 1"));
        if (spotCheckQuarter == null) {
            spotCheckQuarterMapper.insert(spotCheckQuarterDto);
            // æ·»åŠ è¯¦æƒ…
            for (SpotCheckQuarterItem quarterItem : spotCheckQuarterDto.getQuarterItems()) {
                quarterItem.setQuarterId(spotCheckQuarterDto.getQuarterId());
            }
            spotCheckQuarterItemService.saveBatch(spotCheckQuarterDto.getQuarterItems());
        } else {
            // ç´¯åŠ è¯¦æƒ…
            for (SpotCheckQuarterItem quarterItem : spotCheckQuarterDto.getQuarterItems()) {
                quarterItem.setQuarterId(spotCheckQuarter.getQuarterId());
            }
            spotCheckQuarterItemService.saveBatch(spotCheckQuarterDto.getQuarterItems());
        }
        return true;
    }
    /**
     * æŸ¥è¯¢å­£åº¦æŠ½æ ·è¯¦æƒ…
     * @param quarterId
     * @return
     */
    @Override
    public SpotCheckQuarterDto getQuarter(Integer quarterId) {
        SpotCheckQuarter spotCheckQuarter = spotCheckQuarterMapper.selectById(quarterId);
        // æŸ¥è¯¢è¯¦æƒ…
        List<SpotCheckQuarterItem> list = spotCheckQuarterItemService.list(Wrappers.<SpotCheckQuarterItem>lambdaQuery()
                .eq(SpotCheckQuarterItem::getQuarterId, spotCheckQuarter.getQuarterId()));
        SpotCheckQuarterDto spotCheckQuarterDto = new SpotCheckQuarterDto();
        BeanUtil.copyProperties(spotCheckQuarter, spotCheckQuarterDto);
        spotCheckQuarterDto.setQuarterItems(list);
        return spotCheckQuarterDto;
    }
    /**
     * å­£åº¦æŠ½æ ·åˆ†é¡µæŸ¥è¯¢
     * @param page
     * @param spotCheckQuarter
     * @return
     */
    @Override
    public IPage<SpotCheckQuarterDto> getQuarterPage(Page page, SpotCheckQuarterDto spotCheckQuarter) {
        return spotCheckQuarterMapper.getQuarterPage(page, QueryWrappers.queryWrappers(spotCheckQuarter));
    }
    /**
     * åˆ é™¤å­£åº¦æŠ½æ ·
     * @param quarterId
     * @return
     */
    @Override
    public boolean deleteQuarter(Integer quarterId) {
        spotCheckQuarterMapper.deleteById(quarterId);
        spotCheckQuarterItemService.remove(Wrappers.<SpotCheckQuarterItem>lambdaQuery()
                .eq(SpotCheckQuarterItem::getQuarterId, quarterId));
        return true;
    }
    /**
     * æˆå“ä¸‹å•界面查询季度信息
     * @return
     */
    @Override
    public List<Map<String, Object>> getQuarterOnOrder() {
        List<Map<String, Object>> quarterOnOrder = spotCheckQuarterMapper.getQuarterOnOrder();
        for (Map<String, Object> stringMap : quarterOnOrder) {
            List<SpotCheckQuarterItem> list = spotCheckQuarterItemService.list(Wrappers.<SpotCheckQuarterItem>lambdaQuery()
                    .eq(SpotCheckQuarterItem::getQuarterId, (Integer) stringMap.get("value")));
            List<Map<String, Object>> itemMaps = list.stream().map(spotCheckQuarterItem -> {
                Map<String, Object> map = new HashMap<>();
                map.put("value", spotCheckQuarterItem.getQuarterItemId());
                map.put("label", spotCheckQuarterItem.getProductModel() + " "
                        + spotCheckQuarterItem.getProductType() + " "
                        + spotCheckQuarterItem.getSpotCheckNumber());
                return map;
            }).collect(Collectors.toList());
            stringMap.put("children", itemMaps);
        }
        return quarterOnOrder;
    }
    /**
     * ä¿®æ”¹å­£åº¦æ£€éªŒ
     * @param spotCheckQuarterDto
     * @return
     */
    @Override
    public boolean updateQuarterOnOrder(SpotCheckQuarterDto spotCheckQuarterDto) {
        if (CollectionUtils.isNotEmpty(spotCheckQuarterDto.getQuarterItems())) {
            // æ¸…除之前详情
            spotCheckQuarterItemService.remove(Wrappers.<SpotCheckQuarterItem>lambdaQuery()
                    .eq(SpotCheckQuarterItem::getQuarterId, spotCheckQuarterDto.getQuarterId()));
            // æ·»åŠ è¯¦æƒ…
            for (SpotCheckQuarterItem quarterItem : spotCheckQuarterDto.getQuarterItems()) {
                quarterItem.setQuarterId(spotCheckQuarterDto.getQuarterId());
            }
            spotCheckQuarterItemService.saveBatch(spotCheckQuarterDto.getQuarterItems());
        }
        spotCheckQuarterMapper.updateById(spotCheckQuarterDto);
        return true;
    }
    /**
     * ç”Ÿæˆæœ€ç»ˆæŠ¥å‘Š
     * @param quarterId
     * @return
     */
    @Override
    public boolean finalReportQuarter(Integer quarterId, HttpServletResponse response) {
        // æ·»åŠ æŠ¥å‘Šä¿¡æ¯
        SpotCheckQuarter spotCheckQuarter = spotCheckQuarterMapper.selectById(quarterId);
        // æŸ¥è¯¢è¯¦æƒ…
        List<SpotCheckQuarterItem> itemList = spotCheckQuarterItemService.list(Wrappers.<SpotCheckQuarterItem>lambdaQuery()
                .eq(SpotCheckQuarterItem::getQuarterId, spotCheckQuarter.getQuarterId()));
        for (SpotCheckQuarterItem spotCheckQuarterItem : itemList) {
            // æ‹¼æŽ¥åž‹å·å’Œæ•°é‡
            spotCheckQuarterItem.setSpotCheckNumber((StringUtils.isBlank(spotCheckQuarterItem.getProductModel()) ? "" : spotCheckQuarterItem.getProductModel()) +
                    (StringUtils.isBlank(spotCheckQuarterItem.getSpotCheckNumber()) ? "" : spotCheckQuarterItem.getSpotCheckNumber()));
        }
        //编制人
        String writeUrl = null;
        if (spotCheckQuarter.getWriteUser() != null) {
            try {
                writeUrl = userMapper.selectById(spotCheckQuarter.getWriteUser()).getSignatureUrl();
            } catch (Exception e) {
                throw new ErrorException("找不到编制人的签名");
            }
            if (StrUtil.isBlank(writeUrl)) {
                throw new ErrorException("找不到编制人的签名");
            }
        }
        // åˆå§‹åŒ–所有的 countersignUrl å˜é‡
        String[] countersignUrls = new String[7];
        // å¦‚æžœ spotCheckQuarter.getCountersignUser() ä¸æ˜¯ç©ºæˆ–空白字符串
        if (StrUtil.isNotBlank(spotCheckQuarter.getCountersignUser())) {
            String[] split = spotCheckQuarter.getCountersignUser().split(",");
            // éåކ split æ•°ç»„,并将元素依次赋值给 countersignUrls æ•°ç»„
            for (int i = 0; i < Math.min(split.length, countersignUrls.length); i++) {
                String countersignUrl = null;
                try {
                    countersignUrl = userMapper.selectById(Integer.parseInt(split[i])).getSignatureUrl();
                } catch (Exception e) {
                    throw new ErrorException("找不到编制人的签名");
                }
                if (StrUtil.isBlank(countersignUrl)) {
                    throw new ErrorException("找不到编制人的签名");
                }
                countersignUrls[i] = countersignUrl;
            }
        }
        // å°† countersignUrls æ•°ç»„中的值依次赋值给 countersignUrl1 åˆ° countersignUrl7
        String countersignUrl1 = countersignUrls[0];
        String countersignUrl2 = countersignUrls[1];
        String countersignUrl3 = countersignUrls[2];
        String countersignUrl4 = countersignUrls[3];
        String countersignUrl5 = countersignUrls[4];
        String countersignUrl6 = countersignUrls[5];
        String countersignUrl7 = countersignUrls[6];
        //审核人
        String examineUrl = null;
        if (spotCheckQuarter.getExamineUser() != null) {
            try {
                examineUrl = userMapper.selectById(spotCheckQuarter.getExamineUser()).getSignatureUrl();
            } catch (Exception e) {
                throw new ErrorException("找不到审核人的签名");
            }
            if (StrUtil.isBlank(examineUrl)) {
                throw new ErrorException("找不到审核人的签名");
            }
        }
        //批准人
        String ratifyUrl = null;
        if (spotCheckQuarter.getRatifyUser() != null) {
            try {
                ratifyUrl = userMapper.selectById(spotCheckQuarter.getRatifyUser()).getSignatureUrl();
            } catch (Exception e) {
                throw new ErrorException("找不到批准人的签名");
            }
            if (StrUtil.isBlank(ratifyUrl)) {
                throw new ErrorException("找不到批准人的签名");
            }
        }
        String finalWriteUrl = writeUrl;
        String finalExamineUrl = examineUrl;
        String finalRatifyUrl = ratifyUrl;
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/spot_check_quarter.docx");
        ConfigureBuilder builder = Configure.builder();
        builder.useSpringEL(true);
        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
                new HashMap<String, Object>() {{
                    put("quarter", spotCheckQuarter);
                    put("quarterItems", itemList);
                    put("writeUrl", StrUtil.isBlank(finalWriteUrl) ? null :
                            Pictures.ofLocal(imgUrl + "/" + finalWriteUrl).create());
                    put("countersignUrl1", StrUtil.isBlank(countersignUrl1) ? null :
                            Pictures.ofLocal(imgUrl + "/" + countersignUrl1).create());
                    put("countersignUrl2", StrUtil.isBlank(countersignUrl2) ? null :
                            Pictures.ofLocal(imgUrl + "/" + countersignUrl2).create());
                    put("countersignUrl3", StrUtil.isBlank(countersignUrl3) ? null :
                            Pictures.ofLocal(imgUrl + "/" + countersignUrl3).create());
                    put("countersignUrl4", StrUtil.isBlank(countersignUrl4) ? null :
                            Pictures.ofLocal(imgUrl + "/" + countersignUrl4).create());
                    put("countersignUrl5", StrUtil.isBlank(countersignUrl5) ? null :
                            Pictures.ofLocal(imgUrl + "/" + countersignUrl5).create());
                    put("countersignUrl6", StrUtil.isBlank(countersignUrl6) ? null :
                            Pictures.ofLocal(imgUrl + "/" + countersignUrl6).create());
                    put("countersignUrl7", StrUtil.isBlank(countersignUrl7) ? null :
                            Pictures.ofLocal(imgUrl + "/" + countersignUrl7).create());
                    put("examineUrl", StrUtil.isBlank(finalExamineUrl) ? null :
                            Pictures.ofLocal(imgUrl + "/" + finalExamineUrl).create());
                    put("ratifyUrl", StrUtil.isBlank(finalRatifyUrl) ? null :
                            Pictures.ofLocal(imgUrl + "/" + finalRatifyUrl).create());
                    put("createDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(spotCheckQuarter.getCreateTime())).create());
                }});
        try {
            response.setContentType("application/msword");
            String fileName = URLEncoder.encode(
                    spotCheckQuarter.getQuarterNo() + "抽样计划", "UTF-8");
            response.setHeader("Content-disposition",
                    "attachment;filename=" + fileName + ".docx");
            OutputStream os = response.getOutputStream();
            template.write(os);
            os.flush();
            os.close();
            inputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败");
        }
        return true;
    }
    /******************************************************* å¹´åº¦æŠ½æ ·  *************************************************************/
    @Override
    public boolean addSpotCheckYear(SpotCheckYearDto spotCheckYearDto) {
        spotCheckYearMapper.insert(spotCheckYearDto);
        // è¯¦æƒ…
        for (SpotCheckYearItem yearItem : spotCheckYearDto.getYearItems()) {
            yearItem.setYearId(spotCheckYearDto.getYearId());
        }
        spotCheckYearItemService.saveBatch(spotCheckYearDto.getYearItems());
        return true;
    }
    @Override
    public SpotCheckYearDto getSpotCheckYear(Integer yearId) {
        SpotCheckYear spotCheckYear = spotCheckYearMapper.selectById(yearId);
        // æŸ¥è¯¢è¯¦æƒ…
        List<SpotCheckYearItem> list = spotCheckYearItemService.list(Wrappers.<SpotCheckYearItem>lambdaQuery()
                .eq(SpotCheckYearItem::getYearId, spotCheckYear.getYearId()));
        SpotCheckYearDto spotCheckYearDto = new SpotCheckYearDto();
        BeanUtil.copyProperties(spotCheckYear, spotCheckYearDto);
        spotCheckYearDto.setYearItems(list);
        return spotCheckYearDto;
    }
    @Override
    public IPage<SpotCheckYearDto> getSpotCheckYearPage(Page page, SpotCheckYearDto spotCheckYear) {
        return spotCheckYearMapper.getSpotCheckYearPage(page, QueryWrappers.queryWrappers(spotCheckYear));
    }
    @Override
    public boolean deleteSpotCheckYear(Integer yearId) {
        spotCheckYearMapper.deleteById(yearId);
        spotCheckYearItemService.remove(Wrappers.<SpotCheckYearItem>lambdaQuery()
                .eq(SpotCheckYearItem::getYearId, yearId));
        return true;
    }
    /**
     * ä¿®æ”¹å¹´åº¦æ£€éªŒ
     * @param spotCheckYearDto
     * @return
     */
    @Override
    public boolean updateSpotCheckYear(SpotCheckYearDto spotCheckYearDto) {
        spotCheckYearMapper.updateById(spotCheckYearDto);
        // åˆ é™¤è¯¦æƒ…
        spotCheckYearItemService.remove(Wrappers.<SpotCheckYearItem>lambdaQuery()
                .eq(SpotCheckYearItem::getYearId, spotCheckYearDto.getYearId()));
        // é‡æ–°æ–°å¢ž
        for (SpotCheckYearItem yearItem : spotCheckYearDto.getYearItems()) {
            yearItem.setYearId(spotCheckYearDto.getYearId());
        }
        spotCheckYearItemService.saveBatch(spotCheckYearDto.getYearItems());
        return false;
    }
    @Override
    public boolean finalReportSpotCheckYear(Integer yearId, HttpServletResponse response) {
        SpotCheckYear spotCheckYear = spotCheckYearMapper.selectById(yearId);
        // æŸ¥è¯¢è¯¦æƒ…
        List<SpotCheckYearItem> itemList = spotCheckYearItemService.list(Wrappers.<SpotCheckYearItem>lambdaQuery()
                .eq(SpotCheckYearItem::getYearId, spotCheckYear.getYearId()));
        //编制人
        String writeUrl = null;
        if (spotCheckYear.getWriteUser() != null) {
            try {
                writeUrl = userMapper.selectById(spotCheckYear.getWriteUser()).getSignatureUrl();
            } catch (Exception e) {
                throw new ErrorException("找不到编制人的签名");
            }
            if (StrUtil.isBlank(writeUrl)) {
                throw new ErrorException("找不到编制人的签名");
            }
        }
        // åˆå§‹åŒ–所有的 countersignUrl å˜é‡
        String[] countersignUrls = new String[7];
        // å¦‚果不是空或空白字符串
        if (StrUtil.isNotBlank(spotCheckYear.getCountersignUser())) {
            String[] split = spotCheckYear.getCountersignUser().split(",");
            // éåކ split æ•°ç»„,并将元素依次赋值给 countersignUrls æ•°ç»„
            for (int i = 0; i < Math.min(split.length, countersignUrls.length); i++) {
                String countersignUrl = null;
                try {
                    countersignUrl = userMapper.selectById(Integer.parseInt(split[i])).getSignatureUrl();
                } catch (Exception e) {
                    throw new ErrorException("找不到编制人的签名");
                }
                if (StrUtil.isBlank(countersignUrl)) {
                    throw new ErrorException("找不到编制人的签名");
                }
                countersignUrls[i] = countersignUrl;
            }
        }
        // å°† countersignUrls æ•°ç»„中的值依次赋值给 countersignUrl1 åˆ° countersignUrl7
        String countersignUrl1 = countersignUrls[0];
        String countersignUrl2 = countersignUrls[1];
        String countersignUrl3 = countersignUrls[2];
        String countersignUrl4 = countersignUrls[3];
        String countersignUrl5 = countersignUrls[4];
        String countersignUrl6 = countersignUrls[5];
        String countersignUrl7 = countersignUrls[6];
        //审核人
        String examineUrl = null;
        if (spotCheckYear.getExamineUser() != null) {
            try {
                examineUrl = userMapper.selectById(spotCheckYear.getExamineUser()).getSignatureUrl();
            } catch (Exception e) {
                throw new ErrorException("找不到审核人的签名");
            }
            if (StrUtil.isBlank(examineUrl)) {
                throw new ErrorException("找不到审核人的签名");
            }
        }
        //批准人
        String ratifyUrl = null;
        if (spotCheckYear.getRatifyUser() != null) {
            try {
                ratifyUrl = userMapper.selectById(spotCheckYear.getRatifyUser()).getSignatureUrl();
            } catch (Exception e) {
                throw new ErrorException("找不到批准人的签名");
            }
            if (StrUtil.isBlank(ratifyUrl)) {
                throw new ErrorException("找不到批准人的签名");
            }
        }
        String finalWriteUrl = writeUrl;
        String finalExamineUrl = examineUrl;
        String finalRatifyUrl = ratifyUrl;
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/spot_check_year.docx");
        ConfigureBuilder builder = Configure.builder();
        builder.useSpringEL(true);
        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
                new HashMap<String, Object>() {{
                    put("year", spotCheckYear);
                    put("yearItems", itemList);
                    put("writeUrl", StrUtil.isBlank(finalWriteUrl) ? null :
                            Pictures.ofLocal(imgUrl + "/" + finalWriteUrl).create());
                    put("countersignUrl1", StrUtil.isBlank(countersignUrl1) ? null :
                            Pictures.ofLocal(imgUrl + "/" + countersignUrl1).create());
                    put("countersignUrl2", StrUtil.isBlank(countersignUrl2) ? null :
                            Pictures.ofLocal(imgUrl + "/" + countersignUrl2).create());
                    put("countersignUrl3", StrUtil.isBlank(countersignUrl3) ? null :
                            Pictures.ofLocal(imgUrl + "/" + countersignUrl3).create());
                    put("countersignUrl4", StrUtil.isBlank(countersignUrl4) ? null :
                            Pictures.ofLocal(imgUrl + "/" + countersignUrl4).create());
                    put("countersignUrl5", StrUtil.isBlank(countersignUrl5) ? null :
                            Pictures.ofLocal(imgUrl + "/" + countersignUrl5).create());
                    put("countersignUrl6", StrUtil.isBlank(countersignUrl6) ? null :
                            Pictures.ofLocal(imgUrl + "/" + countersignUrl6).create());
                    put("countersignUrl7", StrUtil.isBlank(countersignUrl7) ? null :
                            Pictures.ofLocal(imgUrl + "/" + countersignUrl7).create());
                    put("examineUrl", StrUtil.isBlank(finalExamineUrl) ? null :
                            Pictures.ofLocal(imgUrl + "/" + finalExamineUrl).create());
                    put("ratifyUrl", StrUtil.isBlank(finalRatifyUrl) ? null :
                            Pictures.ofLocal(imgUrl + "/" + finalRatifyUrl).create());
                    put("createDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(spotCheckYear.getCreateTime())).create());
                }});
        try {
            response.setContentType("application/msword");
            String fileName = URLEncoder.encode(
                    spotCheckYear.getYearHead(), "UTF-8");
            response.setHeader("Content-disposition",
                    "attachment;filename=" + fileName + ".docx");
            OutputStream os = response.getOutputStream();
            template.write(os);
            os.flush();
            os.close();
            inputStream.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return true;
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/IfsOrderInspectionServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.ruoyi.inspect.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.dto.IfsInventoryQuantitySupplierDto;
import com.ruoyi.basic.mapper.StandardTreeMapper;
import com.ruoyi.common.enums.OrderType;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.inspect.service.IfsOrderInspectionService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * é”€å”®è®¢å•报检service
 */
@Slf4j
@Service
public class IfsOrderInspectionServiceImpl implements IfsOrderInspectionService {
    @Autowired
    private StandardTreeMapper standardTreeMapper;
    @Override
    public IPage<IfsInventoryQuantitySupplierDto> getIfsByOver(Page<IfsInventoryQuantitySupplierDto> page, IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto) {
        // todo: åªçœ‹æˆ‘
        String beginDeclareDate = ifsInventoryQuantityDto.getBeginDeclareDate();
        String endDeclareDate = ifsInventoryQuantityDto.getEndDeclareDate();
        ifsInventoryQuantityDto.setBeginDeclareDate(null);
        ifsInventoryQuantityDto.setEndDeclareDate(null);
        IPage<IfsInventoryQuantitySupplierDto> ifsByOver = standardTreeMapper.getIfsByOver(page, QueryWrappers.queryWrappers(ifsInventoryQuantityDto), beginDeclareDate, endDeclareDate);
        ifsByOver.getRecords().forEach(r->r.setOrderTypeName(OrderType.getLabelByValue(r.getOrderType())));
        return ifsByOver;
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/IfsPartPropsRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,122 @@
package com.ruoyi.inspect.service.impl;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.mapper.IfsInventoryQuantityMapper;
import com.ruoyi.basic.pojo.IfsInventoryQuantity;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.enums.OrderType;
import com.ruoyi.common.utils.api.IfsApiUtils;
import com.ruoyi.inspect.dto.IfsPartPropsRecordDTO;
import com.ruoyi.inspect.mapper.IfsPartPropsRecordMapper;
import com.ruoyi.inspect.mapper.IfsSplitOrderRecordMapper;
import com.ruoyi.inspect.pojo.IfsPartPropsRecord;
import com.ruoyi.inspect.pojo.IfsSplitOrderRecord;
import com.ruoyi.inspect.service.IfsPartPropsRecordService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
/**
* @author 27233
* @description é’ˆå¯¹è¡¨ã€ifs_part_props_record(ifs订单零件属性记录表)】的数据库操作Service实现
* @createDate 2025-10-23 15:00:34
*/
@Slf4j
@Service
public class IfsPartPropsRecordServiceImpl extends ServiceImpl<IfsPartPropsRecordMapper, IfsPartPropsRecord>
    implements IfsPartPropsRecordService{
    @Autowired
    private IfsApiUtils ifsApiUtils;
    @Autowired
    private IfsInventoryQuantityMapper ifsInventoryQuantityMapper;
    @Autowired
    private IfsSplitOrderRecordMapper ifsSplitOrderRecordMapper;
    @Value("${ifs.contract:}")
    public String contract;
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean saveOrUpdateProps(IfsPartPropsRecordDTO ifsPartPropsRecord) {
        if(Objects.isNull(ifsPartPropsRecord)){
            throw new RuntimeException("参数不能为空");
        }
        //查询是否已有同批次同零件号的批次属性,没有才更新
        Long count = baseMapper.selectCountByPartNoAndLotBatchNo(ifsPartPropsRecord.getPartNo(),ifsPartPropsRecord.getLotBatchNo());
        if(count==0){
            //判断是新增还是更新
            String actionType = Objects.isNull(ifsPartPropsRecord.getId())?"New":"Modify";
            Map<String, Object> inAttrMap = new HashMap<>();
            inAttrMap.put("RECORD_ID", UUID.randomUUID().toString());
            inAttrMap.put("SYSCODE", "LIMS");
            inAttrMap.put("SYSMODEL", "库存物料批次属性修改");
            HashMap<String, Object> batchInfoMap = new HashMap<>();
            batchInfoMap.put("CONTRACT",contract);//域
            batchInfoMap.put("PART_NO",ifsPartPropsRecord.getPartNo());//零件号
            batchInfoMap.put("LOT_BATCH_NO",ifsPartPropsRecord.getLotBatchNo());//批次号
            batchInfoMap.put("ATTR1",ifsPartPropsRecord.getDrumNo());//载具编号
            batchInfoMap.put("ATTR2",ifsPartPropsRecord.getStartMeterMark().toString());//起始米标
            batchInfoMap.put("ATTR3",ifsPartPropsRecord.getEndMeterMark().toString());//截止米标
            batchInfoMap.put("ATTR4", ifsPartPropsRecord.getOuterColor());//外护颜色
            batchInfoMap.put("ATTR5",ifsPartPropsRecord.getInsulationColor());//绝缘颜色
            batchInfoMap.put("ATTR8",ifsPartPropsRecord.getLetteringInfo());//印字信息
            batchInfoMap.put("ATTR23","车间订单");//入库来源
            batchInfoMap.put("ATTR24","0");//分割预留数量
            batchInfoMap.put("ACTION_TYPE",actionType);//操作类型
            inAttrMap.put("BATCH_INFO", Collections.singletonList(batchInfoMap));
            Result result = ifsApiUtils.importPartLotAttr(JSONUtil.toJsonStr(inAttrMap));
            if(result.getCode()!=200){
                throw new RuntimeException("库存物料批次属性更新失败:"+result.getMsg());
            }
        }
        return this.saveOrUpdate(ifsPartPropsRecord);
    }
    @Override
    public IfsPartPropsRecord getOneByIfsId(Long ifsId) {
        //查询ifs订单信息
        IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(ifsId);
        if(Objects.isNull(ifsInventoryQuantity)){
            throw new RuntimeException("未找到对应的IFS订单信息");
        }
        //判断是否是拆分订单
        if(ifsInventoryQuantity.getIsSplitOrder().equals(1)&& StringUtils.equals(ifsInventoryQuantity.getOrderType(), OrderType.RAW.getValue())){
            //查询拆分记录
            IfsSplitOrderRecord splitRecord = ifsSplitOrderRecordMapper.selectOne(Wrappers.<IfsSplitOrderRecord>lambdaQuery()
                    .eq(IfsSplitOrderRecord::getOrderNo, ifsInventoryQuantity.getOrderNo())
                    .eq(IfsSplitOrderRecord::getPartNo, ifsInventoryQuantity.getPartNo())
                    .eq(IfsSplitOrderRecord::getReleaseNo, ifsInventoryQuantity.getReleaseNo())
                    .eq(IfsSplitOrderRecord::getLineNo, ifsInventoryQuantity.getLineNo())
                    .eq(IfsSplitOrderRecord::getReceiptNo, ifsInventoryQuantity.getReceiptNo())
                    .eq(IfsSplitOrderRecord::getLotBatchNo, ifsInventoryQuantity.getUpdateBatchNo())
                    .eq(IfsSplitOrderRecord::getOrderNo, ifsInventoryQuantity.getOrderNo())
            );
            if(Objects.isNull(splitRecord)){
                throw new RuntimeException("未找到零件的拆分信息");
            }
            IfsPartPropsRecord ifsPartPropsRecord = new IfsPartPropsRecord();
            ifsPartPropsRecord.setDrumNo(splitRecord.getDrumNo());
            ifsPartPropsRecord.setLetteringInfo(splitRecord.getLetteringInfo());
            ifsPartPropsRecord.setInsulationColor(splitRecord.getInsulationColor());
            ifsPartPropsRecord.setOuterColor(splitRecord.getOuterColor());
            ifsPartPropsRecord.setDrumNo(splitRecord.getDrumNo());
            ifsPartPropsRecord.setDrumNo(splitRecord.getDrumNo());
            return ifsPartPropsRecord;
        }
        return this.getOne(Wrappers.<IfsPartPropsRecord>lambdaQuery().eq(IfsPartPropsRecord::getIfsInventoryId,ifsId).last("limit 1"));
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/IfsSplitOrderRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.inspect.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.inspect.pojo.IfsSplitOrderRecord;
import com.ruoyi.inspect.service.IfsSplitOrderRecordService;
import com.ruoyi.inspect.mapper.IfsSplitOrderRecordMapper;
import org.springframework.stereotype.Service;
/**
* @author 27233
* @description é’ˆå¯¹è¡¨ã€ifs_split_order_record(ifs原材料订单拆分记录表)】的数据库操作Service实现
* @createDate 2025-10-29 16:39:41
*/
@Service
public class IfsSplitOrderRecordServiceImpl extends ServiceImpl<IfsSplitOrderRecordMapper, IfsSplitOrderRecord>
    implements IfsSplitOrderRecordService{
}
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderDeviceRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.inspect.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.inspect.mapper.InsOrderDeviceRecordMapper;
import com.ruoyi.inspect.pojo.InsOrderDeviceRecord;
import com.ruoyi.inspect.service.InsOrderDeviceRecordService;
import org.springframework.stereotype.Service;
/**
 * @Author zhuo
 * @Date 2024/12/22
 */
@Service
public class InsOrderDeviceRecordServiceImpl extends ServiceImpl<InsOrderDeviceRecordMapper, InsOrderDeviceRecord> implements InsOrderDeviceRecordService {
}
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderFactoryVerifyItemServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.inspect.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.inspect.mapper.InsOrderFactoryVerifyItemMapper;
import com.ruoyi.inspect.pojo.InsOrderFactoryVerifyItem;
import com.ruoyi.inspect.service.InsOrderFactoryVerifyItemService;
import org.springframework.stereotype.Service;
/**
 * åŽŸææ–™åŽ‚å®¶è¿›è´§éªŒè¯æ£€éªŒé¡¹
 *
 * @author zhuo
 * @since 2024-09-26
 */
@Service
public class InsOrderFactoryVerifyItemServiceImpl extends ServiceImpl<InsOrderFactoryVerifyItemMapper, InsOrderFactoryVerifyItem> implements InsOrderFactoryVerifyItemService {
}
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderFileServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.inspect.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.inspect.mapper.InsOrderFileMapper;
import com.ruoyi.inspect.pojo.InsOrderFile;
import com.ruoyi.inspect.service.InsOrderFileService;
import org.springframework.stereotype.Service;
/**
 * <p>
 * æ£€éªŒå•下的附件列表 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-06-06 10:08:21
 */
@Service
public class InsOrderFileServiceImpl extends ServiceImpl<InsOrderFileMapper, InsOrderFile> implements InsOrderFileService {
}
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java
¶Ô±ÈÐÂÎļþ
ÎļþÌ«´ó
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderRatesServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package com.ruoyi.inspect.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.inspect.dto.SampleOrderDto;
import com.ruoyi.inspect.dto.TemplateRateDto;
import com.ruoyi.inspect.mapper.InsOrderRatesMapper;
import com.ruoyi.inspect.pojo.InsOrderRates;
import com.ruoyi.inspect.service.InsOrderRatesService;
import org.springframework.stereotype.Service;
/**
 * è®¢å•费用表
 *
 * @author zhuo
 * @since 2025-02-28
 */
@Service
public class InsOrderRatesServiceImpl extends ServiceImpl<InsOrderRatesMapper, InsOrderRates> implements InsOrderRatesService {
    /**
     * æŸ¥è¯¢è®¢å•费用列表
     * @param page
     * @param sampleOrderDto
     * @return
     */
    @Override
    public IPage<SampleOrderDto> selectInsOrderRates(Page page, SampleOrderDto sampleOrderDto) {
        return baseMapper.selectInsOrderRates(page, QueryWrappers.queryWrappers(sampleOrderDto));
    }
    @Override
    public IPage<TemplateRateDto> selectTemplateRatesDetail(Page page, Integer insOrderId) {
        return baseMapper.selectTemplateRatesDetail(page, insOrderId);
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,1738 @@
package com.ruoyi.inspect.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
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.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
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.service.impl.ServiceImpl;
import com.ruoyi.basic.dto.InventoryDetailDTO;
import com.ruoyi.basic.dto.StandardTreeTemplateBindingVo;
import com.ruoyi.basic.dto.TemplateInspectionItemDto;
import com.ruoyi.basic.mapper.IfsInventoryQuantityMapper;
import com.ruoyi.basic.mapper.StandardProductListMapper;
import com.ruoyi.basic.mapper.StructureItemParameterMapper;
import com.ruoyi.basic.pojo.IfsInventoryQuantity;
import com.ruoyi.basic.pojo.StandardProductList;
import com.ruoyi.basic.pojo.StandardMethod;
import com.ruoyi.basic.pojo.StructureItemParameter;
import com.ruoyi.basic.pojo.StructureTestObject;
import com.ruoyi.basic.pojo.StandardTree;
import com.ruoyi.basic.pojo.StandardTemplate;
import com.ruoyi.basic.service.StandardTemplateService;
import com.ruoyi.basic.service.StandardMethodService;
import com.ruoyi.basic.service.StandardTreeService;
import com.ruoyi.basic.utils.StandardTreePathParser;
import com.ruoyi.common.constant.InsOrderTypeConstants;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.enums.OrderType;
import com.ruoyi.common.numgen.NumberGenerator;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.api.IfsApiUtils;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.inspect.dto.*;
import com.ruoyi.inspect.mapper.*;
import com.ruoyi.inspect.pojo.*;
import com.ruoyi.inspect.service.InsOrderService;
import com.ruoyi.inspect.service.InsOrderStateService;
import com.ruoyi.inspect.service.InsProductService;
import com.ruoyi.inspect.service.InsSampleService;
import com.ruoyi.inspect.vo.IfsOrderVO;
import com.ruoyi.inspect.vo.InsOrderPrintingVo;
import com.ruoyi.inspect.vo.OrderTemplateSummaryVo;
import com.ruoyi.inspect.vo.TemplateConditionVo;
import com.ruoyi.system.mapper.UserMapper;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Month;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
/**
 * @author gaoaoy
 * @description é’ˆå¯¹è¡¨ã€ins_order(检验下单)】的数据库操作Service实现
 * @createDate 2024-03-12 16:17:55
 */
@Service
@AllArgsConstructor
public class InsOrderServiceImpl extends ServiceImpl<InsOrderMapper, InsOrder>
        implements InsOrderService {
    private static final String DIRECT_TEMPLATE_LABORATORY = "新聚";
    private InsOrderMapper insOrderMapper;
    private InsSampleService insSampleService;
    private InsSampleMapper insSampleMapper;
    private InsProductService insProductService;
    private InsProductMapper insProductMapper;
    private InsSampleUserMapper insSampleUserMapper;
    private InsOrderStateService insOrderStateService;
    private UserMapper userMapper;
    private IfsInventoryQuantityMapper ifsInventoryQuantityMapper;
    private final NumberGenerator<InsOrder> numberGenerator;
    private InsReportMapper insReportMapper;
    private InsUnqualifiedRetestProductMapper insUnqualifiedRetestProductMapper;
    private IfsApiUtils ifsApiUtils;
    private SpotCheckQuarterItemMapper spotCheckQuarterItemMapper;
    private StandardProductListMapper standardProductListMapper;
    private StructureItemParameterMapper structureItemParameterMapper;
    private StandardTreeService standardTreeService;
    private StandardMethodService standardMethodService;
    private StandardTemplateService standardTemplateService;
    private InsOrderStandardTemplateMapper insOrderStandardTemplateMapper;
    private InsOrderTemplateDeviceMapper insOrderTemplateDeviceMapper;
    private InsSampleReceiptMapper insSampleReceiptMapper;
    private ApplicationEventPublisher applicationEventPublisher;
    //获取检验下单数据
    @Override
    public IPage<SampleOrderDto> selectInsOrderParameter(IPage<InsOrder> page, SampleOrderDto sampleOrderDto) {
        String laboratory = null;
        // åˆ¤æ–­æ˜¯å¦æ˜¯å…¨éƒ¨
        String isOrderAll = null;
        if (sampleOrderDto.getState() != null && sampleOrderDto.getState() == -2) {
            isOrderAll = "1";
            sampleOrderDto.setState(null);
        }
        // æ£€éªŒä¸­ï¼šæ–°èšä¸‹å•免审核即受理,需样品接收提交后(ins_sample_receipt.status=1)才展示
        String receiptSubmitted = sampleOrderDto.getState() != null && sampleOrderDto.getState() == 1 ? "1" : null;
        return insOrderMapper.selectInsOrderPage(page, QueryWrappers.queryWrappers(sampleOrderDto), laboratory,
                isOrderAll, receiptSubmitted);
    }
    /**
     * åˆ†é…æ£€éªŒäºº
     *
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int upInsOrder(Integer orderId, Integer sampleId, String appointed, Integer userId, String sonLaboratory) {
        InsOrder insOrder = new InsOrder();
        insOrder.setId(orderId);
        insOrder.setAppointed(StringUtils.isNotEmpty(appointed) ? LocalDate.parse(appointed) : null);
        insOrder.setSendTime(LocalDateTime.now());
        insOrderMapper.updateById(insOrder);
        List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery().eq(InsSample::getInsOrderId, orderId));
        List<Integer> ids = insSamples.stream().map(InsSample::getId).collect(Collectors.toList());
        List<InsProduct> insProducts = ids.isEmpty()
                ? Collections.emptyList()
                : insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
                        .in(InsProduct::getInsSampleId, ids)
                        .eq(InsProduct::getState, 1)
                        .select(InsProduct::getSonLaboratory).groupBy(InsProduct::getSonLaboratory));
        InsOrder order = insOrderMapper.selectById(orderId);
        boolean directTemplateOrder = isDirectTemplateOrder(order, insSamples);
        Set<String> taskLaboratories = directTemplateOrder
                ? Collections.singleton(DIRECT_TEMPLATE_LABORATORY)
                : insProducts.stream()
                        .map(InsProduct::getSonLaboratory)
                        .filter(StringUtils::isNotBlank)
                        .collect(Collectors.toCollection(LinkedHashSet::new));
        if (!directTemplateOrder && taskLaboratories.size() != insProducts.size()) {
            throw new ErrorException("该检验单有未维护实验室的检验项目");
        }
        // æ‰¹é‡æ·»åŠ æ£€éªŒä»»åŠ¡çŠ¶æ€è¡¨
        List<InsOrderState> insOrderStateList = taskLaboratories.stream()
                .filter(laboratory -> insOrderStateService.count(Wrappers.<InsOrderState>lambdaQuery()
                        .eq(InsOrderState::getInsOrderId, orderId)
                        .eq(InsOrderState::getLaboratory, laboratory)) == 0)
                .map(laboratory -> {
            InsOrderState insOrderState = new InsOrderState();
            insOrderState.setInsOrderId(orderId);
            insOrderState.setLaboratory(laboratory);
            insOrderState.setInsState(0);
            return insOrderState;
        }).collect(Collectors.toList());
        if (!insOrderStateList.isEmpty()) {
            insOrderStateService.saveBatch(insOrderStateList);
        }
        if (userId != null) {
            Set<String> assignedLaboratories = StringUtils.isBlank(sonLaboratory)
                    ? taskLaboratories
                    : Collections.singleton(sonLaboratory);
            for (String laboratory : assignedLaboratories) {
                InsSampleUser insSampleUser = new InsSampleUser();
                insSampleUser.setState(0);
                insSampleUser.setUserId(userId);
                insSampleUser.setInsSampleId(orderId);
                insSampleUser.setSonLaboratory(laboratory);
                insSampleUserMapper.insert(insSampleUser);
            }
        }
        // åˆ¤æ–­è®¢å•有没有绑定抽样计划
        if (order.getQuarterItemId() != null) {
           // éœ€è¦æ·»åŠ ä¸‹å‘æ—¶é—´åˆ°æŠ½æ ·æ—¶é—´, å–样人员就是检测人
            SpotCheckQuarterItem spotCheckQuarterItem = spotCheckQuarterItemMapper.selectById(order.getQuarterItemId());
            spotCheckQuarterItem.setSpotCheckTime(order.getSendTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
            User user = userMapper.selectById(userId);
            spotCheckQuarterItem.setSamplingUser(user.getName());
            spotCheckQuarterItemMapper.updateById(spotCheckQuarterItem);
        }
        return 1;
    }
    private boolean isDirectTemplateOrder(InsOrder order, List<InsSample> samples) {
        if (order == null || CollectionUtils.isEmpty(samples)) {
            return false;
        }
        Long snapshotCount = insOrderStandardTemplateMapper.selectCount(
                Wrappers.<InsOrderStandardTemplate>lambdaQuery()
                        .eq(InsOrderStandardTemplate::getInsOrderId, order.getId()));
        return snapshotCount > 0 && samples.stream().anyMatch(sample ->
                sample.getStandardMethodListId() == null
                        && StringUtils.isBlank(sample.getFactory())
                        && StringUtils.isBlank(sample.getSampleType())
                        && StringUtils.isBlank(sample.getModel())
                        && StringUtils.isBlank(order.getFactory())
                        && StringUtils.isBlank(order.getSampleType()));
    }
    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 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 "未知";
        }
    }
    // å¦‚果你使用 Java 8+,也可以用 Stream API ç®€åŒ–代码:
    public List<StandardProductList> findMissingItemsWithStream(List<StandardProductList> standardList,
                                                                List<InsProduct> insList) {
        Set<Integer> insIds = insList.stream()
                .map(InsProduct::getStructureItemParameterId)
                .collect(Collectors.toSet());
        return standardList.stream()
                .filter(product -> !insIds.contains(product.getStructureItemParameterId()))
                .collect(Collectors.toList());
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int addInsOrder(List<SampleProductDto> list, InsOrder insOrder) {
        // todo: ä¸‹å•判断抽样计划的唯一性
        if (insOrder.getQuarterItemId() != null) {
            Long quarterItemCount = insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery()
                    .eq(InsOrder::getQuarterItemId, insOrder.getQuarterItemId())
                    .notIn(InsOrder::getState, -1 ,2 ,3));
            if (quarterItemCount > 0) {
                throw new ErrorException("该抽样计划已被绑定过");
            }
        }
        insOrder.setState(0);
        LocalDate appointed = insOrder.getAppointed();
        insOrderMapper.insert(insOrder); // ä¸»è¡¨
        list.forEach(a -> {
            a.setId(null);
            a.setInsOrderId(insOrder.getId());
            insSampleMapper.insert(a);
            if (ObjectUtil.isNotEmpty(a.getInsProduct())) {
                // åˆ¤æ–­æ˜¯å¦å¡«å†™å¾…检项数量
                if (a.getQuantity() != null) {
                    List<InsProduct> ip2 = new ArrayList<>();
                    for (Integer i = 1; i <= a.getQuantity(); i++) {
                        // é‡æ–°æ‹·è´ åˆ›å»ºæ–°å¯¹è±¡
                        AtomicInteger atomicInteger = new AtomicInteger(i);
                        List<InsProduct> insProducts = a.getInsProduct().stream().map(insProduct -> {
                            insProduct.setRawMaterialTag(String.valueOf(atomicInteger.get()));
                            InsProduct product = new InsProduct();
                            BeanUtils.copyProperties(insProduct, product);
                            return product;
                        }).collect(Collectors.toList());
                        ip2.addAll(insProducts);
                    }
                    addInsProductMethod(a.getId(), ip2);
                } else {
                    addInsProductMethod(a.getId(), a.getInsProduct());
                }
            }
            // åˆ¤æ–­æ˜¯å¦æœ‰ç”µç¼†é…ç½®
            if (ObjectUtil.isNotEmpty(a.getInsulating())) {
                // åˆ¤æ–­æ˜¯å¦æœ‰è¾…助线芯
                if (ObjectUtil.isNotEmpty(a.getAuxiliaryWireCore())) {
                    if (a.getAuxiliaryWireCore().getInsProduct().stream().filter(insProduct -> insProduct.getState() == 1).count() !=
                            a.getInsulating().getInsProduct().stream().filter(insProduct -> insProduct.getState() == 1).count()) {
                        throw new ErrorException("电缆配置辅助线芯检验项数量不统一, è¯·æ£€æŸ¥");
                    }
                }
                List<InsProduct> ip2 = new ArrayList<>();
                for (String s : a.getInsulating().getNum()) {
                    // é‡æ–°æ‹·è´ åˆ›å»ºæ–°å¯¹è±¡
                    List<InsProduct> insProducts = a.getInsulating().getInsProduct().stream().map(insProduct -> {
                        insProduct.setCableTag(s);
                        InsProduct product = new InsProduct();
                        BeanUtils.copyProperties(insProduct, product);
                        return product;
                    }).collect(Collectors.toList());
                    ip2.addAll(insProducts);
                }
                for (InsProduct product : ip2) {
                    product.setStandardMethodListId(a.getInsulating().getStandardMethodListId());
                }
                addInsProductMethod(a.getId(), ip2);
            }
            // åˆ¤æ–­æ˜¯å¦æœ‰è¾…助线芯
            if (ObjectUtil.isNotEmpty(a.getAuxiliaryWireCore())) {
                List<InsProduct> ip2 = new ArrayList<>();
                for (String s : a.getAuxiliaryWireCore().getNum()) {
                    // é‡æ–°æ‹·è´ åˆ›å»ºæ–°å¯¹è±¡
                    List<InsProduct> insProducts = a.getAuxiliaryWireCore().getInsProduct().stream().map(insProduct -> {
                        insProduct.setCableTag(s);
                        InsProduct product = new InsProduct();
                        BeanUtils.copyProperties(insProduct, product);
                        return product;
                    }).collect(Collectors.toList());
                    ip2.addAll(insProducts);
                }
                for (InsProduct product : ip2) {
                    product.setStandardMethodListId(a.getAuxiliaryWireCore().getStandardMethodListId());
                }
                addInsProductMethod(a.getId(), ip2);
            }
            // å­æ ·å“é…ç½®
            if (ObjectUtil.isNotEmpty(a.getChildSampleList())) {
                for (SampleProductDto b : a.getChildSampleList()) {
                    for (int i = 0; i < b.getNum(); i++) {
                        b.setId(null);
                        b.setInsOrderId(insOrder.getId());
                        b.setParentId(a.getId());
                        insSampleMapper.insert(b);
                        if (ObjectUtil.isNotEmpty(b.getInsProduct())) {
                            addInsProductMethod(b.getId(), b.getInsProduct());
                        }
                    }
                }
            }
        });
        // ä¸‹å•时生成委托编号并校验唯一性;季度检验复用进厂检验编号,留待审核处理。
        if (!InsOrderTypeConstants.QUARTERLY_TEST.equals(insOrder.getOrderType())) {
            String entrustCode = buildEntrustCode(insOrder, Collections.emptyList());
            assertEntrustCodeUnique(entrustCode, insOrder.getId());
            insOrder.setEntrustCode(entrustCode);
            insOrderMapper.update(null, Wrappers.<InsOrder>lambdaUpdate()
                    .eq(InsOrder::getId, insOrder.getId())
                    .set(InsOrder::getEntrustCode, entrustCode));
        }
        //原材料下单或外购成品下单
        if (Objects.nonNull(insOrder.getTypeSource())&&Objects.nonNull(insOrder.getIfsInventoryId())) {
            // å§”托人就是报检人, ç”Ÿäº§å•位就是供应商单位
            IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(insOrder.getIfsInventoryId());
            Integer declareUserId = ifsInventoryQuantity.getDeclareUserId();
            User user = userMapper.selectById(declareUserId);
            if (user == null) {
               throw new ErrorException("缺少报检人信息");
            }
            // ä¾›åº”商名称
            insOrder.setProduction(ifsInventoryQuantity.getSupplierName());
            insOrder.setProductionEn("");
            // å§”托人名称
            insOrder.setPrepareUserId(user.getId());
            insOrder.setPrepareUser(user.getName());
            insOrder.setPrepareUserEn(user.getNameEn());
            insOrder.setPhone(user.getPhone());
            insOrder.setState(1);
            Long count1 = insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery()
                    .eq(InsOrder::getIfsInventoryId, insOrder.getIfsInventoryId())
                    .ne(InsOrder::getState, -1)
                    .eq(InsOrder::getOrderType, InsOrderTypeConstants.ENTER_THE_FACTORY)
                    .ne(InsOrder::getId, insOrder.getId()));
            // åˆ¤æ–­ä¹‹å‰æ˜¯å¦æœ‰è¿›åŽ‚æ£€éªŒ
            if (count1 == 0) {
                ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>().set(IfsInventoryQuantity::getState, 1)
                        .eq(IfsInventoryQuantity::getId, insOrder.getIfsInventoryId()));
            }
            // åˆ¤æ–­ç»“束状态修改合格状态
            if (ifsInventoryQuantity.getIsFinish().equals(0)) {
                ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
                        .eq(IfsInventoryQuantity::getId, insOrder.getIfsInventoryId())
                        .set(IfsInventoryQuantity::getInspectStatus, 0));
            }
            // å®¡æ ¸æ£€éªŒå•
            upInsOrderOfState(insOrder);
            // å®¡æ ¸é€šè¿‡åŽä»…进入样品接收;由样品接收页面选择主检验人后再创建检验任务。
            //是否为原材料下单
            if(insOrder.getTypeSource().equals(1)){
                // æ ¹æ®é›¶ä»¶å·åˆ¤æ–­æ˜¯å¦æ˜¯è¾…材
                boolean isRaw = false;
                StructureTestObject productObject = insOrderMapper.selectProductByPartNo(ifsInventoryQuantity.getPartNo());
                // æŸ¥è¯¢äº§å“
                if (productObject != null && StrUtil.isNotBlank(productObject.getObjectType()) && productObject.getObjectType().equals("1")) {
                    isRaw = true;
                } else {
                    // æŸ¥è¯¢å¯¹è±¡
                    StructureTestObject testObject = insOrderMapper.selectByPartNo(ifsInventoryQuantity.getPartNo());
                    if (testObject != null && StrUtil.isNotBlank(testObject.getObjectType()) && testObject.getObjectType().equals("1")) {
                        isRaw = true;
                    }
                }
                if (isRaw) {
                    // èŽ·å–å½“å‰å­£åº¦çš„å¼€å§‹æ—¶é—´å’Œç»“æŸæ—¶é—´
                    LocalDateTime now = LocalDateTime.now();
                    // èŽ·å–å½“å‰æœˆä»½
                    int month = now.getMonthValue();
                    // ç¡®å®šå½“前季度的开始月份
                    int startMonth = (month - 1) / 3 * 3 + 1;
                    // æž„造季度的开始时间
                    LocalDateTime startOfQuarter = LocalDateTime.of(now.getYear(), Month.of(startMonth), 1, 0, 0);
                    // è®¡ç®—下一个季度的开始时间
                    LocalDateTime startOfNextQuarter = startOfQuarter.plusMonths(3);
                    // è®¡ç®—当前季度的结束时间
                    LocalDateTime endOfQuarter = startOfNextQuarter.minusSeconds(1);
                    // æ ¹æ®ä¸‹å•的规格型号判断是否为季度首次出现
                    Integer count = ifsInventoryQuantityMapper.selectIsFirst(insOrder.getPartDetail(),
                            ifsInventoryQuantity.getSupplierName(),
                            startOfNextQuarter,
                            endOfQuarter);
                    if (count == 0) {
                        ifsInventoryQuantity.setIsFirst(1);
                        ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
                                .eq(IfsInventoryQuantity::getId, insOrder.getIfsInventoryId())
                                .set(IfsInventoryQuantity::getIsFirst, 1));
                    }
                }
            }
        }
        return insOrder.getId();
    }
    /**
     * æ–°èšæ ‡å‡†åº“直绑模板的下单流程:一个订单、一个样品,检验记录完全由模板标记生成。
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int addNewJuInsOrder(InsPlaceOrderDto dto) {
        if (dto == null || dto.getInsOrder() == null || dto.getStandardTreeId() == null) {
            throw new ErrorException("下单信息或标准不能为空");
        }
        String sampleCode = StringUtils.trim(dto.getSampleCode());
        if (StringUtils.isBlank(sampleCode) || sampleCode.length() < 2) {
            throw new ErrorException("样品编号不能为空且不能少于2位");
        }
        // å§”托要求字段校验:四组单选必选,分包/快递联动必填
        InsOrder reqOrder = dto.getInsOrder();
        if (reqOrder.getSubcontractType() == null || reqOrder.getSampleDisposal() == null
                || reqOrder.getResultEvaluation() == null || reqOrder.getReportDelivery() == null) {
            throw new ErrorException("请选择分包内容、样品处置、对结果评价和报告交付方式");
        }
        if (Integer.valueOf(1).equals(reqOrder.getSubcontractType())
                && StringUtils.isBlank(reqOrder.getSubcontractCompany())) {
            throw new ErrorException("分包内容为有时,分包单位信息不能为空");
        }
        if (Integer.valueOf(2).equals(reqOrder.getReportDelivery())) {
            if (StringUtils.isBlank(reqOrder.getReportAddress())) {
                throw new ErrorException("报告交付方式为快递时,报告寄送地址不能为空");
            }
            if (StringUtils.isBlank(reqOrder.getReportReceiver())) {
                throw new ErrorException("报告交付方式为快递时,收件人及电话不能为空");
            }
        }
        StandardTree standard = standardTreeService.getById(dto.getStandardTreeId());
        if (standard == null || StringUtils.isBlank(standard.getSample())
                || standard.getSampleType() != null || standard.getModel() != null) {
            throw new ErrorException("请选择标准库二级标准");
        }
        List<StandardTreeTemplateBindingVo> bindings = standardTreeService.selectTemplateBindings(dto.getStandardTreeId());
        if (bindings.isEmpty()) {
            throw new ErrorException("该标准尚未绑定可用的原始记录模板");
        }
        Map<Integer, StandardTreeTemplateBindingVo> bindingMap = bindings.stream()
                .collect(Collectors.toMap(StandardTreeTemplateBindingVo::getTemplateId,
                        binding -> binding, (first, ignored) -> first));
        List<OrderTemplateSelectionDto> selections = dto.getTemplateList();
        if (selections == null) {
            selections = bindings.stream().map(binding -> {
                OrderTemplateSelectionDto selection = new OrderTemplateSelectionDto();
                selection.setTemplateId(binding.getTemplateId());
                selection.setSort(binding.getSort());
                return selection;
            }).collect(Collectors.toList());
        }
        if (selections.isEmpty()) {
            throw new ErrorException("请至少保留一个原始记录模板");
        }
        Set<Integer> selectedTemplateIds = new HashSet<>();
        for (int index = 0; index < selections.size(); index++) {
            OrderTemplateSelectionDto selection = selections.get(index);
            if (selection == null || selection.getTemplateId() == null
                    || !bindingMap.containsKey(selection.getTemplateId())) {
                throw new ErrorException("所选原始记录模板不属于当前标准");
            }
            if (!selectedTemplateIds.add(selection.getTemplateId())) {
                throw new ErrorException("原始记录模板不能重复选择");
            }
            if (selection.getSort() == null) {
                selection.setSort(index);
            }
        }
        selections.sort(Comparator.comparing(OrderTemplateSelectionDto::getSort)
                .thenComparing(OrderTemplateSelectionDto::getTemplateId));
        Map<Integer, Integer> templateSortMap = selections.stream()
                .collect(Collectors.toMap(OrderTemplateSelectionDto::getTemplateId,
                        OrderTemplateSelectionDto::getSort));
        List<TemplateInspectionItemDto> templateItems = standardTreeService
                .selectTemplateInspectionItems(dto.getStandardTreeId()).stream()
                .filter(item -> selectedTemplateIds.contains(item.getTemplateId()))
                .sorted(Comparator
                        .comparing((TemplateInspectionItemDto item) -> templateSortMap.get(item.getTemplateId()))
                        .thenComparing(item -> item.getTemplateRowIndex() == null
                                ? Integer.MAX_VALUE : item.getTemplateRowIndex()))
                .collect(Collectors.toList());
        StandardMethod standardMethod = standardMethodService.getById(standard.getStandardMethodId());
        if (standardMethod == null || StringUtils.isBlank(standardMethod.getCode())) {
            throw new ErrorException("标准编号不存在");
        }
        String standardCode = standardMethod.getCode().trim();
        InsOrder order = dto.getInsOrder();
        order.setId(null);
        // æ–°èšä¸‹å•免审核:直接受理,下单即流转到样品接收
        order.setState(1);
        order.setExamineTime(LocalDateTime.now());
        order.setIsExemption(0);
        order.setFactory(null);
        order.setLaboratory(standard.getLaboratory());
        order.setSampleType(null);
        order.setSample(standardCode);
        order.setPrepareUserEn(null);
        order.setPrepareCode(null);
        order.setRemarkEn(null);
        // æ–°èšè®¢å•的环境条件由检验任务填写,避免下单模板或浏览器缓存带入旧值。
        order.setTemperature(null);
        order.setHumidity(null);
        // æœªå‘½ä¸­è”动条件时清空对应文本字段,避免模板快照或浏览器缓存带入旧值。
        if (!Integer.valueOf(1).equals(order.getSubcontractType())) {
            order.setSubcontractCompany(null);
        }
        if (!Integer.valueOf(2).equals(order.getReportDelivery())) {
            order.setReportAddress(null);
            order.setReportReceiver(null);
        }
        insOrderMapper.insert(order);
        InsSample sample = new InsSample();
        sample.setInsOrderId(order.getId());
        sample.setSampleCode(sampleCode);
        sample.setFactory(null);
        sample.setLaboratory(standard.getLaboratory());
        sample.setSampleType(null);
        sample.setSample(standardCode);
        sample.setModel(null);
        sample.setQuantity(1);
        sample.setStandardMethodListId(null);
        insSampleMapper.insert(sample);
        int productSort = 0;
        for (TemplateInspectionItemDto item : templateItems) {
            InsProduct product = new InsProduct();
            product.setInsSampleId(sample.getId());
            product.setInspectionItem(item.getInspectionItem());
            product.setInspectionItemClass("");
            product.setInspectionItemSubclass("");
            product.setFactory(null);
            product.setLaboratory(standard.getLaboratory());
            product.setSampleType(null);
            product.setSample(standardCode);
            product.setModel(null);
            product.setTemplateId(item.getTemplateId());
            product.setTemplateRowIndex(item.getTemplateRowIndex());
            product.setSonLaboratory(DIRECT_TEMPLATE_LABORATORY);
            product.setState(1);
            product.setSort(productSort++);
            insProductMapper.insert(product);
        }
        saveTemplateSnapshots(order.getId(), selections, bindingMap);
        // ä¸‹å•时生成委托编号并校验唯一性,重复则提示,避免留到审核才报错。
        String entrustCode = buildEntrustCode(order, Collections.singletonList(sample));
        assertEntrustCodeUnique(entrustCode, order.getId());
        insOrderMapper.update(null, Wrappers.<InsOrder>lambdaUpdate()
                .eq(InsOrder::getId, order.getId())
                .set(InsOrder::getEntrustCode, entrustCode));
        // å…å®¡æ ¸åŽç”±ä¸‹å•生成待接收的样品接收记录,主检验人仍在样品接收页面选择后才创建检验任务
        insSampleReceiptMapper.insertIgnore(order.getId(), sample.getId());
        // åŒäº‹åŠ¡å†…å‘å¸ƒä¸‹å•äº‹ä»¶ï¼Œç”± cnas-process è‡ªåŠ¨ç”Ÿæˆæ£€éªŒå§”æ‰˜å•ï¼›ç›‘å¬å™¨å¼‚å¸¸ä¼šè¿žå¸¦ä¸‹å•å›žæ»š
        applicationEventPublisher.publishEvent(new com.ruoyi.inspect.event.NewJuOrderPlacedEvent(order.getId()));
        return order.getId();
    }
    private void saveTemplateSnapshots(Integer orderId, List<OrderTemplateSelectionDto> selections,
                                       Map<Integer, StandardTreeTemplateBindingVo> bindingMap) {
        for (OrderTemplateSelectionDto selection : selections) {
            StandardTemplate template = standardTemplateService.getById(selection.getTemplateId());
            if (template == null) {
                throw new ErrorException("原始记录模板不存在");
            }
            InsOrderStandardTemplate snapshot = new InsOrderStandardTemplate();
            snapshot.setInsOrderId(orderId);
            snapshot.setTemplateId(template.getId());
            snapshot.setName(template.getName());
            snapshot.setNumber(template.getNumber());
            snapshot.setRemark(template.getRemark());
            snapshot.setThing(template.getThing());
            snapshot.setSort(selection.getSort());
            insOrderStandardTemplateMapper.insert(snapshot);
            StandardTreeTemplateBindingVo binding = bindingMap.get(selection.getTemplateId());
            List<Integer> deviceIds = binding == null || binding.getDeviceIds() == null
                    ? Collections.emptyList() : binding.getDeviceIds();
            for (int index = 0; index < deviceIds.size(); index++) {
                InsOrderTemplateDevice relation = new InsOrderTemplateDevice();
                relation.setInsOrderId(orderId);
                relation.setTemplateId(selection.getTemplateId());
                relation.setDeviceId(deviceIds.get(index));
                relation.setSort(index);
                insOrderTemplateDeviceMapper.insert(relation);
            }
        }
    }
    /**
     * æ·»åŠ æ£€éªŒé¡¹
     * @param sampleId
     * @param productList
     */
    private void addInsProductMethod(Integer sampleId, List<InsProduct> productList) {
        for (InsProduct product : productList) {
            if (product.getState() == 1) {
                product.setId(null);
                product.setCreateTime(null);
                product.setCreateUser(null);
                product.setUpdateTime(null);
                product.setUpdateUser(null);
                product.setInsSampleId(sampleId);
                if (product.getInspectionItemSubclass() == null) {
                    product.setInspectionItemSubclass("");
                }
                if (StringUtils.isBlank(product.getAsk()) || StringUtils.isBlank(product.getTell())) {
                    throw new ErrorException("有检验项的要求值或要求描述为空, è¯·å…ˆåŽ»æ ‡å‡†åº“é…ç½®è¦æ±‚å€¼æˆ–è¦æ±‚æè¿°");
                }
                if (StringUtils.isBlank(product.getSonLaboratory())) {
                    throw new ErrorException("有检验项的的子实验室为绑定, è¯·å…ˆç»‘定子实验室");
                }
                insProductMapper.insert(product);
            }
        }
    }
    @Override
    public Map<String, Object> getInsOrder(Integer id) {
        Map<String, Object> map = new HashMap<>();
        InsOrder insOrder = insOrderMapper.selectById(id);
        List<SampleProductDto> list;
        // åˆ¤æ–­æ˜¯å¦æ˜¯è¿›åŽ‚æŠ¥å‘Šå…æ£€
        if (insOrder.getIsExemption().equals(1)) {
            list = insSampleMapper.selectExemptionByOrderId(id);
        } else {
            list = insSampleMapper.selectSampleProductListByOrderId2(id);
        }
        Map<String, Object> map1 = insSampleMapper.selectInsOrder(id);
        List<InsSample> orderSamples = insSampleMapper.selectList(
                Wrappers.<InsSample>lambdaQuery()
                        .eq(InsSample::getInsOrderId, id)
                        .select(InsSample::getSampleCode)
                        .orderByAsc(InsSample::getId));
        List<OrderTemplateSummaryVo> templateList = insOrderStandardTemplateMapper.selectList(
                        Wrappers.<InsOrderStandardTemplate>lambdaQuery()
                                .eq(InsOrderStandardTemplate::getInsOrderId, id)
                                .orderByAsc(InsOrderStandardTemplate::getSort,
                                        InsOrderStandardTemplate::getId))
                .stream()
                .map(template -> {
                    OrderTemplateSummaryVo summary = new OrderTemplateSummaryVo();
                    summary.setTemplateId(template.getTemplateId());
                    summary.setName(template.getName());
                    summary.setNumber(template.getNumber());
                    summary.setRemark(template.getRemark());
                    summary.setSort(template.getSort());
                    return summary;
                })
                .collect(Collectors.toList());
        map.put("insOrder", insOrder);
        map.put("sampleProduct", list);
        // æ ·å“ç¼–号直接从样品表读取,不依赖检验项目关联查询是否有结果。
        map.put("sampleCode", orderSamples.isEmpty() ? null : orderSamples.get(0).getSampleCode());
        map.put("insOrderTemplate", map1);
        map.put("templateList", templateList);
        return map;
    }
    /**
     * å®¡æ ¸æ£€éªŒå•
     * @param insOrder
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int upInsOrderOfState(InsOrder insOrder) {
        insOrder.setExamineTime(LocalDateTime.now());
        if (insOrder.getState() == 1) {
            //委托编号已在下单时生成并校验唯一性,审核时复用;历史/季度检验订单兜底生成。
            InsOrder order = this.getById(insOrder.getId());
            List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery()
                    .eq(InsSample::getInsOrderId, insOrder.getId())
                    .orderByAsc(InsSample::getId));
            String no = order.getEntrustCode();
            // åˆ¤æ–­æ˜¯å¦æ˜¯å­£åº¦æ£€éªŒ, æ˜¯å­£åº¦æ£€éªŒå–消原材料季度检验下单
            if (InsOrderTypeConstants.QUARTERLY_TEST.equals(order.getOrderType())) {
                ifsInventoryQuantityMapper.update(null,  Wrappers.<IfsInventoryQuantity>lambdaUpdate()
                        .eq(IfsInventoryQuantity::getId, order.getIfsInventoryId())
                        .set(IfsInventoryQuantity::getIsQuarter, 0));
                // æŸ¥è¯¢æ˜¯å¦æœ‰è¿‡è¿›åŽ‚æ£€éªŒ, æœ‰èŽ·å–é‡Œé¢çš„ç¼–å·
                InsOrder order1 = insOrderMapper.selectOne(Wrappers.<InsOrder>lambdaQuery()
                        .eq(InsOrder::getIfsInventoryId, order.getIfsInventoryId())
                        .ne(InsOrder::getState, -1)
                        .eq(InsOrder::getOrderType, InsOrderTypeConstants.ENTER_THE_FACTORY));
                if (order1 != null) {
                  no = order1.getEntrustCode();
                }
            }
            if (StringUtils.isBlank(no)) {
                no = buildEntrustCode(order, insSamples);
            }
            assertEntrustCodeUnique(no, order.getId());
            int count = 1;
            for (InsSample insSample : insSamples) {
                if (StringUtils.isBlank(insSample.getSampleCode())) {
                    // å¦‚果只有一个样品就不需要拼接数字
                    if (insSamples.size() != 1) {
                        insSample.setSampleCode(no + "-" + count);
                        count++;
                    } else {
                        insSample.setSampleCode(no);
                    }
                }
            }
            insSampleService.updateBatchById(insSamples);
            insOrder.setEntrustCode(no);
        }
        int updated = insOrderMapper.updateById(insOrder);
        if (updated > 0 && Integer.valueOf(1).equals(insOrder.getState())) {
            List<InsSample> samples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery()
                    .eq(InsSample::getInsOrderId, insOrder.getId())
                    .orderByAsc(InsSample::getId));
            if (samples.size() != 1) {
                throw new ErrorException("委托单必须且只能包含一个样品,不能进入样品接收流程");
            }
            insSampleReceiptMapper.insertIgnore(insOrder.getId(), samples.get(0).getId());
        }
        return updated;
    }
    /**
     * å§”托编号全局唯一,生成编号和后续提交前均需排除当前订单后校验。
     */
    private void assertEntrustCodeUnique(String entrustCode, Integer currentOrderId) {
        Long count = insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery()
                .eq(InsOrder::getEntrustCode, entrustCode)
                .ne(currentOrderId != null, InsOrder::getId, currentOrderId));
        if (count > 0) {
            throw new ErrorException("样品/委托单已存在,请确认样品编号");
        }
    }
    /**
     * ç”Ÿæˆå§”托编号:新聚直绑模板订单末两位取样品编号末两位,其余按送样日期生成序号。
     */
    private String buildEntrustCode(InsOrder order, List<InsSample> insSamples) {
        LocalDate entrustDate = order.getSampleDate() == null ? LocalDate.now() : order.getSampleDate();
        String entrustCodePrefix = "LMSY-"
                + entrustDate.format(DateTimeFormatter.BASIC_ISO_DATE)
                + "-";
        if (isDirectTemplateOrder(order, insSamples)) {
            String sampleCode = insSamples.get(0).getSampleCode();
            if (StringUtils.isBlank(sampleCode) || sampleCode.trim().length() < 2) {
                throw new ErrorException("样品编号不能为空且不能少于2位");
            }
            sampleCode = sampleCode.trim();
            return entrustCodePrefix + sampleCode.substring(sampleCode.length() - 2);
        }
        return numberGenerator.generateNumberWithPrefix(2, entrustCodePrefix, InsOrder::getEntrustCode);
    }
    @Override
    public Map<String, Object> getInsOrderAndSample(Integer id, String laboratory) {
        Map<String, Object> map = new HashMap<>();
//        InsOrder insOrder = insOrderMapper.selectById(id);
        IfsOrderVO ifsOrderVO = insOrderMapper.selectOrderInfoById(id);
        Map<Integer, List<Integer>> templateDeviceIds = insOrderTemplateDeviceMapper.selectList(
                        Wrappers.<InsOrderTemplateDevice>lambdaQuery()
                                .eq(InsOrderTemplateDevice::getInsOrderId, id)
                                .orderByAsc(InsOrderTemplateDevice::getSort,
                                        InsOrderTemplateDevice::getId))
                .stream().collect(Collectors.groupingBy(
                        InsOrderTemplateDevice::getTemplateId,
                        LinkedHashMap::new,
                        Collectors.mapping(InsOrderTemplateDevice::getDeviceId, Collectors.toList())));
        List<TemplateConditionVo> templateConditions = insOrderStandardTemplateMapper.selectList(
                        Wrappers.<InsOrderStandardTemplate>lambdaQuery()
                                .eq(InsOrderStandardTemplate::getInsOrderId, id)
                                .select(InsOrderStandardTemplate::getTemplateId,
                                        InsOrderStandardTemplate::getTemperature,
                                        InsOrderStandardTemplate::getHumidity,
                                        InsOrderStandardTemplate::getDetectionTime,
                                        InsOrderStandardTemplate::getDetectionPlace,
                                        InsOrderStandardTemplate::getInsResult)
                                .orderByAsc(InsOrderStandardTemplate::getSort,
                                        InsOrderStandardTemplate::getId))
                .stream().map(snapshot -> {
                    TemplateConditionVo condition = new TemplateConditionVo();
                    condition.setTemplateId(snapshot.getTemplateId());
                    condition.setTemperature(snapshot.getTemperature());
                    condition.setHumidity(snapshot.getHumidity());
                    condition.setDetectionTime(snapshot.getDetectionTime());
                    condition.setDetectionPlace(snapshot.getDetectionPlace());
                    condition.setInsResult(snapshot.getInsResult());
                    condition.setDeviceIds(templateDeviceIds.getOrDefault(
                            snapshot.getTemplateId(), Collections.emptyList()));
                    return condition;
                }).collect(Collectors.toList());
        ifsOrderVO.setTemplateConditions(templateConditions);
        List<SampleProductDto> list = insSampleMapper.getInsOrderAndSample(id, laboratory);
        map.put("insOrder", ifsOrderVO);
        map.put("sampleProduct", list);
        //查询所有记录模版去重
        List<Map<Integer, Object>> list2 = insOrderMapper.selectReportModelByOrderId(id, laboratory);
        map.put("reportModel", list2);
        return map;
    }
    @Override
    public IPage<SampleProductDto2> selectSampleAndProductByOrderId(IPage<SampleProductDto2> page, SampleProductDto2 sampleProductDto) {
        IPage<SampleProductDto2> productDto2IPage = insOrderMapper.selectSampleAndProductByOrderId(page,
                QueryWrappers.queryWrappers(sampleProductDto)
                        .orderByAsc("sample_code")
                        .orderByAsc("cable_tag")
                        .orderByAsc("sort"),
                sampleProductDto.getId());
        return productDto2IPage;
    }
    @Override
    public int updateStatus(Integer id) {
        return insOrderMapper.updateStatus(id);
    }
    /**
     * èŽ·å–ifs库存信息
     * @param
     * @return
     */
    @Override
    public void getIfsOrder(Map<String, Object> map,Boolean isSplitOrder) {
        List<Map<String, Object>> inventory = ifsApiUtils.getInventory(JSONUtil.toJsonStr(map));
        if(inventory.isEmpty()) {
            return;
        }
        // è¿›è¡Œä¿å­˜
        for (Map<String, Object> map1 : inventory) {
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); // æ—¶é—´æ ¼å¼åŒ–
            IfsInventoryQuantity ifsInventoryQuantity = new IfsInventoryQuantity();
            ifsInventoryQuantity.setContract(map1.get("CONTRACT") == null ? "" : map1.get("CONTRACT").toString()); // åŸŸ
            ifsInventoryQuantity.setPartNo(map1.get("PART_NO") == null ? "" : map1.get("PART_NO").toString() ); // é›¶ä»¶å·
            ifsInventoryQuantity.setPartDesc(map1.get("PART_DESC") == null ? "" : map1.get("PART_DESC").toString()); // é›¶ä»¶æè¿°
            ifsInventoryQuantity.setOrderNo(map1.get("ORDER_NO") == null ? "" : map1.get("ORDER_NO").toString()); // è®¢å•号
            ifsInventoryQuantity.setLineNo(map1.get("LINE_NO") == null ? "" : map1.get("LINE_NO").toString()); // è¡Œå·
            ifsInventoryQuantity.setReleaseNo(map1.get("RELEASE_NO") == null ? "" : map1.get("RELEASE_NO").toString()); // ä¸‹è¾¾å·
            ifsInventoryQuantity.setReceiptNo(Integer.parseInt(map1.get("RECEIPT_NO") == null ? "" : map1.get("RECEIPT_NO").toString())); // æŽ¥æ”¶å·
            ifsInventoryQuantity.setStatus(map1.get("STATE") == null ? "" : map1.get("STATE").toString()); // çŠ¶æ€æè¿°
            ifsInventoryQuantity.setStatusDb(map1.get("STATE_DB") == null ? "" : map1.get("STATE_DB").toString()); // çŠ¶æ€
            if(map1.get("QTY_ARRIVED") != null) {
                ifsInventoryQuantity.setQtyArrived(new BigDecimal(map1.get("QTY_ARRIVED").toString())); // æŠµè¾¾çš„采购数量
            }
            if(map1.get("QTY_INSPECTED") != null) {
                ifsInventoryQuantity.setQtyInspected(new BigDecimal(map1.get("QTY_INSPECTED").toString())); // å·²æ£€éªŒçš„购买数量
            }
            if(map1.get("QTY_TO_INSPECT") != null) {
                ifsInventoryQuantity.setQtyToInspect(new BigDecimal(map1.get("QTY_TO_INSPECT").toString())); // è¦æ£€éªŒçš„采购数量
            }
            if(map1.get("INV_QTY_IN_STORE") != null) {
                ifsInventoryQuantity.setInvQtyInStore(new BigDecimal(map1.get("INV_QTY_IN_STORE").toString())); // æŠµè¾¾çš„库存数量
            }
            if(map1.get("PUR_QTY_IN_STORE") != null) {
                ifsInventoryQuantity.setPurQtyInStore(new BigDecimal( map1.get("PUR_QTY_IN_STORE").toString())); // æŠµè¾¾çš„采购数量
            }
            ifsInventoryQuantity.setSupplierId(map1.get("SUPPLIER_ID") == null ? "" : map1.get("SUPPLIER_ID").toString()); // ä¾›åº”商ID
            ifsInventoryQuantity.setSupplierName(map1.get("SUPPLIER_NAME") == null ? "" : map1.get("SUPPLIER_NAME").toString()); // ä¾›åº”商名称
            ifsInventoryQuantity.setConfigurationId(map1.get("CONFIGURATION_ID") == null ? "" : map1.get("CONFIGURATION_ID").toString()); // é…ç½®æ ‡è¯†
            ifsInventoryQuantity.setLotBatchNo(map1.get("LOT_BATCH_NO") == null ? "" : map1.get("LOT_BATCH_NO").toString()); // æ‰¹æ¬¡å·
            ifsInventoryQuantity.setUpdateBatchNo(map1.get("LOT_BATCH_NO") == null ? "" : map1.get("LOT_BATCH_NO").toString()); // æ‰¹æ¬¡å·
            ifsInventoryQuantity.setWaivDevRejNo(map1.get("WAIV_DEV_REJ_NO") == null ? "" : map1.get("WAIV_DEV_REJ_NO").toString()); // WDR号
            ifsInventoryQuantity.setActivitySeq(map1.get("ACTIVITY_SEQ") == null ? null : Integer.parseInt(map1.get("ACTIVITY_SEQ").toString())); // æ´»åŠ¨åºåˆ—
            ifsInventoryQuantity.setSerialNo(map1.get("SERIAL_NO") == null ? "" : map1.get("SERIAL_NO").toString()); // åºåˆ—号
            ifsInventoryQuantity.setLocationNo(map1.get("LOCATION_NO") == null ? "" : map1.get("LOCATION_NO").toString()); // åº“位号
            ifsInventoryQuantity.setEngChgLevel(map1.get("ENG_CHG_LEVEL") == null ? "" : map1.get("ENG_CHG_LEVEL").toString()); // ç‰ˆæœ¬å·
            ifsInventoryQuantity.setReceiver(map1.get("RECEIVER") == null ? "" : map1.get("RECEIVER").toString()); // æŽ¥æ”¶äºº
            ifsInventoryQuantity.setReceiverName(map1.get("RECEIVER_NAME") == null ? "" : map1.get("RECEIVER_NAME").toString()); // æŽ¥æ”¶äººåç§°
            ifsInventoryQuantity.setBuyerCode(map1.get("BUYER_CODE") == null ? "" : map1.get("BUYER_CODE").toString()); // é‡‡è´­å‘˜
            ifsInventoryQuantity.setBuyerName(map1.get("BUYER_NAME") == null ? "" : map1.get("BUYER_NAME").toString()); // é‡‡è´­å‘˜åç§°
            if(map1.get("ARRIVE_DATE") != null) {
                ifsInventoryQuantity.setArriveDate(LocalDateTime.parse(map1.get("ARRIVE_DATE").toString(),dateTimeFormatter)); // å®žé™…到货日期
            }
            if(map1.get("DELIVERY_DATE") != null) {
                ifsInventoryQuantity.setDeliveryDate(LocalDateTime.parse(map1.get("DELIVERY_DATE").toString(),dateTimeFormatter)); // å®žé™…交货日期
            }
            if(map1.get("PRODUCT_DATE") != null) {
                ifsInventoryQuantity.setProductDate(LocalDateTime.parse(map1.get("PRODUCT_DATE").toString(),dateTimeFormatter)); // ç”Ÿäº§æ—¥æœŸ
            }
            if(map1.get("INVALID_DATE") != null) {
                ifsInventoryQuantity.setInvalidDate(LocalDateTime.parse(map1.get("INVALID_DATE").toString(),dateTimeFormatter)); // å¤±æ•ˆæ—¥æœŸ
            }
            if(map1.get("APPROVED_DATE") != null) {
                ifsInventoryQuantity.setApprovedDate(LocalDateTime.parse(map1.get("APPROVED_DATE").toString(),dateTimeFormatter)); // å®¡æ‰¹æ—¥æœŸ
            }
            ifsInventoryQuantity.setReqCeater(map1.get("REQ_CEATER") == null ? "" : map1.get("REQ_CEATER").toString()); // é‡‡è´­ç”³è¯·åˆ›å»ºäºº
            ifsInventoryQuantity.setReqCeaterName(map1.get("REQ_CEATER_NAME") == null ? "" : map1.get("REQ_CEATER_NAME").toString()); // é‡‡è´­ç”³è¯·åˆ›å»ºäººåç§°
            ifsInventoryQuantity.setLineRemarks(map1.get("LINE_REMARKS") == null ? "" : map1.get("LINE_REMARKS").toString()); // é‡‡è´­è®¢å•行备注
            ifsInventoryQuantity.setBuyUnitMeas(map1.get("BUY_UNIT_MEAS") == null ? "" : map1.get("BUY_UNIT_MEAS").toString()); // é‡‡è´­å•位
            ifsInventoryQuantity.setReceiverDate(LocalDateTime.now()); // æŽ¥æ”¶æ—¥æœŸ
            ifsInventoryQuantity.setIsSource(1);
            ifsInventoryQuantity.setState(0);
            Long count = ifsInventoryQuantityMapper.selectCount(new LambdaQueryWrapper<IfsInventoryQuantity>()
                    .eq(IfsInventoryQuantity::getOrderNo, ifsInventoryQuantity.getOrderNo())
                    .eq(IfsInventoryQuantity::getLineNo, ifsInventoryQuantity.getLineNo())
                    .eq(IfsInventoryQuantity::getReleaseNo, ifsInventoryQuantity.getReleaseNo())
                    .eq(IfsInventoryQuantity::getReceiptNo, ifsInventoryQuantity.getReceiptNo())
                    .eq(IfsInventoryQuantity::getLocationNo, ifsInventoryQuantity.getLocationNo())
                    .eq(IfsInventoryQuantity::getLotBatchNo, ifsInventoryQuantity.getLotBatchNo())
                    .eq(IfsInventoryQuantity::getSerialNo, ifsInventoryQuantity.getSerialNo())
                    .eq(IfsInventoryQuantity::getEngChgLevel, ifsInventoryQuantity.getEngChgLevel())
                    .eq(IfsInventoryQuantity::getWaivDevRejNo, ifsInventoryQuantity.getWaivDevRejNo())
                    .eq(IfsInventoryQuantity::getActivitySeq, ifsInventoryQuantity.getActivitySeq())
            );
            if(count == 0) {
                ifsInventoryQuantity.setIsFirst(0);
                if(isSplitOrder){
                    ifsInventoryQuantity.setIsSplitOrder(1);
                }
                ifsInventoryQuantityMapper.insert(ifsInventoryQuantity);
            }
        }
    }
    /**
     * id是原材料的id
     *
     * ä¿®æ”¹è®¢å•单号
     * @param insOrder
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateEntrustCode(InsOrder insOrder) {
        // åˆ¤æ–­å½“前订单是否生成了报告, ç”Ÿæˆäº†æŠ¥å‘Šä¸èƒ½ä¿®æ”¹å•号
        List<InsOrder> insOrders = insOrderMapper.selectList(Wrappers.<InsOrder>lambdaQuery()
                .eq(InsOrder::getIfsInventoryId, insOrder.getId())
                .ne(InsOrder::getState, -1));
        List<Integer> insOrderIds = insOrders.stream().map(InsOrder::getId).collect(Collectors.toList());
        Long count = insReportMapper.selectCount(Wrappers.<InsReport>lambdaQuery()
                .in(InsReport::getInsOrderId, insOrderIds));
        if (count > 0 ) {
            throw new ErrorException("当前订单已经生成了报告不能修改编号");
        }
        Long count1 = insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery()
                .eq(InsOrder::getEntrustCode, insOrder.getEntrustCode())
                .ne(InsOrder::getIfsInventoryId, insOrder.getId())
                .ne(InsOrder::getInsState, -1));
        if (count1 > 0) {
            throw new ErrorException("该编号重复");
        }
        //修改报告的编号
        insOrderMapper.update(null, Wrappers.<InsOrder>lambdaUpdate()
                .eq(InsOrder::getIfsInventoryId, insOrder.getId())
                .set(InsOrder::getEntrustCode, insOrder.getEntrustCode()));
        // ä¿®æ”¹æ ·å“çš„编号
        // æŸ¥è¯¢æ‰€æœ‰çš„æ ·å“
        List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery()
                .in(InsSample::getInsOrderId, insOrderIds));
        for (InsSample insSample : insSamples) {
            String sampleCode = insSample.getSampleCode();
            String updateCode = insOrder.getEntrustCode();
            // æŸ¥æ‰¾æœ€åŽä¸€ä¸ª'-'的位置
            int lastDashIndex = sampleCode.lastIndexOf('-');
            if (lastDashIndex != -1) {
                int secondLastDashIndex = sampleCode.lastIndexOf('-', lastDashIndex - 1);
                // å¤„理最后一个'-'前的部分
                if (secondLastDashIndex != -1) {
                    // å¤„理最后一个'-'及之后的部分
                    String afterLastDash = sampleCode.substring(lastDashIndex);
                    updateCode = updateCode + afterLastDash;
                }
            }
            insSampleMapper.update(null, Wrappers.<InsSample>lambdaUpdate()
                    .eq(InsSample::getId, insSample.getId())
                    .set(InsSample::getSampleCode, updateCode));
        }
    }
    @Override
    public List<InsUnqualifiedRetestProduct> getRetestResult(Integer insProductId) {
        return insUnqualifiedRetestProductMapper.selectList(Wrappers.<InsUnqualifiedRetestProduct>lambdaQuery()
                .eq(InsUnqualifiedRetestProduct::getInsProductId, insProductId));
    }
    /**
     * ä¿®æ”¹é‡‡è´­è®¢å•接收状态, é¿å…å›žæ»š
     * @param id
     */
    @Transactional
    public void updateIfsInventoryQuantity(Long id) {
        ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
                .set(IfsInventoryQuantity::getIsRegister, 1)
                .eq(IfsInventoryQuantity::getId, id));
    }
    /**
     * æ–°å¢žé“œå•丝下单
     * @param list
     * @param insOrder
     * @return
     */
    @Override
    public int addRawCopperOrder(List<SampleProductDto> list, CopperInsOrderDto insOrder) {
        insOrder.setState(1);
        insOrder.setTypeSource(1);
        LocalDate appointed = insOrder.getAppointed();
        insOrderMapper.insert(insOrder); // ä¸»è¡¨
        list.forEach(a -> {
            a.setId(null);
            a.setInsOrderId(insOrder.getId());
            insSampleMapper.insert(a);
            if (ObjectUtil.isNotEmpty(a.getInsProduct())) {
                // åˆ¤æ–­æ˜¯å¦å¡«å†™å¾…检项数量
                if (a.getQuantity() != null) {
                    List<InsProduct> ip2 = new ArrayList<>();
                    for (Integer i = 1; i <= a.getQuantity(); i++) {
                        // é‡æ–°æ‹·è´ åˆ›å»ºæ–°å¯¹è±¡
                        AtomicInteger atomicInteger = new AtomicInteger(i);
                        List<InsProduct> insProducts = a.getInsProduct().stream().map(insProduct -> {
                            insProduct.setRawMaterialTag(String.valueOf(atomicInteger.get()));
                            InsProduct product = new InsProduct();
                            BeanUtils.copyProperties(insProduct, product);
                            return product;
                        }).collect(Collectors.toList());
                        ip2.addAll(insProducts);
                    }
                    addInsProductMethod(a.getId(), ip2);
                } else {
                    addInsProductMethod(a.getId(), a.getInsProduct());
                }
            }
            if (ObjectUtil.isNotEmpty(a.getChildSampleList())) {
                for (SampleProductDto b : a.getChildSampleList()) {
                    for (int i = 0; i < b.getNum(); i++) {
                        b.setId(null);
                        b.setInsOrderId(insOrder.getId());
                        b.setParentId(a.getId());
                        insSampleMapper.insert(b);
                        if (ObjectUtil.isNotEmpty(b.getInsProduct())) {
                            addInsProductMethod(b.getId(), b.getInsProduct());
                        }
                    }
                }
            }
        });
        // æ·»åŠ åŽŸææ–™ä¿¡æ¯
        IfsInventoryQuantity ifsInventoryQuantity = new IfsInventoryQuantity();
        // åŸºæœ¬ä¿¡æ¯
        ifsInventoryQuantity.setIsSource(0);
        ifsInventoryQuantity.setIsInspect(1);
        ifsInventoryQuantity.setState(1);
        ifsInventoryQuantity.setIsFinish(0);
        ifsInventoryQuantity.setIsCopper(1);
        ifsInventoryQuantity.setIsQuarter(0);
        ifsInventoryQuantity.setInspectStatus(0);
        //铜材料下单默认值
        ifsInventoryQuantity.setOrderType(OrderType.RAW.getValue());
        ifsInventoryQuantity.setMaterialProp("01Cu");
        ifsInventoryQuantity.setQtyArrived(insOrder.getQtyArrived());
        ifsInventoryQuantity.setBuyUnitMeas(insOrder.getBuyUnitMeas());
        ifsInventoryQuantity.setSupplierName(insOrder.getSupplierName());
        ifsInventoryQuantity.setUpdateBatchNo(insOrder.getUpdateBatchNo());
        ifsInventoryQuantity.setDeclareDate(insOrder.getDeclareDate());
        ifsInventoryQuantityMapper.insert(ifsInventoryQuantity);
        insOrder.setIfsInventoryId(ifsInventoryQuantity.getId());
        insOrder.setState(1);
        upInsOrderOfState(insOrder);
        // å®¡æ ¸é€šè¿‡åŽä»…进入样品接收;由样品接收页面选择主检验人后再创建检验任务。
        return insOrder.getId();
    }
    /**
     * ä¿®æ”¹å§”托下单编号
     * @param insOrder
     */
    @Override
    public void updateOrderEntrustCode(InsOrder insOrder) {
        // åˆ¤æ–­å½“前订单是否生成了报告, ç”Ÿæˆäº†æŠ¥å‘Šä¸èƒ½ä¿®æ”¹å•号
        Long count = insReportMapper.selectCount(Wrappers.<InsReport>lambdaQuery()
                .eq(InsReport::getInsOrderId, insOrder.getId()));
        if (count > 0 ) {
            throw new ErrorException("当前订单已经生成了报告不能修改编号");
        }
        Long count1 = insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery()
                .eq(InsOrder::getEntrustCode, insOrder.getEntrustCode()));
        if (count1 > 0) {
            throw new ErrorException("该编号重复");
        }
        //修改报告的编号
        insOrderMapper.update(null, Wrappers.<InsOrder>lambdaUpdate()
                .eq(InsOrder::getId, insOrder.getId())
                .set(InsOrder::getEntrustCode, insOrder.getEntrustCode()));
        // ä¿®æ”¹æ ·å“çš„编号
        // æŸ¥è¯¢æ‰€æœ‰çš„æ ·å“
        List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery()
                .eq(InsSample::getInsOrderId, insOrder.getId()));
        for (InsSample insSample : insSamples) {
            String sampleCode = insSample.getSampleCode();
            String updateCode = insOrder.getEntrustCode();
            // æŸ¥æ‰¾æœ€åŽä¸€ä¸ª'-'的位置
            int lastDashIndex = sampleCode.lastIndexOf('-');
            if (lastDashIndex != -1) {
                int secondLastDashIndex = sampleCode.lastIndexOf('-', lastDashIndex - 1);
                // å¤„理最后一个'-'前的部分
                if (secondLastDashIndex != -1) {
                    // å¤„理最后一个'-'及之后的部分
                    String afterLastDash = sampleCode.substring(lastDashIndex);
                    updateCode = updateCode + afterLastDash;
                }
            }
            insSampleMapper.update(null, Wrappers.<InsSample>lambdaUpdate()
                    .eq(InsSample::getId, insSample.getId())
                    .set(InsSample::getSampleCode, updateCode));
        }
    }
    /**
     * ä¿®æ”¹æ£€éªŒä¸‹å•内容
     * @param insOrderUpdateDto
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean updateInsOrder(InsOrderUpdateDto insOrderUpdateDto) {
        InsOrder currentOrder = insOrderMapper.selectById(insOrderUpdateDto.getInsOrder().getId());
        if (currentOrder == null || !Objects.equals(currentOrder.getState(), 2)) {
            throw new ErrorException("只有退回的检验单可以修改");
        }
        boolean hasSelectedProduct = CollectionUtils.isNotEmpty(insOrderUpdateDto.getSampleProduct())
                && insOrderUpdateDto.getSampleProduct().stream()
                .filter(sample -> CollectionUtils.isNotEmpty(sample.getInsProduct()))
                .flatMap(sample -> sample.getInsProduct().stream())
                .anyMatch(product -> Objects.equals(product.getState(), 1));
        if (!hasSelectedProduct) {
            throw new ErrorException("请至少选择一个检验项");
        }
        // ä¿®æ”¹è®¢å•
        insOrderUpdateDto.getInsOrder().setState(0);
        insOrderUpdateDto.getInsOrder().setTell("");
        insOrderMapper.updateById(insOrderUpdateDto.getInsOrder());
        // ä¿®æ”¹æ£€éªŒé¡¹
        for (SampleProductDto sampleProductDto : insOrderUpdateDto.getSampleProduct()) {
            Long sampleCount = insSampleMapper.selectCount(Wrappers.<InsSample>lambdaQuery()
                    .eq(InsSample::getId, sampleProductDto.getId())
                    .eq(InsSample::getInsOrderId, insOrderUpdateDto.getInsOrder().getId()));
            if (sampleCount == 0) {
                throw new ErrorException("检验样品数据异常");
            }
            insSampleService.update(Wrappers.<InsSample>lambdaUpdate()
                    .eq(InsSample::getId, sampleProductDto.getId())
                    .set(InsSample::getSpecialStandardMethod, sampleProductDto.getSpecialStandardMethod()));
            List<InsProduct> products = sampleProductDto.getInsProduct();
            if (CollectionUtils.isEmpty(products)) {
                continue;
            }
            Set<Integer> productIds = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
                            .eq(InsProduct::getInsSampleId, sampleProductDto.getId()))
                    .stream()
                    .map(InsProduct::getId)
                    .collect(Collectors.toSet());
            if (products.stream().anyMatch(product -> product.getId() != null && !productIds.contains(product.getId()))) {
                throw new ErrorException("检验项数据异常");
            }
            List<Integer> removedIds = products.stream()
                    .filter(product -> product.getId() != null && !Objects.equals(product.getState(), 1))
                    .map(InsProduct::getId)
                    .collect(Collectors.toList());
            if (CollectionUtils.isNotEmpty(removedIds)) {
                insProductService.removeByIds(removedIds);
            }
            List<InsProduct> existingProducts = products.stream()
                    .filter(product -> product.getId() != null && Objects.equals(product.getState(), 1))
                    .collect(Collectors.toList());
            if (CollectionUtils.isNotEmpty(existingProducts)) {
                insProductService.updateBatchById(existingProducts);
            }
            List<InsProduct> newProducts = products.stream()
                    .filter(product -> product.getId() == null && Objects.equals(product.getState(), 1))
                    .collect(Collectors.toList());
            addInsProductMethod(sampleProductDto.getId(), newProducts);
        }
        return true;
    }
    /**
     * æˆå“æ ‡ç­¾æ‰“印
     * @param ids
     * @return
     */
    @Override
    public List<InsOrderPrintingVo> labelOrderPrinting(List<Integer> ids) {
        return insOrderMapper.labelOrderPrinting(ids);
    }
    @Override
    public List<InventoryDetailDTO> labelOutsideOrderPrinting(List<Integer> ids) {
        return insOrderMapper.labelOutsideOrderPrinting(ids);
    }
    /**
     * æ ¹æ®æ ·å“id查询检验项树
     * @param insSampleId
     * @return
     */
    @Override
    public List<StandardProductList> getProductTreeBySampleId(Integer insSampleId) {
        // æŸ¥è¯¢ç¬¬ä¸€ä¸ªæ£€éªŒé¡¹èŽ·å–æ£€éªŒé¡¹æ ‘
        InsProduct insProduct = insProductMapper.selectOne(Wrappers.<InsProduct>lambdaQuery()
                .eq(InsProduct::getInsSampleId, insSampleId)
                .last("limit 1"));
        String tree;
        if (insProduct.getSampleType() == null && insProduct.getModel() == null
                && StringUtils.isNotBlank(insProduct.getLaboratory())
                && StringUtils.isNotBlank(insProduct.getSample())) {
            tree = StandardTreePathParser.canonical(insProduct.getLaboratory(), insProduct.getSample());
        } else {
            tree = insProduct.getFactory() + " - " +
                    insProduct.getLaboratory() + " - " +
                    insProduct.getSampleType() + " - " +
                    insProduct.getSample() + " - " +
                    insProduct.getModel();
        }
        // æŸ¥è¯¢æ ‡å‡†æ ‘
        List<StandardProductList> standardProductLists = standardProductListMapper.selectList(Wrappers.<StandardProductList>lambdaQuery()
                .eq(StandardProductList::getStandardMethodListId, insProduct.getStandardMethodListId())
                .eq(StandardProductList::getTree, tree)
                .orderByAsc(StandardProductList::getSort));
        for (StandardProductList standardProductList : standardProductLists) {
            standardProductList.setId(null);
        }
        return standardProductLists;
    }
    /**
     * æ·»åŠ é—æ¼çš„æ£€éªŒé¡¹
     * @param omitOrderProductDto
     * @return
     */
    @Override
    public boolean addOmitOrderProduct(OmitOrderProductDto omitOrderProductDto) {
        if (omitOrderProductDto.getInsSampleId() == null) {
            throw new ErrorException("缺少样品Id");
        }
        for (InsProduct product : omitOrderProductDto.getInsProductBindingList()) {
            if (product.getState() == 1) {
                product.setId(null);
                product.setCreateTime(null);
                product.setCreateUser(null);
                product.setUpdateTime(null);
                product.setUpdateUser(null);
                product.setSection(null);
                product.setInsSampleId(omitOrderProductDto.getInsSampleId());
                if (StringUtils.isBlank(product.getCableTag())) {
                    product.setCableTag(null);
                }
                if (product.getInspectionItemSubclass() == null) {
                    product.setInspectionItemSubclass("");
                }
                if (StringUtils.isBlank(product.getAsk()) || StringUtils.isBlank(product.getTell())) {
                    throw new ErrorException("有检验项的要求值或要求描述为空, è¯·å¡«å†™è¦æ±‚值或要求描述");
                }
                insProductMapper.insert(product);
            }
        }
        return true;
    }
    /**
     * æˆå“æ£€éªŒå•导出
     * @param sampleOrderDto
     * @param response
     */
    @Override
    public void rawAllInsOrderExport(SampleOrderDto sampleOrderDto, HttpServletResponse response) {
        List<SampleOrderDto> sampleOrderDtoList = new ArrayList<>();
        if (StringUtils.isNotBlank(sampleOrderDto.getIds())) {
            List<String> orderIds = StrUtil.split(sampleOrderDto.getIds(), ",");
            sampleOrderDtoList = insOrderMapper.getInsOrderExportByIds(orderIds);
        } else {
            String laboratory = null;
            // åˆ¤æ–­æ˜¯å¦æ˜¯å…¨éƒ¨
            String isOrderAll = null;
            if (sampleOrderDto.getState() != null && sampleOrderDto.getState() == -2) {
                isOrderAll = "1";
                sampleOrderDto.setState(null);
            }
            sampleOrderDto.setIds(null);
            sampleOrderDtoList = insOrderMapper.rawAllInsOrderExport(QueryWrappers.queryWrappers(sampleOrderDto), laboratory, isOrderAll);
        }
        // åˆ¤æ–­æ˜¯å¦æ˜¯ä¸åˆæ ¼, ä¸åˆæ ¼æŸ¥è¯¢ä¸åˆæ ¼é¡¹
        for (SampleOrderDto orderDto : sampleOrderDtoList) {
            if (orderDto.getInsResult() != null && orderDto.getInsResult() == 0){
                // æŸ¥è¯¢ä¸åˆæ ¼é¡¹
                List<String> unqualifiedList = insProductMapper.selectUnqualifiedList(orderDto.getId());
                orderDto.setUnqualifiedItem(CollUtil.join(unqualifiedList, ","));
            }
            orderDto.setCreateTimeString(orderDto.getCreateTime() == null ? "" : orderDto.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        }
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("UTF-8");
        try {
            // è¿™é‡Œ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(SampleOrderDto.class).build();
            //向sheet0写入数据 ä¼ å…¥ç©ºlist这样只导出表头
            excelWriter.write(sampleOrderDtoList, mainSheet);
            //关闭流
            excelWriter.finish();
        } catch (IOException e) {
            throw new RuntimeException("导出失败");
        }
    }
    /**
     * ä¿®æ”¹æ ·å“åž‹å·
     * @param insSample
     */
    @Override
    public void updateSampleModel(InsSample insSample) {
        // åˆ¤æ–­å½“前订单是否生成了报告, ç”Ÿæˆäº†æŠ¥å‘Šä¸èƒ½ä¿®æ”¹å•号
        Long count = insReportMapper.selectCount(Wrappers.<InsReport>lambdaQuery()
                .eq(InsReport::getInsOrderId, insSample.getInsOrderId()));
        if (count > 0 ) {
            throw new ErrorException("当前订单已经生成了报告不能修改编号");
        }
        insSampleService.update(Wrappers.<InsSample>lambdaUpdate()
                .eq(InsSample::getId, insSample.getId())
                .set(InsSample::getModel, insSample.getModel()));
    }
    /**
     * æŸ¥è¯¢å½“前时间是否没有该检测项的抽样计划
     * @param sampleList
     * @param insOrder
     * @return
     */
    @Override
    public Result judgeNotSpotCheckOrder(List<SampleProductDto> sampleList, InsOrder insOrder) {
        // todo: ä¸‹å•判断抽样计划的唯一性
        if (insOrder.getQuarterItemId() != null) {
            Long quarterItemCount = insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery()
                    .eq(InsOrder::getQuarterItemId, insOrder.getQuarterItemId())
                    .notIn(InsOrder::getState, -1 ,2 ,3));
            if (quarterItemCount > 0) {
                throw new ErrorException("该抽样计划已被绑定过");
            }
        }
        // åˆ¤æ–­æ˜¯å¦æ˜¯æŠ½æ ·æ£€æµ‹
        if (insOrder.getOrderType().equals(InsOrderTypeConstants.SPOT_CHECK)) {
            Set<String> monthMessageSet = new HashSet<>();
            Set<String> quarterMessageSet = new HashSet<>();
            Set<String> yearMessageSet = new HashSet<>();
            String formatTime = "yyyy-MM-dd HH:mm:ss";
            // æŸ¥è¯¢å½“前所有样品的检验项
            for (SampleProductDto sampleProductDto : sampleList) {
                List<StandardProductList> standardProductList = getProductTreeBySampleId(sampleProductDto.getId());
                Set<Integer> insIds = sampleProductDto.getInsProduct().stream()
                        .map(InsProduct::getStructureItemParameterId)
                        .collect(Collectors.toSet());
                List<StandardProductList> productLists = standardProductList.stream()
                        .filter(product -> !insIds.contains(product.getStructureItemParameterId()))
                        .collect(Collectors.toList());
                // æŸ¥è¯¢æ£€éªŒé¡¹åŸºç¡€è¡¨, æŸ¥è¯¢æ˜¯å¦æœ‰æœˆåº¦, å­£åº¦, å¹´åº¦çš„æ£€éªŒé¡¹
                List<StructureItemParameter> itemParameterList = structureItemParameterMapper.selectList(Wrappers.<StructureItemParameter>lambdaQuery()
                        .in(StructureItemParameter::getId, productLists.stream().map(StandardProductList::getStructureItemParameterId).collect(Collectors.toList())));
                for (StructureItemParameter item : itemParameterList) {
                    if (StringUtils.isNotBlank(item.getSpotCheckType())) {
                        switch (item.getSpotCheckType()) {
                            case "1": // æœˆåº¦
                                // æŸ¥è¯¢å½“月是否有该检测项的抽样计划
                                // å½“月开始时间
                                DateTime monthStart = DateUtil.beginOfMonth(DateUtil.date());
                                String monthStartTime = monthStart.toString(formatTime);
                                // å½“月结束时间
                                DateTime monthEnd = DateUtil.endOfMonth(DateUtil.date());
                                String monthEndTime = monthEnd.toString(formatTime);
                                Integer count = insOrderMapper.selectNotSpotCheckOrder(item.getId(), monthStartTime, monthEndTime);
                                if (count == 0) {
                                    String monthMessage = item.getInspectionItemClass() +
                                            item.getInspectionItem() +
                                            item.getInspectionItemSubclass();
                                    monthMessageSet.add(monthMessage);
                                }
                                break;
                            case "2": // å­£åº¦
                                DateTime quarterStart = DateUtil.beginOfQuarter(DateUtil.date());
                                String quarterStartTime = quarterStart.toString(formatTime);
                                // å½“月结束时间
                                DateTime quarterEnd = DateUtil.endOfQuarter(DateUtil.date());
                                String quarterEndTime = quarterEnd.toString(formatTime);
                                Integer quarterCount = insOrderMapper.selectNotSpotCheckOrder(item.getId(), quarterStartTime, quarterEndTime);
                                if (quarterCount == 0) {
                                    String quarterMessage = item.getInspectionItemClass() +
                                            item.getInspectionItem() +
                                            item.getInspectionItemSubclass();
                                    quarterMessageSet.add(quarterMessage);
                                }
                                break;
                            case "3": // å¹´åº¦
                                DateTime yearStart = DateUtil.beginOfQuarter(DateUtil.date());
                                String yearStartTime = yearStart.toString(formatTime);
                                // å½“月结束时间
                                DateTime yearEnd = DateUtil.endOfQuarter(DateUtil.date());
                                String yearEndTime = yearEnd.toString(formatTime);
                                Integer yearCount = insOrderMapper.selectNotSpotCheckOrder(item.getId(), yearStartTime, yearEndTime);
                                if (yearCount == 0) {
                                    String yearMessage = item.getInspectionItemClass() +
                                            item.getInspectionItem() +
                                            item.getInspectionItemSubclass();
                                    yearMessageSet.add(yearMessage);
                                }
                                break;
                        }
                    }
                }
            }
            String message = "";
            if (CollectionUtils.isNotEmpty(monthMessageSet)) {
                message += StrUtil.format("<p>检验项<span style=\"color: red\">{}</span>当月还未进行抽样检测, è¯·æŸ¥çœ‹æ˜¯å¦éœ€è¦æ·»åŠ å½“å‰æ£€éªŒé¡¹</p>", CollUtil.join(monthMessageSet, ", "));
            }
            if (CollectionUtils.isNotEmpty(quarterMessageSet)) {
                message += StrUtil.format("<p>检验项<span style=\"color: red\">{}</span>当前季度还未进行抽样检测, è¯·çœ‹æ˜¯å¦éœ€è¦æ·»åŠ å½“å‰æ£€éªŒé¡¹</p>", CollUtil.join(quarterMessageSet, ", "));
            }
            if (CollectionUtils.isNotEmpty(yearMessageSet)) {
                message += StrUtil.format("<p>检验项<span style=\"color: red\">{}</span>今年还未进行抽样检测, è¯·çœ‹æ˜¯å¦éœ€è¦æ·»åŠ å½“å‰æ£€éªŒé¡¹</p>", CollUtil.join(yearMessageSet, ", "));
            }
            if (StringUtils.isNotBlank(message)) {
                return Result.success(false, message);
            }
        }
        return Result.success(true);
    }
    /**
     * ifs移库操作
     * @param inventoryQuantity
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
    public String moveRawMaterial(IfsInventoryQuantity inventoryQuantity) {
        //查询ifs订单详情
        IfsInventoryQuantity one = ifsInventoryQuantityMapper.selectById(inventoryQuantity.getId());
        String toLocation;
        // ç™»è®°é‡‡è´­æ£€éªŒç»“æžœSTD
        if (one.getIsRegister().equals(0)) {
            Map<String, Object> resultMap = new HashMap<>();
            List<Map<String, Object>> resultList = new ArrayList<>();
            Map<String, Object> map = new HashMap<>();
            map.put("ORDER_NO", one.getOrderNo()); // é‡‡è´­è®¢å•号
            map.put("LINE_NO", one.getLineNo()); // è¡Œå·
            map.put("RELEASE_NO", one.getReleaseNo()); // ä¸‹è¾¾å·
            map.put("RECEIPT_NO", one.getReceiptNo()); // æŽ¥æ”¶å·
            map.put("PURCH_QTY", one.getQtyToInspect()); // è¦æ£€éªŒçš„采购数量
            resultList.add(map);
            resultMap.put("RECORD_ID", UUID.randomUUID().toString());
            resultMap.put("SYSCODE", "LIMS");
            resultMap.put("SYSMODEL", "登记采购检验结果");
            resultMap.put("BATCH_INFO", resultList);
            Result result = ifsApiUtils.getProcurementResults(JSONUtil.toJsonStr(resultMap));
            if (result.getCode() != 200) {
                throw new ErrorException("IFS登记采购检验结果失败: " + result.getMsg());
            }
            //如果是拆分订单,则将同一接收号的订单标记已登记校验
            if(one.getIsSplitOrder()==1){
                //查询其余拆分的订单
                List<IfsInventoryQuantity> quantityList = ifsInventoryQuantityMapper.selectList(Wrappers.<IfsInventoryQuantity>lambdaQuery()
                        .eq(IfsInventoryQuantity::getOrderNo, one.getOrderNo())
                        .eq(IfsInventoryQuantity::getPartNo, one.getPartNo())
                        .eq(IfsInventoryQuantity::getLineNo, one.getLineNo())
                        .eq(IfsInventoryQuantity::getReleaseNo, one.getReleaseNo())
                        .eq(IfsInventoryQuantity::getReceiptNo, one.getReceiptNo())
                        .eq(IfsInventoryQuantity::getIsSplitOrder, 1)
                );
                if(Objects.nonNull(quantityList) && !quantityList.isEmpty()){
                    //修改采购订单登记状态
                    List<Long> ids = quantityList.stream().map(IfsInventoryQuantity::getId).collect(Collectors.toList());
                    ifsInventoryQuantityMapper.update(null,Wrappers.<IfsInventoryQuantity>lambdaUpdate()
                            .set(IfsInventoryQuantity::getIsRegister,1)
                            .in(IfsInventoryQuantity::getId, ids)
                    );
                }
            }else{
                this.updateIfsInventoryQuantity(one.getId());
            }
        }
        /**
         * TODO åŽç»­éœ€è¦è°ƒç”¨IFS的接口 ç§»å…¥çš„库位号 toLocation
         */
        // æ£€éªŒåŽç§»åº“
        //1301:原材料合格库,CP-02-001:成品库
        if(StringUtils.equals(inventoryQuantity.getOrderType(), OrderType.RAW.getValue())){
            toLocation = "1301";
        }else if(StringUtils.equals(inventoryQuantity.getOrderType(), OrderType.WG.getValue())){
            toLocation = "CP-02-001";
        }else{
            toLocation = "1301";
        }
        Map<String, Object> moveResultMap = new HashMap<>();
        List<Map<String, Object>> moveResultList = new ArrayList<>();
        Map<String, Object> moveMap = new HashMap<>();
        moveMap.put("ORDER_NO", one.getOrderNo()); // é‡‡è´­è®¢å•号
        moveMap.put("LINE_NO", one.getLineNo());
        moveMap.put("RELEASE_NO", one.getReleaseNo());
        moveMap.put("RECEIPT_NO", one.getReceiptNo());
        moveMap.put("PART_NO", one.getPartNo());
        moveMap.put("QTY", one.getPurQtyInStore());
        moveMap.put("LOCATION_NO", one.getLocationNo());
        moveMap.put("TO_LOCATION_NO", toLocation);
        moveMap.put("LOT_BATCH_NO", one.getLotBatchNo());
        moveMap.put("SERIAL_NO", one.getSerialNo());
        moveMap.put("WAIV_DEV_REJ_NO", one.getWaivDevRejNo());
        moveMap.put("ENG_CHG_LEVEL", one.getEngChgLevel());
        moveMap.put("ACTIVITY_SEQ", one.getActivitySeq());
        moveResultList.add(moveMap);
        moveResultMap.put("RECORD_ID", UUID.randomUUID().toString());
        moveResultMap.put("SYSCODE", "LIMS");
        moveResultMap.put("SYSMODEL", "检验后移库");
        moveResultMap.put("BATCH_INFO", moveResultList);
        Result result1 = ifsApiUtils.moveReceipt(JSONUtil.toJsonStr(moveResultMap));
        // å¦‚果有必须为零件指定批号报错需要重新提交移库信息去指定批号
        if (result1.getCode() != 200) {
            String message = result1.getMsg();
            if (message.contains("必须为零件") && message.contains("指定批号")) {
                updaeBatch(one, toLocation);
            } else {
                throw new ErrorException("IFS检验后移库失败: " + result1.getMsg());
            }
        }
        return toLocation;
    }
    /**
     * å…ˆä¿®æ”¹é‡‡è´­è®¢å•批次号, åŽè¿›è¡Œç§»åº“操作
     * @param one
     * @param toLocation
     */
    private void updaeBatch(IfsInventoryQuantity one, String toLocation) {
        if (one.getIsUpdateBatch().equals(0)) {
            // å…ˆä¿®æ”¹æ‰¹æ¬¡å·åŽè¿›è¡Œç§»åº“
            Map<String, Object> resultMap = new HashMap<>();
            List<Map<String, Object>> resultList = new ArrayList<>();
            Map<String, Object> map = new HashMap<>();
            map.put("ORDER_NO", one.getOrderNo()); // é‡‡è´­è®¢å•号
            map.put("LINE_NO", one.getLineNo()); // è¡Œå·
            map.put("RELEASE_NO", one.getReleaseNo()); // ä¸‹è¾¾å·
            map.put("RECEIPT_NO", one.getReceiptNo()); // æŽ¥æ”¶å·
            map.put("PART_NO", one.getPartNo()); //零件号
            map.put("CONFIGURATION_ID", one.getConfigurationId()); // é…ç½®æ ‡è¯†
            map.put("LOCATION_NO", one.getLocationNo()); // åº“位号
            map.put("LOT_BATCH_NO", one.getLotBatchNo());// æ‰¹æ¬¡å·
            map.put("NEW_LOT_BATCH_NO", one.getUpdateBatchNo()); // ç›®æ ‡æ‰¹æ¬¡å·
            map.put("SERIAL_NO", one.getSerialNo()); // åºåˆ—号
            map.put("ENG_CHG_LEVEL", one.getEngChgLevel()); // ç‰ˆæœ¬å·
            map.put("WAIV_DEV_REJ_NO", one.getWaivDevRejNo()); // wdr号
            map.put("ACTIVITY_SEQ", one.getActivitySeq()); // æ´»åŠ¨åºå·
            map.put("QTY_TO_CHANGE", one.getQtyArrived()); // å˜æ›´æ•°é‡
            resultList.add(map);
            resultMap.put("RECORD_ID", UUID.randomUUID().toString());
            resultMap.put("SYSCODE", "LIMS");
            resultMap.put("SYSMODEL", "修改采购订单批次号");
            resultMap.put("BATCH_INFO", resultList);
            Result result = ifsApiUtils.updateMoveReceiptLot(JSONUtil.toJsonStr(resultMap));
            if (result.getCode() != 200) {
                throw new ErrorException("IFS修改批次号失败: " + result.getMsg());
            }
            ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
                    .set(IfsInventoryQuantity::getIsUpdateBatch, 1)
                    .eq(IfsInventoryQuantity::getId, one.getId()));
        }
        Map<String, Object> moveResultMap = new HashMap<>();
        List<Map<String, Object>> moveResultList = new ArrayList<>();
        Map<String, Object> moveMap = new HashMap<>();
        moveMap.put("ORDER_NO", one.getOrderNo()); // é‡‡è´­è®¢å•号
        moveMap.put("LINE_NO", one.getLineNo());
        moveMap.put("RELEASE_NO", one.getReleaseNo());
        moveMap.put("RECEIPT_NO", one.getReceiptNo());
        moveMap.put("PART_NO", one.getPartNo());
        moveMap.put("QTY", one.getQtyArrived());
        moveMap.put("LOCATION_NO", one.getLocationNo());
        moveMap.put("TO_LOCATION_NO", toLocation);
        moveMap.put("LOT_BATCH_NO", one.getUpdateBatchNo());
        moveMap.put("SERIAL_NO", one.getSerialNo());
        moveMap.put("WAIV_DEV_REJ_NO", one.getWaivDevRejNo());
        moveMap.put("ENG_CHG_LEVEL", one.getEngChgLevel());
        moveMap.put("ACTIVITY_SEQ", one.getActivitySeq());
        moveResultList.add(moveMap);
        moveResultMap.put("RECORD_ID", UUID.randomUUID().toString());
        moveResultMap.put("SYSCODE", "LIMS");
        moveResultMap.put("SYSMODEL", "检验后移库");
        moveResultMap.put("BATCH_INFO", moveResultList);
        Result result1 = ifsApiUtils.moveReceipt(JSONUtil.toJsonStr(moveResultMap));
        if (result1.getCode() != 200) {
            throw new ErrorException("IFS检验后移库失败: " + result1.getMsg());
        }
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderStandardTemplateServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.inspect.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.inspect.mapper.InsOrderStandardTemplateMapper;
import com.ruoyi.inspect.pojo.InsOrderStandardTemplate;
import com.ruoyi.inspect.service.InsOrderStandardTemplateService;
import org.springframework.stereotype.Service;
/**
 * è®¢å•标准模板复制
 *
 * @author zhuo
 * @since 2024-11-05
 */
@Service
public class InsOrderStandardTemplateServiceImpl extends ServiceImpl<InsOrderStandardTemplateMapper, InsOrderStandardTemplate> implements InsOrderStandardTemplateService {
}
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderStateServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.inspect.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.inspect.mapper.InsOrderStateMapper;
import com.ruoyi.inspect.pojo.InsOrderState;
import com.ruoyi.inspect.service.InsOrderStateService;
import org.springframework.stereotype.Service;
/**
 * æ£€éªŒä»»åŠ¡çŠ¶æ€
 *
 * @author zhuo
 * @since 2025-02-28
 */
@Service
public class InsOrderStateServiceImpl extends ServiceImpl<InsOrderStateMapper, InsOrderState> implements InsOrderStateService {
}
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderTemplateServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,93 @@
package com.ruoyi.inspect.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.dto.StandardTreeTemplateBindingVo;
import com.ruoyi.basic.service.StandardTreeService;
import com.ruoyi.inspect.mapper.InsOrderTemplateMapper;
import com.ruoyi.inspect.pojo.InsOrderTemplate;
import com.ruoyi.inspect.service.InsOrderTemplateService;
import com.ruoyi.inspect.vo.InsOrderTemplateDetailVo;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
 * @author Administrator
 * @description é’ˆå¯¹è¡¨ã€ins_order_template】的数据库操作Service实现
 * @createDate 2024-03-18 14:14:54
 */
@Service
@AllArgsConstructor
public class InsOrderTemplateServiceImpl extends ServiceImpl<InsOrderTemplateMapper, InsOrderTemplate>
        implements InsOrderTemplateService {
    private InsOrderTemplateMapper insOrderTemplateMapper;
    private StandardTreeService standardTreeService;
    @Override
    public int addInsOrderTemplate(InsOrderTemplate insOrderTemplate) {
        return insOrderTemplateMapper.insert(insOrderTemplate);
    }
    @Override
    public List<InsOrderTemplate> selectInsOrderTemplate(String company) {
        if (ObjectUtils.isEmpty(company) || company.equals("")) {
            return insOrderTemplateMapper.selectList(Wrappers.<InsOrderTemplate>lambdaQuery()
                    .select(InsOrderTemplate.class, info -> !info.getColumn().equals("thing")));
        } else {
            //根据委托单位进行筛选
            return insOrderTemplateMapper.selectList(Wrappers.<InsOrderTemplate>lambdaQuery()
                    .like(InsOrderTemplate::getThing,"\"company\":\""+ company+"\"")
                    .select(InsOrderTemplate.class, info -> !info.getColumn().equals("thing")));
        }
    }
    @Override
    public InsOrderTemplateDetailVo selectInsOrderTemplateById(Integer id) {
        InsOrderTemplate template = insOrderTemplateMapper.selectById(id);
        InsOrderTemplateDetailVo vo = new InsOrderTemplateDetailVo();
        if (template == null) {
            vo.setTemplateBindings(new ArrayList<>());
            return vo;
        }
        vo.setThing(template.getThing());
        // ä¼˜å…ˆå–模板列上持久化的标准ID,历史数据回退到从表单快照 addObj.standardTreeId è§£æž
        Integer standardTreeId = template.getStandardTreeId();
        if (standardTreeId == null) {
            standardTreeId = parseStandardTreeId(template.getThing());
        }
        vo.setStandardTreeId(standardTreeId);
        if (standardTreeId != null) {
            List<StandardTreeTemplateBindingVo> bindings = standardTreeService.selectTemplateBindings(standardTreeId);
            vo.setTemplateBindings(bindings == null ? new ArrayList<>() : bindings);
        } else {
            vo.setTemplateBindings(new ArrayList<>());
        }
        return vo;
    }
    private Integer parseStandardTreeId(String thing) {
        if (StringUtils.isBlank(thing)) {
            return null;
        }
        try {
            JSONObject addObj = JSON.parseObject(thing).getJSONObject("addObj");
            return addObj == null ? null : addObj.getInteger("standardTreeId");
        } catch (Exception ignored) {
            return null;
        }
    }
    @Override
    public int delInsOrderTemplate(Integer id) {
        return insOrderTemplateMapper.deleteById(id);
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsProductDeviationWarningDetailServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.inspect.service.impl;
import com.ruoyi.inspect.pojo.InsProductDeviationWarningDetail;
import com.ruoyi.inspect.mapper.InsProductDeviationWarningDetailMapper;
import com.ruoyi.inspect.service.InsProductDeviationWarningDetailService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
 * <p>
 * æ£€éªŒé¡¹åå·®é¢„警详情表 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author
 * @since 2025-03-28 02:18:58
 */
@Service
public class InsProductDeviationWarningDetailServiceImpl extends ServiceImpl<InsProductDeviationWarningDetailMapper, InsProductDeviationWarningDetail> implements InsProductDeviationWarningDetailService {
}
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsProductDeviationWarningServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.ruoyi.inspect.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.inspect.dto.InsProductDeviationWarningDto;
import com.ruoyi.inspect.pojo.InsProductDeviationWarning;
import com.ruoyi.inspect.mapper.InsProductDeviationWarningMapper;
import com.ruoyi.inspect.service.InsProductDeviationWarningService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
 * <p>
 * æ£€éªŒé¡¹åå·®é¢„警主表 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author
 * @since 2025-03-28 02:18:02
 */
@Service
public class InsProductDeviationWarningServiceImpl extends ServiceImpl<InsProductDeviationWarningMapper, InsProductDeviationWarning> implements InsProductDeviationWarningService {
    /**
     * æŸ¥çœ‹é¢„警列表
     * @param page
     * @param deviationWarningDto
     * @return
     */
    @Override
    public IPage<InsProductDeviationWarningDto> selectDeviationWarningPage(Page page, InsProductDeviationWarningDto deviationWarningDto) {
        return baseMapper.selectDeviationWarningPage(page, QueryWrappers.queryWrappers(deviationWarningDto));
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsProductServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,316 @@
package com.ruoyi.inspect.service.impl;
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.basic.mapper.StandardProductListMapper;
import com.ruoyi.basic.pojo.StandardProductList;
import com.ruoyi.basic.utils.StandardTreePathParser;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.inspect.dto.InsProductBindingDto;
import com.ruoyi.inspect.dto.WriteInspectionConditionDto;
import com.ruoyi.inspect.mapper.InsOrderMapper;
import com.ruoyi.inspect.mapper.InsOrderStandardTemplateMapper;
import com.ruoyi.inspect.mapper.InsOrderTemplateDeviceMapper;
import com.ruoyi.inspect.mapper.InsProductMapper;
import com.ruoyi.inspect.mapper.InsSampleMapper;
import com.ruoyi.inspect.pojo.InsOrder;
import com.ruoyi.inspect.pojo.InsOrderStandardTemplate;
import com.ruoyi.inspect.pojo.InsOrderTemplateDevice;
import com.ruoyi.inspect.pojo.InsProduct;
import com.ruoyi.inspect.pojo.InsSample;
import com.ruoyi.inspect.service.InsProductService;
import com.ruoyi.performance.pojo.AuxiliaryOutputWorkingHours;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.stream.Collectors;
@Service
@AllArgsConstructor
@Transactional(rollbackFor = Exception.class)
public class InsProductServiceImpl extends ServiceImpl<InsProductMapper, InsProduct>
        implements InsProductService {
    private InsProductMapper insProductMapper;
    private InsOrderMapper insOrderMapper;
    private InsSampleMapper insSampleMapper;
    private StandardProductListMapper standardProductListMapper;
    private InsOrderStandardTemplateMapper insOrderStandardTemplateMapper;
    private InsOrderTemplateDeviceMapper insOrderTemplateDeviceMapper;
    @Override
    public int selectOrderManDay(Integer orderId) {
        return insProductMapper.selectOrderManDay(orderId);
    }
    @Override
    public int updateInspected(Integer id, String ids) {
        InsOrder insOrder = new InsOrder();
        insOrder.setId(id);
        insOrder.setIsRevocation(1);//需要审核
        insOrder.setRevocationInsProductIds(ids);
        return insOrderMapper.updateById(insOrder);
    }
    @Override
    public boolean write(WriteInspectionConditionDto dto) {
        if (dto == null || dto.getId() == null) {
            throw new ErrorException("订单ID不能为空");
        }
        if (dto.getTemplateId() != null) {
            InsOrderStandardTemplate snapshot = insOrderStandardTemplateMapper.selectOne(
                    Wrappers.<InsOrderStandardTemplate>lambdaQuery()
                            .eq(InsOrderStandardTemplate::getInsOrderId, dto.getId())
                            .eq(InsOrderStandardTemplate::getTemplateId, dto.getTemplateId())
                            .last("limit 1"));
            if (snapshot == null) {
                throw new ErrorException("未找到当前模板的原始记录快照");
            }
            boolean hasSnapshotField = dto.isTemperaturePresent() || dto.isHumidityPresent()
                    || dto.isDetectionTimePresent() || dto.isDetectionPlacePresent()
                    || dto.isInsResultPresent();
            if (hasSnapshotField) {
                insOrderStandardTemplateMapper.update(null,
                        Wrappers.<InsOrderStandardTemplate>lambdaUpdate()
                                .eq(InsOrderStandardTemplate::getId, snapshot.getId())
                                .set(dto.isTemperaturePresent(),
                                        InsOrderStandardTemplate::getTemperature, dto.getTemperature())
                                .set(dto.isHumidityPresent(),
                                        InsOrderStandardTemplate::getHumidity, dto.getHumidity())
                                .set(dto.isDetectionTimePresent(),
                                        InsOrderStandardTemplate::getDetectionTime, dto.getDetectionTime())
                                .set(dto.isDetectionPlacePresent(),
                                        InsOrderStandardTemplate::getDetectionPlace, dto.getDetectionPlace())
                                .set(dto.isInsResultPresent(),
                                        InsOrderStandardTemplate::getInsResult, dto.getInsResult()));
            }
            if (dto.isDeviceIdsPresent()) {
                insOrderTemplateDeviceMapper.delete(
                        Wrappers.<InsOrderTemplateDevice>lambdaQuery()
                                .eq(InsOrderTemplateDevice::getInsOrderId, dto.getId())
                                .eq(InsOrderTemplateDevice::getTemplateId, dto.getTemplateId()));
                List<Integer> deviceIds = dto.getDeviceIds() == null
                        ? Collections.emptyList()
                        : dto.getDeviceIds().stream()
                                .filter(Objects::nonNull)
                                .distinct()
                                .collect(Collectors.toList());
                if (!deviceIds.isEmpty()
                        && insOrderTemplateDeviceMapper.selectExistingDeviceIds(deviceIds).size() != deviceIds.size()) {
                    throw new ErrorException("所选设备不存在,请刷新设备列表后重试");
                }
                for (int index = 0; index < deviceIds.size(); index++) {
                    InsOrderTemplateDevice relation = new InsOrderTemplateDevice();
                    relation.setInsOrderId(dto.getId());
                    relation.setTemplateId(dto.getTemplateId());
                    relation.setDeviceId(deviceIds.get(index));
                    relation.setSort(index);
                    insOrderTemplateDeviceMapper.insert(relation);
                }
            }
            if (!hasSnapshotField && !dto.isDeviceIdsPresent()) {
                throw new ErrorException("没有需要保存的模板检验条件");
            }
            return true;
        }
        InsOrder insOrder = new InsOrder();
        insOrder.setId(dto.getId());
        insOrder.setRemark(dto.getRemark());
        insOrderMapper.updateById(insOrder);
        return true;
    }
    //查询待检项目
    @Override
    public IPage<InsProduct> selectNoProducts(Page page, InsProduct insProduct, Integer orderId, String ids) {
        List<Integer> noIds = null;
        if (StringUtils.isNotBlank(ids)) {
            noIds = Arrays.asList(ids.split(",")).stream()
                    .map(Integer::parseInt)
                    .collect(Collectors.toList());
        }
        IPage<InsProduct> insProductIPage = baseMapper.selectNoProducts(page, orderId, noIds);
        return insProductIPage;
    }
    //审核待检撤销
    @Override
    public void checkUpdate(Integer orderId, Integer state) {
        InsOrder insOrder = insOrderMapper.selectById(orderId);
        if (state == 1) {
            List<String> list = new ArrayList<>();
            try {
                list = Arrays.asList(insOrder.getRevocationInsProductIds().split(","));
            } catch (Exception e) {
                throw new ErrorException("还没有选择应该要撤销的检验项目");
            }
            List<Integer> ids = list.stream()
                    .map(Integer::parseInt)
                    .collect(Collectors.toList());
            List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery().eq(InsSample::getInsOrderId, orderId));
            List<Integer> collect = insSamples.stream().map(InsSample::getId).collect(Collectors.toList());
            List<InsProduct> insProducts = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery().eq(InsProduct::getState, 1).in(InsProduct::getInsSampleId, collect));
            if (insProducts.stream().map(InsProduct::getId).collect(Collectors.toList()).equals(ids)) {
                //如果该检验单下的所有项目全部都撤销,那么这个单子也需要撤销
                insOrder.setState(3);
            } else {
                List<InsProduct> products = insProductMapper.selectBatchIds(ids);
                //首先根据选择的项目id进行撤销项目
                updateBatchById(products.stream().map(insProduct -> {
                    insProduct.setState(0);
                    return insProduct;
                }).collect(Collectors.toList()));
            }
            //insProductMapper.updateInspected(id);
        }
        //不通过
        insOrder.setIsRevocation(0);
        insOrderMapper.updateById(insOrder);
    }
    /**
     * æ ¹æ®æ£€éªŒé¡¹id查询检验项树信息
     * @param productId
     * @return
     */
    @Override
    public List<InsProduct> getProductTreeByProductId(Integer productId) {
        // æŸ¥è¯¢æ£€éªŒé¡¹ä¿¡æ¯
        InsProduct insProduct = insProductMapper.selectById(productId);
        String tree;
        if (insProduct.getSampleType() == null && insProduct.getModel() == null
                && StringUtils.isNotBlank(insProduct.getLaboratory())
                && StringUtils.isNotBlank(insProduct.getSample())) {
            tree = StandardTreePathParser.canonical(insProduct.getLaboratory(), insProduct.getSample());
        } else {
            tree = insProduct.getFactory() + " - " +
                    insProduct.getLaboratory() + " - " +
                    insProduct.getSampleType() + " - " +
                    insProduct.getSample() + " - " +
                    insProduct.getModel();
        }
        // æŸ¥è¯¢æ ‡å‡†æ ‘
        List<StandardProductList> standardProductLists = standardProductListMapper.selectList(Wrappers.<StandardProductList>lambdaQuery()
                .eq(StandardProductList::getStandardMethodListId, insProduct.getStandardMethodListId())
                .eq(StandardProductList::getTree, tree));
        List<InsProduct> insProducts = standardProductLists.stream().map(standardProductList -> {
            InsProduct product = new InsProduct();
            BeanUtils.copyProperties(standardProductList, product);
            // é˜²æ­¢åºåˆ—化错误
            product.setTemplate(null);
            product.setStyle(null);
            return product;
        }).sorted((o1, o2) -> (o1.getSort() == null ? 0 : o1.getSort())
                - (o2.getSort() == null ? 0 : o2.getSort())).collect(Collectors.toList());
        return insProducts;
    }
    /**
     * ç‰¹æ®Šæ£€éªŒé¡¹ç»‘定
     * @param insProductBindingDto
     * @return
     */
    @Override
    public boolean bindingProductTreeByProductId(InsProductBindingDto insProductBindingDto) {
        if (insProductBindingDto.getInsProductId() == null) {
            throw new ErrorException("缺少检验项绑定id");
        }
        List<InsProduct> insProductBindingList = insProductBindingDto.getInsProductBindingList();
        // æŸ¥è¯¢åŽŸæœ¬æ£€éªŒé¡¹
        InsProduct insProduct = insProductMapper.selectById(insProductBindingDto.getInsProductId());
        for (InsProduct product : insProductBindingList) {
            product.setBindingProductId(insProductBindingDto.getInsProductId());
            product.setAsk(null);
            product.setTell(null);
            product.setPrice(null);
            product.setManHour(null);
            product.setSection(null);
            // å…³è”标识
            product.setRawMaterialTag(insProduct.getRawMaterialTag());
            product.setRepetitionTag(insProduct.getRepetitionTag());
            product.setInsSampleId(insProduct.getInsSampleId());
            product.setIsBinding(1);
            product.setState(1);
        }
        // åˆ¤æ–­æ˜¯å¦æ˜¯ç”µç¼†æ˜¯ç”µç¼†éœ€è¦æ·»åŠ æ‰€æœ‰ç”µç¼†å…³è”å…³ç³»
        if (StringUtils.isNotBlank(insProduct.getCableTag())) {
            // æŸ¥è¯¢å…¶ä»–电缆
            List<InsProduct> insProducts = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
                    .eq(InsProduct::getInsSampleId, insProduct.getInsSampleId())
                    .eq(InsProduct::getStructureItemParameterId, insProduct.getStructureItemParameterId())
                    .isNotNull(InsProduct::getCableTag));
            for (InsProduct product : insProducts) {
                for (InsProduct insProduct1 : insProductBindingList) {
                    insProduct1.setId(null);
                    insProduct1.setBindingProductId(product.getId());
                    insProduct1.setCableTag(product.getCableTag());
                }
                this.saveBatch(insProductBindingList);
            }
        } else {
            this.saveBatch(insProductBindingList);
        }
        return true;
    }
    /**
     * åˆ é™¤ç‰¹æ®Šæ£€éªŒé¡¹ç»‘定信息
     * @param productId
     * @return
     */
    @Override
    public boolean removeBindingProductTree(Integer productId) {
        // æŸ¥è¯¢æ£€éªŒé¡¹
        InsProduct insProduct = insProductMapper.selectById(productId);
        // åˆ¤æ–­æ˜¯å¦æ˜¯ç”µç¼†é…ç½®, éœ€è¦åˆ é™¤å…³è”的所有的检验项
        if (StringUtils.isNotBlank(insProduct.getCableTag())) {
            insProductMapper.delete(Wrappers.<InsProduct>lambdaQuery()
                    .eq(InsProduct::getInsSampleId, insProduct.getInsSampleId())
                    .eq(InsProduct::getIsBinding, 1)
                    .isNotNull(InsProduct::getBindingProductId)
                    .eq(InsProduct::getStructureItemParameterId, insProduct.getStructureItemParameterId())
                    .isNotNull(InsProduct::getCableTag));
        } else {
            insProductMapper.deleteById(productId);
        }
        return false;
    }
    @Override
    public List<InsProduct> getRevocationInsProductList(Integer orderId) {
        InsOrder insOrder = insOrderMapper.selectById(orderId);
        if(Objects.isNull(insOrder)){
            throw new RuntimeException("未找到该订单");
        }
        String revocationInsProductIds = insOrder.getRevocationInsProductIds();
        List<Integer> ids = new ArrayList<>();
        if(StringUtils.isNotBlank(revocationInsProductIds)){
            ids = Arrays.asList(revocationInsProductIds.split(",")).stream().map(Integer::parseInt).collect(Collectors.toList());
        }
        return baseMapper.getRevocationInsProductList(ids);
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,1254 @@
package com.ruoyi.inspect.service.impl;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
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.aspose.words.FontSettings;
import com.aspose.words.License;
import com.aspose.words.SaveFormat;
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.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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.Pictures;
import com.itextpdf.text.BadElementException;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.ruoyi.basic.mapper.IfsInventoryQuantityMapper;
import com.ruoyi.basic.pojo.IfsInventoryQuantity;
import com.ruoyi.basic.vo.IfsInventoryQuantityVO;
import com.ruoyi.common.config.WechatProperty;
import com.ruoyi.common.constant.InsOrderTypeConstants;
import com.ruoyi.common.constant.MenuJumpPathConstants;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.core.domain.entity.InformationNotification;
import com.ruoyi.common.utils.DateImageUtil;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.WxCpUtils;
import com.ruoyi.common.utils.api.IfsApiUtils;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.inspect.dto.InsReportExport;
import com.ruoyi.inspect.dto.ReportPageDto;
import com.ruoyi.inspect.mapper.*;
import com.ruoyi.inspect.pojo.*;
import com.ruoyi.inspect.service.InsOrderService;
import com.ruoyi.inspect.service.InsReportService;
import com.ruoyi.inspect.service.RawMaterialOrderService;
import com.ruoyi.inspect.util.PreserveReportPicturePlaceholderHandler;
import com.ruoyi.inspect.util.ReportSignaturePictureUtils;
import com.ruoyi.system.mapper.UserMapper;
import com.ruoyi.system.service.InformationNotificationService;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.xwpf.usermodel.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ClassPathResource;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import jakarta.annotation.Resource;
import javax.imageio.ImageIO;
import jakarta.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URLEncoder;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
/**
 * @author Administrator
 * @description é’ˆå¯¹è¡¨ã€ins_report(检验报告)】的数据库操作Service实现
 * @createDate 2024-03-17 22:10:02
 */
@Service
@Slf4j
public class InsReportServiceImpl extends ServiceImpl<InsReportMapper, InsReport>
        implements InsReportService {
    static {
        // Linux æœåŠ¡å™¨ç¼ºå°‘ä¸­æ–‡å­—ä½“ï¼ŒæŠ¥å‘Šè½¬ PDF æ—¶ä¸­æ–‡ä¼šå˜æˆæ–¹å—;将模板字体映射到 Noto CJK å…œåº•。
        FontSettings.addFontSubstitutes("宋体", "Noto Serif CJK SC");
        FontSettings.addFontSubstitutes("黑体", "Noto Sans CJK SC");
    }
    private static final int DETECTION_REPORT = 0;
    private static final int INSPECTION_REPORT = 1;
    @Resource
    private UserMapper userMapper;
    @Resource
    private InsReportMapper insReportMapper;
    @Resource
    private InsOrderStateMapper insOrderStateMapper;
    @Resource
    private InsProductMapper insProductMapper;
    @Resource
    private InformationNotificationService informationNotificationService;
    @Value("${wordUrl}")
    private String wordUrl;
    @Value("${file.path}")
    private String imgUrl;
    @Resource
    private InsOrderMapper insOrderMapper;
    @Resource
    private IfsInventoryQuantityMapper ifsInventoryQuantityMapper;
    @Resource
    private InsUnqualifiedHandlerMapper insUnqualifiedHandlerMapper;
    @Resource
    private InsSampleMapper insSampleMapper;
    @Resource
    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
    @Resource
    private InsOrderService insOrderService;
    @Resource
    private WechatProperty wechatProperty;
    @Resource
    private InsUnqualifiedRetestProductMapper insUnqualifiedRetestProductMapper;
    @Resource
    private IfsApiUtils ifsApiUtils;
    @Resource
    private InsSampleUserMapper insSampleUserMapper;
    @Autowired
    private RawMaterialOrderService rawMaterialOrderService;
    @Override
    public Map<String, Object> pageInsReport(Page page, ReportPageDto reportPageDto) {
        Map<String, Object> map = new HashMap<>();
        // todo: ä»…看自己
        //获取当前人所属实验室id
        String laboratory = null;
        Integer createOrderUser = reportPageDto.getCreateOrderUser();
        String queryStatus = reportPageDto.getQueryStatus();
        reportPageDto.setQueryStatus(null);
        reportPageDto.setCreateOrderUser(null);
        map.put("body", insReportMapper.pageInsReport(page,
                QueryWrappers.queryWrappers(reportPageDto),
                laboratory,
                SecurityUtils.getUserId().intValue(),
                queryStatus,
                createOrderUser));
        return map;
    }
    @Override
    public int inReport(String url, Integer id) {
        InsReport insReport = new InsReport();
        insReport.setId(id);
        insReport.setUrlS(url);
        // è¿˜åŽŸpdf
        String tempUrlPdf = wordToPdfTemp(insReport.getUrlS().replace("/word", wordUrl));
        insReport.setTempUrlPdf("/word/" + tempUrlPdf);
        return insReportMapper.updateById(insReport);
    }
    @Override
    public int upReportUrl(Integer id) {
        InsReport report = insReportMapper.selectById(id);
        // è¿˜åŽŸpdf
        String tempUrlPdf = wordToPdfTemp(report.getUrl().replace("/word", wordUrl));
        return insReportMapper.update(null, Wrappers.<InsReport>lambdaUpdate()
                .eq(InsReport::getId, id)
                .set(InsReport::getUrlS, null)
                .set(InsReport::getTempUrlPdf, "/word/" + tempUrlPdf));
    }
    //提交
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int writeReport(Integer id, Integer userId, Integer submitUserId) {
        submitUserId = submitUserId == null ? SecurityUtils.getUserId().intValue() : submitUserId;
        InsReport insReport = insReportMapper.selectById(id);
        insReport.setId(id);
        insReport.setState(1);
        insReport.setWriteUserId(submitUserId);//提交人
        if (userId == null) {
            throw new ErrorException("缺少审核人");
        }
        insReport.setExamineUserId(userId);//审核人
        insReport.setWriteTime(LocalDateTime.now());//提交时间
        //获取提交人的签名地址
        String signatureUrl;
        try {
            signatureUrl = userMapper.selectById(insReport.getWriteUserId()).getSignatureUrl();
        } catch (Exception e) {
            throw new ErrorException("找不到编制人的签名");
        }
        if (ObjectUtils.isEmpty(signatureUrl) || signatureUrl.equals("")) {
            throw new ErrorException("找不到检验人的签名");
        }
        Integer insOrderId = insReportMapper.selectById(id).getInsOrderId();
        InsOrder order = insOrderMapper.selectById(insOrderId);
        boolean isRawMater = order.getTypeSource() != null && order.getTypeSource().equals(1);
        //发送消息
        InformationNotification info = new InformationNotification();
        info.setCreateUser(insProductMapper.selectUserById(userId).get("name"));
        info.setMessageType("3");
        info.setTheme("审核通知");
        info.setContent("您有一条报告编制待审核消息, ç¼–号:" + insReport.getCode());
        info.setSenderId(submitUserId);    //发送人
        info.setConsigneeId(userId);     //收件人
        info.setViewStatus(false);
        info.setJumpPath(MenuJumpPathConstants.REPORT_PREPARATION);
        informationNotificationService.addInformationNotification(info);
        String primaryReportUrl = getPrimaryReportUrl(insReport);
        // åˆ¤æ–­æ˜¯å¦æ˜¯åŽŸææ–™  éœ€è¦æ›¿æ¢****成供应商
        IfsInventoryQuantity one = ifsInventoryQuantityMapper.selectOne(new LambdaQueryWrapper<IfsInventoryQuantity>()
                .eq(IfsInventoryQuantity::getId, order.getIfsInventoryId()));
        if (one != null) {
            if (isRawMater && order.getOrderType().equals(InsOrderTypeConstants.ENTER_THE_FACTORY)) {
                for (String reportUrl : getApprovalReportUrls(insReport)) {
                    changeText(new HashMap<String, String>() {{
                        put("**********", one.getSupplierName());
                    }}, reportUrl.replace("/word", wordUrl));
                }
            }
        }
        Map<String, Object> writeMarks = new HashMap<String, Object>() {{
            put("writeUrl", ReportSignaturePictureUtils.create(imgUrl, signatureUrl));
            put("writeDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(null)).create());
            put("insUrl", ReportSignaturePictureUtils.create(imgUrl, signatureUrl));
        }};
        writeMarksToReportFiles(insReport, writeMarks);
        // ä¿®æ”¹ä¸´æ—¶pdf
        String tempUrlPdf = wordToPdfTemp(primaryReportUrl.replace("/word", wordUrl));
        insReport.setTempUrlPdf("/word/" + tempUrlPdf);
        insReportMapper.updateById(insReport);
        // æ¸…空审核时间, å®¡æ ¸çŠ¶æ€
        insReportMapper.update(null, Wrappers.<InsReport>lambdaUpdate()
                .eq(InsReport::getId, insReport.getId())
                .set(InsReport::getRatifyTime, null)
                .set(InsReport::getIsRatify, null)
                .set(InsReport::getExamineTime, null)
                .set(InsReport::getIsExamine, null));
        return 1;
    }
    //审核
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int examineReport(Integer id, Integer isExamine, String examineTell, Integer userId) {
        InsReport insReport = insReportMapper.selectById(id);
        insReport.setIsExamine(isExamine);
        if (ObjectUtils.isNotEmpty(examineTell)) {
            insReport.setExamineTell(examineTell);
        }
        // æ£€éªŒäºº
        String userName = insProductMapper.selectUserById(insReport.getWriteUserId()).get("name");
        String userAccount = insProductMapper.selectUserById(insReport.getWriteUserId()).get("account");
        // å®¡æ ¸äºº
        Integer checkUserId = SecurityUtils.getUserId().intValue();
        String checkUserName = insProductMapper.selectUserById(checkUserId).get("name");
        insReport.setExamineTime(LocalDateTime.now());//审核时间
        if (isExamine == 0) {
            // å‘送企业微信通知(审核退回)
            threadPoolTaskExecutor.execute(() -> {
                // æŸ¥è¯¢è®¢å•
                InsOrder order = insOrderMapper.selectById(insReport.getInsOrderId());
                InsSample insSample = insSampleMapper.selectOne(Wrappers.<InsSample>lambdaQuery()
                        .eq(InsSample::getInsOrderId, insReport.getInsOrderId())
                        .last("limit 1"));
                // æŸ¥è¯¢åŽŸææ–™
                IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(order.getIfsInventoryId());
                String message = "";
                message += "报告编制审核退回通知";
                message += "\n审核人: " + checkUserName;
                message += "\n委托编号: " + order.getEntrustCode();
                message += "\n样品名称: " + insSample.getModel();
                message += "\n规格型号: " + order.getPartDetail();
                if (ifsInventoryQuantity != null) {
                    message += "\n批次号: " + ifsInventoryQuantity.getUpdateBatchNo();
                }
                message += "\n退回原因: " + examineTell;
                //发送企业微信消息通知  æäº¤å¤æ ¸
                try {
                    WxCpUtils.inform(userAccount, message, null);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            });
            //如果审核不通过
            insReport.setState(0);//提交状态改为待提交
            return insReportMapper.updateById(insReport);
        } else {
            if (userId == null) {
                throw new ErrorException("缺少批准人");
            }
            if (Objects.equals(insReport.getExamineUserId(), userId)) {
                throw new ErrorException("审核人和批准人不能为同一人,请重新选择批准人");
            }
        }
        insReport.setRatifyUserId(userId);//批准人
        //获取审核人的签名地址
        String signatureUrl;
        try {
            signatureUrl = userMapper.selectById(insReport.getExamineUserId()).getSignatureUrl();
        } catch (Exception e) {
            throw new ErrorException("找不到审核人的签名");
        }
        if (StringUtils.isBlank(signatureUrl)) {
            throw new ErrorException("找不到审核人的签名");
        }
        // æ‰¹å‡†äºº
        String sendUserAccount = insProductMapper.selectUserById(userId).get("account");
        //发送消息
        InformationNotification info = new InformationNotification();
        info.setCreateUser(insProductMapper.selectUserById(userId).get("name"));
        info.setMessageType("3");
        info.setTheme("批准通知");
        info.setContent("您有一条报告编制待批准消息, ç¼–号:" + insReport.getCode());
        info.setSenderId(checkUserId);    //发送人
        info.setConsigneeId(userId);     //收件人
        info.setViewStatus(false);
        info.setJumpPath(MenuJumpPathConstants.REPORT_PREPARATION);
        informationNotificationService.addInformationNotification(info);
        String primaryReportUrl = getPrimaryReportUrl(insReport);
        Map<String, Object> examineMarks = new HashMap<String, Object>() {{
            put("examineUrl", ReportSignaturePictureUtils.create(imgUrl, signatureUrl));
            put("examineDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(null)).create());
        }};
        writeMarksToReportFiles(insReport, examineMarks);
        // ä¿®æ”¹ä¸´æ—¶pdf
        String tempUrlPdf = wordToPdfTemp(primaryReportUrl.replace("/word", wordUrl));
        insReport.setTempUrlPdf("/word/" + tempUrlPdf);
        // å‘送企业微信通知(通知批准人审批)
        threadPoolTaskExecutor.execute(() -> {
            // æŸ¥è¯¢è®¢å•
            InsOrder order = insOrderMapper.selectById(insReport.getInsOrderId());
            InsSample insSample = insSampleMapper.selectOne(Wrappers.<InsSample>lambdaQuery()
                    .eq(InsSample::getInsOrderId, insReport.getInsOrderId())
                    .last("limit 1"));
            // æŸ¥è¯¢åŽŸææ–™
            IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(order.getIfsInventoryId());
            String message = "";
            message += "报告编制批准通知";
            message += "\n检验人: " + userName;
            message += "\n复核人: " + checkUserName;
            message += "\n委托编号: " + order.getEntrustCode();
            message += "\n样品名称: " + insSample.getModel();
            message += "\n规格型号: " + order.getPartDetail();
            if (ifsInventoryQuantity != null) {
                message += "\n生产厂家: " + ifsInventoryQuantity.getSupplierName();
                message += "\n批次号: " + ifsInventoryQuantity.getUpdateBatchNo();
            }
            //发送企业微信消息通知  æäº¤å¤æ ¸
            try {
                WxCpUtils.inform(sendUserAccount, message, null);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        });
        insReportMapper.updateById(insReport);
        // æ¸…空批准备注, æ‰¹å‡†æ—¶é—´, æ‰¹å‡†çŠ¶æ€
        insReportMapper.update(null, Wrappers.<InsReport>lambdaUpdate()
                .eq(InsReport::getId, insReport.getId())
                .set(InsReport::getExamineTell, null)
                .set(InsReport::getRatifyTime, null)
                .set(InsReport::getIsRatify, null));
        return 1;
    }
    //批准
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int ratifyReport(Integer id, Integer isRatify, String ratifyTell) {
        InsReport insReport = insReportMapper.selectById(id);
        if (Objects.equals(insReport.getExamineUserId(), SecurityUtils.getUserId().intValue())) {
            throw new ErrorException("审核人和批准人不能为同一人,请重新选择批准人");
        }
        insReport.setIsRatify(isRatify);
        if (ObjectUtils.isNotEmpty(ratifyTell)) {
            insReport.setRatifyTell(ratifyTell);
        }
        insReport.setRatifyTime(LocalDateTime.now());//批准时间
        if (isRatify == 0) {
            // æ‰¹å‡†äºº
            Integer ratifyUserId = SecurityUtils.getUserId().intValue();
            String ratifyUserName = insProductMapper.selectUserById(ratifyUserId).get("name");
            // å‘送人(审核人)(检验人)
            // æ£€éªŒäºº
            String userAccount = insProductMapper.selectUserById(insReport.getWriteUserId()).get("account");
            // å®¡æ ¸äºº
            String checkUserAccount = insProductMapper.selectUserById(insReport.getExamineUserId()).get("account");
            // å‘送企业微信通知(批准退回)
            threadPoolTaskExecutor.execute(() -> {
                // æŸ¥è¯¢è®¢å•
                InsOrder order = insOrderMapper.selectById(insReport.getInsOrderId());
                InsSample insSample = insSampleMapper.selectOne(Wrappers.<InsSample>lambdaQuery()
                        .eq(InsSample::getInsOrderId, insReport.getInsOrderId())
                        .last("limit 1"));
                // æŸ¥è¯¢åŽŸææ–™
                IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(order.getIfsInventoryId());
                String message = "";
                message += "报告编制批准退回通知";
                message += "\n批准人: " + ratifyUserName;
                message += "\n委托编号: " + order.getEntrustCode();
                message += "\n样品名称: " + insSample.getModel();
                message += "\n规格型号: " + order.getPartDetail();
                if (ifsInventoryQuantity != null) {
                    message += "\n批次号: " + ifsInventoryQuantity.getUpdateBatchNo();
                }
                message += "\n退回原因: " + ratifyTell;
                //发送企业微信消息通知  æäº¤å¤æ ¸
                try {
                    // å®¡æ‰¹äºº
                    WxCpUtils.inform(checkUserAccount, message, null);
                    // æ£€éªŒäºº
                    WxCpUtils.inform(userAccount, message, null);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            });
            //如果批准不通过 ç›´æŽ¥é€€å›žåˆ°æäº¤äººé‚£è¾¹åŽ»
            insReport.setState(0);
            insReport.setIsExamine(0);
            return insReportMapper.updateById(insReport);
        }
        //获取批准人的签名地址
        String signatureUrl;
        try {
            signatureUrl = userMapper.selectById(insReport.getRatifyUserId()).getSignatureUrl();
        } catch (Exception e) {
            throw new ErrorException("找不到批准人的签名");
        }
        if (StringUtils.isBlank(signatureUrl)) {
            throw new ErrorException("找不到批准人的签名");
        }
        Integer insOrderId = insReportMapper.selectById(id).getInsOrderId();
        InsOrder order = insOrderMapper.selectById(insOrderId);
        boolean isRawMater = order.getTypeSource() != null && order.getTypeSource().equals(1);
        //获取场所的报告专用章
        String sealUrl;
        String laboratory = insOrderMapper.selectById(insReport.getInsOrderId()).getLaboratory();
        try {
            String type = "";
            if (isRawMater && order.getOrderType().equals(InsOrderTypeConstants.ENTER_THE_FACTORY)) {
                type = "进厂报告";
            } else {
                type = "委托报告";
            }
            sealUrl = insReportMapper.getLaboratoryByName(laboratory, type);
        } catch (Exception e) {
            throw new ErrorException(laboratory + "找不到报告专用章");
        }
        if (StringUtils.isBlank(sealUrl)) {
            throw new ErrorException(laboratory + "找不到报告专用章");
        }
        String primaryReportUrl = getPrimaryReportUrl(insReport);
        String finalUrl = primaryReportUrl.replace("/word", wordUrl);
        Map<String, Object> ratifyMarks = new HashMap<String, Object>() {{
            put("ratifyUrl", ReportSignaturePictureUtils.create(imgUrl, signatureUrl));
            put("ratifyDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(null)).create());
            put("seal1", Pictures.ofLocal(imgUrl + "/" + sealUrl).create());
            put("seal2", Pictures.ofLocal(imgUrl + "/" + sealUrl).create());
        }};
        writeMarksToReportFiles(insReport, ratifyMarks);
        // ä¿®æ”¹ä¸´æ—¶pdf
        insReport.setTempUrlPdf(primaryReportUrl.replace(".docx", ".pdf"));
        InsOrder insOrder = new InsOrder();
        insOrder.setId(insOrderId);
        insOrder.setState(4);
        insOrderMapper.updateById(insOrder);
        for (String reportUrl : getApprovalReportUrls(insReport)) {
            wordToPdf(reportUrl.replace("/word", wordUrl), sealUrl,
                    isRawMater && order.getOrderType().equals(InsOrderTypeConstants.ENTER_THE_FACTORY));
        }
        // åˆ¤æ–­æ˜¯å¦ä¸ºåŽŸææ–™
        if (isRawMater) {
            // ä¿®æ”¹ifs库存状态
            ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
                    .set(IfsInventoryQuantity::getState, 2)
                    .eq(IfsInventoryQuantity::getId, order.getIfsInventoryId()));
        }
        insReport.setRatifyTell("");
        // å‘送文件到委托人
        if (StringUtils.isNotBlank(order.getPrepareCode())) {
            threadPoolTaskExecutor.execute(() -> {
                String message = "";
                message += "委托编号: " + order.getEntrustCode();
                message += "委托样品: " + order.getSampleView();
                message += "已检测结束, è¯·æŽ¥æ”¶";
                try {
                    WxCpUtils.inform(order.getPrepareCode(), message, new File(finalUrl.replace(".docx", ".pdf")));
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            });
        }
        return insReportMapper.updateById(insReport);
    }
    @Override
    public int wordInsertUrl(Map<String, Object> map, String url) {
        Configure configure = Configure.builder()
                .setValidErrorHandler(new PreserveReportPicturePlaceholderHandler())
                .build();
        XWPFTemplate template = XWPFTemplate.compile(url, configure).render(map);
        try {
            template.writeAndClose(Files.newOutputStream(Paths.get(url)));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return 1;
    }
    private String getPrimaryReportUrl(InsReport report) {
        String reportUrl = StringUtils.isNotBlank(report.getUrlS()) ? report.getUrlS() : report.getUrl();
        if (StringUtils.isBlank(reportUrl)) {
            throw new ErrorException("检测报告文件不存在");
        }
        return reportUrl;
    }
    private List<String> getApprovalReportUrls(InsReport report) {
        return Arrays.asList(getPrimaryReportUrl(report), report.getInspectionUrl()).stream()
                .filter(StringUtils::isNotBlank)
                .distinct()
                .collect(Collectors.toList());
    }
    private void writeMarksToReportFiles(InsReport report, Map<String, Object> marks) {
        for (String reportUrl : getApprovalReportUrls(report)) {
            wordInsertUrl(marks, reportUrl.replace("/word", wordUrl));
        }
    }
    //报告批量下载
    @Override
    @Transactional(rollbackFor = Exception.class)
    public String downAll(String ids) {
        List<Long> list = Arrays.stream(ids.split(",")).map(Long::parseLong).collect(Collectors.toList());
        List<InsReport> insReports = insReportMapper.selectBatchIds(list);
        String zipFilePath = null;
        // ä¸´æ—¶æ–‡ä»¶å¤¹è·¯å¾„
        try {
            String tempFolderPath = wordUrl + "/tempFolder";
            File tempFolder = new File(tempFolderPath);
            if (tempFolder.exists()) {
                deleteDirectory(tempFolder); // åˆ é™¤æ—§çš„临时文件夹
            }
            tempFolder.mkdirs(); // åˆ›å»ºæ–°çš„临时文件夹
            for (InsReport insReport : insReports) {
                File sourceFile = new File((ObjectUtils.isNotEmpty(insReport.getUrlS()) ? insReport.getUrlS() : insReport.getUrl()).replace("/word", wordUrl));
                File destinationFile = new File(tempFolder, sourceFile.getName());
                Files.copy(sourceFile.toPath(), destinationFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
            }
            // åŽ‹ç¼©ä¸´æ—¶æ–‡ä»¶å¤¹
            zipFilePath = wordUrl + "/zip/output.zip";
            // åˆ¤æ–­zip路径是否存在
            File zipDir = new File(wordUrl + "/zip");
            if(!zipDir.isDirectory()){
                zipDir.mkdirs();
            }
            zipDirectory(tempFolderPath, zipFilePath);
            // æ¸…理临时文件夹
            deleteDirectory(tempFolder);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "/word/zip/output.zip";
    }
    @Override
    public void download(Integer id, Integer reportType, Integer createOrderUser, HttpServletResponse response) {
        if (id == null) {
            throw new ErrorException("报告不能为空");
        }
        reportType = reportType == null ? DETECTION_REPORT : reportType;
        if (!Objects.equals(reportType, DETECTION_REPORT) && !Objects.equals(reportType, INSPECTION_REPORT)) {
            throw new ErrorException("报告类型不正确");
        }
        InsReport report = insReportMapper.selectDownloadableReport(id, createOrderUser);
        if (report == null) {
            throw new ErrorException("报告不存在、尚未生成或无权下载");
        }
        String reportUrl = Objects.equals(reportType, INSPECTION_REPORT)
                ? report.getInspectionUrl() : getPrimaryReportUrl(report);
        if (StringUtils.isBlank(reportUrl) || !reportUrl.replace('\\', '/').startsWith("/word/")) {
            throw new ErrorException((Objects.equals(reportType, INSPECTION_REPORT) ? "检验报告" : "检测报告")
                    + "文件不存在,请联系管理员");
        }
        Path root = Paths.get(wordUrl).toAbsolutePath().normalize();
        Path file = root.resolve(reportUrl.replace('\\', '/').substring("/word/".length())).normalize();
        if (!file.startsWith(root) || !Files.isRegularFile(file)) {
            throw new ErrorException("报告文件不存在,请联系管理员");
        }
        try {
            String filename = file.getFileName().toString();
            String encodedName = URLEncoder.encode(filename, "UTF-8").replace("+", "%20");
            response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
            response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedName);
            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition,download-filename");
            response.setHeader("download-filename", encodedName);
            response.setContentLengthLong(Files.size(file));
            try (InputStream inputStream = Files.newInputStream(file);
                 OutputStream outputStream = response.getOutputStream()) {
                byte[] buffer = new byte[8192];
                int length;
                while ((length = inputStream.read(buffer)) != -1) {
                    outputStream.write(buffer, 0, length);
                }
                outputStream.flush();
            }
        } catch (IOException e) {
            log.error("下载报告失败,reportId={}", id, e);
            throw new ErrorException("报告下载失败");
        }
    }
    //批量上传
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int upAll(MultipartFile file) throws IOException {
        File tempFile = null;
        File unzipDir = null;
        try {
            tempFile = File.createTempFile(wordUrl, ".zip");
            file.transferTo(tempFile);
            unzipDir = new File("uploaded_files");
            if (!unzipDir.exists()) {
                unzipDir.mkdir();
            }
            unzip(tempFile, unzipDir);
            // å¤„理解压后的文件
            File[] files = unzipDir.listFiles();
            if (files != null) {
                for (File f : files) {
                    // æ ¹æ®æ–‡ä»¶åæŸ¥è¯¢id
                    String name = f.getName();
                    InsReport insReport = insReportMapper.selectOne(Wrappers.<InsReport>lambdaQuery().like(InsReport::getCode, f.getName().replace(".docx", "").replace("JCZX", "JCZX/")));
                    if (ObjectUtils.isEmpty(insReport)) {
                        throw new ErrorException("没有找到 " + f.getName() + " è¿™ä¸ªæ–‡ä»¶å¯¹åº”的报告数据");
                    }
                    String urlString;
                    String pathName;
                    try {
                        String path = wordUrl;
                        File realpath = new File(path);
                        if (!realpath.exists()) {
                            realpath.mkdirs();
                        }
                        pathName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) + "_" + f.getName();
                        urlString = realpath + "/" + pathName;
                        // å¤åˆ¶æ–‡ä»¶åˆ°æŒ‡å®šè·¯å¾„
                        Files.copy(f.toPath(), new File(urlString).toPath(), StandardCopyOption.REPLACE_EXISTING);
                        inReport("/word/" + pathName, insReport.getId());
                    } catch (IOException e) {
                        throw new ErrorException("文件上传失败");
                    }
                }
            }
        } catch (IOException e) {
            throw new ErrorException("文件处理失败");
        } finally {
            if (tempFile != null && tempFile.exists()) {
                tempFile.delete();
            }
            // é€’归删除解压目录及其中的文件
            if (unzipDir.exists()) {
                deleteDirectory(unzipDir); // åˆ é™¤æ—§çš„临时文件夹
            }
        }
        return 0;
    }
    //解压文件夹
    private void unzip(File zipFile, File destDir) throws IOException {
        try (ZipFile zip = new ZipFile(zipFile)) {
            Enumeration<? extends ZipEntry> entries = zip.entries();
            while (entries.hasMoreElements()) {
                ZipEntry entry = entries.nextElement();
                File file = new File(destDir, entry.getName());
                if (entry.isDirectory()) {
                    file.mkdirs();
                } else {
                    file.getParentFile().mkdirs();
                    try (InputStream in = zip.getInputStream(entry);
                         OutputStream out = new FileOutputStream(file)) {
                        byte[] buffer = new byte[1024];
                        int len;
                        while ((len = in.read(buffer)) > 0) {
                            out.write(buffer, 0, len);
                        }
                    }
                }
            }
        }
    }
    // åŽ‹ç¼©æ–‡ä»¶å¤¹
    public static void zipDirectory(String sourceDirPath, String zipFilePath) throws IOException {
        try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFilePath))) {
            Path sourceDir = Paths.get(sourceDirPath);
            Files.walk(sourceDir)
                    .filter(path -> !Files.isDirectory(path))
                    .forEach(path -> {
                        ZipEntry zipEntry = new ZipEntry(sourceDir.relativize(path).toString());
                        try {
                            zipOut.putNextEntry(zipEntry);
                            Files.copy(path, zipOut);
                            zipOut.closeEntry();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    });
        }
    }
    // åˆ é™¤æ–‡ä»¶å¤¹åŠå…¶å†…容
    public static void deleteDirectory(File directory) throws IOException {
        if (directory.isDirectory()) {
            File[] files = directory.listFiles();
            if (files != null) {
                for (File file : files) {
                    deleteDirectory(file);
                }
            }
        }
        Files.delete(directory.toPath());
    }
    @Override
    public void wordToPdf(String path, String sealUrl, boolean isRawMater) {
        try {
            wordToPdf(path, path.replace(".docx", ".pdf"), sealUrl, isRawMater);
        } catch (Exception e) {
            throw new ErrorException("转换失败");
        }
    }
    public String wordToPdf(String wordPath, String pdfPath, String sealUrl, boolean isRawMater) {
        FileOutputStream os = null;
        try {
            //凭证 ä¸ç„¶åˆ‡æ¢åŽæœ‰æ°´å°
            InputStream is = new ClassPathResource("/lib/license.xml").getInputStream();
            License license = new License();
            license.setLicense(is);
            if (!license.getIsLicensed()) {
                log.info("License验证不通过...");
                return null;
            }
            //生成一个空的PDF文件
            File file;
            //判断是否是进厂报告
            if (!isRawMater) {
                file = new File(pdfPath.replace(".pdf", "-1.pdf"));
            } else {
                file = new File(pdfPath.replace(".pdf", ".pdf"));
            }
            os = new FileOutputStream(file);
            //要转换的word文件
            com.aspose.words.Document doc = new com.aspose.words.Document(wordPath);
            doc.save(os, SaveFormat.PDF);
            //添加骑缝章
            if (!isRawMater) {
                stamperCheckMarkPDF(pdfPath.replace(".pdf", "-1.pdf"), pdfPath, imgUrl + "/" + sealUrl);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }
    /**
     * åˆ‡å‰²å›¾ç‰‡
     *
     * @param Path å›¾ç‰‡è·¯å¾„
     * @param n    åˆ‡å‰²ä»½æ•°
     */
    public static com.itextpdf.text.Image[] slicingImages(String Path, int n) throws IOException, BadElementException {
        com.itextpdf.text.Image[] nImage = new com.itextpdf.text.Image[n];
        BufferedImage img = ImageIO.read(new File(Path));
        int h = img.getHeight();
        int w = img.getWidth();
        int sw = w / n;
        for (int i = 0; i < n; i++) {
            BufferedImage subImg;
            if (i == n - 1) {//最后剩余部分
                subImg = img.getSubimage(i * sw, 0, w - i * sw, h);
            } else {//前n-1块均匀切
                subImg = img.getSubimage(i * sw, 0, sw, h);
            }
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            ImageIO.write(subImg, Path.substring(Path.lastIndexOf('.') + 1), out);
            nImage[i] = com.itextpdf.text.Image.getInstance(out.toByteArray());
        }
        return nImage;
    }
    /**
     * ç›–骑缝章
     *
     * @param infilePath  åŽŸPDF路径
     * @param outFilePath è¾“出PDF路径
     */
    public static void stamperCheckMarkPDF(String infilePath, String outFilePath, String picPath) throws IOException, DocumentException {
        PdfReader reader = new PdfReader(infilePath);//选择需要印章的pdf
        PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(outFilePath));//加完印章后的pdf
        com.itextpdf.text.Rectangle pageSize = reader.getPageSize(1);//获得第一页
        float height = pageSize.getHeight();
        float width = pageSize.getWidth();
        int nums = reader.getNumberOfPages();
        com.itextpdf.text.Image[] nImage = slicingImages(picPath, nums);//生成骑缝章切割图片
        for (int n = 1; n <= nums; n++) {
            PdfContentByte over = stamp.getOverContent(n);//设置在第几页打印印章
            com.itextpdf.text.Image img = nImage[n - 1];//选择图片
            float newHeight = 100f;
            float newWidth = img.getWidth() / (img.getHeight() / 100);
            img.scaleAbsolute(newWidth, newHeight);//控制图片大小
            img.setAbsolutePosition(width - newWidth, height / 2 - newHeight / 2);//控制图片位置
            over.addImage(img);
        }
        stamp.close();
    }
    @Override
    @Transactional(rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
    public void isRawMaterial(InsOrder insOrder,Boolean registerInsResults,Boolean hasExemption) {
        IfsInventoryQuantity one = ifsInventoryQuantityMapper.selectOne(new LambdaQueryWrapper<IfsInventoryQuantity>()
                .eq(IfsInventoryQuantity::getId, insOrder.getIfsInventoryId()));
        if (Objects.isNull(one)) {
            throw new ErrorException("找不到原材料信息");
        }
        // åˆ¤æ–­æ˜¯å¦æœ‰ä¸åˆæ ¼ä¿¡æ¯
        Long count = insUnqualifiedHandlerMapper.selectCount(Wrappers.<InsUnqualifiedHandler>lambdaQuery()
                .eq(InsUnqualifiedHandler::getInventoryQuantityId, one.getId()));
        String toLocation = null;
        // åˆ¤æ–­æ˜¯å¦æœ‰ä¸åˆæ ¼
        Long unqualifiedCount = getUnqualifiedCount(insOrder);
        if (count.equals(0L) && unqualifiedCount.equals(0L) && one.getIsFinish().equals(0)
                && one.getIsSource().equals(1) && Boolean.TRUE.equals(registerInsResults)) {
            // åŽŸææ–™ç§»åº“
            //如果是拆分的订单,则把拆分的所有批次都移库
            if(one.getIsSplitOrder()==1 && !hasExemption){
                //查询拆分订单详情
                List<IfsInventoryQuantityVO> ifsInventoryQuantityVOS = ifsInventoryQuantityMapper.selectSplitOrderList(one.getPartNo(), one.getLineNo(), one.getReleaseNo(), one.getReceiptNo(), one.getOrderNo());
                for (IfsInventoryQuantityVO vo : ifsInventoryQuantityVOS) {
                    //如果有委托单信息且合格,走登记后移库;如果没有,则走免检;不合格不做处理
                    if(Objects.isNull(vo.getInsOrderId())){
                        rawMaterialOrderService.rawOrderRelease(vo.getId(), vo.getPartDesc());
                    }else if(Objects.equals(vo.getInsOrderId(),insOrder.getId())){
                        toLocation = insOrderService.moveRawMaterial(vo);
                    }else if(Objects.nonNull(vo.getInsResult()) && 1 == vo.getInsResult()){
                        toLocation = insOrderService.moveRawMaterial(vo);
                    }
                }
            }else{
                toLocation = insOrderService.moveRawMaterial(one);
            }
        }
        // åˆ¤æ–­ç»“束状态修改合格状态
        int inspectStatus = (count == 0 && unqualifiedCount == 0) ? 1 : 2;
        insOrderMapper.update(null, Wrappers.<InsOrder>lambdaUpdate()
                .eq(InsOrder::getId, insOrder.getId())
                .set(InsOrder::getInsResult, inspectStatus));
        if (one.getIsFinish().equals(0)) {
            ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
                    .eq(IfsInventoryQuantity::getId, insOrder.getIfsInventoryId())
                    .set(IfsInventoryQuantity::getInspectStatus, inspectStatus));
            // ä¿®æ”¹ifs库存状态
            if (StringUtils.isBlank(toLocation)) {
                ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
                        .set(IfsInventoryQuantity::getIsFinish, 1)
                        .eq(IfsInventoryQuantity::getId, insOrder.getIfsInventoryId()));
            } else {
                ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
                        .set(IfsInventoryQuantity::getIsFinish, 1)
                        .set(IfsInventoryQuantity::getToLocation, toLocation)
                        .eq(IfsInventoryQuantity::getId, insOrder.getIfsInventoryId()));
            }
            threadPoolTaskExecutor.execute(() -> {
                // ä¼ä¸šå¾®ä¿¡é€šçŸ¥
                String message = "";
                message += "检测结果提交通知";
                message += "\n批次号: " + one.getUpdateBatchNo();
                message += "\n零件号: " + one.getPartNo();
                message += "\n零件描述: " + one.getPartDesc();
                message += "\n供应商名称: " + one.getSupplierName();
                message += "\n抵达数量: " + one.getQtyArrived().stripTrailingZeros().toPlainString() + one.getBuyUnitMeas();
                // å‘送企业inspectStatus信通知
                if (inspectStatus == 1) {
                    message += "\n检测结果: åˆæ ¼";
                } else {
                    message += "\n检测结果: ä¸åˆæ ¼";
                }
                WxCpUtils.informWebHook(wechatProperty.getExaminingUrl(), message);
            });
        }
    }
    /**
     * åˆ¤æ–­æ˜¯å¦æœ‰ä¸åˆæ ¼
     * @param insOrder
     * @return
     */
    @Override
    public Long getUnqualifiedCount(InsOrder insOrder) {
        Long unqualifiedCount = 0L;
        List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery()
                .eq(InsSample::getInsOrderId, insOrder.getId()));
        if (CollectionUtils.isNotEmpty(insSamples)) {
            unqualifiedCount = insProductMapper.selectCount(Wrappers.<InsProduct>lambdaQuery()
                    .in(InsProduct::getInsSampleId, insSamples.stream().map(InsSample::getId).collect(Collectors.toList()))
                    .eq(InsProduct::getInsResult, 0));
            // åˆ¤æ–­å¦‚果有不合格的检验项, åˆ¤æ–­æœ‰æ²¡æœ‰æ£€éªŒé¡¹å¤æµ‹, å¤æ ¸åˆæ ¼ä¹Ÿç®—合格通过
            if (!unqualifiedCount.equals(0L)) {
                List<InsProduct> insProducts = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
                        .in(InsProduct::getInsSampleId, insSamples.stream().map(InsSample::getId).collect(Collectors.toList()))
                        .eq(InsProduct::getInsResult, 0));
                boolean flag = true;
                for (InsProduct insProduct : insProducts) {
                    Long unqualifiedProductCount = insUnqualifiedRetestProductMapper.selectCount(Wrappers.<InsUnqualifiedRetestProduct>lambdaQuery()
                            .eq(InsUnqualifiedRetestProduct::getInsProductId, insProduct.getId())
                            .ne(InsUnqualifiedRetestProduct::getInsResult, 0));
                    if (unqualifiedProductCount != 2) {
                        flag = false;
                    }
                }
                if (flag) {
                    unqualifiedCount = 0L;
                }
            }
        }
        return unqualifiedCount;
    }
    /**
     * é€€å›žåˆ°æ£€éªŒä»»åŠ¡
     * @param id
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean sendBackTask(Integer id) {
        InsReport report = insReportMapper.selectById(id);
        // æ ¹æ®è®¢å•查询试验室
        String laboratory = insOrderMapper.selectLaboratoryByOrderId(report.getInsOrderId());
        // ä¿®æ”¹è®¢å•状态
        insOrderStateMapper.update(null, Wrappers.<InsOrderState>lambdaUpdate()
                .eq(InsOrderState::getInsOrderId, report.getInsOrderId())
                .eq(InsOrderState::getLaboratory, laboratory)
                .set(InsOrderState::getInsState, 4));
        Integer insSampleId = insSampleUserMapper.selectOne(Wrappers.<InsSampleUser>lambdaQuery()
                .eq(InsSampleUser::getInsSampleId, report.getInsOrderId())
                .orderByDesc(InsSampleUser::getId)
                .last("limit 1")).getId();
        insSampleUserMapper.deleteById(insSampleId);
        // ä¿®æ”¹æŠ¥å‘Šè¡Œä¸ºæœªæ˜¾ç¤º
        insReportMapper.update(null, Wrappers.<InsReport>lambdaUpdate()
                .eq(InsReport::getId, id)
                .set(InsReport::getIsPass, 0));
        return false;
    }
    /**
     * æŠ¥å‘ŠæŠ¥è¡¨å¯¼å‡º
     * @param dto
     * @param response
     */
    @Override
    public void reportAllExport(ReportPageDto dto, HttpServletResponse response) throws UnsupportedEncodingException {
        Integer createOrderUser = dto.getCreateOrderUser();
        String queryStatus = dto.getQueryStatus();
        dto.setQueryStatus(null);
        dto.setCreateOrderUser(null);
        List<InsReportExport> insReportExports = insReportMapper.reportAllExport(QueryWrappers.queryWrappers(dto),
                SecurityUtils.getUserId().intValue(),
                queryStatus,
                createOrderUser);
        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();
            //获取sheet0对象
            WriteSheet mainSheet = EasyExcel.writerSheet(0, "报告报表导出").head(InsReportExport.class).build();
            //向sheet0写入数据 ä¼ å…¥ç©ºlist这样只导出表头
            excelWriter.write(insReportExports, mainSheet);
            //关闭流
            excelWriter.finish();
        } catch (IOException e) {
            throw new RuntimeException("导出失败");
        }
    }
    /**
     * å…ˆä¿®æ”¹é‡‡è´­è®¢å•批次号, åŽè¿›è¡Œç§»åº“操作
     * @param one
     * @param toLocation
     */
    private void updaeBatch(IfsInventoryQuantity one, String toLocation) {
        if (one.getIsUpdateBatch().equals(0)) {
            // å…ˆä¿®æ”¹æ‰¹æ¬¡å·åŽè¿›è¡Œç§»åº“
            Map<String, Object> resultMap = new HashMap<>();
            List<Map<String, Object>> resultList = new ArrayList<>();
            Map<String, Object> map = new HashMap<>();
            map.put("ORDER_NO", one.getOrderNo()); // é‡‡è´­è®¢å•号
            map.put("LINE_NO", one.getLineNo()); // è¡Œå·
            map.put("RELEASE_NO", one.getReleaseNo()); // ä¸‹è¾¾å·
            map.put("RECEIPT_NO", one.getReceiptNo()); // æŽ¥æ”¶å·
            map.put("PART_NO", one.getPartNo()); //零件号
            map.put("CONFIGURATION_ID", one.getConfigurationId()); // é…ç½®æ ‡è¯†
            map.put("LOCATION_NO", one.getLocationNo()); // åº“位号
            map.put("LOT_BATCH_NO", one.getLotBatchNo());// æ‰¹æ¬¡å·
            map.put("NEW_LOT_BATCH_NO", one.getUpdateBatchNo()); // ç›®æ ‡æ‰¹æ¬¡å·
            map.put("SERIAL_NO", one.getSerialNo()); // åºåˆ—号
            map.put("ENG_CHG_LEVEL", one.getEngChgLevel()); // ç‰ˆæœ¬å·
            map.put("WAIV_DEV_REJ_NO", one.getWaivDevRejNo()); // wdr号
            map.put("ACTIVITY_SEQ", one.getActivitySeq()); // æ´»åŠ¨åºå·
            map.put("QTY_TO_CHANGE", one.getQtyArrived()); // å˜æ›´æ•°é‡
            resultList.add(map);
            resultMap.put("RECORD_ID", UUID.randomUUID().toString());
            resultMap.put("SYSCODE", "LIMS");
            resultMap.put("SYSMODEL", "修改采购订单批次号");
            resultMap.put("BATCH_INFO", resultList);
            Result result = ifsApiUtils.updateMoveReceiptLot(JSONUtil.toJsonStr(resultMap));
            if (result.getCode() != 200) {
                throw new ErrorException("IFS修改批次号失败: " + result.getMsg());
            }
            ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
                    .set(IfsInventoryQuantity::getIsUpdateBatch, 1)
                    .eq(IfsInventoryQuantity::getId, one.getId()));
        }
        Map<String, Object> moveResultMap = new HashMap<>();
        List<Map<String, Object>> moveResultList = new ArrayList<>();
        Map<String, Object> moveMap = new HashMap<>();
        moveMap.put("ORDER_NO", one.getOrderNo()); // é‡‡è´­è®¢å•号
        moveMap.put("LINE_NO", one.getLineNo());
        moveMap.put("RELEASE_NO", one.getReleaseNo());
        moveMap.put("RECEIPT_NO", one.getReceiptNo());
        moveMap.put("PART_NO", one.getPartNo());
        moveMap.put("QTY", one.getQtyArrived());
        moveMap.put("LOCATION_NO", one.getLocationNo());
        moveMap.put("TO_LOCATION_NO", toLocation);
        moveMap.put("LOT_BATCH_NO", one.getUpdateBatchNo());
        moveMap.put("SERIAL_NO", one.getSerialNo());
        moveMap.put("WAIV_DEV_REJ_NO", one.getWaivDevRejNo());
        moveMap.put("ENG_CHG_LEVEL", one.getEngChgLevel());
        moveMap.put("ACTIVITY_SEQ", one.getActivitySeq());
        moveResultList.add(moveMap);
        moveResultMap.put("RECORD_ID", UUID.randomUUID().toString());
        moveResultMap.put("SYSCODE", "LIMS");
        moveResultMap.put("SYSMODEL", "检验后移库");
        moveResultMap.put("BATCH_INFO", moveResultList);
        Result result1 = ifsApiUtils.moveReceipt(JSONUtil.toJsonStr(moveResultMap));
        if (result1.getCode() != 200) {
            throw new ErrorException("IFS检验后移库失败: " + result1.getMsg());
        }
    }
    /**
     * æ›¿æ¢æ®µè½æ–‡æœ¬
     * @param filePath docx解析对象
     * @param textMap éœ€è¦æ›¿æ¢çš„信息集合
     */
    public static void changeText(Map<String, String> textMap, String filePath) {
        try {
            FileInputStream stream = new FileInputStream(filePath);
            XWPFDocument document = new XWPFDocument(stream);
            List<XWPFTable> tables = document.getTables();
            for (XWPFTable table : tables) {
                for (XWPFTableRow row : table.getRows()) {
                    for (XWPFTableCell cell : row.getTableCells()) {
                        textMap.forEach((s, s2) -> {
                            if (cell.getText().equals(s)) {
                                XWPFParagraph paragraph = cell.getParagraphs().get(0);
                                XWPFRun oldRun = paragraph.getRuns().get(0);
                                // ä¿å­˜åŽŸæ ·å¼
                                String fontFamily = oldRun.getFontFamily();
                                int fontSize = oldRun.getFontSize();
                                String color = oldRun.getColor();
                                ParagraphAlignment alignment = paragraph.getAlignment();
                                // æ›¿æ¢å†…容
                                paragraph.removeRun(0); // ç§»é™¤åŽŸæœ‰çš„ run
                                XWPFRun newRun = paragraph.createRun();
                                newRun.setText(s2);
                                // åº”用原样式
                                newRun.setFontFamily(fontFamily);
                                newRun.setFontSize(fontSize);
                                newRun.setColor(color);
                                paragraph.setAlignment(alignment);
                            }
                        });
                    }
                }
            }
            FileOutputStream fileOutputStream = new FileOutputStream(filePath);
            document.write(fileOutputStream);
            fileOutputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new ErrorException(e.getMessage());
        }
    }
    /**
     * word转换pdf
     * @param path
     * @return
     */
    private String wordToPdfTemp(String path) {
        try {
            return wordToPdf(path, path.replace(".docx", "-临时.pdf"));
        } catch (Exception e) {
            throw new ErrorException("转换失败");
        }
    }
    private String wordToPdf(String wordPath, String pdfPath) {
        FileOutputStream os = null;
        try {
            //凭证 ä¸ç„¶åˆ‡æ¢åŽæœ‰æ°´å°
            InputStream is = new ClassPathResource("/lib/license.xml").getInputStream();
            License license = new License();
            license.setLicense(is);
            if (!license.getIsLicensed()) {
                log.info("License验证不通过...");
                return null;
            }
            //生成一个空的PDF文件
            File file;
            //判断是否是进厂报告
            file = new File(pdfPath);
            os = new FileOutputStream(file);
            //要转换的word文件
            com.aspose.words.Document doc = new com.aspose.words.Document(wordPath);
            doc.save(os, SaveFormat.PDF);
            return file.getName();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsSampleReceiptServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,165 @@
package com.ruoyi.inspect.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.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.inspect.dto.SampleReceiptActionDto;
import com.ruoyi.inspect.dto.SampleReceiptPageDto;
import com.ruoyi.inspect.dto.SampleReceiptQueryDto;
import com.ruoyi.inspect.mapper.InsOrderMapper;
import com.ruoyi.inspect.mapper.InsOrderStandardTemplateMapper;
import com.ruoyi.inspect.mapper.InsProductMapper;
import com.ruoyi.inspect.mapper.InsSampleMapper;
import com.ruoyi.inspect.mapper.InsSampleReceiptMapper;
import com.ruoyi.inspect.mapper.InsSampleUserMapper;
import com.ruoyi.inspect.pojo.InsOrder;
import com.ruoyi.inspect.pojo.InsOrderStandardTemplate;
import com.ruoyi.inspect.pojo.InsProduct;
import com.ruoyi.inspect.pojo.InsSample;
import com.ruoyi.inspect.pojo.InsSampleReceipt;
import com.ruoyi.inspect.pojo.InsSampleUser;
import com.ruoyi.inspect.service.InsOrderService;
import com.ruoyi.inspect.service.InsOrderStateService;
import com.ruoyi.inspect.service.InsSampleReceiptService;
import com.ruoyi.system.mapper.UserMapper;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
@Service
@AllArgsConstructor
public class InsSampleReceiptServiceImpl extends ServiceImpl<InsSampleReceiptMapper, InsSampleReceipt>
        implements InsSampleReceiptService {
    private final InsSampleReceiptMapper receiptMapper;
    private final InsOrderMapper insOrderMapper;
    private final InsOrderStandardTemplateMapper insOrderStandardTemplateMapper;
    private final InsSampleMapper insSampleMapper;
    private final InsProductMapper insProductMapper;
    private final InsSampleUserMapper insSampleUserMapper;
    private final InsOrderStateService insOrderStateService;
    private final InsOrderService insOrderService;
    private final UserMapper userMapper;
    @Override
    public com.baomidou.mybatisplus.core.metadata.IPage<SampleReceiptPageDto> page(Page<?> page, SampleReceiptQueryDto query) {
        return receiptMapper.selectPage(page, query);
    }
    @Override
    public SampleReceiptPageDto detail(Integer id) {
        return receiptMapper.selectDetail(id);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void submit(SampleReceiptActionDto dto) {
        if (dto == null || dto.getReceiptId() == null || dto.getMainInspectorId() == null) {
            throw new ErrorException("请选择主检验人");
        }
        InsSampleReceipt receipt = receiptMapper.selectForUpdate(dto.getReceiptId());
        ensurePending(receipt);
        InsOrder order = insOrderMapper.selectById(receipt.getInsOrderId());
        if (order == null || !Integer.valueOf(1).equals(order.getState())) {
            throw new ErrorException("该委托当前状态不允许样品接收");
        }
        List<InsSample> samples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery()
                .eq(InsSample::getInsOrderId, order.getId()).orderByAsc(InsSample::getId));
        if (samples.size() != 1 || !samples.get(0).getId().equals(receipt.getInsSampleId())) {
            throw new ErrorException("该委托的样品数量异常,请检查下单数据");
        }
        InsSample sample = samples.get(0);
        // åªèµ°æ–°èšç›´ç»‘模板流程:委托单必须已绑定原始记录模板(下单时生成订单模板快照)
        Long snapshotCount = insOrderStandardTemplateMapper.selectCount(Wrappers.<InsOrderStandardTemplate>lambdaQuery()
                .eq(InsOrderStandardTemplate::getInsOrderId, order.getId()));
        if (snapshotCount == 0) {
            throw new ErrorException("该委托未绑定原始记录模板,不能提交检验");
        }
        Long productCount = insProductMapper.selectCount(Wrappers.<InsProduct>lambdaQuery()
                .eq(InsProduct::getInsSampleId, sample.getId()).eq(InsProduct::getState, 1));
        if (productCount == 0) {
            throw new ErrorException("该委托未绑定检验项目,不能提交检验");
        }
        if (userMapper.selectById(dto.getMainInspectorId()) == null) {
            throw new ErrorException("主检验人不存在或已停用");
        }
        if (insOrderStateService.count(Wrappers.lambdaQuery(com.ruoyi.inspect.pojo.InsOrderState.class)
                .eq(com.ruoyi.inspect.pojo.InsOrderState::getInsOrderId, order.getId())) > 0
                || insSampleUserMapper.selectCount(Wrappers.<InsSampleUser>lambdaQuery()
                .eq(InsSampleUser::getInsSampleId, order.getId())) > 0) {
            throw new ErrorException("该委托已进入检验任务,不能重复提交");
        }
        String appointed = LocalDateTime.now().plusHours(insProductMapper.selectOrderManDay(order.getId()))
                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        insOrderService.upInsOrder(order.getId(), sample.getId(), appointed, dto.getMainInspectorId(), null);
        receipt.setStatus(1);
        receipt.setMainInspectorId(dto.getMainInspectorId());
        receipt.setReceiveUserId(SecurityUtils.getUserId().intValue());
        receipt.setReceiveTime(LocalDateTime.now());
        receipt.setSubmitTime(LocalDateTime.now());
        receiptMapper.updateById(receipt);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void reject(SampleReceiptActionDto dto) {
        if (dto == null || dto.getReceiptId() == null || StringUtils.isBlank(dto.getRemark())) {
            throw new ErrorException("请填写拒收备注");
        }
        if (dto.getRemark().trim().length() > 500) {
            throw new ErrorException("拒收备注不能超过500个字符");
        }
        InsSampleReceipt receipt = receiptMapper.selectForUpdate(dto.getReceiptId());
        ensurePending(receipt);
        if (insOrderStateService.count(Wrappers.lambdaQuery(com.ruoyi.inspect.pojo.InsOrderState.class)
                .eq(com.ruoyi.inspect.pojo.InsOrderState::getInsOrderId, receipt.getInsOrderId())) > 0) {
            throw new ErrorException("该委托已进入检验任务,不能拒收");
        }
        receipt.setStatus(2);
        receipt.setRejectRemark(dto.getRemark().trim());
        receipt.setReceiveUserId(SecurityUtils.getUserId().intValue());
        receipt.setReceiveTime(LocalDateTime.now());
        receiptMapper.updateById(receipt);
        InsOrder order = new InsOrder();
        order.setId(receipt.getInsOrderId());
        order.setState(5);
        insOrderMapper.updateById(order);
    }
    private void ensurePending(InsSampleReceipt receipt) {
        if (receipt == null || !Integer.valueOf(0).equals(receipt.getStatus())) {
            throw new ErrorException("该样品接收记录已被处理,请刷新后重试");
        }
    }
    @Override
    public void export(SampleReceiptQueryDto query, HttpServletResponse response) {
        List<SampleReceiptPageDto> list = receiptMapper.selectExportList(query);
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("UTF-8");
        try {
            String fileName = URLEncoder.encode("样品接收导出", "UTF-8");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())
                    .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
            WriteSheet sheet = EasyExcel.writerSheet(0, "样品接收导出").head(SampleReceiptPageDto.class).build();
            excelWriter.write(list, sheet);
            excelWriter.finish();
        } catch (IOException e) {
            throw new RuntimeException("导出失败");
        }
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsSampleServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package com.ruoyi.inspect.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.inspect.mapper.InsSampleMapper;
import com.ruoyi.inspect.pojo.InsSample;
import com.ruoyi.inspect.service.InsSampleService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author Administrator
* @description é’ˆå¯¹è¡¨ã€ins_sample(检验样品)】的数据库操作Service实现
* @createDate 2024-03-14 17:14:57
*/
@Service
public class InsSampleServiceImpl extends ServiceImpl<InsSampleMapper, InsSample>
    implements InsSampleService {
    /**
     * æ ¹æ®è®¢å•id查询样品
     * @param insOrderId
     * @return
     */
    @Override
    public List<InsSample> getSampleByOrderId(Integer insOrderId) {
        return baseMapper.getSampleByOrderId(insOrderId);
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsUnqualifiedHandlerFileServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,76 @@
package com.ruoyi.inspect.service.impl;
import cn.hutool.core.lang.UUID;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.inspect.mapper.InsUnqualifiedHandlerFileMapper;
import com.ruoyi.inspect.pojo.InsUnqualifiedHandlerFile;
import com.ruoyi.inspect.service.InsUnqualifiedHandlerFileService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
/**
* @author 27233
* @description é’ˆå¯¹è¡¨ã€ins_unqualified_handler_file(不合格处理附件记录表)】的数据库操作Service实现
* @createDate 2024-07-31 13:38:38
*/
@Service
@Slf4j
public class InsUnqualifiedHandlerFileServiceImpl extends ServiceImpl<InsUnqualifiedHandlerFileMapper, InsUnqualifiedHandlerFile>
    implements InsUnqualifiedHandlerFileService {
    @Value("${wordUrl}")
    private String wordUrl;
    @Value("${file.path}")
    private String imgUrl;
    @Override
    public InsUnqualifiedHandlerFile uploadFile(Long handlerId, MultipartFile file) {
        String urlString;
        String pathName;
        String path;
        String prefix;
        String filename = file.getOriginalFilename();
        String contentType = file.getContentType();
        InsUnqualifiedHandlerFile unqualifiedHandlerFile = new InsUnqualifiedHandlerFile();
//        unqualifiedHandlerFile.setUnqualifiedId(handlerId);
        unqualifiedHandlerFile.setFileName(filename);
        if (contentType != null && contentType.startsWith("image/")) {
            // æ˜¯å›¾ç‰‡
            path = imgUrl;
            prefix = "/image/";
            unqualifiedHandlerFile.setType(1);
        } else {
            // æ˜¯æ–‡ä»¶
            path = wordUrl;
            prefix = "/word/";
            unqualifiedHandlerFile.setType(2);
        }
        try {
            File realpath = new File(path);
            if (!realpath.exists()) {
                realpath.mkdirs();
            }
            pathName = UUID.randomUUID() + "_" + file.getOriginalFilename();
            urlString = realpath + "/" + pathName;
            file.transferTo(new File(urlString));
            unqualifiedHandlerFile.setFileUrl(pathName);
            baseMapper.insert(unqualifiedHandlerFile);
            return unqualifiedHandlerFile;
        } catch (Exception e) {
            e.printStackTrace();
            log.error("附件上传错误");
            throw new ErrorException(e.getMessage());
        }
    }
}
在上述文件截断后对比
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsUnqualifiedHandlerServiceImpl.java inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsUnqualifiedRetestProductServiceImpl.java inspect-server/src/main/java/com/ruoyi/inspect/service/impl/OutsourcingFinishProductInspectionServiceImpl.java inspect-server/src/main/java/com/ruoyi/inspect/service/impl/RawMaterialOrderServiceImpl.java inspect-server/src/main/java/com/ruoyi/inspect/service/impl/RawMaterialOrderTemplateServiceImpl.java inspect-server/src/main/java/com/ruoyi/inspect/service/impl/ReportServiceImpl.java inspect-server/src/main/java/com/ruoyi/inspect/service/impl/SpotCheckQuarterItemServiceImpl.java inspect-server/src/main/java/com/ruoyi/inspect/service/impl/SpotCheckYearItemServiceImpl.java inspect-server/src/main/java/com/ruoyi/inspect/service/impl/WarehouseCellServiceImpl.java inspect-server/src/main/java/com/ruoyi/inspect/service/impl/WarehouseServiceImpl.java inspect-server/src/main/java/com/ruoyi/inspect/task/RawMaterIalSchedule.java inspect-server/src/main/java/com/ruoyi/inspect/util/HackLoopTableRenderPolicy.java inspect-server/src/main/java/com/ruoyi/inspect/util/PreserveReportPicturePlaceholderHandler.java inspect-server/src/main/java/com/ruoyi/inspect/util/ReportSignaturePictureUtils.java inspect-server/src/main/java/com/ruoyi/inspect/util/UserUtils.java inspect-server/src/main/java/com/ruoyi/inspect/util/XWPFDocumentUtils.java inspect-server/src/main/java/com/ruoyi/inspect/vo/DeviationAnalyzeVo.java inspect-server/src/main/java/com/ruoyi/inspect/vo/IfsOrderVO.java inspect-server/src/main/java/com/ruoyi/inspect/vo/InsOrderPlanTaskSwitchVo.java inspect-server/src/main/java/com/ruoyi/inspect/vo/InsOrderPlanVO.java inspect-server/src/main/java/com/ruoyi/inspect/vo/InsOrderPrintingVo.java inspect-server/src/main/java/com/ruoyi/inspect/vo/InsOrderTemplateDetailVo.java inspect-server/src/main/java/com/ruoyi/inspect/vo/InsSampleUserVO.java inspect-server/src/main/java/com/ruoyi/inspect/vo/OrderTemplateSummaryVo.java inspect-server/src/main/java/com/ruoyi/inspect/vo/ProductVo.java inspect-server/src/main/java/com/ruoyi/inspect/vo/RawMaterialSupplierVo.java inspect-server/src/main/java/com/ruoyi/inspect/vo/RawProductAnalysisVo.java inspect-server/src/main/java/com/ruoyi/inspect/vo/SampleDefectsChildrenVo.java inspect-server/src/main/java/com/ruoyi/inspect/vo/SampleDefectsFatherVo.java inspect-server/src/main/java/com/ruoyi/inspect/vo/SampleVo.java inspect-server/src/main/java/com/ruoyi/inspect/vo/TemplateConditionVo.java inspect-server/src/main/java/com/ruoyi/inspect/vo/UnqualifiedHandlerVO.java inspect-server/src/main/resources/lib/license.xml inspect-server/src/main/resources/mapper/DataAnalysisMapper.xml inspect-server/src/main/resources/mapper/IfsPartPropsRecordMapper.xml inspect-server/src/main/resources/mapper/IfsSplitOrderRecordMapper.xml inspect-server/src/main/resources/mapper/InsOrderDeviceRecordMapper.xml inspect-server/src/main/resources/mapper/InsOrderFileMapper.xml inspect-server/src/main/resources/mapper/InsOrderMapper.xml inspect-server/src/main/resources/mapper/InsOrderRatesMapper.xml inspect-server/src/main/resources/mapper/InsOrderStateMapper.xml inspect-server/src/main/resources/mapper/InsOrderTemplateDeviceMapper.xml inspect-server/src/main/resources/mapper/InsOrderTemplateMapper.xml inspect-server/src/main/resources/mapper/InsProductDeviationWarningDetailMapper.xml inspect-server/src/main/resources/mapper/InsProductDeviationWarningMapper.xml inspect-server/src/main/resources/mapper/InsProductMapper.xml inspect-server/src/main/resources/mapper/InsProductResultMapper.xml inspect-server/src/main/resources/mapper/InsProductUserMapper.xml inspect-server/src/main/resources/mapper/InsReportMapper.xml inspect-server/src/main/resources/mapper/InsSampleMapper.xml inspect-server/src/main/resources/mapper/InsSampleReceiptMapper.xml inspect-server/src/main/resources/mapper/InsSampleUserMapper.xml inspect-server/src/main/resources/mapper/InsUnqualifiedHandlerMapper.xml inspect-server/src/main/resources/mapper/InsUnqualifiedRetestProductMapper.xml inspect-server/src/main/resources/mapper/RawMaterialOrderTemplateMapper.xml inspect-server/src/main/resources/mapper/SpotCheckQuarterItemMapper.xml inspect-server/src/main/resources/mapper/SpotCheckQuarterMapper.xml inspect-server/src/main/resources/mapper/SpotCheckYearMapper.xml inspect-server/src/main/resources/mapper/WarehouseCellMapper.xml inspect-server/src/main/resources/mapper/WarehouseHistoryMapper.xml inspect-server/src/main/resources/mapper/WarehouseMapper.xml inspect-server/src/main/resources/static/detection-report-template-v2.docx inspect-server/src/main/resources/static/detection-report-template.docx inspect-server/src/main/resources/static/factory_verify.docx inspect-server/src/main/resources/static/inspection-report-template-v2.docx inspect-server/src/main/resources/static/report-template.docx inspect-server/src/main/resources/static/small-detection-template.docx inspect-server/src/main/resources/static/small-report-template.docx inspect-server/src/main/resources/static/small-wg-detection-template.docx inspect-server/src/main/resources/static/small-wg-report-template.docx inspect-server/src/main/resources/static/split_order_import_template.xlsx inspect-server/src/main/resources/static/spot_check_quarter.docx inspect-server/src/main/resources/static/spot_check_year.docx performance-server/src/main/java/com/ruoyi/performance/controller/AuxiliaryCorrectionHoursController.java performance-server/src/main/java/com/ruoyi/performance/controller/AuxiliaryOriginalHoursController.java performance-server/src/main/java/com/ruoyi/performance/controller/AuxiliaryOutputWorkingHoursController.java performance-server/src/main/java/com/ruoyi/performance/controller/AuxiliaryWorkingHoursController.java performance-server/src/main/java/com/ruoyi/performance/controller/AuxiliaryWorkingHoursDayController.java performance-server/src/main/java/com/ruoyi/performance/controller/PerformanceShiftController.java performance-server/src/main/java/com/ruoyi/performance/controller/ShiftTimeController.java performance-server/src/main/java/com/ruoyi/performance/dto/AuxiliaryAllDto.java performance-server/src/main/java/com/ruoyi/performance/dto/AuxiliaryOriginalHoursLookDto.java performance-server/src/main/java/com/ruoyi/performance/dto/AuxiliaryOutputWorkingHoursTemporaryDto.java performance-server/src/main/java/com/ruoyi/performance/mapper/AuxiliaryCorrectionHoursMapper.java performance-server/src/main/java/com/ruoyi/performance/mapper/AuxiliaryOutputWorkingHoursMapper.java performance-server/src/main/java/com/ruoyi/performance/mapper/AuxiliaryOutputWorkingHoursTemporaryMapper.java performance-server/src/main/java/com/ruoyi/performance/mapper/AuxiliaryWorkingHoursDayMapper.java performance-server/src/main/java/com/ruoyi/performance/mapper/AuxiliaryWorkingHoursMapper.java performance-server/src/main/java/com/ruoyi/performance/mapper/PerformanceShiftMapper.java performance-server/src/main/java/com/ruoyi/performance/pojo/AuxiliaryOutputWorkingHoursTemporary.java performance-server/src/main/java/com/ruoyi/performance/service/AuxiliaryOutputWorkingHoursTemporaryService.java performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryCorrectionHoursServiceImpl.java performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryOriginalHoursServiceImpl.java performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryOutputWorkingHoursServiceImpl.java performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryOutputWorkingHoursTemporaryServiceImpl.java performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryWorkingHoursDayServiceImpl.java performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryWorkingHoursServiceImpl.java performance-server/src/main/java/com/ruoyi/performance/utils/CustomerDoubleSerialize.java performance-server/src/main/resources/mapper/AuxiliaryOutputWorkingHoursMapper.xml performance-server/src/main/resources/mapper/AuxiliaryOutputWorkingHoursTemporaryMapper.xml performance-server/src/main/resources/mapper/AuxiliaryWorkingHoursDayMapper.xml performance-server/src/main/resources/mapper/AuxiliaryWorkingHoursMapper.xml performance-server/src/main/resources/mapper/PerformanceShiftMapper.xml ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/User.java ruoyi-common/src/main/java/com/ruoyi/common/utils/QueryWrappers.java ruoyi-framework/src/main/java/com/ruoyi/framework/exception/ErrorException.java ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictTypeMapper.java ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserMapper.java ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java ruoyi-system/src/main/java/com/ruoyi/system/service/UserService.java ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserServiceImpl.java ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml ruoyi-system/src/main/resources/mapper/system/UserMapper.xml