cuilei
2025-06-11 cd00884c3db8fa6808b3b5949ab1a2b1459d6bdc
Merge remote-tracking branch 'origin/master'
已重命名21个文件
已添加24个文件
已修改66个文件
已删除1个文件
3519 ■■■■■ 文件已修改
lxzn-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-boot-base-core/src/main/java/org/jeecg/config/filter/WebsocketFilter.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/controller/DocRelativeController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/DirectoryValidator.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileListener.java 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileMonitorBootstrap.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileMonitorConfig.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/MultiPathMonitor.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/xml/DocInfoMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IDocInfoService.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/CutterServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DeviceGroupServiceImpl.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java 135 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocRelativeServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/GuideCardBatchServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessStreamServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/controller/AssignFileStreamController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/IAssignFileStreamService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/AssignFileStreamServiceImpl.java 81 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/dto/MaintenanceStandardImport.java 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/dto/SecondMaintenanceStandardImport.java 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/dto/ThirdMaintenanceStandardImport.java 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/dto/WeekMaintenanceStandardImport.java 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamInspectionOrderDetail.java 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamMaintenanceStandardDetail.java 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamSecondMaintenanceOrderDetail.java 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamThirdMaintenanceOrderDetail.java 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamWeekMaintenanceOrderDetail.java 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/EamRepairOrderMapper.java 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/EamReportRepairMapper.java 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/xml/EamRepairOrderMapper.xml 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/xml/EamReportRepairMapper.xml 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/request/EamRepairOrderQuery.java 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/request/EamRepairOrderRequest.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/request/EamRepairOrderResponse.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/request/EamReportRepairQuery.java 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/IEamRepairOrderService.java 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/IEamReportRepairService.java 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/impl/EamRepairOrderServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/impl/EamReportRepairServiceImpl.java 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/util/DateUtils.java 1089 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/EquipmentMapper.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentMapper.xml 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentMapper.xml 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IEquipmentService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IMdcAlarmInfoService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentServiceImpl.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/pom.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/board/controller/DtBoardController.java 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/IDtBoardService.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/impl/DtBoardServiceImpl.java 340 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquAlarm.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquDowntimeInfo.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquOeeMonth.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquOperation.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquRunInfo.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquStatus.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquUtilRate.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquUtilRateMonth.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcDowntimeOperatorController.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcDowntimeReasonController.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcDowntime.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningOverallEquipmentEfficiencyJob.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/ScanDowntimeJob.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/WebsocketPushEquStatusJob.java 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcAlarmInfoMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcDowntimeMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcDowntimeOperatorMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentStatisticalInfoMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcOeeInfoMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcAlarmInfoMapper.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDowntimeMapper.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDowntimeOperatorMapper.xml 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentStatisticalInfoMapper.xml 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcOeeInfoMapper.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcDowntimeOperatorService.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcDowntimeService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentStatisticalInfoService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcOeeInfoService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcAlarmInfoServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcDowntimeServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcDowntimeServiceOperatorImpl.java 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentStatisticalInfoServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcOeeInfoServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcDowntimeVo.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/SplitDowntimeVo.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/cas/controller/CasClientController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/MdcProductionMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/MdcProductionMapper.xml 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/IMdcProductionService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/MdcProductionServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/BaseToolsController.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/BaseTools.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaBladeVo.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaCommonToolVo.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaHolesToolsVo.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaMillToolVo.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaThreadingToolVo.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaTurningToolsVo.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/BaseToolsMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/InboundOrderServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java
@@ -598,6 +598,11 @@
    String DICT_MDC_STAFF_TEAM = "mdc_staff_team";
    /**
     * é©±åŠ¨å‚æ•°å•ä½å­—å…¸ç¼–å·
     */
    String DICT_EQUIPMENT_RUN_UNIT = "equipment_run_unit";
    /**
     * åŠ ç­æ•°æ® è‡ªåŠ¨è®¡ç®—æ ‡è¯† 1(是) 2(否)
     */
    Integer AUTO_FLAG_Y = 1;
@@ -612,8 +617,11 @@
     */
    String CLOSE_TYPE_0 = "0";
    String CLOSE_TYPE_1 = "1";
    String ORG_TYPE = "3";
    /**
     * äº§çº¿ç±»åž‹ 1一级部门 2子部门 3子部门
     */
    String ORG_TYPE_2 = "2";
    String ORG_TYPE_3 = "3";
    Integer SHIFT_TYPE_1 = 1;
    Integer SHIFT_TYPE_2 = 2;
lxzn-boot-base-core/src/main/java/org/jeecg/config/filter/WebsocketFilter.java
@@ -14,6 +14,7 @@
/**
 * websocket å‰ç«¯å°†token放到子协议里传入 ä¸ŽåŽç«¯å»ºç«‹è¿žæŽ¥æ—¶éœ€è¦ç”¨åˆ°http协议,此处用于校验token的有效性
 *
 * @Author taoYan
 * @Date 2022/4/21 17:01
 **/
@@ -34,20 +35,22 @@
        if (redisUtil == null) {
            redisUtil = SpringContextUtils.getBean(RedisUtil.class);
        }
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        String token = request.getHeader(TOKEN_KEY);
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        if (request.getHeader(TOKEN_KEY) != null) {
            String token = request.getHeader(TOKEN_KEY);
        log.debug("Websocket连接 Token安全校验,Path = {},token:{}", request.getRequestURI(), token);
            log.debug("Websocket连接 Token安全校验,Path = {},token:{}", request.getRequestURI(), token);
        try {
            TokenUtils.verifyToken(token, commonApi, redisUtil);
        } catch (Exception exception) {
            //log.error("Websocket连接 Token安全校验失败,IP:{}, Token:{}, Path = {},异常:{}", oConvertUtils.getIpAddrByRequest(request), token, request.getRequestURI(), exception.getMessage());
            log.debug("Websocket连接 Token安全校验失败,IP:{}, Token:{}, Path = {},异常:{}", oConvertUtils.getIpAddrByRequest(request), token, request.getRequestURI(), exception.getMessage());
            return;
            try {
                TokenUtils.verifyToken(token, commonApi, redisUtil);
            } catch (Exception exception) {
                //log.error("Websocket连接 Token安全校验失败,IP:{}, Token:{}, Path = {},异常:{}", oConvertUtils.getIpAddrByRequest(request), token, request.getRequestURI(), exception.getMessage());
                log.debug("Websocket连接 Token安全校验失败,IP:{}, Token:{}, Path = {},异常:{}", oConvertUtils.getIpAddrByRequest(request), token, request.getRequestURI(), exception.getMessage());
                return;
            }
            HttpServletResponse response = (HttpServletResponse) servletResponse;
            response.setHeader(TOKEN_KEY, token);
        }
        HttpServletResponse response = (HttpServletResponse)servletResponse;
        response.setHeader(TOKEN_KEY, token);
        filterChain.doFilter(servletRequest, servletResponse);
    }
lxzn-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java
@@ -99,6 +99,7 @@
        filterChainDefinitionMap.put("/sys/getQrcodeToken/**", "anon"); //监听扫码
        filterChainDefinitionMap.put("/sys/checkAuth", "anon"); //授权接口排除
        filterChainDefinitionMap.put("/msi/**", "anon"); //集成接口
        filterChainDefinitionMap.put("/board/dtBoard/**", "anon"); //数字孪生看板接口排除
        filterChainDefinitionMap.put("/", "anon");
        filterChainDefinitionMap.put("/doc.html", "anon");
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/controller/DocRelativeController.java
@@ -5,7 +5,6 @@
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.modules.dnc.entity.DeviceInfo;
import org.jeecg.modules.dnc.entity.DocRelative;
import org.jeecg.modules.dnc.response.CommonCode;
import org.jeecg.modules.dnc.response.QueryListResponseResult;
@@ -30,7 +29,7 @@
    @ApiOperation(value = "设备关联文档表-删除设备下的文档接口", notes = "设备关联文档表-删除设备下的文档接口")
    @DeleteMapping("/delete/device/{docId}/{deviceId}")
    public ResponseResult deleteDocByDeviceId(@PathVariable("docId") String docId, @PathVariable("deviceId") String deviceId) {
        boolean b = relativeService.deleteDocByAttr(docId, 4, deviceId);
        boolean b = relativeService.deleteDocByAttr(docId, 7, deviceId);
        if(b)
            return new ResponseResult(CommonCode.SUCCESS);
        return new ResponseResult(CommonCode.FAIL);
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/DirectoryValidator.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package org.jeecg.modules.dnc.listener;
import java.io.File;
import java.util.List;
public class DirectoryValidator {
    public static void validatePaths(List<String> paths) {
        //根据配置的目录进行校验,可以修改yml文件对应的监控目录来改变校验数量
        if (paths == null || paths.size() < 3) {
            throw new IllegalArgumentException("必须配置三个监控目录");
        }
        for (String path : paths) {
            File dir = new File(path);
            if (!dir.exists() || !dir.isDirectory()) {
                throw new IllegalArgumentException("无效的监控目录: " + path);
            }
            if (!dir.canRead()) {
                throw new SecurityException("目录不可读: " + path);
            }
        }
    }
}
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,115 @@
package org.jeecg.modules.dnc.listener;
import org.apache.commons.io.monitor.FileAlterationListener;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.jeecg.common.util.FileUtil;
import org.jeecg.modules.dnc.service.IDocInfoService;
import org.jeecg.modules.dnc.utils.file.FileUtilS;
import org.jeecg.modules.message.enums.DeployEnum;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.io.File;
import java.util.Objects;
@Component
public class FileListener implements FileAlterationListener {
    private static final Logger log = LoggerFactory.getLogger(FileListener.class);
    @Value("${deploy.deployType}")
    private String deployType;    //工控网/涉密网部署 0为工控网 1为涉密网
    @Autowired
    private IDocInfoService docInfoService;  // æ–‡æ¡£æœåŠ¡
    @Override
    public void onStart(FileAlterationObserver observer) {
        log.info("开始监听目录: {}", observer.getDirectory().getAbsolutePath());
    }
    @Override
    public void onDirectoryCreate(File directory) {
        log.info("[目录创建]: {}", directory.getAbsolutePath());
    }
    @Override
    public void onDirectoryChange(File directory) {
        log.info("[目录修改]: {}", directory.getAbsolutePath());
    }
    @Override
    public void onDirectoryDelete(File directory) {
        log.info("[目录删除]: {}", directory.getAbsolutePath());
    }
    @Override
    public void onFileCreate(File file) {
        String filePath = file.getAbsolutePath();
        log.info("[新建]: {}", filePath);
        if (DeployEnum.GW.getCode().equals(deployType)) {
            //工控网解析涉密网传过来的NC文件与nc文件进行解析
            if (filePath.startsWith("D:\\hy_test\\ncFile")) {
                handleIndustrialDocFile(file);
            }
        }else {
            //涉密网解析工控网传过来的NC文件与nc文件进行解析(程序回传)
            if (filePath.startsWith("D:\\hy_test\\ncFile")) {
                handleSecretDocFile(file);
            }
        }
    }
    @Override
    public void onFileChange(File file) {
        log.info("[修改]: {}", file.getAbsolutePath());
    }
    @Override
    public void onFileDelete(File file) {
        log.info("[删除]: {}", file.getAbsolutePath());
    }
    @Override
    public void onStop(FileAlterationObserver observer) {
        log.info("结束监听目录: {}", observer.getDirectory().getAbsolutePath());
    }
    /**
     * å·¥æŽ§ç½‘解析涉密网传过来的NC文件与nc文件进行解析
     * @param file
     */
    private void handleIndustrialDocFile(File file) {
        log.info("工控网解析涉密网传过来的NC文件与nc文件进行解析: {}", file.getAbsolutePath());
        try {
            if (Objects.equals(FileUtil.getFileSuffix(file.getName()), "nc")) {
                boolean success = docInfoService.addDocInfoAnalysisGwNcService(file.getAbsolutePath(), file);
                if (success) {
                    FileUtilS.copyFileRec(file.getAbsolutePath());
                    FileUtilS.fileRecDelete(file.getAbsolutePath());
                }
            }else if (Objects.equals(FileUtil.getFileSuffix(file.getName()), "txt")) {
                //todo æ˜¯å¦è§£æžå·¥ä½œæµæ“ä½œ
            }
        } catch (Exception e) {
            log.error("工控网解析涉密网传过来的NC文件与nc文件进行解析: {}", e.getMessage());
        }
    }
    /**
     * æ¶‰å¯†ç½‘解析工控网传过来的NC文件与nc文件进行解析(程序回传)
     * @param file
     */
    private void handleSecretDocFile(File file) {
        log.info("涉密网解析工控网传过来的NC文件与nc文件进行解析: {}", file.getAbsolutePath());
        try {
            boolean b= docInfoService.addDocInfoAnalysisSmwNcService(file.getAbsolutePath(), file);
        }catch (Exception e) {
            log.error("涉密网解析工控网传过来的NC文件与nc文件进行解析: {}", e.getMessage());
        }
    }
}
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileMonitorBootstrap.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,53 @@
package org.jeecg.modules.dnc.listener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.web.servlet.ServletContextInitializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FileMonitorBootstrap implements ApplicationRunner {
    private MultiPathMonitor monitor;
    @Autowired
    private FileMonitorConfig config;
    @Autowired
    private FileListener listener;
    @Bean
    public MultiPathMonitor fileMonitor() {
        return new MultiPathMonitor(
                config.getPaths(),
                config.getInterval(),
                listener
        );
    }
    @Override
    public void run(ApplicationArguments args) throws Exception {
        monitor = fileMonitor();
        monitor.start();
    }
    // åœ¨åº”用关闭时停止监控
    @Bean
    public ServletContextInitializer stopMonitorOnShutdown() {
        return servletContext -> {
            servletContext.addListener(new javax.servlet.ServletContextListener() {
                @Override
                public void contextDestroyed(javax.servlet.ServletContextEvent sce) {
                    try {
                        if (monitor != null) {
                            monitor.stop();
                        }
                    } catch (Exception e) {
                        System.err.println("停止监控时出错: " + e.getMessage());
                    }
                }
            });
        };
    }
}
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileMonitorConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package org.jeecg.modules.dnc.listener;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Setter
@Getter
@Component
@ConfigurationProperties(prefix = "file.monitor")
public class FileMonitorConfig {
    private List<String> paths = new ArrayList<>();
    private long interval = 10000L; // é»˜è®¤10秒
}
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/MultiPathMonitor.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
package org.jeecg.modules.dnc.listener;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.util.List;
public class MultiPathMonitor {
    private static final Logger log = LoggerFactory.getLogger(MultiPathMonitor.class);
    private final List<String> paths;
    private final FileListener listener;
    private final long interval;
    private final FileAlterationMonitor monitor;
    public MultiPathMonitor(List<String> paths, long interval, FileListener listener) {
        // éªŒè¯ç›®å½•
        DirectoryValidator.validatePaths(paths);
        this.paths = paths;
        this.interval = interval;
        this.listener = listener;
        this.monitor = new FileAlterationMonitor(interval);
    }
    public void start() {
        // ä¸ºæ¯ä¸ªè·¯å¾„创建独立的观察者
        paths.forEach(path -> {
            FileAlterationObserver observer = new FileAlterationObserver(new File(path));
            observer.addListener(listener);
            monitor.addObserver(observer);
            log.info("开始监控目录: {}", path);
        });
        try {
            monitor.start();
            log.info("文件监控器已启动,监控目录数量: {}", paths.size());
        } catch (Exception e) {
            log.error("监控启动失败", e);
            throw new RuntimeException("监控启动失败", e);
        }
    }
    public void stop() throws Exception {
        if (monitor != null) {
            monitor.stop();
            log.info("文件监控器已停止");
        }
    }
    // åŠ¨æ€æ·»åŠ æ–°ç›®å½•
    public void addMonitorPath(String newPath) {
        File dir = new File(newPath);
        if (!dir.exists() || !dir.isDirectory() || !dir.canRead()) {
            log.error("无法添加无效目录: {}", newPath);
            return;
        }
        FileAlterationObserver newObserver = new FileAlterationObserver(dir);
        newObserver.addListener(listener);
        monitor.addObserver(newObserver);
        paths.add(newPath);
        log.info("新增监控目录: {}", newPath);
    }
}
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/xml/DocInfoMapper.xml
@@ -66,6 +66,7 @@
        ,u.doc_status
        ,u.publish_file_id
        ,u.publish_version
        ,u.doc_dispatch_status
        ,u.description
        ,u.CREATE_TIME
        ,u.create_by
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IDocInfoService.java
@@ -14,6 +14,7 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.List;
public interface IDocInfoService extends IService<DocInfo> {
@@ -47,6 +48,28 @@
     */
    boolean addDocInfoRec(String pathFile,File fileRec);
    /**
     * è§£æžNC文档通用方法(工控解析涉密)
     * @param pathFile,fileRec
     * @return
     */
    boolean addDocInfoAnalysisGwNcService(String pathFile,File fileRec) throws FileNotFoundException;
    /**
     * ç¨‹åºå›žä¼ ï¼ˆæ¶‰å¯†è§£æžå·¥æŽ§ï¼‰
     * @param pathFile
     */
    boolean addDocInfoAnalysisSmwNcService(String pathFile,File fileRec);
    /**
     * æ–‡æ¡£è§£æž
     * @param equipmentId
     * @param fileRec
     * @param fileNameSuffix
     * @param fileNameNew
     * @param filePath
     * @return
     */
    boolean addDocInfoRecService(String equipmentId,File fileRec,String fileNameSuffix,String fileNameNew,String filePath );
    /**
     * å…¥åº“操作 æ–‡æ¡£å¯¹åº”文件升版
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/CutterServiceImpl.java
@@ -182,7 +182,18 @@
        List<Cutter> cutterList = extractToolAfterM6(docInfo,list);
        // ä¿å­˜åˆ€å…·
        if (!cutterList.isEmpty()) {
            this.saveBatch(cutterList);
            List<Cutter> newCutterList = new ArrayList<>();
            //验证刀具是否已经存在
            cutterList.forEach(item -> {
                List<Cutter> otherCuttersWithSameNo = checkCutterNo(item);
                if (otherCuttersWithSameNo == null || otherCuttersWithSameNo.isEmpty()) {
                    newCutterList.add(item);
                }
            });
            if (newCutterList.isEmpty()) {
                return Result.error("未发现刀具的参数信息注释,无法提取刀具信息");
            }
            this.saveBatch(newCutterList);
            //TODO发送刀具管理数据
            return Result.OK("提取刀具信息成功");
        }else {
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DeviceGroupServiceImpl.java
@@ -1,27 +1,21 @@
package org.jeecg.modules.dnc.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.system.vo.LoginUser;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.modules.dnc.dto.DeviceGroupExt;
import org.jeecg.modules.dnc.entity.DeviceGroup;
import org.jeecg.modules.dnc.entity.DeviceGroupPermission;
import org.jeecg.modules.dnc.entity.DevicePermissionStream;
import org.jeecg.modules.dnc.exception.ExceptionCast;
import org.jeecg.modules.dnc.mapper.DeviceGroupMapper;
import org.jeecg.modules.dnc.response.CommonCode;
import org.jeecg.modules.dnc.response.DeviceGroupCode;
import org.jeecg.modules.dnc.response.UcenterCode;
import org.jeecg.modules.dnc.service.*;
import org.jeecg.modules.dnc.ucenter.Department;
import org.jeecg.modules.dnc.service.IDeviceGroupPermissionService;
import org.jeecg.modules.dnc.service.IDeviceGroupService;
import org.jeecg.modules.dnc.service.IDevicePermissionStreamService;
import org.jeecg.modules.dnc.utils.ValidateUtil;
import org.jeecg.modules.dnc.entity.*;
import org.jeecg.modules.system.entity.SysUser;
import org.jeecg.modules.dnc.utils.file.FileUtilS;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -36,9 +30,6 @@
    private IDeviceGroupPermissionService groupPermissionService;
    @Autowired
    private IDevicePermissionStreamService devicePermissionStreamService;
    @Autowired
    @Lazy
    private IDeviceInfoService deviceInfoService;
    //  æŸ¥è¯¢æ‰€ä»¥çˆ¶èŠ‚ç‚¹
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java
@@ -16,6 +16,8 @@
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.modules.dnc.entity.*;
import org.jeecg.modules.dnc.exception.ExceptionCast;
import org.jeecg.modules.dnc.ext.NcTxtFilePathInfo;
import org.jeecg.modules.dnc.listener.FileMonitorConfig;
import org.jeecg.modules.dnc.mapper.DocInfoMapper;
import org.jeecg.modules.dnc.request.DocInfoQueryRequest;
import org.jeecg.modules.dnc.request.DocInfoUploadRequest;
@@ -27,7 +29,9 @@
import org.jeecg.modules.dncFlow.entity.DispatchFile;
import org.jeecg.modules.dncFlow.service.IDispatchFileService;
import org.jeecg.modules.mdc.entity.MdcEquipment;
import org.jeecg.modules.mdc.service.IMdcEquipmentService;
import org.jeecg.modules.system.entity.SysParams;
import org.jeecg.modules.system.service.IMdcProductionService;
import org.jeecg.modules.system.service.ISysParamsService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -39,13 +43,22 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;
@Service
public class DocInfoServiceImpl extends ServiceImpl<DocInfoMapper, DocInfo> implements IDocInfoService {
    @Autowired
    private FileMonitorConfig config;
    @Autowired
    private IMdcEquipmentService iMdcEquipmentService;
    @Autowired
    private IMdcProductionService iMdcProductionService;
    @Autowired
    private IDocClassificationService docClassificationService;
    @Autowired
@@ -55,11 +68,6 @@
    @Autowired
    @Lazy
    private IDocRelativeService docRelativeService;
    @Autowired
    @Lazy
    private IDeviceInfoService deviceInfoService;
    @Autowired
    private IDeviceGroupService deviceGroupService;
    @Autowired
    private IDispatchFileService dispatchFileService;
    @Autowired
@@ -134,28 +142,28 @@
        docInfo.setPublishVersion(docFile.getDocVersion());
        docInfo.setPublishFileId(docFile.getFileId());
        //COPY
        DeviceInfo deviceInfo= deviceInfoService.getById(uploadRequest.getAttributionId());
        if (deviceInfo != null) {
            List<String> strings =  deviceGroupService.findListParentTreeAll(deviceInfo.getGroupId());
        MdcEquipment mdcEquipment= iMdcEquipmentService.getById(uploadRequest.getAttributionId());
        if (mdcEquipment != null) {
            List<String> strings = iMdcProductionService.findListParentTreeAll(mdcEquipment.getId());
            boolean copyFileNc = false;
            if (strings != null && !strings.isEmpty()) {
                String path = org.apache.commons.lang3.StringUtils.join(strings.toArray(), "/");
                copyFileNc = FileUtilS.copyFile(fileUploadResult.getFilePath()+"/" + fileUploadResult.getFileEncodeName(),
                        path+ "/" + deviceInfo.getDeviceNo() ,fileNameAll);
                        path+ "/" + mdcEquipment.getEquipmentId() ,fileNameAll);
                if (!copyFileNc) {
                    ExceptionCast.cast(ActivitiCode.ACT_FILE_ERROR);
                } else {
                    FileUtilS.deleteZipFromToSend(path + "/"+ deviceInfo.getDeviceNo(),
                    FileUtilS.deleteZipFromToSend(path + "/"+ mdcEquipment.getEquipmentId(),
                            docFile.getFileName(),docFile.getFileSuffix());
                }
            } else {
                copyFileNc =FileUtilS.copyFile(fileUploadResult.getFilePath()+"/" + fileUploadResult.getFileEncodeName(),
                        deviceInfo.getDeviceNo() ,fileNameAll);
                        mdcEquipment.getEquipmentId() ,fileNameAll);
                if (!copyFileNc) {
                    ExceptionCast.cast(ActivitiCode.ACT_FILE_ERROR);
                } else {
                    FileUtilS.deleteZipFromToSend(fileUploadResult.getFilePath()+"/" + fileUploadResult.getFileEncodeName() + "/"+ deviceInfo.getDeviceNo(),
                    FileUtilS.deleteZipFromToSend(fileUploadResult.getFilePath()+"/" + fileUploadResult.getFileEncodeName() + "/"+ mdcEquipment.getEquipmentId(),
                            docFile.getFileName(),docFile.getFileSuffix());
                }
@@ -212,8 +220,8 @@
        if (StringUtils.isEmpty(deviceNo)) {
            return false;
        }
        DeviceInfo deviceInfo = deviceInfoService.getByDeviceNo(deviceNo);
        if (deviceInfo == null) {
        MdcEquipment mdcEquipment = iMdcEquipmentService.findEquipmentNameByEquipmentId(deviceNo);
        if (mdcEquipment == null) {
            return false;
        }
        String fileName = FileUtilS.getFilenameNonSuffix(file.getOriginalFilename());
@@ -222,7 +230,7 @@
        if(fileUploadResult == null) {
            return false;
        }
        DocInfo en = findByAttrAndDocName(fileName, 4, deviceInfo.getDeviceId());
        DocInfo en = findByAttrAndDocName(fileName, 7, mdcEquipment.getId());
        if(en != null) {
            return false;
        }
@@ -235,9 +243,9 @@
        docInfo.setDocStatus(1);
        docInfo.setSyncStatus(2);
        DocRelative docRelative = new DocRelative();
        docRelative.setAttributionId(deviceInfo.getDeviceId());
        docRelative.setAttributionId(mdcEquipment.getId());
        docRelative.setDocId(docInfo.getDocId());
        docRelative.setAttributionType(4);
        docRelative.setAttributionType(7);
        docRelative.setClassificationId(docClass.getClassificationId());
        boolean b = docRelativeService.save(docRelative);
        if(!b) {
@@ -260,6 +268,84 @@
        return saveBool;
    }
    /**
     * è§£æžNC文档通用方法
     * @param pathFile,fileRec
     * @return
     */
    @Override
    @Transactional(rollbackFor = {Exception.class})
    public boolean addDocInfoAnalysisGwNcService(String pathFile,File file) throws FileNotFoundException {
        String line;
        int count = 0;
        String loFilePath = config.getPaths().get(0)+"/" + file.getName();
        FileInputStream fis = new FileInputStream(loFilePath);
        NcTxtFilePathInfo result = new NcTxtFilePathInfo();
        Scanner sc = new Scanner(fis, "UTF-8");
        while (count < 8 &&  sc.hasNext()) {
            line = sc.nextLine();
            if (count ==0) {
                result.setFileTxtName(line.trim());
            } else  if (count ==1) {
                result.setFileNcName(line.trim());
            }else  if (count ==2) {
                result.setOrigFileName(line.trim());
            }else  if (count ==3) {
                result.setOrigFileSuffix(line.trim());
            }else  if (count ==4) {
                result.setFilePath(line.trim());
            }else  if (count ==5) {
                result.setEquipmentId(line.trim());
            }else  if (count ==6) {
                result.setFileAddOrDelete(Integer.valueOf(line.trim()));
            }else  if (count == 7) {
                result.setFileSize(line.trim());
            }
            count++;
        }
        sc.close();
        if (result.getFileAddOrDelete() != null ) {
            if ( result.getFileAddOrDelete()==1) {
                String path = config.getPaths().get(0) +"/" + result.getFileNcName()+ ".NC";
                    if (org.apache.commons.lang3.StringUtils.isNotBlank(result.getFileNcName()) &&
                            result.getFileNcName().equals("null")) {
                        //文件待处理
                        //备份数据
                        FileUtilS.deleteFileNewRec(loFilePath);
                    }
                File ncFile = new File(path);
                //已经存在文件需要备份
                String size = String.valueOf(ncFile.length());
                if (!size.equals(result.getFileSize())) {
                    return false;
                }
                boolean bool = this.addDocInfoRecService(result.getEquipmentId(),
                        ncFile,result.getOrigFileSuffix(),
                        FileUtilS.getFilenameNonSuffix(result.getOrigFileName())
                        ,result.getFilePath());
                if (bool) {
                    FileUtilS.deleteFileNewRec(path);
                    FileUtilS.deleteFileNewRec(loFilePath);
                }else {
                    return false;
                }
            }
        }
        return true;
    }
    /**
     * ç¨‹åºå›žä¼ ï¼ˆæ¶‰å¯†è§£æžå·¥æŽ§ï¼‰
     * @param pathFile
     */
    @Override
    @Transactional(rollbackFor = {Exception.class})
    public boolean addDocInfoAnalysisSmwNcService(String pathFile,File fileRec){
        //todo ç¨‹åºå›žä¼ 
        return true;
    }
    @Override
    @Transactional(rollbackFor = {Exception.class})
    public boolean addDocInfoRecService(String equipmentId,File fileRec,String fileNameSuffix,String fileNameNew,String filePath ) {
@@ -272,12 +358,11 @@
            ExceptionCast.cast(DocumentCode.DOC_CLASS_ERROR);
        }
        //根据设备编号查询数据
        String deviceNo = equipmentId;
        if (StringUtils.isEmpty(deviceNo)) {
        if (StringUtils.isEmpty(equipmentId)) {
            return false;
        }
        DeviceInfo deviceInfo = deviceInfoService.getByDeviceNo(deviceNo);
        if (deviceInfo == null) {
        MdcEquipment mdcEquipment = iMdcEquipmentService.findEquipmentNameByEquipmentId(equipmentId);
        if (mdcEquipment == null) {
            return false;
        }
        String fileName = FileUtilS.getFilenameNonSuffix(file.getOriginalFilename());
@@ -286,7 +371,7 @@
        if(fileUploadResult == null) {
            return false;
        }
        DocInfo en = findByAttrAndDocName(fileName, 4, deviceInfo.getDeviceId());
        DocInfo en = findByAttrAndDocName(fileName, 7, mdcEquipment.getId());
        if(en != null) {
            return false;
        }
@@ -299,9 +384,9 @@
        docInfo.setDocStatus(1);
        docInfo.setSyncStatus(2);
        DocRelative docRelative = new DocRelative();
        docRelative.setAttributionId(deviceInfo.getDeviceId());
        docRelative.setAttributionId(mdcEquipment.getId());
        docRelative.setDocId(docInfo.getDocId());
        docRelative.setAttributionType(4);
        docRelative.setAttributionType(7);
        docRelative.setClassificationId(docClass.getClassificationId());
        boolean b = docRelativeService.save(docRelative);
        if(!b) {
@@ -678,7 +763,7 @@
    public boolean deleteByDeviceId(String deviceId) {
        if(!ValidateUtil.validateString(deviceId))
            ExceptionCast.cast(CommonCode.INVALID_PARAM);
        Integer attrType = 4;
        Integer attrType = 7;
        /*boolean b = docFileService.deleteByDocAttr(attrType, deviceId);
        if(!b)
            ExceptionCast.cast(CommonCode.FAIL);
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocRelativeServiceImpl.java
@@ -11,8 +11,6 @@
import org.jeecg.modules.dnc.mapper.DocInfoMapper;
import org.jeecg.modules.dnc.mapper.DocRelativeMapper;
import org.jeecg.modules.dnc.response.CommonCode;
import org.jeecg.modules.dnc.service.IDeviceGroupService;
import org.jeecg.modules.dnc.service.IDeviceInfoService;
import org.jeecg.modules.dnc.service.IDocRelativeService;
import org.jeecg.modules.dnc.utils.ValidateUtil;
import org.jeecg.modules.dnc.utils.date.DateUtil;
@@ -31,12 +29,6 @@
    @Autowired
    private DocInfoMapper docInfoMapper;
    @Autowired
    private IDeviceInfoService deviceInfoService;
    @Autowired
    private IDeviceGroupService deviceGroupService;
//    @Value("${securedoc.localFilePath}")
//    private String localFilePath;
    @Autowired
    private IMdcEquipmentService iMdcEquipmentService;
    @Autowired
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/GuideCardBatchServiceImpl.java
@@ -83,7 +83,7 @@
        }
        // æ‹¼æŽ¥å®Œæ•´ç¼–号
        return yearSuffix + code + user.getUsername() + serialSuffix;
        return yearSuffix+"-"+ code+"-"+ user.getUsername()+"-"+ serialSuffix;
    }
    /**
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessStreamServiceImpl.java
@@ -19,6 +19,8 @@
import org.jeecg.modules.dnc.response.*;
import org.jeecg.modules.dnc.service.*;
import org.jeecg.modules.dnc.utils.ValidateUtil;
import org.jeecg.modules.mdc.entity.MdcEquipment;
import org.jeecg.modules.mdc.service.IMdcEquipmentService;
import org.jeecg.modules.system.entity.MdcProduction;
import org.jeecg.modules.system.entity.SysUser;
import org.springframework.beans.factory.annotation.Autowired;
@@ -39,8 +41,7 @@
    @Autowired
    private IProcessSpecVersionService processSpecVersionService;
    @Autowired
    @Lazy
    private IDeviceInfoService deviceInfoService;
    private IMdcEquipmentService mdcEquipmentService;
    @Autowired
    private IPermissionStreamNewService permissionStreamNewService;
    @Autowired
@@ -259,8 +260,8 @@
    public List<ProcessStream> validateDeviceProcessInfo(String pnCode, String deviceNo) {
        if(!ValidateUtil.validateString(pnCode) || !ValidateUtil.validateString(deviceNo))
            ExceptionCast.cast(CommonCode.INVALID_PARAM);
        DeviceInfo deviceInfo = deviceInfoService.getByDeviceNo(deviceNo);
        if(deviceInfo == null)
        MdcEquipment mdcEquipment = mdcEquipmentService.findEquipmentNameByEquipmentId(deviceNo);
        if(mdcEquipment == null)
            ExceptionCast.cast(DeviceCode.DEVICE_NOT_EXIST);
        PermissionStream stream = componentInfoService.validateComponentOrPartsPnCode(pnCode);
        if(stream == null)
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/controller/AssignFileStreamController.java
@@ -88,16 +88,6 @@
        return new DataResponseResult<>(CommonCode.SUCCESS, b);
    }
    @AutoLog(value = "DNC指派设备流程操作-扫码传输程序 ä¸ç»è¿‡å®¡æ‰¹ æ–‡ä»¶å­˜åœ¨é‡‡ç”¨è¦†ç›–")
    @ApiOperation(value = "DNC指派设备流程操作-扫码传输程序 ä¸ç»è¿‡å®¡æ‰¹ æ–‡ä»¶å­˜åœ¨é‡‡ç”¨è¦†ç›–", notes = "DNC指派设备流程操作-扫码传输程序 ä¸ç»è¿‡å®¡æ‰¹ æ–‡ä»¶å­˜åœ¨é‡‡ç”¨è¦†ç›–")
    @PostMapping("/transfer/doc")
    public ResponseResult transferDocFile(String pnCode, String deviceNo) {
        boolean b = assignFileStreamService.transferDocFile(pnCode, deviceNo);
        if(b)
            return new ResponseResult(CommonCode.SUCCESS);
        return new ResponseResult(CommonCode.FAIL);
    }
    @GetMapping(value = "/selectVoById")
    public Result<AssignFileStream> selectVoById(@RequestParam(name="id") String id){
        return Result.OK(assignFileStreamService.getAssignFileStreamDetail(id));
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/IAssignFileStreamService.java
@@ -84,12 +84,4 @@
     * @return
     */
    Boolean getFlowableEnable();
    /**
     * æ‰«ç ä¼ è¾“程序 ä¸ç»è¿‡å®¡æ‰¹ æ–‡ä»¶å­˜åœ¨é‡‡ç”¨è¦†ç›–
     * @param pnCode
     * @param deviceNo
     * @return
     */
    boolean transferDocFile(String pnCode, String deviceNo);
}
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/AssignFileStreamServiceImpl.java
@@ -25,7 +25,6 @@
import org.jeecg.modules.dnc.utils.date.DateUtil;
import org.jeecg.modules.dnc.utils.file.FileUtilS;
import org.jeecg.modules.dncFlow.entity.AssignFileStream;
import org.jeecg.modules.dncFlow.entity.ToEquipmentTask;
import org.jeecg.modules.dncFlow.ext.AssignFileStreamExt;
import org.jeecg.modules.dncFlow.mapper.AssignFileStreamMapper;
import org.jeecg.modules.dncFlow.request.ApproveBatchRequest;
@@ -33,7 +32,6 @@
import org.jeecg.modules.dncFlow.request.AssignFileStreamQueryRequest;
import org.jeecg.modules.dncFlow.request.TaskRequest;
import org.jeecg.modules.dncFlow.service.IAssignFileStreamService;
import org.jeecg.modules.dncFlow.service.IToEquipmentTaskService;
import org.jeecg.modules.dncFlow.vo.AssignFlowTaskVo;
import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness;
import org.jeecg.modules.flowable.apithird.business.service.IFlowMyBusinessService;
@@ -73,13 +71,7 @@
    @Autowired
    private IDocInfoService docInfoService;
    @Autowired
    private IProcessStreamService processStreamService;
    @Autowired
    private IDocClassificationService classificationService;
    @Autowired
    private IToEquipmentTaskService equipmentTaskService;
    @Autowired
    private IDeviceInfoService deviceInfoService;
    @Autowired
    private IDocFileService docFileService;
    @Autowired
@@ -107,11 +99,9 @@
    @Autowired
    private IDncPassLogService dncPassLogService;
    @Value("${deploy.deployType}")
    //工控网/涉密网部署 0为工控网 1为涉密网
    private String deployType;
    private String deployType;    //工控网/涉密网部署 0为工控网 1为涉密网
    @Value("${deploy.secretFolder}")
    //涉密网传输nc文件夹
    private String secretFolder;
    private String secretFolder;    //涉密网传输nc文件夹
    @Override
    @Transactional(rollbackFor = {Exception.class})
@@ -138,7 +128,6 @@
     */
    public String getDeviceSpecialChar(String deviceId, String fileId){
        //替换为mdc设备表
//        DeviceInfo deviceInfo = deviceInfoService.getById(deviceId);
        MdcEquipment mdcEquipment = iMdcEquipmentService.getById(deviceId);
        if(mdcEquipment == null)
            ExceptionCast.cast(ActivitiCode.ACT_ASSIGN_DEVICE_NONE);
@@ -232,6 +221,9 @@
        //权限校验
        validateParams(stream);
        DocInfo docInfo = getDocInfo(stream);
        //修改原有状态
        docInfo.setDocDispatchStatus(4);
        docInfoService.updateById(docInfo);
        MdcEquipment mdcEquipment = getMdcEquipment(stream);
        DocFile docFile = getDocFile(stream);
        DocInfo deviceDoc = docInfoService.getByDocAttrAndDocId(stream.getDocId(), 7, stream.getDeviceId());
@@ -344,6 +336,9 @@
            DocFile docFile = docFileService.getById(en.getFileId());
            if(docFile == null)
                ExceptionCast.cast(ActivitiCode.ACT_FILE_ERROR);
            //修改原有状态
            docInfo.setDocDispatchStatus(4);
            docInfoService.updateById(docInfo);
            DocInfo deviceDoc = docInfoService.getByDocAttrAndDocId(en.getDocId(),7, en.getDeviceId());
            if(deviceDoc != null) {
                // åˆ é™¤ å¤‡ä»½  è¦†ç›– åŽŸæœ‰çš„
@@ -487,64 +482,6 @@
        return false;
    }
    @Override
    @Transactional(rollbackFor = {Exception.class})
    public boolean transferDocFile(String pnCode, String deviceNo) {
        List<ProcessStream> streams = processStreamService.validateDeviceProcessInfo(pnCode, deviceNo);
        DeviceInfo deviceInfo = deviceInfoService.getByDeviceNo(deviceNo);
        if(deviceInfo == null)
            ExceptionCast.cast(DeviceCode.DEVICE_NOT_EXIST);
        //删除原来设备下的所有文档
        docRelativeService.deleteByDocAttr(7, deviceInfo.getDeviceId());
        List<DocInfo> docInfoList = docInfoService.getByProcessIds(streams);
        if(docInfoList == null || docInfoList.isEmpty())
            ExceptionCast.cast(DocumentCode.DOC_NOT_EXIST);
        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        String userId = user.getId();
        if(!ValidateUtil.validateString(userId))
            ExceptionCast.cast(UcenterCode.UCENTER_ACCOUNT_NOT_EXIST);
        for(DocInfo docInfo : docInfoList) {
            DocFile docFile = docFileService.getById(docInfo.getPublishFileId());
            if(docFile == null)
                ExceptionCast.cast(ActivitiCode.ACT_FILE_ERROR);
            //插入文档到设备发送文档
            DocClassification classification = classificationService.getByCode(SEND_CODE);
            if(classification == null)
                ExceptionCast.cast(DocumentCode.DOC_CLASS_ERROR);
            DocRelative docRelative = new DocRelative();
            docRelative.setDocId(docInfo.getDocId());
            docRelative.setClassificationId(classification.getClassificationId());
            docRelative.setAttributionType(7);
            docRelative.setAttributionId(deviceInfo.getDeviceId());
            boolean b = docRelativeService.save(docRelative);
            if(!b)
                ExceptionCast.cast(ActivitiCode.ACT_APPROVE_ERROR);
            //插入文件传输任务表
            ToEquipmentTask equipmentTask = new ToEquipmentTask();
            //不能直接从doc中拿fileId å’Œversion  å¯èƒ½ä¼šå­˜åœ¨æ–Œæ›´
            //equipmentTask.setFileId(docInfo.getPublishFileId());
            //equipmentTask.setDocVersion(docInfo.getPublishVersion());
            equipmentTask.setDocId(docInfo.getDocId());
            equipmentTask.setSyncFlag(1);
            equipmentTask.setDeviceNo(deviceInfo.getDeviceNo());
            equipmentTask.setDeviceId(deviceInfo.getDeviceId());
            equipmentTask.setDepartId(deviceInfo.getDepartId());
            //文件相关信息
            equipmentTask.setFileId(docFile.getFileId());
            equipmentTask.setDocVersion(docFile.getDocVersion());
            equipmentTask.setFileName(docInfo.getDocName());
            equipmentTask.setFileEncodeName(docFile.getFileEncodeName());
            equipmentTask.setFilePath(docFile.getFilePath());
            equipmentTask.setFileSuffix(docFile.getFileSuffix());
            equipmentTask.setFileSize(docFile.getFileSize());
            b = equipmentTaskService.save(equipmentTask);
            if(!b) {
                ExceptionCast.cast(ActivitiCode.ACT_APPROVE_ERROR);
            }
        }
        return synchronizedFlagService.updateFlag(1);
    }
    //传参验证
    private void validateParams(AssignFileStream stream) {
        if (stream == null) {
@@ -575,7 +512,7 @@
    //获取文件
    private void handleExistingDeviceDoc(DocFile docFile, MdcEquipment mdcEquipment, String deviceId) {
        List<String> strings = iMdcProductionService.findListParentTreeAll(mdcEquipment.getEquipmentId());
        List<String> strings = iMdcProductionService.findListParentTreeAll(mdcEquipment.getId());
        if (strings != null && !strings.isEmpty()) {
            String path = StringUtils.join(strings.toArray(), "/");
            boolean copyFileNc = FileUtilS.copyFileNcToBak(path + "/" + mdcEquipment.getEquipmentId(),
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/dto/MaintenanceStandardImport.java
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/dto/SecondMaintenanceStandardImport.java
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/dto/ThirdMaintenanceStandardImport.java
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/dto/WeekMaintenanceStandardImport.java
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamInspectionOrderDetail.java
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamMaintenanceStandardDetail.java
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamSecondMaintenanceOrderDetail.java
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamThirdMaintenanceOrderDetail.java
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamWeekMaintenanceOrderDetail.java
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/EamRepairOrderMapper.java
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/EamReportRepairMapper.java
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/xml/EamRepairOrderMapper.xml
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/xml/EamReportRepairMapper.xml
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/request/EamRepairOrderQuery.java
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/request/EamRepairOrderRequest.java
ÎļþÃû´Ó lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamRepairOrderRequest.java ÐÞ¸Ä
@@ -5,9 +5,7 @@
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.jeecg.common.api.vo.FileUploadResult;
import org.jeecg.common.aspect.annotation.Dict;
import org.jeecg.modules.flowable.domain.vo.FlowTaskVo;
import org.jeecgframework.poi.excel.annotation.Excel;
import java.io.Serializable;
import java.util.List;
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/request/EamRepairOrderResponse.java
ÎļþÃû´Ó lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamRepairOrderResponse.java ÐÞ¸Ä
@@ -8,9 +8,7 @@
import lombok.experimental.Accessors;
import org.jeecg.common.aspect.annotation.Dict;
import org.jeecg.modules.eam.entity.EamRepairOrder;
import org.jeecg.modules.eam.entity.EamReportRepair;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.springframework.beans.BeanUtils;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/request/EamReportRepairQuery.java
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/IEamRepairOrderService.java
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/IEamReportRepairService.java
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/impl/EamRepairOrderServiceImpl.java
ÎļþÃû´Ó lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamRepairOrderServiceImpl.java ÐÞ¸Ä
@@ -33,13 +33,13 @@
import org.jeecg.modules.eam.service.IEamEquipmentService;
import org.jeecg.modules.eam.service.IEamRepairOrderService;
import org.jeecg.modules.eam.service.IEamReportRepairService;
import org.jeecg.modules.eam.util.DateUtils;
import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness;
import org.jeecg.modules.flowable.apithird.business.service.IFlowMyBusinessService;
import org.jeecg.modules.flowable.apithird.service.FlowCallBackServiceI;
import org.jeecg.modules.flowable.apithird.service.FlowCommonService;
import org.jeecg.modules.flowable.service.IFlowDefinitionService;
import org.jeecg.modules.flowable.service.IFlowTaskService;
import org.jeecg.modules.mdc.util.DateUtils;
import org.jeecg.modules.system.service.ISysBusinessCodeRuleService;
import org.jeecg.modules.system.service.ISysUserService;
import org.jeecg.modules.system.vo.UserSelector;
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/impl/EamReportRepairServiceImpl.java
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/util/DateUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,1089 @@
package org.jeecg.modules.eam.util;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class DateUtils {
    private final static long DAYTIMESUNSET = 86400;
    /**
     * @return å¾—到明天
     */
    public static Date getNextDay(Date d1) {
        long d2 = d1.getTime() + 86400 * 1000;
        return new Date(d2);
    }
    /**
     * @return å¾—到昨天
     */
    public static Date getPreviousDay(Date d1) {
        long d2 = d1.getTime() - 86400 * 1000;
        return new Date(d2);
    }
    /**
     * @return è¿”回时间差的语言描述  å¦‚1天2小时5分6秒
     */
    public static String different(Date d1, Date d2) {
        if (d1 == null || d2 == null) {
            return "";
        }
        StringBuilder strB = new StringBuilder();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            //毫秒ms
            long diff = d2.getTime() - d1.getTime();
            long diffSeconds = diff / 1000 % 60;
            long diffMinutes = diff / (60 * 1000) % 60;
            long diffHours = diff / (60 * 60 * 1000) % 24;
            long diffDays = diff / (24 * 60 * 60 * 1000);
            if (diffDays > 0) {
                strB.append(diffDays + " å¤© ");
                strB.append(diffHours + " å°æ—¶ ");
                strB.append(diffMinutes + " åˆ†é’Ÿ ");
                strB.append(diffSeconds + " ç§’ ");
            } else if (diffHours > 0) {
                strB.append(diffHours + " å°æ—¶ ");
                strB.append(diffMinutes + " åˆ†é’Ÿ ");
                strB.append(diffSeconds + " ç§’ ");
            } else if (diffMinutes > 0) {
                strB.append(diffMinutes + " åˆ†é’Ÿ ");
                strB.append(diffSeconds + " ç§’ ");
            } else {
                strB.append(diffSeconds + " ç§’ ");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return strB.toString();
    }
    /**
     * @return èŽ·å–ä¸¤ä¸ªdate的时间差,结果为秒 é™¤
     */
    public static long differentSecond(Date startDate, Date endDate) {
        return new BigDecimal(endDate.getTime() - startDate.getTime()).divide(new BigDecimal("1000"), 0, BigDecimal.ROUND_HALF_UP).longValue();
//        return (endDate.getTime() - startDate.getTime()) / 1000;
    }
    /**
     * @return èŽ·å–ä¸¤ä¸ªdate的时间差,结果为分钟
     */
    public static Integer differentMinutes(Date startDate, Date endDate) {
        return new BigDecimal(endDate.getTime() - startDate.getTime()).divide(new BigDecimal("60000"), 0, RoundingMode.HALF_UP).intValue();
    }
    /**
     * @return è¿”回传入时间的0点0分0秒
     */
    public static Date getTodayZero(Date d) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(d);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        return cal.getTime();
    }
    /**
     * @return è¿”回传入时间的0点0分0秒
     */
    public static Date getTomorrowZero(Date d) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(d);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.add(Calendar.DAY_OF_MONTH, 1);
        return cal.getTime();
    }
    /**
     * @return åˆ¤æ–­æ—¶é—´æ˜¯å¦æ˜¯å½“天
     */
    public static boolean isTaday(Date date) {
        Date now = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd");
        String nowDay = sf.format(now);
        String day = sf.format(date);
        return day.equals(nowDay);
    }
    /**
     * @return åˆ¤æ–­ä¸¤ä¸ªæ—¶é—´æ˜¯å¦ä¸ºåŒä¸€å¤©
     */
    public static boolean isOneDay(Date d1, Date d2) {
        SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd");
        String d1Str = sf.format(d1);
        String d2Str = sf.format(d2);
        return d1Str.equals(d2Str);
    }
    /**
     * @return åˆ¤æ–­ä¸¤ä¸ªæ—¶é—´æ˜¯å¦ä¸ºåŒä¸€å¹´
     */
    public static boolean isOneYear(Date d1, Date d2) {
        SimpleDateFormat sf = new SimpleDateFormat("yyyy");
        String d1Str = sf.format(d1);
        String d2Str = sf.format(d2);
        return d1Str.equals(d2Str);
    }
    public static String dateProportion(Date start, Date end) {
        float differentSecond = DateUtils.differentSecond(start, end);
        float f = differentSecond / DAYTIMESUNSET * 100;
        return String.format("%.2f", f) + "%";
    }
    public static Date strToDate(String dateStr, String format) {
        SimpleDateFormat sf = new SimpleDateFormat(format);
        Date result = null;
        try {
            result = sf.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return result;
    }
    public static final String STR_DATE = "yyyy-MM-dd";
    public static final String STRDATE = "yyyyMMdd";
    public static final String STR_YEAR_MONTH = "yyyy-MM";
    public static final String STRYEARMONTH = "yyyyMM";
    public static final String STR_DATE_TIME = "yyyy-MM-dd HH:mm:ss.SSS";
    public static final String STR_DATE_TIME_SMALL = "yyyy-MM-dd HH:mm:ss";
    public static final String STR_DATE_TIME_MIN = "yyyy-MM-dd HH:mm";
    public static final String STR_DATE_TIME_HOUR = "yyyy-MM-dd HH";
    public static final String STR_DATE_TIME_FULL = "yyyyMMddHHmmssSSS";
    public static final String STR_HHMMSS = "HH:mm:ss";
    public static final String STR_HHMM = "HH:mm";
    public static final String STR_MMDD = "MM-dd";
    /**
     * <p>
     * Description: å®žé™…投标月份
     * </p>
     *
     * @param startDate
     * @param endDate
     * @return obj [0] å®žé™…投标月份 ä¾‹å¦‚实际投标月份(3.86)意义是3个月又26天 obj[1] å®žé™…取整月份 ï¼ˆ3)
     */
    public static Integer getRealMonth(Date startDate, Date endDate) {
        Integer month = 0;
        Calendar start = Calendar.getInstance();
        start.setTime(startDate);
        Calendar end = Calendar.getInstance();
        end.setTime(endDate);
        int year = start.get(Calendar.YEAR);
        int year2 = end.get(Calendar.YEAR);
        int month2 = start.get(Calendar.MONTH);
        int month3 = end.get(Calendar.MONTH);
        try {
            while (start.before(end)) {
                start.add(Calendar.MONTH, 1);
                month++;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        int day2 = start.get(Calendar.DAY_OF_MONTH);
        int day3 = end.get(Calendar.DAY_OF_MONTH);
        int tmpYear = year2 - year;
        if (day2 == day3) {
            return (tmpYear * 12) + (month3 - month2);
        }
        return month == 0 ? month : (month - 1);
    }
    public static Date getNow() {
        return new Date(System.currentTimeMillis());
    }
    public static int getDayOfMonth() {
        Calendar aCalendar = Calendar.getInstance(Locale.CHINA);
        int day = aCalendar.getActualMaximum(Calendar.DATE);
        return day;
    }
    /**
     * <p>
     * Description: ä¿®æ”¹æ—¶é—´ä¸ºæŒ‡å®šæ—¶é—´å½“天的23:59:59.000
     * </p>
     *
     * @param date éœ€è¦ä¿®æ”¹çš„æ—¶é—´
     * @return ä¿®æ”¹åŽçš„æ—¶é—´
     */
    public static Date fillTime(Date date) {
        Date result = removeTime(date);
        result.setTime(result.getTime() + 24 * 60 * 60 * 1000 - 1000); // åР䏀天
        return result;
    }
    /**
     * @param date å½“前时间
     * @param i    å¾€å‰å‡ å¤©
     * @return
     */
    public static Date fillBeforeTime(Date date, Integer i) {
        Date result = removeTime(date);
        Calendar calendar = Calendar.getInstance(); // å¾—到日历
        calendar.setTime(result);// æŠŠå½“前时间赋给日历
        calendar.add(Calendar.DAY_OF_MONTH, i); // è®¾ç½®ä¸ºå‰ä¸€å¤©
        result.setTime(calendar.getTime().getTime() + 24 * 60 * 60 * 1000
                - 1000); // åР䏀天
        return result;
    }
    /**
     * <p>
     * Description: ä¿®æ”¹æ—¶é—´ä¸ºæŒ‡å®šæ—¶é—´å‰ä¸€å¤©çš„00:00:00
     * </p>
     *
     * @param date éœ€è¦ä¿®æ”¹çš„æ—¶é—´
     * @return ä¿®æ”¹åŽçš„æ—¶é—´
     */
    public static Date plusTime(Date date, Integer i) {
        Date result = removeTime(date);
        Calendar calendar = Calendar.getInstance(); // å¾—到日历
        calendar.setTime(result);// æŠŠå½“前时间赋给日历
        calendar.add(Calendar.DAY_OF_MONTH, i); // è®¾ç½®ä¸ºå‰ä¸€å¤©
        return calendar.getTime();
    }
    /**
     * <p>
     * Description: åŽ»æŽ‰æ—¥æœŸæ—¶é—´ä¸­çš„æ—¶é—´éƒ¨åˆ†
     * </p>
     * å¦‚: 2013-11-11 18:56:33 ---> 2013-11-11 00:00:00
     *
     * @param date éœ€è¦ä¿®æ”¹çš„æ—¶é—´
     * @return ä¿®æ”¹åŽçš„æ—¶é—´
     */
    public static Date removeTime(Date date) {
        Date result = null;
        try {
            SimpleDateFormat df = new SimpleDateFormat(STR_DATE);
            String dateStr = df.format(date);
            result = df.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return result;
    }
    /**
     * <p>
     * Description: æŒ‰é»˜è®¤æ ¼å¼(yyyy-MM-dd HH:mm:ss.SSS)获取时间字符串
     * </p>
     *
     * @param date è¦è½¬æ¢çš„æ—¥æœŸ
     * @return è½¬æ¢åŽçš„æ—¶é—´å­—符串
     */
    public static String format(Date date) {
        SimpleDateFormat df = new SimpleDateFormat(STR_DATE_TIME);
        return df.format(date);
    }
    public static Date parseDate(Date date, String format) {
        SimpleDateFormat df = new SimpleDateFormat(format);
        try {
            date = df.parse(df.format(date));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
    public static Date getDelayedYear() {
        Calendar curr = Calendar.getInstance();
        curr.set(Calendar.YEAR, curr.get(Calendar.YEAR) + 1);
        Date date = curr.getTime();
        return date;
    }
    /**
     * <p>
     * Description: æŒ‰æŒ‡å®šæ ¼å¼èŽ·å–æ—¶é—´å­—ç¬¦ä¸²
     * </p>
     *
     * @param date   è¦è½¬æ¢çš„æ—¥æœŸ
     * @param format æ ¼å¼,例如:yyyy-MM-dd HH:mm:ss.SSS
     * @return è½¬æ¢åŽçš„æ—¶é—´å­—符串
     */
    public static String format(Date date, String format) {
        SimpleDateFormat df = new SimpleDateFormat(format);
        return df.format(date);
    }
    /**
     * <p>
     * Description: åŠ æœˆå‡½æ•°
     * </p>
     *
     * @param month æœˆä»½æ•°
     * @return
     */
    public static Date addMonth(Integer month, Date time) {
        Calendar c = Calendar.getInstance();
        c.setTime(time);
        c.add(Calendar.MONTH, month);
        return c.getTime();
    }
    public static Boolean greater(Date startTime, Date endTime) {
        return startTime.getTime() > endTime.getTime();
    }
    public static Boolean less(Date startTime, Date endTime) {
        return startTime.getTime() < endTime.getTime();
    }
    public static Boolean equals(Date startTime, Date endTime) {
        return startTime.getTime() == endTime.getTime();
    }
    public static Integer getDiffMonth(Calendar c, Calendar c1) {
        return (c.get(Calendar.YEAR) - c1.get(Calendar.YEAR)) * 12
                + (c.get(Calendar.MONTH) - c1.get(Calendar.MONTH));
    }
    /**
     * æ˜¯å¦ä¸ºåŒä¸€å¤©
     */
    public static boolean equalsDay(Date a, Date b) {
        return removeTime(a).getTime() == removeTime(b).getTime();
    }
    public static Integer getDays(Date startTime, Date endTime) {
        Calendar c = Calendar.getInstance();
        c.setTime(startTime);
        Calendar c1 = Calendar.getInstance();
        c1.setTime(endTime);
        long t1 = c.getTimeInMillis();
        long t2 = c1.getTimeInMillis();
        // è®¡ç®—天数
        Long days = (t2 - t1) / (24 * 60 * 60 * 1000);
        return days.intValue();
    }
    public static Integer getSeconds(Date startTime, Date endTime) {
        try {
            Calendar c = Calendar.getInstance();
            c.setTime(startTime);
            Calendar c1 = Calendar.getInstance();
            c1.setTime(endTime);
            long t1 = c.getTimeInMillis();
            long t2 = c1.getTimeInMillis();
            // è®¡ç®—ç§’æ•°
            Long days = (t2 - t1) / (1000);
            return days.intValue();
        } catch (Exception e) {
            return 0;
        }
    }
    //获取小时差
    public static double subHours(Date startTime, Date endTime) {
        Calendar c = Calendar.getInstance();
        c.setTime(startTime);
        Calendar c1 = Calendar.getInstance();
        c1.setTime(endTime);
        double t1 = c.getTimeInMillis();
        double t2 = c1.getTimeInMillis();
        // è®¡ç®—天数
        double hours = (t2 - t1) / (1000 * 60 * 60);
        return Double.valueOf(new DecimalFormat("#.00").format(hours));
    }
    //根据当前时间和出生日期获取年龄
    public static int getAge(Date birthDay) {
        Calendar cal = Calendar.getInstance();
        // å–出系统当前时间的年、月、日部分
        int yearNow = cal.get(Calendar.YEAR);
        int monthNow = cal.get(Calendar.MONTH);
        int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH);
        cal.setTime(birthDay);
        // å–出出生日期的年、月、日部分
        int yearBirth = cal.get(Calendar.YEAR);
        int monthBirth = cal.get(Calendar.MONTH);
        int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH);
        // å½“前年份与出生年份相减,初步计算年龄
        int age = yearNow - yearBirth;
        // å½“前月份与出生日期的月份相比,如果月份小于出生月份,则年龄上减1,表示不满多少周岁
        if (monthNow <= monthBirth) {
            // å¦‚果月份相等,在比较日期,如果当前日,小于出生日,也减1,表示不满多少周岁
            if (monthNow == monthBirth) {
                if (dayOfMonthNow < dayOfMonthBirth) {
                    age--;
                }
            } else {
                age--;
            }
        }
        return age;
    }
    public static Date subDays(Date startTime, Integer day) {
        Calendar c = Calendar.getInstance();
        c.setTime(startTime);
        c.add(Calendar.DATE, day * -1);
        return c.getTime();
    }
    public static Date addDays(Date startTime, Integer day) {
        Calendar c = Calendar.getInstance();
        c.setTime(startTime);
        c.add(Calendar.DATE, day);
        return c.getTime();
    }
    /*public static Date addHours(Date startTime, Integer hours) {
        Calendar c = Calendar.getInstance();
        c.setTime(startTime);
        c.add(Calendar.HOUR, hours );
        return c.getTime();
    }*/
    public static Date toDate(String date, String format) {
        SimpleDateFormat df = new SimpleDateFormat(format);
        try {
            return df.parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
    public static Date toDateFull(String date) {
        SimpleDateFormat df = new SimpleDateFormat(STR_DATE_TIME);
        try {
            return df.parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
    public static Date toDateMedium(String date) {
        SimpleDateFormat df = new SimpleDateFormat(STR_DATE_TIME_SMALL);
        try {
            Date dd = df.parse(date);
            return dd;
        } catch (ParseException e) {
            return null;
        }
    }
    public static Integer getDate(Date date) {
        if (date != null) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            int day = calendar.get(Calendar.DATE);
            return day;
        }
        return null;
    }
    public static Integer getYear() {
        return getYear(new Date());
    }
    public static Integer getYear(Date date) {
        if (date != null) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            int year = calendar.get(Calendar.YEAR);
            return year;
        }
        return null;
    }
    public static Integer getMonth() {
        return getMonth(new Date());
    }
    public static Integer getMonth(Date date) {
        if (date != null) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            int month = calendar.get(Calendar.MONTH);
            return month + 1;
        }
        return null;
    }
    public static Integer getDay() {
        return getDay(new Date());
    }
    public static Integer getDay(Date date) {
        if (date != null) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            int day = calendar.get(Calendar.DAY_OF_MONTH);
            return day;
        }
        return null;
    }
    public static Date[] getMonthStartTimeAndEndTime(Integer month) {
        Calendar calendar = Calendar.getInstance();
        Date[] dates = new Date[2];
        Date startTime = null;
        Date endsTime = null;
        if (month != null) {
            calendar.set(Calendar.MONTH, month);
            //获得到本月的第一天
            calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
            startTime = calendar.getTime();
            startTime = DateUtils.removeTime(startTime);
            //获得到本月的最后一天
            calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
            endsTime = calendar.getTime();
            endsTime = DateUtils.fillTime(endsTime);
        }
        dates[0] = startTime;
        dates[1] = endsTime;
        return dates;
    }
    public static Date[] getMonthStartTimeAndEndTime(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        Integer month = calendar.get(Calendar.MONTH);
        Date[] dates = new Date[2];
        Date startTime = null;
        Date endsTime = null;
        if (month != null) {
            calendar.set(Calendar.MONTH, month);
            //获得到本月的第一天
            calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
            startTime = calendar.getTime();
            startTime = DateUtils.removeTime(startTime);
            //获得到本月的最后一天
            calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
            endsTime = calendar.getTime();
            endsTime = DateUtils.fillTime(endsTime);
        }
        dates[0] = startTime;
        dates[1] = endsTime;
        return dates;
    }
    /**
     * èŽ·å–days天的时间区间,endTime ä¸ºå½“天的后一天0点,
     * startTime ä¸ºendTime前days天
     *
     * @param days
     * @return
     */
    public static Date[] getDaysStartTimeAndEndTime(Integer days) {
        Date[] dates = new Date[2];
        Date endDate = plusTime(removeTime(getNow()), 1);
        Date startDate = subDays(endDate, days);
        dates[0] = startDate;
        dates[1] = endDate;
        return dates;
    }
    /**
     * æ ¹æ®æŸä¸€å¹´èŽ·å–æœ€åŽä¸€å¤©çš„æ—¶é—´
     * 2013 ---> 2013-12-31 23:59:59.000
     *
     * @param year
     * @return
     */
    public static Date getYearEndDay(Integer year) {
        Calendar calendar = Calendar.getInstance();
        calendar.clear();
        calendar.set(Calendar.YEAR, year);
        calendar.roll(Calendar.DAY_OF_YEAR, -1);
        Date yearLast = calendar.getTime();
        Date lastYear = DateUtils.fillTime(yearLast);
        return lastYear;
    }
    /**
     * èŽ·å–start/end的所有日期字符串 æ ¼å¼yyyy-MM-dd
     *
     * @param start
     * @param end
     * @return
     */
    public static List<String> getDatesStringList(Date start, Date end, String strDate) {
        List<String> list = new ArrayList<>();
        int i = getDays(start, end);
        for (int j = 0; j <= i; j++) {
            if (j == 0) {
                list.add(format(start, strDate));
            } else {
                list.add(format(plusTime(start, j), strDate));
            }
        }
        return list;
    }
    /**
     * èŽ·å–start/end的所有日期字符串 æ ¼å¼yyyy-MM-dd
     *
     * @param start
     * @param end
     * @return
     */
    public static List<String> getDatesStringList(Date start, Date end) {
        List<String> list = new ArrayList<>();
        int i = getDays(start, end);
        for (int j = 0; j <= i; j++) {
            if (j == 0) {
                list.add(format(start, STR_DATE));
            } else {
                list.add(format(plusTime(start, j), STR_DATE));
            }
        }
        return list;
    }
    /**
     * èŽ·å–start/end的所有日期字符串 æ ¼å¼yyyyMMdd
     *
     * @param start
     * @param end
     * @return
     */
    public static List<String> getDatesStringList2(Date start, Date end) {
        List<String> list = new ArrayList<>();
        int i = getDays(start, end);
        for (int j = 0; j <= i; j++) {
            if (j == 0) {
                list.add(format(start, STRDATE));
            } else {
                list.add(format(plusTime(start, j), STRDATE));
            }
        }
        return list;
    }
    /**
     * èŽ·å–start/end的所有日期字符串 æ ¼å¼MM-dd
     *
     * @param start
     * @param end
     * @return
     */
    public static List<String> getDatesStringLists(Date start, Date end) {
        List<String> list = new ArrayList<>();
        int i = getDays(start, end);
        for (int j = 0; j <= i; j++) {
            if (j == 0) {
                list.add(format(start, STR_MMDD));
            } else {
                list.add(format(plusTime(start, j), STR_MMDD));
            }
        }
        return list;
    }
    public static List<String> getMonthBetween(Date start, Date end) {
        List<String> list = new ArrayList<>();
        Calendar min = Calendar.getInstance();
        Calendar max = Calendar.getInstance();
        min.setTime(start);
        min.set(min.get(Calendar.YEAR), min.get(Calendar.MONTH), 1);
        max.setTime(end);
        max.set(max.get(Calendar.YEAR), max.get(Calendar.MONTH), 2);
        Calendar curr = min;
        while (curr.before(max)) {
            list.add(format(curr.getTime(), STR_YEAR_MONTH));
            curr.add(Calendar.MONTH, 1);
        }
        return list;
    }
    /**
     * èŽ·å–dateStr的日期格式yyyy-MM-dd
     *
     * @param dateStr
     * @return
     */
    public static Date getShortDate(String dateStr) {
        SimpleDateFormat sdf = new SimpleDateFormat(STR_DATE);
        Date startTime = null;
        try {
            startTime = sdf.parse(dateStr);
        } catch (ParseException e) {
        }
        return startTime == null ? removeTime(new Date()) : startTime;
    }
    /**
     * èŽ·å–dateStr的日期格式yyyyMMdd
     *
     * @param dateStr
     * @return
     */
    public static Date getShortDate2(String dateStr) {
        SimpleDateFormat sdf = new SimpleDateFormat(STRDATE);
        Date startTime = null;
        try {
            startTime = sdf.parse(dateStr);
        } catch (ParseException e) {
        }
        return startTime == null ? removeTime(new Date()) : startTime;
    }
    public static Date getFormatDate(String dateStr, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        Date startTime = null;
        try {
            startTime = sdf.parse(dateStr);
        } catch (ParseException e) {
        }
        return startTime == null ? removeTime(new Date()) : startTime;
    }
    /**
     * @param time
     * @param n
     * @return åœ¨ä¸€ä¸ªæ—¶é—´ä¸ŠåŠ ç§’
     */
    public static Date addSecond(Date time, Integer n) {
        Calendar c = Calendar.getInstance();
        c.setTime(time);
        c.add(Calendar.SECOND, n);
        return c.getTime();
    }
    /**
     * @param time
     * @param n
     * @return åœ¨ä¸€ä¸ªæ—¶é—´ä¸ŠåŠ åˆ†é’Ÿ
     */
    public static Date addMinute(Date time, Integer n) {
        Calendar c = Calendar.getInstance();
        c.setTime(time);
        c.add(Calendar.MINUTE, n);
        return c.getTime();
    }
    /**
     * @param time
     * @param n
     * @return åœ¨ä¸€ä¸ªæ—¶é—´ä¸ŠåŠ å°æ—¶
     */
    public static Date addHour(Date time, Integer n) {
        Calendar c = Calendar.getInstance();
        c.setTime(time);
        c.add(Calendar.HOUR_OF_DAY, n);
        return c.getTime();
    }
    /**
     * èŽ·å–start/end的所有日期字符串 æ ¼å¼yyyy-MM-dd
     *
     * @param start
     * @param end
     * @return
     */
    public static List<String> getDateMonth(String start, String end) {
        List<String> list = new ArrayList<>();
        SimpleDateFormat yyyyMM = new SimpleDateFormat("yyyy-MM");
        Date startyear = null;
        try {
            startyear = yyyyMM.parse(start);
            Date endyear = yyyyMM.parse(end);
            Calendar dd = Calendar.getInstance();//定义日期实例
            dd.setTime(startyear);//设置日期起始时间
            while (dd.getTime().before(endyear)) {//判断是否到结束日期
                String str = yyyyMM.format(dd.getTime());
                dd.add(Calendar.MONTH, 1);//进行当前日期月份加1
                list.add(str);
            }
            list.add(yyyyMM.format(endyear));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return list;
    }
    /**
     * èŽ·å–start/end的所有日期字符串 æ ¼å¼yyyy
     *
     * @param start
     * @param end
     * @return
     */
    public static List<String> getDateYear(String start, String end) {
        List<String> list = new ArrayList<>();
        SimpleDateFormat yyyy = new SimpleDateFormat("yyyy");
        Date startyear = null;
        try {
            startyear = yyyy.parse(start);
            Date endyear = yyyy.parse(end);
            Calendar dd = Calendar.getInstance();//定义日期实例
            dd.setTime(startyear);//设置日期起始时间
            while (dd.getTime().before(endyear)) {//判断是否到结束日期
                String str = yyyy.format(dd.getTime());
                dd.add(Calendar.YEAR, 1);//进行当前日期月份加1
                list.add(str);
            }
            list.add(yyyy.format(endyear));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return list;
    }
    /**
     * èŽ·å–å½“å‰æ—¶é—´ å®šä½åˆ°å°æ—¶
     * æ ¼å¼ä¸º yyyy-MM-dd hh:mm
     * ä¾‹ï¼š2018-02-27 11:00
     *
     * @return
     */
    public static Date getNowHourDate() {
        Date now = getNow();
        Date result;
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(now);
        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        String dateStr = format(now, STR_DATE);
        dateStr = dateStr + " " + (hour < 10 ? "0" + hour : hour) + ":00";
        result = toDate(dateStr, STR_DATE_TIME_MIN);
        return result;
    }
    /**
     * èŽ·å–æ¯æ—¥8:11或11:11的时间点
     *
     * @return
     */
    public static Date getNowHourDateTo() {
        Date now = getNow();
        Date result;
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(now);
        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        if (hour != 8 && hour != 11) {
            return null;
        }
        int minute = calendar.get(Calendar.MINUTE);
        if (minute < 11) {
            return null;
        }
        String dateStr = format(now, STR_DATE);
        dateStr = dateStr + " " + (hour < 10 ? "0" + hour : hour) + ":11";
        result = toDate(dateStr, STR_DATE_TIME_MIN);
        return result;
    }
    /**
     * èŽ·å–æ¯æ—¥8:00、13:00、20:00的时间点
     *
     * @return
     */
    public static List<Date> getHourDateList(Date time) {
        List<Date> result = new ArrayList<>();
        result.add(addHour(time, 8));
        result.add(addHour(time, 13));
        result.add(addHour(time, 20));
        return result;
    }
    /**
     * èŽ·å–ä¸Šæœˆçš„æœ€åŽä¸€å¤©
     *
     * @return
     */
    public static Date getPreviousMonthLastDay() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_MONTH, 0);
        return DateUtils.removeTime(calendar.getTime());
    }
    /**
     * èŽ·å–end时间月的第一天
     *
     * @param end æœˆä»½æœ€åŽä¸€å¤©
     * @return
     */
    public static Date getTheMonthFirstDay(Date end) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(end);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        return calendar.getTime();
    }
    public static String secToTimeHour(int time) {
        String timeStr = null;
        int hour = 0;
        if (time <= 0) {
            return "0小时";
        } else {
            BigDecimal bigDecimal = new BigDecimal(time);
            BigDecimal bigDecimal1 = new BigDecimal(3600);
            BigDecimal hourBigDecimal = new BigDecimal(0);
            hourBigDecimal = new BigDecimal(String.valueOf(bigDecimal)).
                    divide(new BigDecimal(String.valueOf(bigDecimal1)), 2, BigDecimal.ROUND_HALF_UP);
            timeStr = hourBigDecimal + "小时";
        }
        return timeStr;
    }
    public static String secToTime(int time) {
        String timeStr = null;
        int hour = 0;
        int minute = 0;
        int second = 0;
        if (time <= 0)
            return " ";
        else {
            minute = time / 60;
            if (minute < 60) {
                second = time % 60;
                timeStr = unitFormat(minute) + "分" + unitFormat(second) + " ç§’";
            } else {
                hour = minute / 60;
                minute = minute % 60;
                second = time - hour * 3600 - minute * 60;
                timeStr = unitFormat(hour) + "小时" + unitFormat(minute) + "分" + unitFormat(second) + "秒";
            }
        }
        return timeStr;
    }
    public static String unitFormat(int i) {
        String retStr = null;
        if (i >= 0 && i < 10)
            retStr = "0" + Integer.toString(i);
        else
            retStr = "" + i;
        return retStr;
    }
    /**
     * éªŒè¯æ—¶é—´
     *
     * @param time æ—¶é—´å­—符串 HH:mm
     * @return éªŒè¯æˆåŠŸè¿”å›žtrue,验证失败返回false
     */
    public static boolean checkTime(String time) {
        String regex = "([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$";
        return Pattern.matches(regex, time);
    }
    /**
     * èŽ·å–æ¯æ—¥07:30:00的时间点
     * æ ¼å¼ä¸º yyyy-MM-dd HH:mm:ss
     * ä¾‹ï¼š2018-05-28 07:30:00
     *
     * @return
     */
    public static Date getHourDateTo(Date now, String time) {
        String dateStr = format(now, STR_DATE);
        dateStr = dateStr + " " + time;
        Date result = toDate(dateStr, STR_DATE_TIME_SMALL);
        return result;
    }
    public static Date setTimeForDay(Date theDate, String planTime) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(theDate);
        String[] times = planTime.split(":");
        cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(times[0]));
        cal.set(Calendar.MINUTE, Integer.parseInt(times[1]));
        cal.set(Calendar.SECOND, Integer.parseInt(times[2]));
        return cal.getTime();
    }
    public static long getTimeWithOutDay(Date d) {
        return d.getTime() / 1000 % 86400;
    }
    /**
     * @param lo æ¯«ç§’æ•°
     * @return String yyyy-MM-dd HH:mm:ss
     * @Description: long类型转换成日期
     */
    public static String longToDate(long lo) {
        Date date = new Date(lo);
        SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sd.format(date);
    }
    /**
     * @param startDate
     * @param endDate
     * @return
     */
    public static List<Date> getWeekDays(LocalDate startDate, LocalDate endDate) {
        List<Date> result = new ArrayList<>();
        List<LocalDate> dateList = Stream.iterate(startDate, localDate -> localDate.plusDays(1))
                .limit(ChronoUnit.DAYS.between(startDate, endDate) + 1)
                .filter(localDate -> DayOfWeek.SATURDAY.equals(DayOfWeek.of(localDate.get(ChronoField.DAY_OF_WEEK))) || DayOfWeek.SUNDAY.equals(DayOfWeek.of(localDate.get(ChronoField.DAY_OF_WEEK))))
                .collect(Collectors.toList());
        dateList.forEach(localDate -> result.add(Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant())));
        return result;
    }
    /**
     * @param smallDate
     * @param bigDate
     * @desc èŽ·å–ä¸¤ä¸ªæ—¥æœŸä¹‹é—´çš„å¤©æ•°
     */
    public static Integer getDaysBetween(String smallDate, String bigDate) throws ParseException {
        // æ—¥æœŸæ ¼å¼
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        // èŽ·å–ä¸¤ä¸ªæ—¥æœŸçš„æ—¶é—´æˆ³
        Calendar cal = Calendar.getInstance();
        cal.setTime(sdf.parse(smallDate));
        long smallTime = cal.getTimeInMillis();
        cal.setTime(sdf.parse(bigDate));
        long bigTime = cal.getTimeInMillis();
        // ç›¸å·®çš„æ—¥æœŸ
        long days = (bigTime - smallTime) / (1000 * 3600 * 24);
        // long转int å­˜åœ¨æº¢å‡ºæƒ…况  æ ¹æ®ä¸šåŠ¡æƒ…å†µç¼–è¾‘catch中返回值
        try {
            return Integer.parseInt(String.valueOf(days));
        } catch (NumberFormatException e) {
            e.printStackTrace();
            return 0;
        }
    }
    /**
     * æ—¥æœŸè½¬æ¢ï¼Œå°†æŽ¥å£è¿”回的20180524转为2018-05-24
     *
     * @param str
     * @return
     */
    public static String dateConvertion(String str) {
        Date parse = null;
        String dateString = "";
        try {
            parse = new SimpleDateFormat("yyyyMMdd").parse(str);
            dateString = new SimpleDateFormat("yyyy-MM-dd").format(parse);
        } catch (ParseException e) {
            dateString = null;
        }
        return dateString;
    }
}
lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/EquipmentMapper.java
@@ -7,6 +7,8 @@
import org.apache.ibatis.annotations.Select;
import org.jeecg.modules.mdc.entity.Equipment;
import java.util.List;
/**
 * @Description: é‡‡é›†è®¾å¤‡è¡¨
 * @Author: liuS
@@ -19,15 +21,19 @@
    @Select(" SELECT name FROM SysObjects Where XType='U' AND name = '${saveTableName}' ")
    String checkTableExists(@Param("saveTableName") String saveTableName);
    @Select(" SELECT COUNT(CollectTime) num FROM ${saveTableName} WHERE CollectTime < '${day}' ")
    @Select(" SELECT COUNT(CollectTime) num FROM [${saveTableName}] WHERE CollectTime < '${day}' ")
    Integer checkTableDataNum(@Param("saveTableName") String saveTableName, @Param("day") String day);
    @Insert(" INSERT INTO ${tableName} SELECT * FROM ${lastTableName}  WHERE CollectTime < '${date}' ")
    @Insert(" INSERT INTO [${tableName}] SELECT * FROM [${lastTableName}]  WHERE CollectTime < '${date}' ")
    void insertTableData(@Param("tableName") String tableName, @Param("lastTableName") String lastTableName, @Param("date") String date);
    @Delete(" delete from ${tableName} where CollectTime < '${day}' ")
    @Delete(" delete from [${tableName}] where CollectTime < '${day}' ")
    void deleteTableData(@Param("tableName") String saveTableName, @Param("day") String day);
    @Insert(" SELECT * INTO ${tableName} FROM ${lastTableName} WHERE CollectTime < '${date}' ")
    @Insert(" SELECT * INTO [${tableName}] FROM [${lastTableName}] WHERE CollectTime < '${date}' ")
    void insertNoTableData(@Param("tableName") String tableName, @Param("lastTableName") String lastTableName, @Param("date") String date);
    List<Equipment> listByProds(@Param("proIds") List<String> proIds);
    Equipment findByEquId(@Param("equipmentId") String equipmentId);
}
lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentMapper.java
@@ -140,4 +140,8 @@
    List<MdcEquipment> findByProIdsAndTeamCode(@Param("mdcProductionIds") List<String> mdcProductionIds, @Param("teamCodeList") List<String> teamCodeList);
    List<MdcEquipment> findByProIdsAndType(@Param("mdcProductionIds") List<String> mdcProductionIds, @Param("typeList") List<String> typeList);
    List<String> getEquIdsByProIds(@Param("proIds") List<String> proIds);
    List<MdcEquipment> getEquipmentList(@Param("allProductionIds") List<String> allProductionIds);
}
lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentMapper.xml
@@ -2,4 +2,22 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.mdc.mapper.EquipmentMapper">
    <select id="listByProds" resultType="org.jeecg.modules.mdc.entity.Equipment">
        SELECT
            t1.*
        FROM
            Equipment t1
            LEFT JOIN mdc_equipment t2 ON t1.EquipmentID = t2.equipment_id
            LEFT JOIN mdc_production_equipment t3 ON t2.id = t3.equipment_id
        <where>
            t3.production_id IN
            <foreach collection="proIds" index="index" item="id" open="(" separator="," close=")">
                #{id}
            </foreach>
        </where>
    </select>
    <select id="findByEquId" resultType="org.jeecg.modules.mdc.entity.Equipment">
        SELECT TOP 1 * FROM Equipment WHERE EquipmentID = #{equipmentId}
    </select>
</mapper>
lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentMapper.xml
@@ -89,6 +89,20 @@
        </foreach>
    </select>
    <!--根据产线id查询设备id集合-->
    <select id="getEquipmentList" resultType="org.jeecg.modules.mdc.entity.MdcEquipment">
        SELECT
        me.*
        FROM
        mdc_equipment me
        LEFT JOIN mdc_production_equipment mpe ON me.id = mpe.equipment_id
        WHERE
        mpe.production_id IN
        <foreach collection="allProductionIds" index="index" item="id" open="(" separator="," close=")">
            #{id}
        </foreach>
    </select>
    <!--查询设备监控信息-->
    <select id="checkStatusFromEquipmentIds" resultType="org.jeecg.modules.mdc.entity.MdcEquipmentMonitor">
        SELECT
@@ -340,6 +354,7 @@
            #{equipmentType}
        </foreach>
    </select>
    <select id="queryByDepartIdsAndType" resultType="org.jeecg.modules.mdc.entity.MdcEquipment">
        SELECT
            e.*,
@@ -358,4 +373,18 @@
        </foreach>
    </select>
    <select id="getEquIdsByProIds" resultType="java.lang.String">
        SELECT
        t1.equipment_id
        FROM
        mdc_equipment t1
        LEFT JOIN mdc_production_equipment t2 ON t1.id = t2.equipment_id
        <where>
            t2.production_id IN
            <foreach collection="proIds" index="index" item="id" open="(" separator="," close=")">
                #{id}
            </foreach>
        </where>
    </select>
</mapper>
lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IEquipmentService.java
@@ -3,6 +3,8 @@
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.mdc.entity.Equipment;
import java.util.List;
/**
 * @Description: é‡‡é›†è®¾å¤‡è¡¨
 * @Author: liuS
@@ -48,4 +50,8 @@
     * @param day
     */
    void insertNoTableData(String backupTableName, String tableName, String day);
    List<Equipment> listByProds(List<String> proIds);
    Equipment findByEquId(String equipmentId);
}
lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IMdcAlarmInfoService.java
@@ -11,4 +11,5 @@
 */
public interface IMdcAlarmInfoService extends IService<MdcAlarmInfo> {
    MdcAlarmInfo findAlarmContent(String alarmNo, String equipmentId);
}
lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentService.java
@@ -239,4 +239,13 @@
     * @return
     */
    List<MdcEquipment> findByProIdsAndType(List<String> allProductionIds, List<String> typeList);
    List<String> getEquIdsByProIds(List<String> proIds);
    /**
     * æ ¹æ®ç”¨æˆ·æŸ¥è¯¢è®¾å¤‡åˆ—表信息
     * @return
     */
    List<MdcEquipment> getEquipmentList();
}
lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentServiceImpl.java
@@ -6,6 +6,9 @@
import org.jeecg.modules.mdc.service.IEquipmentService;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
/**
 * @Description: é‡‡é›†è®¾å¤‡è¡¨
 * @Author: liuS
@@ -39,4 +42,14 @@
    public void insertNoTableData(String backupTableName, String tableName, String day) {
        this.baseMapper.insertNoTableData(backupTableName, tableName, day);
    }
    @Override
    public List<Equipment> listByProds(List<String> proIds) {
        return this.baseMapper.listByProds(proIds);
    }
    @Override
    public Equipment findByEquId(String equipmentId) {
        return this.baseMapper.findByEquId(equipmentId);
    }
}
lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentServiceImpl.java
@@ -4,6 +4,7 @@
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.StringPool;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
@@ -1042,4 +1043,36 @@
        return this.baseMapper.findByProIdsAndType(allProductionIds, typeList);
    }
    @Override
    public List<MdcEquipment> getEquipmentList() {
        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        String userId = user.getId();
        if (StringUtils.isNotEmpty(user.getEquipmentIds())) {
            return this.baseMapper.selectList(new LambdaQueryWrapper<MdcEquipment>().eq(MdcEquipment::getEquipmentId, Arrays.asList(user.getEquipmentIds().split(StringPool.COMMA))));
        }
        //获取所有产线数据
        List<MdcProduction> productionList = mdcProductionService.list(new LambdaQueryWrapper<MdcProduction>().eq(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_0.toString()).orderByAsc(MdcProduction::getProductionOrder));
        //根据用户id获取拥有的产线信息集合
        List<String> productionIds = mdcUserProductionService.queryProductionIdsByUserId(userId);
        List<String> allProductionIds = new ArrayList<>();
        //找到所有产线id的上级id
        if (productionIds != null && !productionIds.isEmpty()) {
            for (String productionId : productionIds) {
                this.getAllProductionIds(productionList, productionId, allProductionIds);
            }
        }
        //根据产线集合查找所有设备id
        if (allProductionIds.isEmpty()) {
            return null;
        }
        List<MdcEquipment> equipmentIds = this.baseMapper.getEquipmentList(allProductionIds);
        return equipmentIds;
    }
    @Override
    public List<String> getEquIdsByProIds(List<String> proIds) {
        return this.baseMapper.getEquIdsByProIds(proIds);
    }
}
lxzn-module-mdc/pom.xml
@@ -25,6 +25,11 @@
            <artifactId>lxzn-module-mdc-common</artifactId>
            <version>3.4.3</version>
        </dependency>
        <dependency>
            <groupId>org.jeecgframework.boot</groupId>
            <artifactId>lxzn-module-eam-common</artifactId>
            <version>3.4.3</version>
        </dependency>
    </dependencies>
</project>
lxzn-module-mdc/src/main/java/org/jeecg/modules/board/controller/DtBoardController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,95 @@
package org.jeecg.modules.board.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.board.service.IDtBoardService;
import org.jeecg.modules.board.vo.*;
import org.jeecg.modules.system.entity.MdcProduction;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
/**
 * @Author: Lius
 * @CreateTime: 2025-05-30
 * @Description: æ•°å­—孪生看板接口
 */
@Slf4j
@Api(tags = "数字孪生看板")
@RestController
@RequestMapping("/board/dtBoard")
public class DtBoardController {
    @Resource
    private IDtBoardService dtBoardService;
    @ApiOperation(value = "数字孪生看板-获取车间分组", notes = "数字孪生看板-获取车间分组")
    @GetMapping("/productionList")
    public Result<?> productionList() {
        List<MdcProduction> result = dtBoardService.productionList();
        return Result.OK(result);
    }
    @ApiOperation(value = "数字孪生看板-设备月度利用率", notes = "数字孪生看板-设备月度利用率")
    @GetMapping("/equipmentMonthUtilizationRate")
    public Result<?> equipmentMonthUtilizationRate(@ApiParam(value = "productionId", required = true) String productionId) {
        List<EquUtilRateMonth> result = dtBoardService.equipmentMonthUtilizationRate(productionId);
        return Result.OK(result);
    }
    @ApiOperation(value = "数字孪生看板-设备利用率", notes = "数字孪生看板-设备利用率")
    @GetMapping("/equipmentUtilizationRate")
    public Result<?> equipmentUtilizationRate(@ApiParam(value = "productionId", required = true) String productionId) {
        List<EquUtilRate> result = dtBoardService.equipmentUtilizationRate(productionId);
        return Result.OK(result);
    }
    @ApiOperation(value = "数字孪生看板-月度OEE", notes = "数字孪生看板-月度OEE")
    @GetMapping("/equipmentMonthOee")
    public Result<?> equipmentMonthOee(@ApiParam(value = "productionId", required = true) String productionId) {
        List<EquOeeMonth> result = dtBoardService.equipmentMonthOee(productionId);
        return Result.OK(result);
    }
    @ApiOperation(value = "数字孪生看板-设备运行状态统计", notes = "数字孪生看板-设备运行状态")
    @GetMapping("/equipmentOperationStatistics")
    public Result<?> equipmentOperationStatistics(@ApiParam(value = "productionId", required = true) String productionId) {
        EquOperation result = dtBoardService.equipmentOperationStatistics(productionId);
        return Result.OK(result);
    }
    @ApiOperation(value = "数字孪生看板-设备信息", notes = "数字孪生看板-设备信息")
    @GetMapping("/equipmentRunInfo")
    public Result<?> equipmentRunInfo(@ApiParam(value = "equipmentId", required = true) String equipmentId) {
        List<EquRunInfo> result = dtBoardService.equipmentRunInfo(equipmentId);
        return Result.OK(result);
    }
    @ApiOperation(value = "数字孪生看板-设备停机统计", notes = "数字孪生看板-设备停机统计")
    @GetMapping("/equDowntimeStatistics")
    public Result<?> equDowntimeStatistics(@ApiParam(value = "productionId", required = true) String productionId) {
        List<EquDowntimeInfo> result = dtBoardService.equDowntimeStatistics(productionId);
        return Result.OK(result);
    }
    @ApiOperation(value = "数字孪生看板-设备报警", notes = "数字孪生看板-设备报警")
    @GetMapping("/equAlarmList")
    public Result<?> equAlarmList(@ApiParam(value = "productionId", required = true) String productionId) {
        List<EquAlarm> result = dtBoardService.equAlarmList(productionId);
        return Result.OK(result);
    }
//    @ApiOperation(value = "数字孪生看板-设备故障", notes = "数字孪生看板-设备故障")
//    @GetMapping("/equAlarmList")
//    public Result<?> equAlarmList(@ApiParam(value = "productionId", required = true) String productionId) {
//        dtBoardService.
//    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/IDtBoardService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package org.jeecg.modules.board.service;
import org.jeecg.modules.board.vo.*;
import org.jeecg.modules.system.entity.MdcProduction;
import java.util.List;
/**
 * @Author: Lius
 * @CreateTime: 2025-05-30
 * @Description:
 */
public interface IDtBoardService {
    List<MdcProduction> productionList();
    List<EquUtilRateMonth> equipmentMonthUtilizationRate(String productionId);
    List<EquUtilRate> equipmentUtilizationRate(String productionId);
    List<EquOeeMonth> equipmentMonthOee(String productionId);
    EquOperation equipmentOperationStatistics(String productionId);
    List<EquRunInfo> equipmentRunInfo(String equipmentId);
    List<EquDowntimeInfo> equDowntimeStatistics(String productionId);
    List<EquAlarm> equAlarmList(String productionId);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/impl/DtBoardServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,340 @@
package org.jeecg.modules.board.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import liquibase.pro.packaged.I;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.system.vo.DictModel;
import org.jeecg.modules.board.service.IDtBoardService;
import org.jeecg.modules.board.vo.*;
import org.jeecg.modules.mdc.constant.MdcConstant;
import org.jeecg.modules.mdc.entity.*;
import org.jeecg.modules.mdc.service.*;
import org.jeecg.modules.mdc.util.DateUtils;
import org.jeecg.modules.system.entity.MdcProduction;
import org.jeecg.modules.system.service.IMdcProductionService;
import org.jeecg.modules.system.service.ISysDictService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;
/**
 * @Author: Lius
 * @CreateTime: 2025-05-30
 * @Description:
 */
@Service
public class DtBoardServiceImpl implements IDtBoardService {
    @Resource
    private IMdcProductionService mdcProductionService;
    @Resource
    private IMdcEquipmentService mdcEquipmentService;
    @Resource
    private IMdcEquipmentStatisticalInfoService mdcEquipmentStatisticalInfoService;
    @Resource
    private IMdcOeeInfoService mdcOeeInfoService;
    @Resource
    private IEquipmentService equipmentService;
    @Resource
    private IEquipmentWorkLineService equipmentWorkLineService;
    @Resource
    private IMdcDriveTypeParamConfigService mdcDriveTypeParamConfigService;
    @Resource
    private ISysDictService sysDictService;
    @Resource
    private IMdcDowntimeService mdcDowntimeService;
    @Resource
    private IEquipmentAlarmService equipmentAlarmService;
    @Resource
    private IMdcAlarmInfoService mdcAlarmInfoService;
    /**
     * è½¦é—´ä¿¡æ¯
     */
    @Override
    public List<MdcProduction> productionList() {
        return mdcProductionService.list(new LambdaQueryWrapper<MdcProduction>().eq(MdcProduction::getOrgType, CommonConstant.ORG_TYPE_2).eq(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_0).orderByAsc(MdcProduction::getProductionOrder));
    }
    /**
     * è®¾å¤‡æœˆåº¦åˆ©ç”¨çއ
     */
    @Override
    public List<EquUtilRateMonth> equipmentMonthUtilizationRate(String productionId) {
        // ç»„装返回数据
        LocalDate now = LocalDate.now();
        Date start = DateUtils.toDate(now.plusMonths(-12).toString(), DateUtils.STR_DATE);
        Date end = DateUtils.toDate(now.plusMonths(-1).toString(), DateUtils.STR_DATE);
        List<String> monthBetween = DateUtils.getMonthBetween(start, end);
        Map<String, EquUtilRateMonth> resultMap = monthBetween.stream().collect(Collectors.toMap(
                date -> date,
                date -> new EquUtilRateMonth(date.substring(date.lastIndexOf("-") + 1).replaceFirst("^0*", "") + "月"),
                (existing, replacement) -> existing, // å¤„理键冲突的合并函数(通常不会冲突)
                LinkedHashMap::new // æŒ‡å®šä½¿ç”¨LinkedHashMap保持插入顺序
        ));
        List<String> proIds = mdcProductionService.findChildByProId(productionId);
        if (proIds == null || proIds.isEmpty()) {
            return new ArrayList<>(resultMap.values());
        }
        List<String> equipmentIdList = mdcEquipmentService.getEquIdsByProIds(proIds);
        if (equipmentIdList == null || equipmentIdList.isEmpty()) {
            return new ArrayList<>(resultMap.values());
        }
        for (String month : monthBetween) {
            MdcEquipmentStatisticalInfo mdcEquipmentStatisticalInfo = mdcEquipmentStatisticalInfoService.findByEquIdsAndMonth(equipmentIdList, month.replaceAll("-", ""));
            if (mdcEquipmentStatisticalInfo != null) {
                if (resultMap.containsKey(month)) {
                    EquUtilRateMonth equUtilRateMonth = resultMap.get(month);
                    if (mdcEquipmentStatisticalInfo.getProcessLong().compareTo(BigDecimal.ZERO) > 0) {
                        equUtilRateMonth.setUtilizationRate(mdcEquipmentStatisticalInfo.getProcessLong().divide(new BigDecimal("864"), 2, RoundingMode.HALF_UP));
                    }
                    resultMap.put(month, equUtilRateMonth);
                }
            }
        }
        return new ArrayList<>(resultMap.values());
    }
    /**
     * è®¾å¤‡åˆ©ç”¨çއ(昨天)
     */
    @Override
    public List<EquUtilRate> equipmentUtilizationRate(String productionId) {
        List<String> proIds = mdcProductionService.findChildByProId(productionId);
        if (proIds == null || proIds.isEmpty()) {
            return null;
        }
        List<String> equipmentIdList = mdcEquipmentService.getEquIdsByProIds(proIds);
        if (equipmentIdList == null || equipmentIdList.isEmpty()) {
            return null;
        }
        Map<String, EquUtilRate> resultMap = new LinkedHashMap<>();
        equipmentIdList.forEach(equipmentId -> {
            EquUtilRate equUtilRate = new EquUtilRate(equipmentId);
            resultMap.put(equipmentId, equUtilRate);
        });
        String yesterday = LocalDate.now().plusDays(-1).toString();
        List<MdcEquipmentStatisticalInfo> mdcEquipmentStatisticalInfoList = mdcEquipmentStatisticalInfoService.findByEquipmentAndDate(equipmentIdList, yesterday.replaceAll("-", ""));
        if (mdcEquipmentStatisticalInfoList != null && !mdcEquipmentStatisticalInfoList.isEmpty()) {
            mdcEquipmentStatisticalInfoList.forEach(mdcEquipmentStatisticalInfo -> {
                if (resultMap.containsKey(mdcEquipmentStatisticalInfo.getEquipmentId())) {
                    EquUtilRate equUtilRate = resultMap.get(mdcEquipmentStatisticalInfo.getEquipmentId());
                    if (mdcEquipmentStatisticalInfo.getProcessLong().compareTo(BigDecimal.ZERO) > 0) {
                        equUtilRate.setUtilizationRate(mdcEquipmentStatisticalInfo.getProcessLong().divide(new BigDecimal("864"), 2, RoundingMode.HALF_UP));
                    }
                    resultMap.put(mdcEquipmentStatisticalInfo.getEquipmentId(), equUtilRate);
                }
            });
        }
        return new ArrayList<>(resultMap.values());
    }
    /**
     * æœˆåº¦è®¾å¤‡ç»¼åˆæ•ˆçއ
     */
    @Override
    public List<EquOeeMonth> equipmentMonthOee(String productionId) {
        LocalDate now = LocalDate.now();
        Date start = DateUtils.toDate(now.plusMonths(-12).toString(), DateUtils.STR_DATE);
        Date end = DateUtils.toDate(now.plusMonths(-1).toString(), DateUtils.STR_DATE);
        List<String> monthBetween = DateUtils.getMonthBetween(start, end);
        Map<String, EquOeeMonth> resultMap = monthBetween.stream().collect(Collectors.toMap(
                date -> date,
                date -> new EquOeeMonth(date.substring(date.lastIndexOf("-") + 1).replaceFirst("^0*", "") + "月"),
                (existing, replacement) -> existing, // å¤„理键冲突的合并函数(通常不会冲突)
                LinkedHashMap::new // æŒ‡å®šä½¿ç”¨LinkedHashMap保持插入顺序
        ));
        List<String> proIds = mdcProductionService.findChildByProId(productionId);
        if (proIds == null || proIds.isEmpty()) {
            return new ArrayList<>(resultMap.values());
        }
        List<String> equipmentIdList = mdcEquipmentService.getEquIdsByProIds(proIds);
        if (equipmentIdList == null || equipmentIdList.isEmpty()) {
            return new ArrayList<>(resultMap.values());
        }
        for (String month : monthBetween) {
            BigDecimal oee = mdcOeeInfoService.findByEquIdAndMonth(equipmentIdList, month);
            if (oee != null) {
                EquOeeMonth equOeeMonth = resultMap.get(month);
                equOeeMonth.setOee(oee.setScale(2, RoundingMode.HALF_UP));
                resultMap.put(month, equOeeMonth);
            }
        }
        return new ArrayList<>(resultMap.values());
    }
    /**
     * è®¾å¤‡çŠ¶æ€ç»Ÿè®¡
     */
    @Override
    public EquOperation equipmentOperationStatistics(String productionId) {
        EquOperation equOperation = new EquOperation();
        List<String> proIds = mdcProductionService.findChildByProId(productionId);
        if (proIds == null || proIds.isEmpty()) {
            return equOperation;
        }
        List<Equipment> equipmentList = equipmentService.listByProds(proIds);
        if (equipmentList == null || equipmentList.isEmpty()) {
            return equOperation;
        }
        for (Equipment equipment : equipmentList) {
            if (equipment.getOporation() != null) {
                switch (equipment.getOporation()) {
                    case 1:
                    case 2:
                        equOperation.setStandby(equOperation.getStandby() + 1);
                        break;
                    case 3:
                        equOperation.setRun(equOperation.getRun() + 1);
                        break;
                    case 22:
                        equOperation.setAlarm(equOperation.getAlarm() + 1);
                        break;
                    default:
                        equOperation.setShutdown(equOperation.getShutdown() + 1);
                        break;
                }
            } else {
                equOperation.setShutdown(equOperation.getShutdown() + 1);
            }
        }
        return equOperation;
    }
    /**
     * è®¾å¤‡è¿è¡Œä¿¡æ¯
     */
    @Override
    public List<EquRunInfo> equipmentRunInfo(String equipmentId) {
        List<EquRunInfo> equRunInfoList = new ArrayList<>();
        Equipment equipment = equipmentService.findByEquId(equipmentId);
        if (equipment != null) {
            //填充设备基础信息
            equRunInfoList.add(new EquRunInfo("设备名称", equipment.getEquipmentname(), ""));
            equRunInfoList.add(new EquRunInfo("设备编号", equipment.getEquipmentid(), ""));
            if (equipment.getOporation() != null && equipment.getOporation() != 0) {
                String saveTableName = equipment.getSavetablename();
                Map<String, Object> mapData = equipmentWorkLineService.getDataList(saveTableName);
                if (mapData != null) {
                    //获取 MDC é©±åŠ¨å¯¹åº”çš„å±•ç¤ºå‚æ•°   å¹¶æ ¹æ®key æ‹¼è£…从 workData  æŸ¥è¯¢çš„æ•°æ®
                    List<MdcDriveTypeParamConfig> mdcDriveTypeParamList = mdcDriveTypeParamConfigService.getShowDriveParam(equipment.getDrivetype());
                    if (mdcDriveTypeParamList != null && !mdcDriveTypeParamList.isEmpty()) {
                        List<DictModel> dictItems = sysDictService.getDictItems(CommonConstant.DICT_EQUIPMENT_RUN_UNIT);
                        Map<String, DictModel> resultMap = new HashMap<>();
                        dictItems.forEach(dictModel -> {
                            resultMap.put(dictModel.getText(), dictModel);
                        });
                        for (MdcDriveTypeParamConfig mdcDriveTypeParamConfig : mdcDriveTypeParamList) {
                            EquRunInfo equRunInfo = new EquRunInfo();
                            String englishName = mdcDriveTypeParamConfig.getEnglishName();
                            String chineseName = mdcDriveTypeParamConfig.getChineseName();
                            equRunInfo.setKey(chineseName);
                            if (mapData.containsKey(englishName)) {
                                Object object = mapData.get(englishName);
                                String value = "";
                                if ("CollectTime".equals(englishName)) {
                                    Date date = object == null ? null : (Date) object;
                                    value = DateUtils.format(date, DateUtils.STR_DATE_TIME_SMALL);
                                } else if ("ZUOLAN".equals(equipment.getDrivetype()) && "spindlespeed".equals(englishName) && equipment.getOporation() == 3) {
                                    // ZUOLAN设备主轴转速字段spindlespeed
                                    value = String.valueOf(((new Random().nextInt(35)) + 1) * 100);
                                } else if ("ZUOLAN".equals(equipment.getDrivetype()) && "spindleload".equals(englishName) && equipment.getOporation() == 3) {
                                    // ZUOLAN设备主轴负荷字段spindleload
                                    value = String.valueOf(Integer.valueOf(new Random().nextInt(21)));
                                } else if ("ZUOLAN".equals(equipment.getDrivetype()) && "spindlebeilv".equals(englishName) && equipment.getOporation() == 3) {
                                    // ZUOLAN设备主轴倍率字段spindlebeilv
                                    value = String.valueOf((new Random().nextInt(13)) * 10);
                                } else if ("ZUOLAN".equals(equipment.getDrivetype()) && "feedbeilv".equals(englishName) && equipment.getOporation() == 3) {
                                    // ZUOLAN设备进给倍率字段feedbeilv
                                    value = String.valueOf((new Random().nextInt(13)) * 10);
                                } else {
                                    value = object == null ? "" : object.toString();
                                }
                                equRunInfo.setValue(value);
                                // è®¾ç½®å•位
                                if (resultMap.containsKey(chineseName)) {
                                    DictModel dictModel = resultMap.get(chineseName);
                                    equRunInfo.setUnit(dictModel.getValue());
                                }
                                equRunInfoList.add(equRunInfo);
                            }
                        }
                    }
                }
            }
        }
        return equRunInfoList;
    }
    /**
     * è®¾å¤‡åœæœºç»Ÿè®¡
     */
    @Override
    public List<EquDowntimeInfo> equDowntimeStatistics(String productionId) {
        List<String> proIds = mdcProductionService.findChildByProId(productionId);
        if (proIds == null || proIds.isEmpty()) {
            return null;
        }
        List<String> equipmentIdList = mdcEquipmentService.getEquIdsByProIds(proIds);
        if (equipmentIdList == null || equipmentIdList.isEmpty()) {
            return null;
        }
        LocalDate end = LocalDate.now();
        LocalDate start = end.plusDays(-30);
        List<EquDowntimeInfo> result = mdcDowntimeService.equDowntimeStatistics(equipmentIdList, start.toString(), end.toString());
        result.forEach(equDowntimeInfo -> {
            equDowntimeInfo.setDuration(equDowntimeInfo.getDuration().setScale(2, RoundingMode.HALF_UP));
        });
        return result;
    }
    /**
     * è®¾å¤‡æŠ¥è­¦åˆ—表
     */
    @Override
    public List<EquAlarm> equAlarmList(String productionId) {
        List<EquAlarm> result = new ArrayList<>();
        List<String> proIds = mdcProductionService.findChildByProId(productionId);
        if (proIds == null || proIds.isEmpty()) {
            return null;
        }
        List<String> equipmentIdList = mdcEquipmentService.getEquIdsByProIds(proIds);
        if (equipmentIdList == null || equipmentIdList.isEmpty()) {
            return null;
        }
        List<EquipmentAlarm> equipmentAlarmList =  equipmentAlarmService.list(new LambdaQueryWrapper<EquipmentAlarm>().in(EquipmentAlarm::getEquipmentid, equipmentIdList).orderByDesc(EquipmentAlarm::getCollecttime).isNotNull(EquipmentAlarm::getAlarmNo).last("TOP 15"));
        if (equipmentAlarmList == null || equipmentAlarmList.isEmpty()) {
            return null;
        }
        for (EquipmentAlarm equipmentAlarm : equipmentAlarmList) {
            MdcAlarmInfo mdcAlarmInfo = mdcAlarmInfoService.findAlarmContent(equipmentAlarm.getAlarmNo(), equipmentAlarm.getEquipmentid());
            EquAlarm equAlarm = new EquAlarm();
            equAlarm.setEquipmentId(equipmentAlarm.getEquipmentid());
            if (mdcAlarmInfo != null) {
                equAlarm.setAlarmInfo(mdcAlarmInfo.getAlarmContent());
            } else {
                equAlarm.setAlarmInfo(equipmentAlarm.getAlarmContent());
            }
            result.add(equAlarm);
        }
        return result;
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquAlarm.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package org.jeecg.modules.board.vo;
import lombok.Data;
/**
 * @Author: Lius
 * @CreateTime: 2025-06-09
 * @Description: è®¾å¤‡æŠ¥è­¦ä¿¡æ¯
 */
@Data
public class EquAlarm {
    /**
     * è®¾å¤‡ç¼–号
     */
    private String equipmentId;
    /**
     * æŠ¥è­¦ä¿¡æ¯
     */
    private String alarmInfo;
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquDowntimeInfo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package org.jeecg.modules.board.vo;
import lombok.Data;
import java.math.BigDecimal;
/**
 * @Author: Lius
 * @CreateTime: 2025-06-09
 * @Description: è®¾å¤‡åœæœºç»Ÿè®¡
 */
@Data
public class EquDowntimeInfo {
    /**
     * åœæœºåŽŸå› 
     */
    private String shutdownInfo;
    /**
     * åœæœºæ—¶é•¿
     */
    private BigDecimal duration;
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquOeeMonth.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package org.jeecg.modules.board.vo;
import lombok.Data;
import java.math.BigDecimal;
/**
 * @Author: Lius
 * @CreateTime: 2025-05-30
 * @Description:
 */
@Data
public class EquOeeMonth {
    private String month;
    private BigDecimal oee = BigDecimal.ZERO;
    public EquOeeMonth(String month) {
        this.month = month;
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquOperation.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package org.jeecg.modules.board.vo;
import lombok.Data;
/**
 * @Author: Lius
 * @CreateTime: 2025-06-06
 * @Description:
 */
@Data
public class EquOperation {
    private Integer shutdown = 0;
    private Integer alarm = 0;
    private Integer standby = 0;
    private Integer run = 0;
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquRunInfo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package org.jeecg.modules.board.vo;
import lombok.Data;
/**
 * @Author: Lius
 * @CreateTime: 2025-06-06
 * @Description:
 */
@Data
public class EquRunInfo {
    private String key;
    private String value;
    private String unit;
    public EquRunInfo() {
    }
    public EquRunInfo(String key, String value, String unit) {
        this.key = key;
        this.value = value;
        this.unit = unit;
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquStatus.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package org.jeecg.modules.board.vo;
import lombok.Data;
/**
 * @Author: Lius
 * @CreateTime: 2025-06-05
 * @Description:
 */
@Data
public class EquStatus {
    private String equipmentId;
    private Integer state;
    private String plantName;
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquUtilRate.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package org.jeecg.modules.board.vo;
import lombok.Data;
import java.math.BigDecimal;
/**
 * @Author: Lius
 * @CreateTime: 2025-05-30
 * @Description:
 */
@Data
public class EquUtilRate {
    private String deviceNum;
    private BigDecimal utilizationRate = BigDecimal.ZERO;
    public EquUtilRate(String deviceNum) {
        this.deviceNum = deviceNum;
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquUtilRateMonth.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package org.jeecg.modules.board.vo;
import lombok.Data;
import java.math.BigDecimal;
/**
 * @Author: Lius
 * @CreateTime: 2025-05-30
 * @Description:
 */
@Data
public class EquUtilRateMonth {
    private String month;
    private BigDecimal utilizationRate = BigDecimal.ZERO;
    public EquUtilRateMonth(String month) {
        this.month = month;
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcDowntimeOperatorController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,85 @@
package org.jeecg.modules.mdc.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.modules.mdc.dto.MdcDowntimeDto;
import org.jeecg.modules.mdc.entity.MdcDowntime;
import org.jeecg.modules.mdc.service.IMdcDowntimeOperatorService;
import org.jeecg.modules.mdc.vo.MdcDowntimeVo;
import org.jeecg.modules.mdc.vo.SplitDowntimeVo;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
 * @Description: æ“ä½œå·¥åœæœºå¾…机表
 * @Author: lius
 * @Date: 2025-03-12
 */
@Slf4j
@Api(tags = "操作工停机待机表")
@RestController
@RequestMapping("/mdc/operator/mdcDowntime")
public class MdcDowntimeOperatorController  extends JeecgController<MdcDowntime, IMdcDowntimeOperatorService> {
    @Resource
    private IMdcDowntimeOperatorService mdcDowntimeService;
    /**
     * åˆ†é¡µåˆ—表查询
     *
     * @param mdcDowntimeVo
     * @param pageNo
     * @param pageSize
     * @return
     */
    @AutoLog(value = "待机停机表-分页列表查询")
    @ApiOperation(value = "待机停机表-分页列表查询", notes = "待机停机表-分页列表查询")
    @GetMapping(value = "/list")
    public Result<?> queryPageList(MdcDowntimeVo mdcDowntimeVo,
                                   @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                   @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        String userId = user.getId();
        Page<MdcDowntimeDto> page = new Page<MdcDowntimeDto>(pageNo, pageSize);
        IPage<MdcDowntimeDto> pageList = mdcDowntimeService.pageList(mdcDowntimeVo, page);
        return Result.OK(pageList);
    }
    /**
     * ç»´æŠ¤åœæœº
     *
     * @param mdcDowntimeVo
     * @return
     */
    @AutoLog(value = "待机停机表-维护停机")
    @ApiOperation(value = "待机停机表-维护停机", notes = "待机停机表-维护停机")
    @RequestMapping(value = "/updateReason", method = {RequestMethod.PUT, RequestMethod.POST})
    public Result<?> updateReason(@RequestBody MdcDowntimeVo mdcDowntimeVo) {
        mdcDowntimeService.updateReason(mdcDowntimeVo);
        return Result.OK("编辑成功!");
    }
    /**
     * åœæœºæ‹†åˆ†
     *
     * @param splitDowntimeVo
     * @return
     */
    @AutoLog(value = "待机停机表-停机拆分")
    @ApiOperation(value = "待机停机表-停机拆分", notes = "待机停机表-停机拆分")
    @RequestMapping(value = "/splitDowntime", method = {RequestMethod.PUT, RequestMethod.POST})
    public Result<?> splitDowntime(@RequestBody SplitDowntimeVo splitDowntimeVo) {
        mdcDowntimeService.splitDowntime(splitDowntimeVo);
        return Result.OK("拆分成功!");
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcDowntimeReasonController.java
@@ -3,6 +3,7 @@
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.beust.jcommander.internal.Lists;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
@@ -10,9 +11,9 @@
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.modules.mdc.dto.OptionsDto;
import org.jeecg.modules.mdc.entity.MdcDowntimeReason;
import org.jeecg.modules.mdc.service.IMdcDowntimeReasonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
@@ -166,4 +167,24 @@
        return Result.OK(result);
    }
    /**
     * åœæœºåŽŸå› ä¸‹æ‹‰é€‰æ‹©
     *
     * @return
     */
    @AutoLog(value = "停机原因表-停机原因下拉选择")
    @ApiOperation(value = "停机原因表-停机原因下拉选择", notes = "停机原因表-停机原因下拉选择")
    @GetMapping(value = "/reasonList")
    public Result<List<OptionsDto>> reasonList() {
        List<MdcDowntimeReason> result = mdcDowntimeReasonService.list();
        List<OptionsDto> list = Lists.newArrayList();
        result.forEach(mdcDowntimeReason -> {
            OptionsDto optionsDto = new OptionsDto();
            optionsDto.setValue(mdcDowntimeReason.getId());
            optionsDto.setLabel(mdcDowntimeReason.getDowntimeDescription());
            list.add(optionsDto);
        });
        return Result.OK(list);
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentController.java
@@ -111,6 +111,17 @@
    }
    /**
     * æ ¹æ®ç”¨æˆ·æŸ¥è¯¢è®¾å¤‡åˆ—表信息
     */
    @AutoLog(value = "设备表-根据用户查询设备列表信息")
    @ApiOperation(value = "设备表-根据用户查询设备列表信息", notes = "设备表-根据用户查询设备列表信息")
    @GetMapping(value = "/getEquipmentList")
    public Result<List<MdcEquipment>> getEquipmentList() {
        List<MdcEquipment> list = mdcEquipmentService.getEquipmentList();
        return Result.OK(list);
    }
    /**
     * è®¾å¤‡ç›‘控列表
     */
    @AutoLog(value = "设备表-设备监控列表")
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcDowntime.java
@@ -81,5 +81,18 @@
    @Excel(name = "备注", width = 15)
    @ApiModelProperty(value = "备注")
    private String remark;
    /**
     * å½•入类型
     */
    @Excel(name = "录入类型", width = 15)
    @ApiModelProperty(value = "录入类型")
    @Dict(dicCode = "enter_type")
    private Integer enterType;
    /**
     * åœæœºæ—¶é•¿
     */
    @Excel(name = "停机时长", width = 15)
    @ApiModelProperty(value = "停机时长")
    private Integer shutdownDuration;
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningOverallEquipmentEfficiencyJob.java
ÎļþÒÑɾ³ý
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/ScanDowntimeJob.java
@@ -90,6 +90,7 @@
                    downtime.setTheDate(finalDate);
                    downtime.setStartDate(mdcEquipmentWaitSectionDto.getStartTime());
                    downtime.setEndDate(mdcEquipmentWaitSectionDto.getEndTime());
                    downtime.setShutdownDuration(DateUtils.differentMinutes(downtime.getStartDate(), downtime.getEndDate()));
                    return downtime;
                }).collect(Collectors.toList());
                if (!downtimeList.isEmpty()) {
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/WebsocketPushEquStatusJob.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,108 @@
package org.jeecg.modules.mdc.job;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.constant.WebsocketConst;
import org.jeecg.common.util.RedisUtil;
import org.jeecg.modules.board.vo.EquStatus;
import org.jeecg.modules.mdc.entity.Equipment;
import org.jeecg.modules.mdc.service.IEquipmentService;
import org.jeecg.modules.mdc.util.ThrowableUtil;
import org.jeecg.modules.message.websocket.WebSocket;
import org.jeecg.modules.quartz.entity.QuartzJob;
import org.jeecg.modules.quartz.entity.SysQuartzLog;
import org.jeecg.modules.quartz.service.IQuartzJobService;
import org.jeecg.modules.quartz.service.ISysQuartzLogService;
import org.jeecg.modules.system.service.IMdcProductionService;
import org.quartz.*;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
 * @Author: Lius
 * @CreateTime: 2025-06-05
 * @Description: websocket推送设备状态任务
 */
@DisallowConcurrentExecution
@Slf4j
public class WebsocketPushEquStatusJob implements Job {
    @Resource
    private IQuartzJobService quartzJobService;
    @Resource
    private ISysQuartzLogService sysQuartzLogService;
    @Resource
    private RedisUtil redisUtil;
    @Resource
    private WebSocket webSocket;
    @Resource
    private IEquipmentService equipmentService;
    @Resource
    private IMdcProductionService mdcProductionService;
    final private static String redisKey = "board:equipment:status:";
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        SysQuartzLog quartzLog = new SysQuartzLog();
        quartzLog.setCreateTime(new Date());
        List<QuartzJob> byJobClassName = this.quartzJobService.findByJobClassName(this.getClass().getName());
        if (byJobClassName != null && !byJobClassName.isEmpty()) {
            quartzLog.setJobId(byJobClassName.get(0).getId());
        }
        long startTime = System.currentTimeMillis();
        try {
            List<Equipment> equipmentList = equipmentService.list();
            if (equipmentList != null && !equipmentList.isEmpty()) {
                List<EquStatus> equStatusList = new ArrayList<>();
                for (Equipment equipment : equipmentList) {
                    if (equipment.getOporation() == null) {
                        equipment.setOporation(0);
                    }
                    String key = redisKey + equipment.getEquipmentid();
                    if (redisUtil.hasKey(key)) {
                        Integer status = (Integer) redisUtil.get(key);
                        if (!status.equals(equipment.getOporation())) {
                            EquStatus equStatus = new EquStatus();
                            equStatus.setEquipmentId(equipment.getEquipmentid());
                            equStatus.setState(equipment.getOporation());
                            // é€šè¿‡equipmentId获取设备车间名称
                            String productionName = mdcProductionService.findProName(equipment.getEquipmentid());
                            equStatus.setPlantName(productionName);
                            equStatusList.add(equStatus);
                            redisUtil.set(key, equipment.getOporation());
                        }
                    } else {
                        EquStatus equStatus = new EquStatus();
                        equStatus.setEquipmentId(equipment.getEquipmentid());
                        equStatus.setState(equipment.getOporation());
                        // é€šè¿‡equipmentId获取设备车间名称
                        String productionName = mdcProductionService.findProName(equipment.getEquipmentid());
                        equStatus.setPlantName(productionName);
                        equStatusList.add(equStatus);
                        redisUtil.set(key, equipment.getOporation());
                    }
                }
                JSONObject jsonObject = new JSONObject();
                jsonObject.put(WebsocketConst.MSG_CMD, "equStatus");
                jsonObject.put("data", equStatusList);
                webSocket.sendMessage(jsonObject.toJSONString());
            }
            quartzLog.setIsSuccess(0);
        } catch (Exception e) {
            quartzLog.setIsSuccess(-1);
            quartzLog.setExceptionDetail(ThrowableUtil.getStackTrace(e));
        }
        long endTime = System.currentTimeMillis();
        quartzLog.setExecutionTime(Integer.parseInt(String.valueOf(endTime - startTime)));
        sysQuartzLogService.save(quartzLog);
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcAlarmInfoMapper.java
@@ -1,6 +1,7 @@
package org.jeecg.modules.mdc.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.mdc.entity.MdcAlarmInfo;
/**
@@ -11,4 +12,5 @@
 */
public interface MdcAlarmInfoMapper extends BaseMapper<MdcAlarmInfo> {
    MdcAlarmInfo findAlarmContent(@Param("alarmNo") String alarmNo, @Param("equipmentId") String equipmentId);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcDowntimeMapper.java
@@ -4,6 +4,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.board.vo.EquDowntimeInfo;
import org.jeecg.modules.mdc.dto.MdcDowntimeDto;
import org.jeecg.modules.mdc.entity.MdcDowntime;
import org.jeecg.modules.mdc.vo.MdcDowntimeVo;
@@ -20,4 +21,6 @@
    IPage<MdcDowntimeDto> pageList(Page<MdcDowntimeDto> page, @Param("mdcDowntimeVo") MdcDowntimeVo mdcDowntimeVo);
    List<MdcDowntime> findPlanTimeDuration(@Param("equipmentId") String equipmentId, @Param("validDate") String validDate, @Param("closeType") String closeType);
    List<EquDowntimeInfo> equDowntimeStatistics(@Param("equipmentIdList") List<String> equipmentIdList, @Param("start") String start, @Param("end") String end);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcDowntimeOperatorMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package org.jeecg.modules.mdc.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.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.mdc.dto.MdcDowntimeDto;
import org.jeecg.modules.mdc.entity.MdcDowntime;
import org.jeecg.modules.mdc.vo.MdcDowntimeVo;
import java.util.List;
/**
 * @Description: æ“ä½œå·¥å¾…机停机表
 * @Author: lius
 * @Date: 2025-03-12
 */
public interface MdcDowntimeOperatorMapper extends BaseMapper<MdcDowntime> {
    IPage<MdcDowntimeDto> page(Page<MdcDowntimeDto> page, @Param(Constants.WRAPPER) QueryWrapper<MdcDowntimeDto> queryWrapper);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentStatisticalInfoMapper.java
@@ -5,6 +5,8 @@
import org.jeecg.modules.mdc.dto.MdcEquipmentStatisticalDto;
import org.jeecg.modules.mdc.entity.MdcEquipmentStatisticalInfo;
import java.util.List;
/**
 * @Description: è®¾å¤‡å•日运行数据表
 * @Author: jeecg-boot
@@ -28,4 +30,8 @@
    Integer selectProcessLong(@Param("equipmentId") String equipmentId, @Param("validDate") String validDate);
    MdcEquipmentStatisticalDto findByEquipmentAndMonth(@Param("equipmentId") String equipmentId, @Param("date") String date);
    MdcEquipmentStatisticalInfo findByEquIdsAndMonth(@Param("equipmentIdList") List<String> equipmentIdList, @Param("month") String month);
    List<MdcEquipmentStatisticalInfo> findByEquipmentAndDate(@Param("equipmentIdList") List<String> equipmentIdList, @Param("date") String date);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcOeeInfoMapper.java
@@ -7,6 +7,9 @@
import org.jeecg.modules.mdc.entity.MdcOeeInfo;
import org.jeecg.modules.mdc.vo.MdcOeeInfoVo;
import java.math.BigDecimal;
import java.util.List;
/**
 * @Description: OEE表
 * @Author: lius
@@ -22,4 +25,6 @@
     * @return
     */
    IPage<MdcOeeInfo> pageList(Page<MdcOeeInfo> page, @Param("mdcOeeInfoVo") MdcOeeInfoVo mdcOeeInfoVo);
    BigDecimal findByEquIdAndMonth(@Param("equipmentIdList") List<String> equipmentIdList, @Param("month") String month);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcAlarmInfoMapper.xml
@@ -2,4 +2,13 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.mdc.mapper.MdcAlarmInfoMapper">
    <select id="findAlarmContent" resultType="org.jeecg.modules.mdc.entity.MdcAlarmInfo">
        SELECT
            t1.*
        FROM
            mdc_alarm_info t1
                LEFT JOIN mdc_equipment t2 ON t1.drive_type = t2.drive_type
        WHERE
            t2.equipment_id = #{equipmentId} AND t1.alarm_code = #{alarmNo}
    </select>
</mapper>
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDowntimeMapper.xml
@@ -40,4 +40,24 @@
            AND t2.downtime_type = #{closeType}
            AND t1.the_date = #{validDate}
    </select>
    <select id="equDowntimeStatistics" resultType="org.jeecg.modules.board.vo.EquDowntimeInfo">
        SELECT
            t2.downtime_description AS shutdown_info,
            SUM ( DATEDIFF( SECOND, t1.start_date, t1.end_date ) ) / 3600.0 AS duration_hours
        FROM
            mdc_downtime t1
                LEFT JOIN mdc_downtime_reason t2 ON t1.reason_id = t2.id
        WHERE
            t1.reason_id != ''
          AND t1.the_date BETWEEN #{start} AND #{end}
        AND t1.equipment_id IN
        <foreach collection="equipmentIdList" item="equipmentId" index="index" open="(" close=")" separator=",">
            #{ equipmentId }
        </foreach>
        GROUP BY
            t2.downtime_description
        ORDER BY
            duration_hours DESC
    </select>
</mapper>
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDowntimeOperatorMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
<?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="org.jeecg.modules.mdc.mapper.MdcDowntimeOperatorMapper">
    <select id="page" resultType="org.jeecg.modules.mdc.dto.MdcDowntimeDto">
        SELECT
            t1.* ,
            t2.downtime_type downtimeType,
            t2.downtime_description downtimeDescription
        FROM mdc_downtime t1 LEFT JOIN mdc_downtime_reason t2 ON t1.reason_id = t2.id
        ${ew.customSqlSegment}
        ORDER BY t1.create_time DESC
    </select>
</mapper>
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentStatisticalInfoMapper.xml
@@ -26,4 +26,34 @@
        WHERE
            equipment_id = #{equipmentId} AND the_date LIKE CONCAT(#{date}, '%')
    </select>
    <select id="findByEquIdsAndMonth" resultType="org.jeecg.modules.mdc.entity.MdcEquipmentStatisticalInfo">
        SELECT
            AVG(open_long) openLong,
            AVG(close_long) closeLong,
            AVG(wait_long) waitLong,
            AVG(process_long) processLong,
            AVG(error_long) errorLong
        FROM
            mdc_equipment_statistical_info
        WHERE
            equipment_id IN
            <foreach collection="equipmentIdList" item="id" index="index" open="(" close=")" separator=",">
                #{ id }
            </foreach>
            AND the_date LIKE CONCAT(#{month}, '%')
    </select>
    <select id="findByEquipmentAndDate" resultType="org.jeecg.modules.mdc.entity.MdcEquipmentStatisticalInfo">
        SELECT
            *
        FROM
            mdc_equipment_statistical_info
        WHERE
        equipment_id IN
        <foreach collection="equipmentIdList" item="id" index="index" open="(" close=")" separator=",">
            #{ id }
        </foreach>
        AND the_date = #{date}
    </select>
</mapper>
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcOeeInfoMapper.xml
@@ -27,4 +27,17 @@
        </where>
        ORDER BY the_date DESC, equipment_id ASC
    </select>
    <select id="findByEquIdAndMonth" resultType="java.math.BigDecimal">
        SELECT
            AVG(oee)
        FROM
            mdc_oee_info
        WHERE
            the_date LIKE CONCAT(#{month}, '%')
          AND equipment_id IN
        <foreach collection="equipmentIdList" item="id" index="index" open="(" close=")" separator=",">
            #{ id }
        </foreach>
    </select>
</mapper>
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcDowntimeOperatorService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package org.jeecg.modules.mdc.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.mdc.dto.MdcDowntimeDto;
import org.jeecg.modules.mdc.entity.MdcDowntime;
import org.jeecg.modules.mdc.vo.MdcDowntimeVo;
import org.jeecg.modules.mdc.vo.SplitDowntimeVo;
/**
 * @Description: æ“ä½œå·¥å¾…机停机表
 * @Author: lius
 * @Date: 2025-03-12
 */
public interface IMdcDowntimeOperatorService extends IService<MdcDowntime> {
    IPage<MdcDowntimeDto> pageList(MdcDowntimeVo mdcDowntimeVo, Page<MdcDowntimeDto> page);
    void updateReason(MdcDowntimeVo mdcDowntimeVo);
    void splitDowntime(SplitDowntimeVo splitDowntimeVo);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcDowntimeService.java
@@ -3,11 +3,13 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.board.vo.EquDowntimeInfo;
import org.jeecg.modules.mdc.dto.MdcDowntimeDto;
import org.jeecg.modules.mdc.entity.MdcDowntime;
import org.jeecg.modules.mdc.vo.MdcDowntimeVo;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
/**
 * @Description: å¾…机停机表
@@ -35,4 +37,6 @@
     * @return
     */
    Integer findPlanTimeDuration(String equipmentId, String validDate, String closeType);
    List<EquDowntimeInfo> equDowntimeStatistics(List<String> equipmentIdList, String start, String end);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentStatisticalInfoService.java
@@ -4,6 +4,8 @@
import org.jeecg.modules.mdc.entity.MdcEquipmentStatisticalInfo;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
 * @Description: è®¾å¤‡å•日运行数据表
 * @Author: lius
@@ -29,4 +31,8 @@
    Integer selectProcessLong(String equipmentId, String validDate);
    MdcEquipmentStatisticalDto findByEquipmentAndMonth(String equipmentId, String date);
    MdcEquipmentStatisticalInfo findByEquIdsAndMonth(List<String> equipmentIdList, String month);
    List<MdcEquipmentStatisticalInfo> findByEquipmentAndDate(List<String> equipmentIdList, String date);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcOeeInfoService.java
@@ -9,6 +9,8 @@
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.List;
/**
 * @Description: OEE表
@@ -44,4 +46,5 @@
     */
    void computeOee(MdcOeeComputeVo mdcOeeComputeVo);
    BigDecimal findByEquIdAndMonth(List<String> equipmentIdList, String month);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcAlarmInfoServiceImpl.java
@@ -15,4 +15,8 @@
@Service
public class MdcAlarmInfoServiceImpl extends ServiceImpl<MdcAlarmInfoMapper, MdcAlarmInfo> implements IMdcAlarmInfoService {
    @Override
    public MdcAlarmInfo findAlarmContent(String alarmNo, String equipmentId) {
        return this.baseMapper.findAlarmContent(alarmNo, equipmentId);
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcDowntimeServiceImpl.java
@@ -4,6 +4,7 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.modules.board.vo.EquDowntimeInfo;
import org.jeecg.modules.mdc.dto.MdcDowntimeDto;
import org.jeecg.modules.mdc.entity.MdcDowntime;
import org.jeecg.modules.mdc.mapper.MdcDowntimeMapper;
@@ -68,6 +69,11 @@
        return result;
    }
    @Override
    public List<EquDowntimeInfo> equDowntimeStatistics(List<String> equipmentIdList, String start, String end) {
        return this.baseMapper.equDowntimeStatistics(equipmentIdList, start, end);
    }
    private List<String> getEquipmentIds(String userId, MdcDowntimeVo mdcDowntimeVo) {
        if (StringUtils.isNotEmpty(mdcDowntimeVo.getEquipmentId())) {
            return Collections.singletonList(mdcDowntimeVo.getEquipmentId());
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcDowntimeServiceOperatorImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,171 @@
package org.jeecg.modules.mdc.service.impl;
import cn.hutool.core.bean.BeanUtil;
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.IdWorker;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
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.beust.jcommander.internal.Lists;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.modules.mdc.dto.MdcDowntimeDto;
import org.jeecg.modules.mdc.entity.MdcDowntime;
import org.jeecg.modules.mdc.mapper.MdcDowntimeOperatorMapper;
import org.jeecg.modules.mdc.service.IMdcDowntimeOperatorService;
import org.jeecg.modules.mdc.service.IMdcEquipmentService;
import org.jeecg.modules.mdc.util.DateUtils;
import org.jeecg.modules.mdc.vo.MdcDowntimeVo;
import org.jeecg.modules.mdc.vo.SplitDowntimeVo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.*;
/**
 * @Description: æ“ä½œå·¥å¾…机停机表
 * @Author: lius
 * @Date: 2025-03-12
 */
@Service
public class MdcDowntimeServiceOperatorImpl extends ServiceImpl<MdcDowntimeOperatorMapper, MdcDowntime> implements IMdcDowntimeOperatorService {
    @Resource
    private IMdcEquipmentService mdcEquipmentService;
    @Override
    public IPage<MdcDowntimeDto> pageList(MdcDowntimeVo mdcDowntimeVo, Page<MdcDowntimeDto> page) {
        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        String userId = user.getId();
        // èŽ·å–è®¾å¤‡ID列表
        List<String> equipmentIds = Lists.newArrayList();
        if (StringUtils.isNotBlank(user.getEquipmentIds())) {
            equipmentIds = Arrays.asList(user.getEquipmentIds().split(StringPool.COMMA));
        }else {
            equipmentIds = getEquipmentIds(userId, mdcDowntimeVo);
        }
        // å¦‚果设备ID列表为空,直接返回空分页
        if (equipmentIds == null || equipmentIds.isEmpty()) {
            return new Page<>(page.getCurrent(), page.getSize(), 0);
        }
        QueryWrapper<MdcDowntimeDto> queryWrapper = Wrappers.query();
        if (CollectionUtils.isNotEmpty(equipmentIds)) {
            queryWrapper.in("t1.equipment_id", equipmentIds);
        }
        if (StringUtils.isNotBlank(mdcDowntimeVo.getEquipmentId())) {
            queryWrapper.eq("t1.equipment_id", mdcDowntimeVo.getEquipmentId());
        }
        if (Objects.nonNull(mdcDowntimeVo.getStartDate())) {
            queryWrapper.ge("t1.start_date", mdcDowntimeVo.getStartDate());
        }
        if (Objects.nonNull(mdcDowntimeVo.getEndDate())) {
            queryWrapper.le("t1.end_date", mdcDowntimeVo.getEndDate());
        }
        if (StringUtils.isNotBlank(mdcDowntimeVo.getDowntimeDescription())) {
            queryWrapper.eq("t2.id", mdcDowntimeVo.getDowntimeDescription());
        }
        return this.baseMapper.page(page, queryWrapper);
    }
    @Override
    @Transactional(rollbackFor = {Exception.class})
    public void updateReason(MdcDowntimeVo mdcDowntimeVo) {
        if (StringUtils.isEmpty(mdcDowntimeVo.getDownTimeIds())) {
            throw new JeecgBootException("请选择需要维护停机的数据");
        }
        List<MdcDowntime> mdcDowntimeList = this.listByIds(Arrays.asList(mdcDowntimeVo.getDownTimeIds().split(StringPool.COMMA)));
        mdcDowntimeList.forEach(mdcDowntime -> {
            mdcDowntime.setReasonId(mdcDowntimeVo.getReasonId());
        });
        this.updateBatchById(mdcDowntimeList);
    }
    @Transactional(rollbackFor = {Exception.class})
    @Override
    public void splitDowntime(SplitDowntimeVo splitDowntimeVo) {
        if (StringUtils.isBlank(splitDowntimeVo.getId())) {
            throw new JeecgBootException("请选择需要拆分停机的数据");
        }
        MdcDowntime mdcDowntime = this.getById(splitDowntimeVo.getId());
        if (StringUtils.isNotBlank(mdcDowntime.getReasonId())) {
            throw new JeecgBootException("已设置停机原因,无法拆分停机");
        }
        //比较拆分一段的日期是否再区间范围内(开始时间:startTime ç»“束时间:入无二段时间,则取endTime)
        if (Objects.nonNull(splitDowntimeVo.getFirstMiddleTime())) {
            //校验一段日期是否大于startTime,否,抛出异常
            if (Objects.isNull(splitDowntimeVo.getSecondMiddleTime())) {
                if (splitDowntimeVo.getStartDate().compareTo(splitDowntimeVo.getFirstMiddleTime()) != -1 || splitDowntimeVo.getFirstMiddleTime().compareTo(splitDowntimeVo.getEndDate()) != -1) {
                    throw new JeecgBootException("拆分一段时间未在开始时间和结束时间之内,请检查!");
                }
            }else {
                if (splitDowntimeVo.getStartDate().compareTo(splitDowntimeVo.getFirstMiddleTime()) != -1 || splitDowntimeVo.getFirstMiddleTime().compareTo(splitDowntimeVo.getSecondMiddleTime()) != -1) {
                    throw new JeecgBootException("拆分一段时间未在开始时间和拆分二段结束时间之内,请检查!");
                }
            }
        }else {
            throw new JeecgBootException("请维护拆分一段结束时间");
        }
        if (Objects.nonNull(splitDowntimeVo.getSecondMiddleTime())) {
            //校验二段日期是否存在于一段日期和endTime之间
            if (splitDowntimeVo.getFirstMiddleTime().compareTo(splitDowntimeVo.getSecondMiddleTime()) != -1 || splitDowntimeVo.getSecondMiddleTime().compareTo(splitDowntimeVo.getEndDate()) != -1) {
                throw new JeecgBootException("拆分二段时间未在拆分一段结束时间和结束时间之内,请检查!");
            }
        }
        List<MdcDowntime> list = Lists.newArrayList();
        //设置拆分1段
        if (Objects.nonNull(splitDowntimeVo.getFirstMiddleTime())) {
            list.add(checkMdcDowntime(mdcDowntime, splitDowntimeVo.getStartDate(), splitDowntimeVo.getFirstMiddleTime(), splitDowntimeVo.getFirstDowntimeDescription()));
        }
        //设置拆分2段,二段不存在则将endDate作为拆分二段
        if (Objects.nonNull(splitDowntimeVo.getSecondMiddleTime())) {
            list.add(checkMdcDowntime(mdcDowntime, splitDowntimeVo.getFirstMiddleTime(), splitDowntimeVo.getSecondMiddleTime(), splitDowntimeVo.getSecondDowntimeDescription()));
            list.add(checkMdcDowntime(mdcDowntime, splitDowntimeVo.getSecondMiddleTime(), splitDowntimeVo.getEndDate(), splitDowntimeVo.getThirdDowntimeDescription()));
        }else {
            list.add(checkMdcDowntime(mdcDowntime, splitDowntimeVo.getFirstMiddleTime(), splitDowntimeVo.getEndDate(), splitDowntimeVo.getThirdDowntimeDescription()));
        }
        //保存拆分数据并删除原有数据
        if (this.saveBatch(list)) {
            this.removeById(mdcDowntime);
        }
    }
    private MdcDowntime checkMdcDowntime(MdcDowntime mdcDowntime, Date startDate, Date endDate, String downtimeDescription) {
        MdcDowntime mdcDowntimeInfo = new MdcDowntime();
        BeanUtil.copyProperties(mdcDowntime, mdcDowntimeInfo);
        mdcDowntimeInfo.setId(IdWorker.getIdStr());
        mdcDowntimeInfo.setStartDate(startDate);
        mdcDowntimeInfo.setEndDate(endDate);
        mdcDowntimeInfo.setShutdownDuration(DateUtils.differentMinutes(startDate, endDate));
        mdcDowntimeInfo.setEnterType(2);
        mdcDowntimeInfo.setReasonId(StringUtils.isNotBlank(downtimeDescription) ? downtimeDescription : StringPool.EMPTY);
        return mdcDowntimeInfo;
    }
    private List<String> getEquipmentIds(String userId, MdcDowntimeVo mdcDowntimeVo) {
        if (StringUtils.isNotEmpty(mdcDowntimeVo.getEquipmentId())) {
            return Collections.singletonList(mdcDowntimeVo.getEquipmentId());
        }
        return mdcEquipmentService.getEquipmentIdsProduction(userId, null);
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentStatisticalInfoServiceImpl.java
@@ -323,4 +323,14 @@
    public MdcEquipmentStatisticalDto findByEquipmentAndMonth(String equipmentId, String date) {
        return this.baseMapper.findByEquipmentAndMonth(equipmentId, date);
    }
    @Override
    public MdcEquipmentStatisticalInfo findByEquIdsAndMonth(List<String> equipmentIdList, String month) {
        return this.baseMapper.findByEquIdsAndMonth(equipmentIdList, month);
    }
    @Override
    public List<MdcEquipmentStatisticalInfo> findByEquipmentAndDate(List<String> equipmentIdList, String date) {
        return this.baseMapper.findByEquipmentAndDate(equipmentIdList, date);
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcOeeInfoServiceImpl.java
@@ -243,4 +243,9 @@
        super.saveBatch(result);
    }
    @Override
    public BigDecimal findByEquIdAndMonth(List<String> equipmentIdList, String month) {
        return this.baseMapper.findByEquIdAndMonth(equipmentIdList, month);
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcDowntimeVo.java
@@ -31,6 +31,16 @@
    private String parentId;
    /**
     * åœæœºåŽŸå› 
     */
    private String downtimeDescription;
    /**
     * åœæœºids
     */
    private String downTimeIds;
    /**
     * è®¾å¤‡ids
     */
    private List<String> equipmentIdList;
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/SplitDowntimeVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,70 @@
package org.jeecg.modules.mdc.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
 * åœæœºæ‹†åˆ†æ“ä½œå…¥å‚
 */
@Data
public class SplitDowntimeVo {
    /**
     * åœæœºæ‹†åˆ†id
     */
    private String id;
    /**
     * å¼€å§‹æ—¶é—´
     */
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "开始时间")
    private Date startDate;
    /**
     * æ‹†åˆ†1段结束时间
     */
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "拆分1段开始时间")
    private Date firstMiddleTime;
    /**
     * æ‹†åˆ†1段停机原因
     */
    @ApiModelProperty(value = "拆分1段停机原因")
    private String firstDowntimeDescription;
    /**
     * æ‹†åˆ†2段结束时间
     */
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "拆分2段开始时间")
    private Date secondMiddleTime;
    /**
     * æ‹†åˆ†2段停机原因
     */
    @ApiModelProperty(value = "拆分2段停机原因")
    private String secondDowntimeDescription;
    /**
     * ç»“束时间
     */
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "结束时间")
    private Date endDate;
    /**
     * æ‹†åˆ†3段停机原因
     */
    @ApiModelProperty(value = "拆分3段停机原因")
    private String thirdDowntimeDescription;
}
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/cas/controller/CasClientController.java
@@ -74,7 +74,7 @@
            log.info("-------token----username---"+principal);
            //1. æ ¡éªŒç”¨æˆ·æ˜¯å¦æœ‰æ•ˆ
              SysUser sysUser = sysUserService.getUserByName(principal);
              result = sysUserService.checkUserIsEffective(sysUser);
              result = sysUserService.checkUserIsEffective(sysUser, null);
              if(!result.isSuccess()) {
                  return result;
              }
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java
@@ -2,6 +2,9 @@
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import javax.annotation.Resource;
import javax.websocket.*;
import javax.websocket.server.PathParam;
@@ -23,7 +26,7 @@
@Slf4j
@ServerEndpoint("/websocket/{userId}")
public class WebSocket {
    /**线程安全Map*/
    private static ConcurrentHashMap<String, Session> sessionPool = new ConcurrentHashMap<>();
@@ -34,14 +37,23 @@
    @Resource
    private JeecgRedisClient jeecgRedisClient;
    private ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    //==========【websocket接受、推送消息等方法 â€”— å…·ä½“服务节点推送ws消息】========================================================================================
    @OnOpen
    public void onOpen(Session session, @PathParam(value = "userId") String userId) {
        try {
            sessionPool.put(userId, session);
            log.info("【系统 WebSocket】有新的连接,总数为:" + sessionPool.size());
            // å¯åŠ¨å¿ƒè·³ä»»åŠ¡ï¼Œæ¯åˆ†é’Ÿå‘é€ä¸€æ¬¡å¿ƒè·³æ¶ˆæ¯
//            scheduler.scheduleAtFixedRate(() -> {
//                pushMessage(userId, "{\"cmd\":\"" + WebsocketConst.CMD_USER + "\",\"txt\":\"" + "心跳响应" + "\"}");
//            }, 0, 1, TimeUnit.MINUTES);
        } catch (Exception e) {
            log.error("【系统 WebSocket】onOpen å¼‚常", e);
        }
    }
@@ -50,6 +62,8 @@
        try {
            sessionPool.remove(userId);
            log.info("【系统 WebSocket】连接断开,总数为:" + sessionPool.size());
            // å–消心跳任务
            scheduler.shutdown();
        } catch (Exception e) {
            e.printStackTrace();
        }
@@ -93,12 +107,11 @@
                    log.error(e.getMessage(), e);
                }
            }
            log.info("【系统 WebSocket】群发消息:" + message);
            log.info("【3D实时数据 WebSocket】消息" );
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
    }
    /**
     * ws接受客户端消息
@@ -110,14 +123,14 @@
        }else{
            log.debug("【系统 WebSocket】收到客户端消息:" + message);
        }
        //------------------------------------------------------------------------------
        JSONObject obj = new JSONObject();
        //业务类型
        obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_CHECK);
        //消息内容
        obj.put(WebsocketConst.MSG_TXT, "心跳响应");
        this.pushMessage(userId, obj.toJSONString());
//        JSONObject obj = new JSONObject();
//        //业务类型
//        obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_CHECK);
//        //消息内容
//        obj.put(WebsocketConst.MSG_TXT, "心跳响应");
//        this.pushMessage(userId, obj.toJSONString());
        //------------------------------------------------------------------------------
    }
@@ -129,11 +142,11 @@
     */
    @OnError
    public void onError(Session session, Throwable t) {
        log.warn("【系统 WebSocket】消息出现错误");
        log.warn("【系统 WebSocket】消息出现错误",t);
        //t.printStackTrace();
    }
    //==========【系统 WebSocket接受、推送消息等方法 â€”— å…·ä½“服务节点推送ws消息】========================================================================================
    //==========【采用redis发布订阅模式——推送消息】========================================================================================
    /**
@@ -187,5 +200,5 @@
        }
    }
    //=======【采用redis发布订阅模式——推送消息】==========================================================================================
}
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java
@@ -121,7 +121,7 @@
        }
        SysUser sysUser = sysUserService.getOne(queryWrapper);
        //update-end-author:wangshuai date:20200601 for: ç™»å½•代码验证用户是否注销bug,if条件永远为false
        result = sysUserService.checkUserIsEffective(sysUser);
        result = sysUserService.checkUserIsEffective(sysUser, loginType);
        if(!result.isSuccess()) {
            return result;
        }
@@ -397,7 +397,7 @@
            }else {
                //登录模式,校验用户有效性
                SysUser sysUser = sysUserService.getUserByPhone(mobile);
                result = sysUserService.checkUserIsEffective(sysUser);
                result = sysUserService.checkUserIsEffective(sysUser, null);
                if(!result.isSuccess()) {
                    String message = result.getMessage();
                    String userNotExist="该用户不存在,请注册";
@@ -458,7 +458,7 @@
        //校验用户有效性
        SysUser sysUser = sysUserService.getUserByPhone(phone);
        result = sysUserService.checkUserIsEffective(sysUser);
        result = sysUserService.checkUserIsEffective(sysUser, null);
        if(!result.isSuccess()) {
            return result;
        }
@@ -626,7 +626,7 @@
        //1. æ ¡éªŒç”¨æˆ·æ˜¯å¦æœ‰æ•ˆ
        SysUser sysUser = sysUserService.getUserByName(username);
        result = sysUserService.checkUserIsEffective(sysUser);
        result = sysUserService.checkUserIsEffective(sysUser, null);
        if(!result.isSuccess()) {
            return result;
        }
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java
@@ -218,7 +218,7 @@
        //1. æ ¡éªŒç”¨æˆ·æ˜¯å¦æœ‰æ•ˆ
        SysUser sysUser = sysUserService.getUserByName(username);
        result = sysUserService.checkUserIsEffective(sysUser);
        result = sysUserService.checkUserIsEffective(sysUser, null);
        if(!result.isSuccess()) {
            return result;
        }
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/MdcProductionMapper.java
@@ -61,4 +61,8 @@
    List<String> findTeamValue(@Param("userId") String userId, @Param("productionList") List<String> productionList);
    List<String> findProIdsByUId(@Param("userId") String userId, @Param("allProductionIds") List<String> allProductionIds);
    List<String> findChildByProId(@Param("productionId") String productionId);
    String findProName(@Param("equipmentId") String equipmentId);
}
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/MdcProductionMapper.xml
@@ -138,4 +138,67 @@
            </foreach>
          AND user_id = #{userId}
    </select>
    <select id="findChildByProId" resultType="java.lang.String">
        WITH temp ( id ) AS (
            SELECT
                id
            FROM
                mdc_production
            WHERE
                id = #{ productionId }
              AND mdc_flag = '1' UNION ALL
            SELECT
                a.id
            FROM
                mdc_production a
                    INNER JOIN temp ON a.parent_id = temp.id
            WHERE
                a.mdc_flag = '1'
        ) SELECT
            *
        FROM
            temp
    </select>
    <select id="findProName" resultType="java.lang.String">
        WITH production_hierarchy AS (
            SELECT
                t3.id,
                t3.parent_id,
                t3.production_name,
                t3.org_type,
                0 AS level
            FROM
                mdc_equipment t1
                    JOIN
                mdc_production_equipment t2 ON t1.id = t2.equipment_id
                    JOIN
                mdc_production t3 ON t2.production_id = t3.id
            WHERE
                t1.equipment_id = #{equipmentId}
            UNION ALL
            SELECT
                t4.id,
                t4.parent_id,
                t4.production_name,
                t4.org_type,
                ph.level + 1
            FROM
                production_hierarchy ph
                    JOIN
                mdc_production t4 ON ph.parent_id = t4.id
            WHERE
                ph.parent_id IS NOT NULL
        )
        SELECT TOP 1
            production_name
        FROM
            production_hierarchy
        WHERE
            org_type = 2
        ORDER BY
            level ASC
    </select>
</mapper>
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/IMdcProductionService.java
@@ -175,4 +175,14 @@
     * @return
     */
    List<String> findProIdsByUId(String userId, List<String> allProductionIds);
    /**
     *
     * @param productionId
     * @return
     */
    List<String> findChildByProId(String productionId);
    String findProName(String equipmentId);
}
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java
@@ -221,7 +221,7 @@
     * @param sysUser
     * @return
     */
    Result checkUserIsEffective(SysUser sysUser);
    Result checkUserIsEffective(SysUser sysUser, String loginType);
    /**
     * æŸ¥è¯¢è¢«é€»è¾‘删除的用户
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/MdcProductionServiceImpl.java
@@ -627,4 +627,14 @@
            super.update(updateWrapper);
        }
    }
    @Override
    public List<String> findChildByProId(String productionId) {
        return this.baseMapper.findChildByProId(productionId);
    }
    @Override
    public String findProName(String equipmentId) {
        return this.baseMapper.findProName(equipmentId);
    }
}
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java
@@ -440,7 +440,7 @@
     * @return
     */
    @Override
    public Result<?> checkUserIsEffective(SysUser sysUser) {
    public Result<?> checkUserIsEffective(SysUser sysUser, String loginType) {
        Result<?> result = new Result<Object>();
        //情况1:根据用户信息查询,该用户不存在
        if (sysUser == null) {
@@ -464,7 +464,7 @@
        }
        //情况4:根据用户信息查询,该用户密码系首次使用,需修改密码
        List<DictModel> dictList = sysDictService.queryEnableDictItemsByCode(CommonConstant.DICT_USER_FIRST_LOGIN);
        if (dictList != null && !dictList.isEmpty()) {
        if (!"terminal".equals(loginType) && dictList != null && !dictList.isEmpty()) {
            if (CommonConstant.DEL_FLAG_1.equals(Integer.valueOf(dictList.get(0).getValue())) && CommonConstant.DEL_FLAG_1.equals(sysUser.getPasswordFlag())) {
                baseCommonService.addLog("用户登录失败,用户名:" + sysUser.getUsername() + "系首次登录系统,请重置密码!", CommonConstant.LOG_TYPE_1, null);
                result.setCode(5001);
lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml
@@ -311,7 +311,13 @@
deploy:
    #工控网/涉密网部署 0为涉密网 1为工控网
    deployType: 0
    #涉密网传输nc文件夹
    secretFolder: D:\\hy_test\\a
    #工控网监控nc文件夹
    workFolder: D:\\hy_test\\b
    #涉密网传输工控网nc文件夹(指派设备nc文件)    å·¥æŽ§ç½‘传输涉密网nc文件夹(解析回传后的nc文件)
    secretFolder: D:\\test\\a
file:
  monitor:
    # ä¸‰ä¸ªç›‘控目录配置
    paths:
      - D:\\hy_test\\ncFile #工控负责解析里面的文件;涉密网进行解析回传的操作
      - D:\\hy_test\\b
      - D:\\hy_test\\c
    interval: 10000  # ç›‘控间隔(ms)
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/BaseToolsController.java
@@ -1,5 +1,8 @@
package org.jeecg.modules.tms.controller;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.Arrays;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
@@ -7,6 +10,8 @@
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.modules.tms.entity.*;
@@ -575,4 +580,98 @@
         IPage<SharpeeningVo> resultPage = baseToolsService.pageWithSharpedAndConfig(page, queryWrapper);
         return Result.OK(resultPage);
     }
     /**
      * å¯¼å…¥æ¨¡æ¿ä¸‹è½½
      *
      */
     @RequestMapping(value = "/loadTemplate")
     public void loadTemplate(HttpServletRequest request, HttpServletResponse response) throws IOException {
         Map<String,String[]> req = request.getParameterMap();
         String paraTypeFlag = "";
         if(req.get("paraTypeFlag") != null){
             paraTypeFlag = req.get("paraTypeFlag")[0];
         }
         if("1".equals(paraTypeFlag)){
             Workbook workbook = WorkbookFactory.create(new File("D:\\opt\\upFiles\\刀具信息导入模板-通用参数.xlsx"));
             //导出Workbook
             //设置响应头
             String fileName = "刀具信息导入模板-通用参数.xlsx";
             // å¯¹æ–‡ä»¶åè¿›è¡ŒURL编码,防止中文乱码
             String encodedFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
             response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
             response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName);
             // å°†Workbook写入响应输出流
             try { // try-with-resources自动关闭资源
                 workbook.write(response.getOutputStream());
                 response.flushBuffer();
             } catch (IOException e) {
                 // å¼‚常处理(如记录日志)
                 throw new IOException("下载模板失败", e);
             }
         }else if("2".equals(paraTypeFlag)){
             Workbook workbook = WorkbookFactory.create(new File("D:\\opt\\upFiles\\刀具信息导入模板-孔加工工具.xlsx"));
             String fileName = "刀具信息导入模板-孔加工工具.xlsx";
             String encodedFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
             response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
             response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName);
             try {
                 workbook.write(response.getOutputStream());
                 response.flushBuffer();
             } catch (IOException e) {
                 throw new IOException("下载模板失败", e);
             }
         }else if("3".equals(paraTypeFlag)){
             Workbook workbook = WorkbookFactory.create(new File("D:\\opt\\upFiles\\刀具信息导入模板-螺纹工具.xlsx"));
             String fileName = "刀具信息导入模板-螺纹工具.xlsx";
             String encodedFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
             response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
             response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName);
             try {
                 workbook.write(response.getOutputStream());
                 response.flushBuffer();
             } catch (IOException e) {
                 throw new IOException("下载模板失败", e);
             }
         }else if("4".equals(paraTypeFlag)){
             Workbook workbook = WorkbookFactory.create(new File("D:\\opt\\upFiles\\刀具信息导入模板-铣削工具.xlsx"));
             String fileName = "刀具信息导入模板-铣削工具.xlsx";
             String encodedFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
             response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
             response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName);
             try {
                 workbook.write(response.getOutputStream());
                 response.flushBuffer();
             } catch (IOException e) {
                 throw new IOException("下载模板失败", e);
             }
         }else if("5".equals(paraTypeFlag)){
             Workbook workbook = WorkbookFactory.create(new File("D:\\opt\\upFiles\\刀具信息导入模板-车削工具.xlsx"));
             String fileName = "刀具信息导入模板-车削工具.xlsx";
             String encodedFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
             response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
             response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName);
             try {
                 workbook.write(response.getOutputStream());
                 response.flushBuffer();
             } catch (IOException e) {
                 throw new IOException("下载模板失败", e);
             }
         }else if("6".equals(paraTypeFlag)){
             Workbook workbook = WorkbookFactory.create(new File("D:\\opt\\upFiles\\刀具信息导入模板-刀片.xlsx"));
             String fileName = "刀具信息导入模板-刀片.xlsx";
             String encodedFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
             response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
             response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName);
             try {
                 workbook.write(response.getOutputStream());
                 response.flushBuffer();
             } catch (IOException e) {
                 throw new IOException("下载模板失败", e);
             }
         }
     }
}
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/BaseTools.java
@@ -108,4 +108,9 @@
    @DateTimeFormat(pattern="yyyy-MM-dd")
    @ApiModelProperty(value = "更新时间")
    private Date updateTime;
    /**工具图片*/
    @Excel(name = "工具图片", width = 15)
    @ApiModelProperty(value = "工具图片")
    private String toolPicture;
}
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaBladeVo.java
@@ -163,4 +163,7 @@
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "工具图片")
    private String toolPicture;
}
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaCommonToolVo.java
@@ -94,4 +94,7 @@
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "工具图片")
    private String toolPicture;
}
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaHolesToolsVo.java
@@ -188,4 +188,7 @@
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "工具图片")
    private String toolPicture;
}
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaMillToolVo.java
@@ -191,4 +191,7 @@
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "工具图片")
    private String toolPicture;
}
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaThreadingToolVo.java
@@ -160,4 +160,7 @@
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "工具图片")
    private String toolPicture;
}
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/ParaTurningToolsVo.java
@@ -198,4 +198,7 @@
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "工具图片")
    private String toolPicture;
}
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/BaseToolsMapper.xml
@@ -13,6 +13,7 @@
            t.standard_code standardCode,
            t.tool_model toolModel,
            t.parama_table_name paramaTableName,
            t.tool_picture toolPicture,
            t1.application_type applicationType,
            t1.supplier_id supplierId,
            t1.province_city provinceCity,
@@ -81,6 +82,7 @@
            t.standard_code standardCode,
            t.tool_model toolModel,
            t.parama_table_name paramaTableName,
            t.tool_picture toolPicture,
            t1.application_type applicationType,
            t1.supplier_id supplierId,
            t1.province_city provinceCity,
@@ -113,6 +115,7 @@
            t.standard_code standardCode,
            t.tool_model toolModel,
            t.parama_table_name paramaTableName,
            t.tool_picture toolPicture,
            t1.application_type applicationType,
            t1.supplier_id supplierId,
            t1.province_city provinceCity,
@@ -171,6 +174,7 @@
            t.standard_code standardCode,
            t.tool_model toolModel,
            t.parama_table_name paramaTableName,
            t.tool_picture toolPicture,
            t1.application_type applicationType,
            t1.supplier_id supplierId,
            t1.province_city provinceCity,
@@ -238,6 +242,7 @@
            t.standard_code standardCode,
            t.tool_model toolModel,
            t.parama_table_name paramaTableName,
            t.tool_picture toolPicture,
            t1.application_type applicationType,
            t1.supplier_id supplierId,
            t1.province_city provinceCity,
@@ -309,6 +314,7 @@
            t.standard_code standardCode,
            t.tool_model toolModel,
            t.parama_table_name paramaTableName,
            t.tool_picture toolPicture,
            t1.application_type applicationType,
            t1.supplier_id supplierId,
            t1.province_city provinceCity,
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/InboundOrderServiceImpl.java
@@ -262,6 +262,7 @@
                        num++;
                        //转换回字符串并保留前导零
                        String result = String.format("%0" + currentCode.length() + "d", num);
                        //打印二维码
                        //保存入库流水
                        InStoreDetail inStoreDetail = new InStoreDetail();
                        inStoreDetail.setInboundTime(inboundTime);