#
Junjie
2025-11-04 b1013def3c6fd89195a6ee726cbb47016a155fab
#
201个文件已删除
43个文件已添加
21个文件已修改
38937 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/BasCrnpController.java 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/BasCrnpErrController.java 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/BasCrnpErrLogController.java 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/BasCrnpOptController.java 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/BasLiftController.java 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/BasLiftErrController.java 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/BasLiftErrLogController.java 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/BasLiftOptController.java 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/BasMapController.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/BasShuttleChargeController.java 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/BasShuttleController.java 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/BasShuttleErrController.java 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/BasShuttleErrLogController.java 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/BasShuttleOptController.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/ConsoleController.java 224 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/DeviceMsgController.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/ForkLiftController.java 361 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/LiftController.java 361 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/LocMastController.java 296 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OpenController.java 230 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/ShuttleController.java 457 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/TrafficControlController.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/ShuttleGatherResult.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/param/LiftOperatorParam.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/param/ReportExceptionParam.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/param/RobotReportActionStatusParam.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/param/ShuttleDemoParam.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/param/ShuttleGatherParam.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/param/ShuttleOperatorParam.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/param/ShuttleTimedPowerRangeParam.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/ForkLiftMsgTableVo.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/LiftDataVo.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/LiftMsgTableVo.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/LiftSensorDataVo.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/LiftStateTableVo.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/ShuttleDataVo.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/ShuttleMsgTableVo.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/ShuttleSensorDataVo.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/ShuttleStateTableVo.java 202 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasCrnp.java 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasCrnpErr.java 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasCrnpErrLog.java 311 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasCrnpOpt.java 191 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasLift.java 150 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasLiftErr.java 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasLiftErrLog.java 293 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasLiftOpt.java 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasShuttle.java 207 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasShuttleCharge.java 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasShuttleErr.java 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasShuttleErrLog.java 291 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasShuttleOpt.java 180 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/BasCrnpErrLogMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/BasCrnpErrMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/BasCrnpMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/BasCrnpOptMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/BasLiftErrLogMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/BasLiftErrMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/BasLiftMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/BasLiftOptMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/BasShuttleChargeMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/BasShuttleErrLogMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/BasShuttleErrMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/BasShuttleMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/BasShuttleOptMapper.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/BasCrnpErrLogService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/BasCrnpErrService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/BasCrnpOptService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/BasCrnpService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/BasLiftErrLogService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/BasLiftErrService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/BasLiftOptService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/BasLiftService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/BasShuttleChargeService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/BasShuttleErrLogService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/BasShuttleErrService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/BasShuttleOptService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/BasShuttleService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasCrnpErrLogServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasCrnpErrServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasCrnpOptServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasCrnpServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasLiftErrLogServiceImpl.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasLiftErrServiceImpl.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasLiftOptServiceImpl.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasLiftServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasShuttleChargeServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasShuttleErrLogServiceImpl.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasShuttleErrServiceImpl.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasShuttleOptServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasShuttleServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/ForkMainServiceImpl.java 2042 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 2030 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/NotifyScheduler.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/ShuttleChargePowerScheduler.java 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/ShuttlePowerEarlyWarning.java 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/main/ShuttleTaskExecuteScheduler.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/NotifyUtils.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/ShuttleTaskUtils.java 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/Utils.java 231 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/ws/ConsoleWebSocket.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/ws/ShuttleWebSocket.java 152 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/CodeBuilder.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/LiftPointModel.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/MatDto.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/NavigateNode.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/SearchLocParam.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/ShuttleOperaResult.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/utils/ForkLiftUtils.java 245 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/utils/LiftUtils.java 248 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/utils/NavigateMapData.java 418 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/utils/NavigateMapUtils.java 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/utils/NavigatePositionConvert.java 136 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/utils/NavigateSolution.java 303 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/utils/NavigateUtils.java 616 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/utils/RobotUtils.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/utils/ShuttleOperaUtils.java 639 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/ServerBootstrap.java 195 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/action/ForkLiftAction.java 187 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/action/LiftAction.java 225 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/action/ShuttleAction.java 793 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/cache/MessageQueue.java 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/config/PointInitializer.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/config/ShuttleConfigInitializer.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/dispatcher/ForkLiftDispatchUtils.java 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/dispatcher/LiftDispatchUtils.java 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/dispatcher/ShuttleDispatchUtils.java 487 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/CrnForkPosType.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/CrnLiftPosType.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/CrnModeType.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/CrnStatusType.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/ForkLiftIoModeType.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/ForkLiftProtocolStatusType.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/ForkLiftTaskModeType.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/LiftDeviceStatusType.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/LiftIoModeType.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/LiftProtocolStatusType.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/LiftTaskModeType.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/RedisKeyType.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/ShuttleCheckCommandResultType.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/ShuttleCommandModeType.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/ShuttleProtocolStatusType.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/ShuttleRequireChargeType.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/ShuttleRunDirection.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/ShuttleStatusType.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/ShuttleTaskModeType.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/ShuttleTaskNoType.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/SlaveType.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/ForkLiftSlave.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/LiftSlave.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/LiftStation.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/PythonResult.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/PythonSimilarityResult.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/ShuttleSlave.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/TrafficControlDataModel.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/ForkLiftAssignCommand.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/ForkLiftCommand.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/ForkLiftRedisCommand.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/LiftAssignCommand.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/LiftCommand.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/LiftRedisCommand.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/NyShuttleHttpCommand.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/ShuttleAssignCommand.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/ShuttleCommand.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/ShuttleRedisCommand.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/param/OperateTrafficControlParam.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/param/ShuttleMoveLocParam.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/CrnProtocol.java 207 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/ForkLiftProtocol.java 245 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/ForkLiftStaProtocol.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/LiftProtocol.java 262 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/LiftStaProtocol.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/ShuttleProtocol.java 387 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/properties/SlaveProperties.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/task/DeviceLogScheduler.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/task/ShuttleDemoScheduler.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/task/ShuttleDeviceLogScheduler.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/task/ShuttleExecuteScheduler.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/task/TrafficApplyProcess.java 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/CrnThread.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/ForkLiftThread.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/LiftThread.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/ShuttleThread.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/TrafficControlThread.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/impl/LfdZyForkLiftMasterThread.java 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/impl/LfdZyForkLiftSlaveThread.java 475 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/impl/NyLiftThread.java 747 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/impl/NyShuttleThread.java 1394 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/impl/NyShuttleThread2.java 1302 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/impl/TrafficControlImplThread.java 529 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/impl/ZyForkLiftThread.java 650 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/impl/ZyForkLiftThread2.java 451 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/utils/DeviceMsgUtils.java 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/utils/TrafficControlUtils.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/docs/台升四向库WCS与货叉提升机PLC通讯接口协议1.0.docx 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/docs/台升四向库WCS与货叉提升机PLC通讯接口协议1.1.docx 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/docs/四向车货叉式提升机WCS接口V1.0.docx 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/docs/四向车货叉式提升机WCS接口V1.1.docx 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/docs/四向车货叉式提升机WCS接口V1.2.docx 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/docs/四向车货叉式提升机WCS接口V1.3.docx 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/docs/四向车货叉式提升机WCS接口V1.4.docx 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/map/qlsxk_map.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasCrnpErrLogMapper.xml 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasCrnpErrMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasCrnpMapper.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasCrnpOptMapper.xml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasLiftErrLogMapper.xml 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasLiftErrMapper.xml 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasLiftMapper.xml 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasLiftOptMapper.xml 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasShuttleChargeMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasShuttleErrLogMapper.xml 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasShuttleErrMapper.xml 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasShuttleMapper.xml 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasShuttleOptMapper.xml 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/sql/20251016145740_qlsxk.nb3 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/sql/30台车数据库.nb3 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/sql/40台车数据库.nb3 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/sql/5台车数据库.nb3 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/sql/出库任务预调度提升机sql 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/sql/小车避障配置sql 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/sql/库位地图sql 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/sql/货叉提升机异常码sql 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/css/console_vue.css 247 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/basCrnp/basCrnp.js 264 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/basCrnpErr/basCrnpErr.js 261 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/basCrnpErrLog/basCrnpErrLog.js 285 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/basCrnpOpt/basCrnpOpt.js 268 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/basLift/basLift.js 258 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/basLiftErr/basLiftErr.js 260 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/basLiftErrLog/basLiftErrLog.js 287 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/basLiftOpt/basLiftOpt.js 264 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/basShuttle/basShuttle.js 399 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/basShuttleCharge/basShuttleCharge.js 261 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/basShuttleErr/basShuttleErr.js 267 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/basShuttleErrLog/basShuttleErrLog.js 287 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/basShuttleErrLog/basShuttleOpt.js 275 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/common.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/admin/basCrnp/basCrnp.html 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/admin/basCrnp/basCrnp_detail.html 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/admin/basCrnpErr/basCrnpErr.html 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/admin/basCrnpErr/basCrnpErr_detail.html 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/admin/basCrnpErrLog/basCrnpErrLog.html 234 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/admin/basCrnpErrLog/basCrnpErrLog_detail.html 202 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/admin/basCrnpOpt/basCrnpOpt.html 174 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/admin/basCrnpOpt/basCrnpOpt_detail.html 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/admin/basLift/basLift.html 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/admin/basLiftErr/basLiftErr.html 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/admin/basLiftErrLog/basLiftErrLog.html 240 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/admin/basLiftOpt/basLiftOpt.html 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/admin/basShuttle/basShuttle.html 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/admin/basShuttleCharge/basShuttleCharge.html 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/admin/basShuttleCharge/basShuttleCharge_detail.html 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/admin/basShuttleErr/basShuttleErr.html 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/admin/basShuttleErrLog/basShuttleErrLog.html 240 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/admin/basShuttleErrLog/basShuttleOpt.html 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/car_vue.html 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/console.html 1031 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/console1.html 721 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/console2.html 1025 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/console3.html 688 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/console4.html 971 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/forklift.html 460 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/BasCrnpController.java
New file
@@ -0,0 +1,125 @@
package com.zy.asrs.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.core.common.DateUtils;
import com.zy.asrs.entity.BasCrnp;
import com.zy.asrs.service.BasCrnpService;
import com.core.annotations.ManagerAuth;
import com.core.common.BaseRes;
import com.core.common.Cools;
import com.core.common.R;
import com.zy.common.web.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.*;
@RestController
public class BasCrnpController extends BaseController {
    @Autowired
    private BasCrnpService basCrnpService;
    @RequestMapping(value = "/basCrnp/{id}/auth")
    @ManagerAuth
    public R get(@PathVariable("id") String id) {
        return R.ok(basCrnpService.selectById(String.valueOf(id)));
    }
    @RequestMapping(value = "/basCrnp/list/auth")
    @ManagerAuth
    public R list(@RequestParam(defaultValue = "1")Integer curr,
                  @RequestParam(defaultValue = "10")Integer limit,
                  @RequestParam(required = false)String orderByField,
                  @RequestParam(required = false)String orderByType,
                  @RequestParam(required = false)String condition,
                  @RequestParam Map<String, Object> param){
        EntityWrapper<BasCrnp> wrapper = new EntityWrapper<>();
        excludeTrash(param);
        convert(param, wrapper);
        allLike(BasCrnp.class, param.keySet(), wrapper, condition);
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
        return R.ok(basCrnpService.selectPage(new Page<>(curr, limit), wrapper));
    }
    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
        for (Map.Entry<String, Object> entry : map.entrySet()){
            String val = String.valueOf(entry.getValue());
            if (val.contains(RANGE_TIME_LINK)){
                String[] dates = val.split(RANGE_TIME_LINK);
                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
                wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
            } else {
                wrapper.like(entry.getKey(), val);
            }
        }
    }
    @RequestMapping(value = "/basCrnp/add/auth")
    @ManagerAuth
    public R add(BasCrnp basCrnp) {
        basCrnpService.insert(basCrnp);
        return R.ok();
    }
    @RequestMapping(value = "/basCrnp/update/auth")
    @ManagerAuth
    public R update(BasCrnp basCrnp){
        if (Cools.isEmpty(basCrnp) || null==basCrnp.getCrnNo()){
            return R.error();
        }
        basCrnpService.updateById(basCrnp);
        return R.ok();
    }
    @RequestMapping(value = "/basCrnp/delete/auth")
    @ManagerAuth
    public R delete(@RequestParam(value="ids[]") Integer[] ids){
         for (Integer id : ids){
            basCrnpService.deleteById(id);
        }
        return R.ok();
    }
    @RequestMapping(value = "/basCrnp/export/auth")
    @ManagerAuth
    public R export(@RequestBody JSONObject param){
        EntityWrapper<BasCrnp> wrapper = new EntityWrapper<>();
        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
        Map<String, Object> map = excludeTrash(param.getJSONObject("basCrnp"));
        convert(map, wrapper);
        List<BasCrnp> list = basCrnpService.selectList(wrapper);
        return R.ok(exportSupport(list, fields));
    }
    @RequestMapping(value = "/basCrnpQuery/auth")
    @ManagerAuth
    public R query(String condition) {
        EntityWrapper<BasCrnp> wrapper = new EntityWrapper<>();
        wrapper.like("crn_no", condition);
        Page<BasCrnp> page = basCrnpService.selectPage(new Page<>(0, 10), wrapper);
        List<Map<String, Object>> result = new ArrayList<>();
        for (BasCrnp basCrnp : page.getRecords()){
            Map<String, Object> map = new HashMap<>();
            map.put("id", basCrnp.getCrnNo());
            map.put("value", basCrnp.getCrnNo());
            result.add(map);
        }
        return R.ok(result);
    }
    @RequestMapping(value = "/basCrnp/check/column/auth")
    @ManagerAuth
    public R query(@RequestBody JSONObject param) {
        Wrapper<BasCrnp> wrapper = new EntityWrapper<BasCrnp>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
        if (null != basCrnpService.selectOne(wrapper)){
            return R.parse(BaseRes.REPEAT).add(getComment(BasCrnp.class, String.valueOf(param.get("key"))));
        }
        return R.ok();
    }
}
src/main/java/com/zy/asrs/controller/BasCrnpErrController.java
New file
@@ -0,0 +1,125 @@
package com.zy.asrs.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.core.common.DateUtils;
import com.zy.asrs.entity.BasCrnpErr;
import com.zy.asrs.service.BasCrnpErrService;
import com.core.annotations.ManagerAuth;
import com.core.common.BaseRes;
import com.core.common.Cools;
import com.core.common.R;
import com.zy.common.web.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.*;
@RestController
public class BasCrnpErrController extends BaseController {
    @Autowired
    private BasCrnpErrService basCrnpErrService;
    @RequestMapping(value = "/basCrnpErr/{id}/auth")
    @ManagerAuth
    public R get(@PathVariable("id") String id) {
        return R.ok(basCrnpErrService.selectById(String.valueOf(id)));
    }
    @RequestMapping(value = "/basCrnpErr/list/auth")
    @ManagerAuth
    public R list(@RequestParam(defaultValue = "1")Integer curr,
                  @RequestParam(defaultValue = "10")Integer limit,
                  @RequestParam(required = false)String orderByField,
                  @RequestParam(required = false)String orderByType,
                  @RequestParam(required = false)String condition,
                  @RequestParam Map<String, Object> param){
        EntityWrapper<BasCrnpErr> wrapper = new EntityWrapper<>();
        excludeTrash(param);
        convert(param, wrapper);
        allLike(BasCrnpErr.class, param.keySet(), wrapper, condition);
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
        return R.ok(basCrnpErrService.selectPage(new Page<>(curr, limit), wrapper));
    }
    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
        for (Map.Entry<String, Object> entry : map.entrySet()){
            String val = String.valueOf(entry.getValue());
            if (val.contains(RANGE_TIME_LINK)){
                String[] dates = val.split(RANGE_TIME_LINK);
                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
                wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
            } else {
                wrapper.like(entry.getKey(), val);
            }
        }
    }
    @RequestMapping(value = "/basCrnpErr/add/auth")
    @ManagerAuth
    public R add(BasCrnpErr basCrnpErr) {
        basCrnpErrService.insert(basCrnpErr);
        return R.ok();
    }
    @RequestMapping(value = "/basCrnpErr/update/auth")
    @ManagerAuth
    public R update(BasCrnpErr basCrnpErr){
        if (Cools.isEmpty(basCrnpErr) || null==basCrnpErr.getId()){
            return R.error();
        }
        basCrnpErrService.updateById(basCrnpErr);
        return R.ok();
    }
    @RequestMapping(value = "/basCrnpErr/delete/auth")
    @ManagerAuth
    public R delete(@RequestParam(value="ids[]") Integer[] ids){
         for (Integer id : ids){
            basCrnpErrService.deleteById(id);
        }
        return R.ok();
    }
    @RequestMapping(value = "/basCrnpErr/export/auth")
    @ManagerAuth
    public R export(@RequestBody JSONObject param){
        EntityWrapper<BasCrnpErr> wrapper = new EntityWrapper<>();
        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
        Map<String, Object> map = excludeTrash(param.getJSONObject("basCrnpErr"));
        convert(map, wrapper);
        List<BasCrnpErr> list = basCrnpErrService.selectList(wrapper);
        return R.ok(exportSupport(list, fields));
    }
    @RequestMapping(value = "/basCrnpErrQuery/auth")
    @ManagerAuth
    public R query(String condition) {
        EntityWrapper<BasCrnpErr> wrapper = new EntityWrapper<>();
        wrapper.like("id", condition);
        Page<BasCrnpErr> page = basCrnpErrService.selectPage(new Page<>(0, 10), wrapper);
        List<Map<String, Object>> result = new ArrayList<>();
        for (BasCrnpErr basCrnpErr : page.getRecords()){
            Map<String, Object> map = new HashMap<>();
            map.put("id", basCrnpErr.getId());
            map.put("value", basCrnpErr.getId());
            result.add(map);
        }
        return R.ok(result);
    }
    @RequestMapping(value = "/basCrnpErr/check/column/auth")
    @ManagerAuth
    public R query(@RequestBody JSONObject param) {
        Wrapper<BasCrnpErr> wrapper = new EntityWrapper<BasCrnpErr>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
        if (null != basCrnpErrService.selectOne(wrapper)){
            return R.parse(BaseRes.REPEAT).add(getComment(BasCrnpErr.class, String.valueOf(param.get("key"))));
        }
        return R.ok();
    }
}
src/main/java/com/zy/asrs/controller/BasCrnpErrLogController.java
New file
@@ -0,0 +1,125 @@
package com.zy.asrs.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.core.common.DateUtils;
import com.zy.asrs.entity.BasCrnpErrLog;
import com.zy.asrs.service.BasCrnpErrLogService;
import com.core.annotations.ManagerAuth;
import com.core.common.BaseRes;
import com.core.common.Cools;
import com.core.common.R;
import com.zy.common.web.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.*;
@RestController
public class BasCrnpErrLogController extends BaseController {
    @Autowired
    private BasCrnpErrLogService basCrnpErrLogService;
    @RequestMapping(value = "/basCrnpErrLog/{id}/auth")
    @ManagerAuth
    public R get(@PathVariable("id") String id) {
        return R.ok(basCrnpErrLogService.selectById(String.valueOf(id)));
    }
    @RequestMapping(value = "/basCrnpErrLog/list/auth")
    @ManagerAuth
    public R list(@RequestParam(defaultValue = "1")Integer curr,
                  @RequestParam(defaultValue = "10")Integer limit,
                  @RequestParam(required = false)String orderByField,
                  @RequestParam(required = false)String orderByType,
                  @RequestParam(required = false)String condition,
                  @RequestParam Map<String, Object> param){
        EntityWrapper<BasCrnpErrLog> wrapper = new EntityWrapper<>();
        excludeTrash(param);
        convert(param, wrapper);
        allLike(BasCrnpErrLog.class, param.keySet(), wrapper, condition);
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
        return R.ok(basCrnpErrLogService.selectPage(new Page<>(curr, limit), wrapper));
    }
    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
        for (Map.Entry<String, Object> entry : map.entrySet()){
            String val = String.valueOf(entry.getValue());
            if (val.contains(RANGE_TIME_LINK)){
                String[] dates = val.split(RANGE_TIME_LINK);
                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
                wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
            } else {
                wrapper.like(entry.getKey(), val);
            }
        }
    }
    @RequestMapping(value = "/basCrnpErrLog/add/auth")
    @ManagerAuth
    public R add(BasCrnpErrLog basCrnpErrLog) {
        basCrnpErrLogService.insert(basCrnpErrLog);
        return R.ok();
    }
    @RequestMapping(value = "/basCrnpErrLog/update/auth")
    @ManagerAuth
    public R update(BasCrnpErrLog basCrnpErrLog){
        if (Cools.isEmpty(basCrnpErrLog) || null==basCrnpErrLog.getId()){
            return R.error();
        }
        basCrnpErrLogService.updateById(basCrnpErrLog);
        return R.ok();
    }
    @RequestMapping(value = "/basCrnpErrLog/delete/auth")
    @ManagerAuth
    public R delete(@RequestParam(value="ids[]") Integer[] ids){
         for (Integer id : ids){
            basCrnpErrLogService.deleteById(id);
        }
        return R.ok();
    }
    @RequestMapping(value = "/basCrnpErrLog/export/auth")
    @ManagerAuth
    public R export(@RequestBody JSONObject param){
        EntityWrapper<BasCrnpErrLog> wrapper = new EntityWrapper<>();
        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
        Map<String, Object> map = excludeTrash(param.getJSONObject("basCrnpErrLog"));
        convert(map, wrapper);
        List<BasCrnpErrLog> list = basCrnpErrLogService.selectList(wrapper);
        return R.ok(exportSupport(list, fields));
    }
    @RequestMapping(value = "/basCrnpErrLogQuery/auth")
    @ManagerAuth
    public R query(String condition) {
        EntityWrapper<BasCrnpErrLog> wrapper = new EntityWrapper<>();
        wrapper.like("id", condition);
        Page<BasCrnpErrLog> page = basCrnpErrLogService.selectPage(new Page<>(0, 10), wrapper);
        List<Map<String, Object>> result = new ArrayList<>();
        for (BasCrnpErrLog basCrnpErrLog : page.getRecords()){
            Map<String, Object> map = new HashMap<>();
            map.put("id", basCrnpErrLog.getId());
            map.put("value", basCrnpErrLog.getId());
            result.add(map);
        }
        return R.ok(result);
    }
    @RequestMapping(value = "/basCrnpErrLog/check/column/auth")
    @ManagerAuth
    public R query(@RequestBody JSONObject param) {
        Wrapper<BasCrnpErrLog> wrapper = new EntityWrapper<BasCrnpErrLog>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
        if (null != basCrnpErrLogService.selectOne(wrapper)){
            return R.parse(BaseRes.REPEAT).add(getComment(BasCrnpErrLog.class, String.valueOf(param.get("key"))));
        }
        return R.ok();
    }
}
src/main/java/com/zy/asrs/controller/BasCrnpOptController.java
New file
@@ -0,0 +1,125 @@
package com.zy.asrs.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.core.common.DateUtils;
import com.zy.asrs.entity.BasCrnpOpt;
import com.zy.asrs.service.BasCrnpOptService;
import com.core.annotations.ManagerAuth;
import com.core.common.BaseRes;
import com.core.common.Cools;
import com.core.common.R;
import com.zy.common.web.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.*;
@RestController
public class BasCrnpOptController extends BaseController {
    @Autowired
    private BasCrnpOptService basCrnpOptService;
    @RequestMapping(value = "/basCrnpOpt/{id}/auth")
    @ManagerAuth
    public R get(@PathVariable("id") String id) {
        return R.ok(basCrnpOptService.selectById(String.valueOf(id)));
    }
    @RequestMapping(value = "/basCrnpOpt/list/auth")
    @ManagerAuth
    public R list(@RequestParam(defaultValue = "1")Integer curr,
                  @RequestParam(defaultValue = "10")Integer limit,
                  @RequestParam(required = false)String orderByField,
                  @RequestParam(required = false)String orderByType,
                  @RequestParam(required = false)String condition,
                  @RequestParam Map<String, Object> param){
        EntityWrapper<BasCrnpOpt> wrapper = new EntityWrapper<>();
        excludeTrash(param);
        convert(param, wrapper);
        allLike(BasCrnpOpt.class, param.keySet(), wrapper, condition);
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
        return R.ok(basCrnpOptService.selectPage(new Page<>(curr, limit), wrapper));
    }
    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
        for (Map.Entry<String, Object> entry : map.entrySet()){
            String val = String.valueOf(entry.getValue());
            if (val.contains(RANGE_TIME_LINK)){
                String[] dates = val.split(RANGE_TIME_LINK);
                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
                wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
            } else {
                wrapper.like(entry.getKey(), val);
            }
        }
    }
    @RequestMapping(value = "/basCrnpOpt/add/auth")
    @ManagerAuth
    public R add(BasCrnpOpt basCrnpOpt) {
        basCrnpOptService.insert(basCrnpOpt);
        return R.ok();
    }
    @RequestMapping(value = "/basCrnpOpt/update/auth")
    @ManagerAuth
    public R update(BasCrnpOpt basCrnpOpt){
        if (Cools.isEmpty(basCrnpOpt) || null==basCrnpOpt.getId()){
            return R.error();
        }
        basCrnpOptService.updateById(basCrnpOpt);
        return R.ok();
    }
    @RequestMapping(value = "/basCrnpOpt/delete/auth")
    @ManagerAuth
    public R delete(@RequestParam(value="ids[]") Integer[] ids){
        for (Integer id : ids) {
            basCrnpOptService.deleteById(id);
        }
        return R.ok();
    }
    @RequestMapping(value = "/basCrnpOpt/export/auth")
    @ManagerAuth
    public R export(@RequestBody JSONObject param){
        EntityWrapper<BasCrnpOpt> wrapper = new EntityWrapper<>();
        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
        Map<String, Object> map = excludeTrash(param.getJSONObject("basCrnpOpt"));
        convert(map, wrapper);
        List<BasCrnpOpt> list = basCrnpOptService.selectList(wrapper);
        return R.ok(exportSupport(list, fields));
    }
    @RequestMapping(value = "/basCrnpOptQuery/auth")
    @ManagerAuth
    public R query(String condition) {
        EntityWrapper<BasCrnpOpt> wrapper = new EntityWrapper<>();
        wrapper.like("id", condition);
        Page<BasCrnpOpt> page = basCrnpOptService.selectPage(new Page<>(0, 10), wrapper);
        List<Map<String, Object>> result = new ArrayList<>();
        for (BasCrnpOpt basCrnpOpt : page.getRecords()){
            Map<String, Object> map = new HashMap<>();
            map.put("id", basCrnpOpt.getId());
            map.put("value", basCrnpOpt.getId());
            result.add(map);
        }
        return R.ok(result);
    }
    @RequestMapping(value = "/basCrnpOpt/check/column/auth")
    @ManagerAuth
    public R query(@RequestBody JSONObject param) {
        Wrapper<BasCrnpOpt> wrapper = new EntityWrapper<BasCrnpOpt>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
        if (null != basCrnpOptService.selectOne(wrapper)){
            return R.parse(BaseRes.REPEAT).add(getComment(BasCrnpOpt.class, String.valueOf(param.get("key"))));
        }
        return R.ok();
    }
}
src/main/java/com/zy/asrs/controller/BasLiftController.java
File was deleted
src/main/java/com/zy/asrs/controller/BasLiftErrController.java
File was deleted
src/main/java/com/zy/asrs/controller/BasLiftErrLogController.java
File was deleted
src/main/java/com/zy/asrs/controller/BasLiftOptController.java
File was deleted
src/main/java/com/zy/asrs/controller/BasMapController.java
@@ -2,33 +2,24 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.core.common.DateUtils;
import com.zy.asrs.entity.BasMap;
import com.zy.asrs.entity.BasShuttleCharge;
import com.zy.asrs.service.BasMapService;
import com.core.annotations.ManagerAuth;
import com.core.common.BaseRes;
import com.core.common.Cools;
import com.core.common.R;
import com.zy.asrs.service.BasShuttleChargeService;
import com.zy.asrs.utils.MapExcelUtils;
import com.zy.common.model.MapNode;
import com.zy.common.utils.RedisUtil;
import com.zy.common.web.BaseController;
import com.zy.core.enums.RedisKeyType;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.*;
@@ -37,8 +28,6 @@
    @Autowired
    private BasMapService basMapService;
    @Autowired
    private BasShuttleChargeService basShuttleChargeService;
    @Autowired
    private RedisUtil redisUtil;
@@ -143,38 +132,6 @@
    @Autowired
    private MapExcelUtils mapExcelUtils;
    @PostMapping("/basMap/upload")
    public R uploadExcel(@RequestParam("file") MultipartFile file) throws IOException {
        // ä¿å­˜ä¸Šä¼ çš„æ–‡ä»¶åˆ°ä¸´æ—¶ä½ç½®
        String tempFilePath = System.getProperty("java.io.tmpdir") + file.getOriginalFilename();
        file.transferTo(new File(tempFilePath));
        HashMap<Integer, List<List<HashMap<String, Object>>>> dataMap = mapExcelUtils.readExcel(tempFilePath);
        HashMap<Integer, List<List<MapNode>>> levMap = mapExcelUtils.processExcelData(dataMap);
        // åˆ é™¤ä¸´æ—¶æ–‡ä»¶
        new File(tempFilePath).delete();
        basMapService.delete(new EntityWrapper<>());
        for (Map.Entry<Integer, List<List<MapNode>>> entry : levMap.entrySet()) {
            Integer lev = entry.getKey();
            List<List<MapNode>> map = entry.getValue();
            Date now = new Date();
            BasMap basMap = new BasMap();
            basMap.setLev(lev);
            basMap.setOriginData(JSON.toJSONString(map, SerializerFeature.DisableCircularReferenceDetect));
            basMap.setCreateTime(now);
            basMap.setUpdateTime(now);
            basMapService.insert(basMap);
            redisUtil.del(RedisKeyType.MAP.key + lev);
        }
        return R.ok();
    }
    @PostMapping("/basMap/crn/upload")
    public R uploadExcel2(@RequestParam("file") MultipartFile file) throws IOException {
src/main/java/com/zy/asrs/controller/BasShuttleChargeController.java
File was deleted
src/main/java/com/zy/asrs/controller/BasShuttleController.java
File was deleted
src/main/java/com/zy/asrs/controller/BasShuttleErrController.java
File was deleted
src/main/java/com/zy/asrs/controller/BasShuttleErrLogController.java
File was deleted
src/main/java/com/zy/asrs/controller/BasShuttleOptController.java
File was deleted
src/main/java/com/zy/asrs/controller/ConsoleController.java
@@ -1,37 +1,12 @@
package com.zy.asrs.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.annotations.ManagerAuth;
import com.core.common.Cools;
import com.core.common.R;
import com.zy.asrs.domain.param.SystemSwitchParam;
import com.zy.asrs.entity.BasMap;
import com.zy.asrs.entity.DeviceConfig;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.service.BasMapService;
import com.zy.asrs.service.DeviceConfigService;
import com.zy.asrs.service.LocMastService;
import com.zy.asrs.utils.Utils;
import com.zy.common.model.MapNode;
import com.zy.common.model.NavigateNode;
import com.zy.common.model.enums.NavigationMapType;
import com.zy.common.utils.NavigateMapData;
import com.zy.common.utils.RedisUtil;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.RedisKeyType;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.command.ShuttleRedisCommand;
import com.zy.core.model.protocol.ShuttleProtocol;
import com.zy.core.properties.SystemProperties;
import com.zy.core.thread.ShuttleThread;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
/**
 * ä¸»æŽ§å›¾æŽ¥å£
@@ -41,17 +16,6 @@
@RestController
@RequestMapping("/console")
public class ConsoleController {
    @Autowired
    private BasMapService basMapService;
    @Autowired
    private RedisUtil redisUtil;
    @Autowired
    private NavigateMapData navigateMapData;
    @Autowired
    private LocMastService locMastService;
    @Autowired
    private DeviceConfigService deviceConfigService;
    @PostMapping("/system/running/status")
    @ManagerAuth(memo = "系统运行状态")
@@ -76,194 +40,6 @@
        Thread.sleep(200L);
        SystemProperties.WCS_RUNNING_STATUS.set(param.getOperatorType()==1?Boolean.TRUE:Boolean.FALSE);
        return R.ok().add(Cools.add("status", SystemProperties.WCS_RUNNING_STATUS.get()));
    }
    /**
     * èŽ·å–åœ°å›¾æ¥¼å±‚æ•°æ®
     */
    @GetMapping("/map/lev/list")
    @ManagerAuth
    public R getMapLevList() {
        List<BasMap> basMaps = basMapService.selectList(new EntityWrapper<BasMap>().orderBy("lev", true));
        ArrayList<Integer> levList = new ArrayList<>();
        for (BasMap basMap : basMaps) {
            levList.add(basMap.getLev());
        }
        return R.ok().add(levList);
    }
    /**
     * èŽ·å–åœ°å›¾æ•°æ®
     */
    @GetMapping("/map/{lev}/auth")
    @ManagerAuth
    public R getMapFromRedis(@PathVariable Integer lev) {
        Object data = redisUtil.get(RedisKeyType.MAP.key + lev);
        if (data == null) {
            return R.error();
        }
        List<List<MapNode>> arrayList = (List<List<MapNode>>) data;
        List<List<MapNode>> lists = navigateMapData.filterMap(NavigationMapType.getMapTypes(NavigationMapType.NONE, NavigationMapType.PATH_LOCK), arrayList, lev, null, null);//过滤地图数据
        return R.ok().add(lists);
    }
    /**
     * èŽ·å–åº“ä½åœ°å›¾æ•°æ®
     */
    @GetMapping("/locMap/{lev}/auth")
    @ManagerAuth
    public R getLocMap(@PathVariable Integer lev) {
        Object data = redisUtil.get(RedisKeyType.MAP.key + lev);
        if (data == null) {
            return R.error();
        }
        List<List<MapNode>> arrayList = (List<List<MapNode>>) data;
        List<List<MapNode>> lists = navigateMapData.filterMap(NavigationMapType.getMapTypes(NavigationMapType.NONE), arrayList, lev, null, null);//过滤地图数据
        //获取当前楼层库位数据
        List<LocMast> locMasts = locMastService.selectLocByLev(lev);
        for (LocMast locMast : locMasts) {
            Integer row = locMast.getRow1();
            Integer bay = locMast.getBay1();
            List<MapNode> list = lists.get(row);
            MapNode mapNode = list.get(bay);
            mapNode.setLocSts(locMast.getLocSts());
            mapNode.setLocNo(locMast.getLocNo());
            //更新list
            list.set(bay, mapNode);
            lists.set(row, list);
        }
        return R.ok().add(lists);
    }
    /**
     * é‡ç½®redis中的地图,将占用的库位全部解除
     */
    @GetMapping("/map/resetMap/auth")
    @ManagerAuth
    public R resetMapToRedis() {
        List<BasMap> basMaps = basMapService.selectList(new EntityWrapper<BasMap>().orderBy("lev", true));
        for (BasMap basMap : basMaps) {
            Integer lev = basMap.getLev();
            redisUtil.del(RedisKeyType.MAP.key + lev);
        }
        return R.ok();
    }
    /**
     * é‡ç½®redis中的地图,将占用的库位全部解除
     */
    @GetMapping("/map/resetMap/{lev}")
    @ManagerAuth(memo = "重置Redis地图")
    public R resetMapToRedisByLev(@PathVariable Integer lev, HttpServletRequest request) {
        redisUtil.del(RedisKeyType.MAP.key + lev);
        return R.ok();
    }
    /**
     * èŽ·å–é¢„è®¡è·¯å¾„
     */
    @GetMapping("/getMoveAdvancePath/{lev}/auth")
    @ManagerAuth
    public R getMoveAdvancePath(@PathVariable Integer lev) {
        HashMap<String, Object> pathMap = new HashMap<>();
        List<DeviceConfig> shuttleList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.Shuttle)));
        for (DeviceConfig deviceConfig : shuttleList) {
            // èŽ·å–å››å‘ç©¿æ¢­è½¦ä¿¡æ¯
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, deviceConfig.getDeviceNo());
            if (shuttleThread == null) {
                continue;
            }
            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
            if (shuttleProtocol == null || shuttleProtocol.getShuttleNo()==null) {
                continue;
            }
            if (shuttleProtocol.getCurrentLocNo() == null) {
                continue;
            }
            if (Utils.getLev(shuttleProtocol.getCurrentLocNo()) != lev) {
                continue;
            }
            if (shuttleProtocol.getTaskNo() == 0) {
            }
            //存在任务,获取指令
            Object object = redisUtil.get(RedisKeyType.SHUTTLE_WORK_FLAG.key + shuttleProtocol.getTaskNo());
            if (object != null) {
                ShuttleRedisCommand redisCommand = JSON.parseObject(object.toString(), ShuttleRedisCommand.class);
                List<NavigateNode> nodes = redisCommand.getAssignCommand().getNodes();//穿梭车预计路径
                for (NavigateNode node : nodes) {
                    String locNo = Utils.getLocNo(node.getX(), node.getY(), node.getZ());
                    List<Integer> shuttleNoList = new ArrayList<>();
                    Object tmp = pathMap.get(locNo);
                    if(tmp != null) {
                        shuttleNoList = (List<Integer>) tmp;
                    }
                    if (!shuttleNoList.contains(shuttleProtocol.getShuttleNo())) {
                        shuttleNoList.add(shuttleProtocol.getShuttleNo());
                    }
                    pathMap.put(locNo, shuttleNoList);
                }
            }
        }
        List<HashMap<String, Object>> pathList = new ArrayList<>();
        for (Map.Entry<String, Object> entry : pathMap.entrySet()) {
            String locNo = entry.getKey();
            Object shuttleNoList = entry.getValue();
            HashMap<String, Object> map = new HashMap<>();
            map.put("locNo", locNo);
            map.put("x", Utils.getRow(locNo));
            map.put("y", Utils.getBay(locNo));
            map.put("z", Utils.getLev(locNo));
            map.put("shuttleNoList", shuttleNoList);
            pathList.add(map);
        }
        return R.ok().add(pathList);
    }
    /**
     * èŽ·å–é”å®šè·¯å¾„
     */
    @GetMapping("/getLockPath/{lev}/auth")
    @ManagerAuth
    public R getLockPath(@PathVariable Integer lev) {
        HashMap<String, Object> lockMap = new HashMap<>();
        Object o = redisUtil.get(RedisKeyType.LOCK_MAP_NODES.key + lev);
        if (o != null) {
            lockMap = (HashMap<String, Object>) o;
        }
        List<HashMap<String, Object>> lockList = new ArrayList<>();
        for (Map.Entry<String, Object> entry : lockMap.entrySet()) {
            String locNo = entry.getKey();
            Object shuttleNo = entry.getValue();
            HashMap<String, Object> map = new HashMap<>();
            map.put("locNo", locNo);
            map.put("x", Utils.getRow(locNo));
            map.put("y", Utils.getBay(locNo));
            map.put("z", Utils.getLev(locNo));
            map.put("shuttleNo", shuttleNo);
            lockList.add(map);
        }
        return R.ok().add(lockList);
    }
}
src/main/java/com/zy/asrs/controller/DeviceMsgController.java
File was deleted
src/main/java/com/zy/asrs/controller/ForkLiftController.java
File was deleted
src/main/java/com/zy/asrs/controller/LiftController.java
File was deleted
src/main/java/com/zy/asrs/controller/LocMastController.java
@@ -1,6 +1,5 @@
package com.zy.asrs.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
@@ -12,20 +11,9 @@
import com.core.common.DateUtils;
import com.core.common.R;
import com.core.exception.CoolException;
import com.zy.asrs.entity.BasMap;
import com.zy.asrs.entity.BasShuttleCharge;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.service.BasMapService;
import com.zy.asrs.service.BasShuttleChargeService;
import com.zy.asrs.service.LocMastService;
import com.zy.asrs.utils.Utils;
import com.zy.common.model.MapNode;
import com.zy.common.model.NavigateNode;
import com.zy.common.model.enums.NavigationMapType;
import com.zy.common.utils.NavigateMapData;
import com.zy.common.web.BaseController;
import com.zy.core.enums.LocStsType;
import com.zy.core.enums.MapNodeType;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
@@ -38,13 +26,7 @@
public class LocMastController extends BaseController {
    @Autowired
    private NavigateMapData navigateMapData;
    @Autowired
    private LocMastService locMastService;
    @Autowired
    private BasMapService basMapService;
    @Autowired
    private BasShuttleChargeService basShuttleChargeService;
    @RequestMapping(value = "/locMast/{id}/auth")
    @ManagerAuth
@@ -150,145 +132,145 @@
    @ManagerAuth(memo = "初始化库位")
    @Transactional
    public R locMastInit() {
        List<BasMap> basMaps = basMapService.selectList(new EntityWrapper<BasMap>().orderBy("lev", true));
        basShuttleChargeService.delete(new EntityWrapper<>());
        int chargeNo = 1;
        for (BasMap basMap : basMaps) {
            Integer lev = basMap.getLev();
            locMastService.delete(new EntityWrapper<>(new LocMast())
                    .eq("lev1", lev));
            List<List<MapNode>> lists = navigateMapData.getJsonData(lev, NavigationMapType.getMapTypes(NavigationMapType.NONE), null, null);//获取完整地图(包括入库出库)
            for (int row = 0; row < lists.size(); row++) {
                List<MapNode> nodeList = lists.get(row);
                for (int bay = 0; bay < nodeList.size(); bay++) {
                    MapNode mapNode = nodeList.get(bay);
                    if (mapNode.getValue() == MapNodeType.DISABLE.id) {
                        continue;
                    }
                    String locNo = Utils.getLocNo(row, bay, lev);
                    LocMast locMast = new LocMast();
                    locMast.setLocNo(locNo);
                    locMast.setRow1(row);
                    locMast.setBay1(bay);
                    locMast.setLev1(lev);
                    locMast.setStatus(1);
                    if (mapNode.getValue() == MapNodeType.NORMAL_PATH.id) {
                        locMast.setLocSts(LocStsType.O.toString());
                    } else if (mapNode.getValue() == MapNodeType.MAIN_PATH.id) {
                        locMast.setLocSts(LocStsType.W.toString());
                    } else if (mapNode.getValue() == MapNodeType.CHARGE.id) {
                        locMast.setLocSts(LocStsType.C.toString());
                        BasShuttleCharge basShuttleCharge = new BasShuttleCharge();
                        basShuttleCharge.setChargeId(chargeNo++);
                        basShuttleCharge.setLocNo(locNo);
                        basShuttleCharge.setWaitLocNo(locNo);
                        basShuttleCharge.setStatus(1);
                        basShuttleCharge.setCreateTime(new Date());
                        basShuttleCharge.setUpdateTime(new Date());
                        basShuttleChargeService.insert(basShuttleCharge);
                    } else if (mapNode.getValue() == MapNodeType.CONVEYOR.id) {
                        locMast.setLocSts(LocStsType.E.toString());
                    } else if (mapNode.getValue() == MapNodeType.LIFT.id) {
                        locMast.setLocSts(LocStsType.E.toString());
                    }
                    locMastService.insert(locMast);
                }
            }
            LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("lev1", lev).orderBy("row1", false));
            Integer rowMax = locMast.getRow1();
            LocMast locMast2 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("lev1", lev).orderBy("bay1", false));
            Integer bayMax = locMast2.getBay1();
            Integer baseRow = basMap.getBaseRow();
            Integer baseRowCode = basMap.getBaseRowCode();
            if (baseRow > 0) {
                for (int i = baseRow; i <= rowMax; i++) {
                    Integer baseBayCode = basMap.getBaseBayCode();
                    if (basMap.getBaseBay() > 0) {
                        for (int j = basMap.getBaseBay(); j <= bayMax; j++) {
                            String locNo = Utils.getLocNo(i, j, lev);
                            LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>()
                                    .eq("loc_no", locNo));
                            if (locMast1 != null) {
                                HashMap<String, Object> point = new HashMap<>();
                                point.put("y", baseRowCode);
                                point.put("x", baseBayCode);
                                point.put("z", lev);
                                locMast1.setQrCodeValue(JSON.toJSONString(point));
                                locMastService.updateById(locMast1);
                            }
                            baseBayCode += 1;
                        }
                    }else {
                        int baseBay = basMap.getBaseBay() * -1;
                        for (int j = baseBay; j > 0; j--) {
                            String locNo = Utils.getLocNo(i, j, lev);
                            LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>()
                                    .eq("loc_no", locNo));
                            if (locMast1 != null) {
                                HashMap<String, Object> point = new HashMap<>();
                                point.put("y", baseRowCode);
                                point.put("x", baseBayCode);
                                point.put("z", lev);
                                locMast1.setQrCodeValue(JSON.toJSONString(point));
                                locMastService.updateById(locMast1);
                            }
                            baseBayCode += 1;
                        }
                    }
                    baseRowCode += 1;
                }
            }else {
                baseRow = baseRow * -1;
                for (int i = baseRow; i > 0; i--) {
                    Integer baseBayCode = basMap.getBaseBayCode();
                    if (basMap.getBaseBay() > 0) {
                        for (int j = basMap.getBaseBay(); j <= bayMax; j++) {
                            String locNo = Utils.getLocNo(i, j, lev);
                            LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>()
                                    .eq("loc_no", locNo));
                            if (locMast1 != null) {
                                HashMap<String, Object> point = new HashMap<>();
                                point.put("y", baseRowCode);
                                point.put("x", baseBayCode);
                                point.put("z", lev);
                                locMast1.setQrCodeValue(JSON.toJSONString(point));
                                locMastService.updateById(locMast1);
                            }
                            baseBayCode += 1;
                        }
                    }else {
                        int baseBay = basMap.getBaseBay() * -1;
                        for (int j = baseBay; j > 0; j--) {
                            String locNo = Utils.getLocNo(i, j, lev);
                            LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>()
                                    .eq("loc_no", locNo));
                            if (locMast1 != null) {
                                HashMap<String, Object> point = new HashMap<>();
                                point.put("y", baseRowCode);
                                point.put("x", baseBayCode);
                                point.put("z", lev);
                                locMast1.setQrCodeValue(JSON.toJSONString(point));
                                locMastService.updateById(locMast1);
                            }
                            baseBayCode += 1;
                        }
                    }
                    baseRowCode += 1;
                }
            }
        }
//        List<BasMap> basMaps = basMapService.selectList(new EntityWrapper<BasMap>().orderBy("lev", true));
//        basShuttleChargeService.delete(new EntityWrapper<>());
//        int chargeNo = 1;
//        for (BasMap basMap : basMaps) {
//            Integer lev = basMap.getLev();
//            locMastService.delete(new EntityWrapper<>(new LocMast())
//                    .eq("lev1", lev));
//            List<List<MapNode>> lists = navigateMapData.getJsonData(lev, NavigationMapType.getMapTypes(NavigationMapType.NONE), null, null);//获取完整地图(包括入库出库)
//            for (int row = 0; row < lists.size(); row++) {
//                List<MapNode> nodeList = lists.get(row);
//                for (int bay = 0; bay < nodeList.size(); bay++) {
//                    MapNode mapNode = nodeList.get(bay);
//
//                    if (mapNode.getValue() == MapNodeType.DISABLE.id) {
//                        continue;
//                    }
//
//                    String locNo = Utils.getLocNo(row, bay, lev);
//                    LocMast locMast = new LocMast();
//                    locMast.setLocNo(locNo);
//                    locMast.setRow1(row);
//                    locMast.setBay1(bay);
//                    locMast.setLev1(lev);
//                    locMast.setStatus(1);
//
//                    if (mapNode.getValue() == MapNodeType.NORMAL_PATH.id) {
//                        locMast.setLocSts(LocStsType.O.toString());
//                    } else if (mapNode.getValue() == MapNodeType.MAIN_PATH.id) {
//                        locMast.setLocSts(LocStsType.W.toString());
//                    } else if (mapNode.getValue() == MapNodeType.CHARGE.id) {
//                        locMast.setLocSts(LocStsType.C.toString());
//
//                        BasShuttleCharge basShuttleCharge = new BasShuttleCharge();
//                        basShuttleCharge.setChargeId(chargeNo++);
//                        basShuttleCharge.setLocNo(locNo);
//                        basShuttleCharge.setWaitLocNo(locNo);
//                        basShuttleCharge.setStatus(1);
//                        basShuttleCharge.setCreateTime(new Date());
//                        basShuttleCharge.setUpdateTime(new Date());
//                        basShuttleChargeService.insert(basShuttleCharge);
//                    } else if (mapNode.getValue() == MapNodeType.CONVEYOR.id) {
//                        locMast.setLocSts(LocStsType.E.toString());
//                    } else if (mapNode.getValue() == MapNodeType.LIFT.id) {
//                        locMast.setLocSts(LocStsType.E.toString());
//                    }
//
//                    locMastService.insert(locMast);
//                }
//            }
//
//            LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("lev1", lev).orderBy("row1", false));
//            Integer rowMax = locMast.getRow1();
//            LocMast locMast2 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("lev1", lev).orderBy("bay1", false));
//            Integer bayMax = locMast2.getBay1();
//
//            Integer baseRow = basMap.getBaseRow();
//            Integer baseRowCode = basMap.getBaseRowCode();
//
//            if (baseRow > 0) {
//                for (int i = baseRow; i <= rowMax; i++) {
//                    Integer baseBayCode = basMap.getBaseBayCode();
//                    if (basMap.getBaseBay() > 0) {
//                        for (int j = basMap.getBaseBay(); j <= bayMax; j++) {
//                            String locNo = Utils.getLocNo(i, j, lev);
//
//                            LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>()
//                                    .eq("loc_no", locNo));
//                            if (locMast1 != null) {
//                                HashMap<String, Object> point = new HashMap<>();
//                                point.put("y", baseRowCode);
//                                point.put("x", baseBayCode);
//                                point.put("z", lev);
//                                locMast1.setQrCodeValue(JSON.toJSONString(point));
//                                locMastService.updateById(locMast1);
//                            }
//                            baseBayCode += 1;
//                        }
//                    }else {
//                        int baseBay = basMap.getBaseBay() * -1;
//                        for (int j = baseBay; j > 0; j--) {
//                            String locNo = Utils.getLocNo(i, j, lev);
//
//                            LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>()
//                                    .eq("loc_no", locNo));
//                            if (locMast1 != null) {
//                                HashMap<String, Object> point = new HashMap<>();
//                                point.put("y", baseRowCode);
//                                point.put("x", baseBayCode);
//                                point.put("z", lev);
//                                locMast1.setQrCodeValue(JSON.toJSONString(point));
//                                locMastService.updateById(locMast1);
//                            }
//                            baseBayCode += 1;
//                        }
//                    }
//                    baseRowCode += 1;
//                }
//            }else {
//                baseRow = baseRow * -1;
//                for (int i = baseRow; i > 0; i--) {
//                    Integer baseBayCode = basMap.getBaseBayCode();
//                    if (basMap.getBaseBay() > 0) {
//                        for (int j = basMap.getBaseBay(); j <= bayMax; j++) {
//                            String locNo = Utils.getLocNo(i, j, lev);
//
//                            LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>()
//                                    .eq("loc_no", locNo));
//                            if (locMast1 != null) {
//                                HashMap<String, Object> point = new HashMap<>();
//                                point.put("y", baseRowCode);
//                                point.put("x", baseBayCode);
//                                point.put("z", lev);
//                                locMast1.setQrCodeValue(JSON.toJSONString(point));
//                                locMastService.updateById(locMast1);
//                            }
//                            baseBayCode += 1;
//                        }
//                    }else {
//                        int baseBay = basMap.getBaseBay() * -1;
//                        for (int j = baseBay; j > 0; j--) {
//                            String locNo = Utils.getLocNo(i, j, lev);
//
//                            LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>()
//                                    .eq("loc_no", locNo));
//                            if (locMast1 != null) {
//                                HashMap<String, Object> point = new HashMap<>();
//                                point.put("y", baseRowCode);
//                                point.put("x", baseBayCode);
//                                point.put("z", lev);
//                                locMast1.setQrCodeValue(JSON.toJSONString(point));
//                                locMastService.updateById(locMast1);
//                            }
//                            baseBayCode += 1;
//                        }
//                    }
//                    baseRowCode += 1;
//                }
//            }
//        }
        return R.ok();
    }
src/main/java/com/zy/asrs/controller/OpenController.java
@@ -3,30 +3,17 @@
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.R;
import com.zy.asrs.domain.ShuttleGatherResult;
import com.zy.asrs.domain.enums.NotifyMsgType;
import com.zy.asrs.domain.param.*;
import com.zy.asrs.entity.ApiLog;
import com.zy.asrs.entity.DeviceConfig;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.service.DeviceConfigService;
import com.zy.asrs.service.LocMastService;
import com.zy.asrs.service.WrkMastService;
import com.zy.asrs.utils.NotifyUtils;
import com.zy.common.annotations.OpenApiLog;
import com.zy.common.service.CommonService;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.dispatcher.ShuttleDispatchUtils;
import com.zy.core.enums.SlaveType;
import com.zy.core.enums.WrkIoType;
import com.zy.core.model.protocol.ForkLiftProtocol;
import com.zy.core.model.protocol.LiftProtocol;
import com.zy.core.model.protocol.ShuttleProtocol;
import com.zy.core.thread.ForkLiftThread;
import com.zy.core.thread.LiftThread;
import com.zy.core.thread.ShuttleThread;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@@ -44,8 +31,6 @@
    @Autowired
    private CommonService commonService;
    @Autowired
    private ShuttleDispatchUtils shuttleDispatchUtils;
    @Autowired
    private NotifyUtils notifyUtils;
    @Autowired
    private ApiLogService apiLogService;
@@ -53,37 +38,6 @@
    private LocMastService locMastService;
    @Autowired
    private WrkMastService wrkMastService;
    @Autowired
    private DeviceConfigService deviceConfigService;
    @PostMapping("/createMoveTask")
    @OpenApiLog(memo = "小车移动任务")
    public R createMoveTask(@RequestBody CreateMoveTaskParam param) {
        if (param == null) {
            return R.error("参数不能为空");
        }
        boolean dispatchShuttle = shuttleDispatchUtils.dispatchShuttle(null, param.getLocNo(), param.getShuttleNo());
        apiLogService.insert(new ApiLog(
                null
                , "小车移动任务"
                , "/createMoveTask"
                , null
                , null
                , null
                , JSON.toJSONString(param)
                , null
                , null
                , dispatchShuttle ? 1 : 0
                , 1
                , new Date()
                , null
                , null
        ));
        if (dispatchShuttle) {
            return R.ok();
        }
        return R.error("生成失败");
    }
    //移库任务
    @PostMapping("/createLocMoveTask")
@@ -237,79 +191,60 @@
//    @OpenApiLog(memo = "获取设备状态")
    public R getDeviceStatus() {
        HashMap<String, Object> map = new HashMap<>();
        //获取小车数据
        ArrayList<ShuttleProtocol> shuttleProtocols = new ArrayList<>();
        List<DeviceConfig> shuttleList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.Shuttle)));
        for (DeviceConfig device : shuttleList) {
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getDeviceNo());
            if (shuttleThread == null) {
                continue;
            }
            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
            if (shuttleProtocol == null) {
                continue;
            }
            shuttleProtocols.add(shuttleProtocol);
        }
        //获取货叉提升机数据
        ArrayList<ForkLiftProtocol> forkLiftProtocols = new ArrayList<>();
        List<DeviceConfig> forkLiftList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.ForkLift)));
        for (DeviceConfig device : forkLiftList) {
            ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, device.getDeviceNo());
            if (forkLiftThread == null) {
                continue;
            }
            ForkLiftProtocol forkLiftProtocol = forkLiftThread.getStatus();
            if (forkLiftProtocol == null) {
                continue;
            }
            forkLiftProtocols.add(forkLiftProtocol);
        }
        //获取提升机数据
        ArrayList<LiftProtocol> liftProtocols = new ArrayList<>();
        List<DeviceConfig> liftList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.Lift)));
        for (DeviceConfig device : liftList) {
            LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, device.getDeviceNo());
            if (liftThread == null) {
                continue;
            }
            LiftProtocol liftProtocol = liftThread.getStatus();
            if (liftProtocol == null) {
                continue;
            }
            liftProtocols.add(liftProtocol);
        }
        map.put("shuttle", shuttleProtocols);
        map.put("forkLift", forkLiftProtocols);
        map.put("lift", liftProtocols);
        return R.ok().add(map);
    }
    @RequestMapping("/liftDeviceOriginData")
    public R getLiftDeviceOriginData() {
        HashMap<Integer, String> map = new HashMap<>();
        //获取提升机数据
        List<DeviceConfig> liftList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.Lift)));
        for (DeviceConfig device : liftList) {
            LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, device.getDeviceNo());
            if (liftThread == null) {
                continue;
            }
            map.put(device.getDeviceNo(), liftThread.getRealtimeOriginData());
        }
//        //获取小车数据
//        ArrayList<ShuttleProtocol> shuttleProtocols = new ArrayList<>();
//        List<DeviceConfig> shuttleList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
//                .eq("device_type", String.valueOf(SlaveType.Shuttle)));
//        for (DeviceConfig device : shuttleList) {
//            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getDeviceNo());
//            if (shuttleThread == null) {
//                continue;
//            }
//
//            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
//            if (shuttleProtocol == null) {
//                continue;
//            }
//            shuttleProtocols.add(shuttleProtocol);
//        }
//
//        //获取货叉提升机数据
//        ArrayList<ForkLiftProtocol> forkLiftProtocols = new ArrayList<>();
//        List<DeviceConfig> forkLiftList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
//                .eq("device_type", String.valueOf(SlaveType.ForkLift)));
//        for (DeviceConfig device : forkLiftList) {
//            ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, device.getDeviceNo());
//            if (forkLiftThread == null) {
//                continue;
//            }
//
//            ForkLiftProtocol forkLiftProtocol = forkLiftThread.getStatus();
//            if (forkLiftProtocol == null) {
//                continue;
//            }
//            forkLiftProtocols.add(forkLiftProtocol);
//        }
//
//        //获取提升机数据
//        ArrayList<LiftProtocol> liftProtocols = new ArrayList<>();
//        List<DeviceConfig> liftList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
//                .eq("device_type", String.valueOf(SlaveType.Lift)));
//        for (DeviceConfig device : liftList) {
//            LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, device.getDeviceNo());
//            if (liftThread == null) {
//                continue;
//            }
//
//            LiftProtocol liftProtocol = liftThread.getStatus();
//            if (liftProtocol == null) {
//                continue;
//            }
//            liftProtocols.add(liftProtocol);
//        }
//
//        map.put("shuttle", shuttleProtocols);
//        map.put("forkLift", forkLiftProtocols);
//        map.put("lift", liftProtocols);
        return R.ok().add(map);
    }
@@ -351,56 +286,6 @@
        return R.ok().add(list);
    }
    @PostMapping("/shuttleGather")
    @OpenApiLog(memo = "小车集合")
    public R shuttleGather(@RequestBody ShuttleGatherParam param) {
        List<ShuttleGatherResult> shuttleGather = shuttleDispatchUtils.shuttleGather(param);
        apiLogService.insert(new ApiLog(
                null
                , "小车集合"
                , "/shuttleGather"
                , null
                , null
                , null
                , JSON.toJSONString(param)
                , JSON.toJSONString(shuttleGather)
                , null
                , null
                , 1
                , new Date()
                , null
                , null
        ));
        return R.ok().add(shuttleGather);
    }
    @PostMapping("/shuttleDemo")
    @OpenApiLog(memo = "小车演示")
    public R shuttleDemo(@RequestBody ShuttleDemoParam param) {
        shuttleDispatchUtils.shuttleDemo(param);
        apiLogService.insert(new ApiLog(
                null
                , "小车演示"
                , "/shuttleDemo"
                , null
                , null
                , null
                , JSON.toJSONString(param)
                , null
                , null
                , null
                , 1
                , new Date()
                , null
                , null
        ));
        return R.ok();
    }
    @PostMapping("/queryTask")
    @OpenApiLog(memo = "查询任务")
    public R queryTask(@RequestBody QueryTaskParam param) {
@@ -439,13 +324,6 @@
    @GetMapping("/systemStatus")
    public R systemStatus() {
        return R.ok();
    }
    @GetMapping("/test")
    public R test() {
        notifyUtils.notify("task", 1, "9999", "W9999", NotifyMsgType.SHUTTLE_MOVING, "data");
        notifyUtils.notify(String.valueOf(SlaveType.Shuttle), 2, "9999", "W9999", NotifyMsgType.SHUTTLE_MOVE_COMPLETE);
        return R.ok();
    }
src/main/java/com/zy/asrs/controller/ShuttleController.java
File was deleted
src/main/java/com/zy/asrs/controller/TrafficControlController.java
File was deleted
src/main/java/com/zy/asrs/domain/ShuttleGatherResult.java
File was deleted
src/main/java/com/zy/asrs/domain/param/LiftOperatorParam.java
File was deleted
src/main/java/com/zy/asrs/domain/param/ReportExceptionParam.java
File was deleted
src/main/java/com/zy/asrs/domain/param/RobotReportActionStatusParam.java
File was deleted
src/main/java/com/zy/asrs/domain/param/ShuttleDemoParam.java
File was deleted
src/main/java/com/zy/asrs/domain/param/ShuttleGatherParam.java
File was deleted
src/main/java/com/zy/asrs/domain/param/ShuttleOperatorParam.java
File was deleted
src/main/java/com/zy/asrs/domain/param/ShuttleTimedPowerRangeParam.java
File was deleted
src/main/java/com/zy/asrs/domain/vo/ForkLiftMsgTableVo.java
File was deleted
src/main/java/com/zy/asrs/domain/vo/LiftDataVo.java
File was deleted
src/main/java/com/zy/asrs/domain/vo/LiftMsgTableVo.java
File was deleted
src/main/java/com/zy/asrs/domain/vo/LiftSensorDataVo.java
File was deleted
src/main/java/com/zy/asrs/domain/vo/LiftStateTableVo.java
File was deleted
src/main/java/com/zy/asrs/domain/vo/ShuttleDataVo.java
File was deleted
src/main/java/com/zy/asrs/domain/vo/ShuttleMsgTableVo.java
File was deleted
src/main/java/com/zy/asrs/domain/vo/ShuttleSensorDataVo.java
File was deleted
src/main/java/com/zy/asrs/domain/vo/ShuttleStateTableVo.java
File was deleted
src/main/java/com/zy/asrs/entity/BasCrnp.java
New file
@@ -0,0 +1,121 @@
package com.zy.asrs.entity;
import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.enums.IdType;
import com.baomidou.mybatisplus.annotations.TableField;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import com.baomidou.mybatisplus.annotations.TableName;
import java.io.Serializable;
@Data
@TableName("asr_bas_crnp")
public class BasCrnp implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * ç¼–号
     */
    @ApiModelProperty(value= "编号")
    @TableId(value = "crn_no", type = IdType.AUTO)
    @TableField("crn_no")
    private Integer crnNo;
    @ApiModelProperty(value= "")
    private Integer status;
    @ApiModelProperty(value= "")
    @TableField("wrk_no")
    private Integer wrkNo;
    /**
     * å¯å…¥(checkBox)
     */
    @ApiModelProperty(value= "可入(checkBox)")
    @TableField("in_enable")
    private String inEnable;
    /**
     * å¯å‡º(checkBox)
     */
    @ApiModelProperty(value= "可出(checkBox)")
    @TableField("out_enable")
    private String outEnable;
    @ApiModelProperty(value= "")
    @TableField("create_by")
    private Long createBy;
    @ApiModelProperty(value= "")
    @TableField("create_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    @ApiModelProperty(value= "")
    @TableField("update_by")
    private Long updateBy;
    @ApiModelProperty(value= "")
    @TableField("update_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
    @ApiModelProperty(value= "")
    private String memo;
    public BasCrnp() {}
    public BasCrnp(Integer status,Integer wrkNo,String inEnable,String outEnable,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
        this.status = status;
        this.wrkNo = wrkNo;
        this.inEnable = inEnable;
        this.outEnable = outEnable;
        this.createBy = createBy;
        this.createTime = createTime;
        this.updateBy = updateBy;
        this.updateTime = updateTime;
        this.memo = memo;
    }
//    BasCrnp basCrnp = new BasCrnp(
//            null,    //
//            null,    //
//            null,    // å¯å…¥(checkBox)
//            null,    // å¯å‡º(checkBox)
//            null,    //
//            null,    //
//            null,    //
//            null,    //
//            null    //
//    );
    public String getCreateTime$(){
        if (Cools.isEmpty(this.createTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
    }
    public String getUpdateTime$(){
        if (Cools.isEmpty(this.updateTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
    }
    public String getStatus$(){
        if (Cools.isEmpty(this.status)){
            return "";
        }
        return this.status == 1 ? "正常" : "禁用";
    }
}
src/main/java/com/zy/asrs/entity/BasCrnpErr.java
New file
@@ -0,0 +1,133 @@
package com.zy.asrs.entity;
import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.enums.IdType;
import com.baomidou.mybatisplus.annotations.TableField;
import com.core.common.SpringUtils;
import com.zy.system.service.UserService;
import com.zy.system.entity.User;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
import com.core.common.SpringUtils;
import com.zy.system.service.UserService;
import com.zy.system.entity.User;
import java.text.SimpleDateFormat;
import java.util.Date;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import com.baomidou.mybatisplus.annotations.TableName;
import java.io.Serializable;
@Data
@TableName("asr_bas_crnp_err")
public class BasCrnpErr implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * ç¼–号
     */
    @ApiModelProperty(value= "编号")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    /**
     * å¼‚常码
     */
    @ApiModelProperty(value= "异常码")
    @TableField("error_code")
    private Long errorCode;
    /**
     * å¼‚常
     */
    @ApiModelProperty(value= "异常")
    @TableField("err_name")
    private String errName;
    /**
     * ä¿®æ”¹äººå‘˜
     */
    @ApiModelProperty(value= "修改人员")
    @TableField("modi_user")
    private Long modiUser;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @ApiModelProperty(value= "修改时间")
    @TableField("modi_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date modiTime;
    /**
     * æ·»åŠ äººå‘˜
     */
    @ApiModelProperty(value= "添加人员")
    @TableField("appe_user")
    private Long appeUser;
    /**
     * æ·»åŠ æ—¶é—´
     */
    @ApiModelProperty(value= "添加时间")
    @TableField("appe_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date appeTime;
    public BasCrnpErr() {}
    public BasCrnpErr(Long errorCode,String errName,Long modiUser,Date modiTime,Long appeUser,Date appeTime) {
        this.errorCode = errorCode;
        this.errName = errName;
        this.modiUser = modiUser;
        this.modiTime = modiTime;
        this.appeUser = appeUser;
        this.appeTime = appeTime;
    }
//    BasCrnpErr basCrnpErr = new BasCrnpErr(
//            null,    // å¼‚常码
//            null,    // å¼‚常
//            null,    // ä¿®æ”¹äººå‘˜
//            null,    // ä¿®æ”¹æ—¶é—´
//            null,    // æ·»åŠ äººå‘˜
//            null    // æ·»åŠ æ—¶é—´
//    );
    public String getModiUser$(){
        UserService service = SpringUtils.getBean(UserService.class);
        User user = service.selectById(this.modiUser);
        if (!Cools.isEmpty(user)){
            return String.valueOf(user.getId());
        }
        return null;
    }
    public String getModiTime$(){
        if (Cools.isEmpty(this.modiTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.modiTime);
    }
    public String getAppeUser$(){
        UserService service = SpringUtils.getBean(UserService.class);
        User user = service.selectById(this.appeUser);
        if (!Cools.isEmpty(user)){
            return String.valueOf(user.getId());
        }
        return null;
    }
    public String getAppeTime$(){
        if (Cools.isEmpty(this.appeTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.appeTime);
    }
}
src/main/java/com/zy/asrs/entity/BasCrnpErrLog.java
New file
@@ -0,0 +1,311 @@
package com.zy.asrs.entity;
import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.enums.IdType;
import com.baomidou.mybatisplus.annotations.TableField;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.core.common.SpringUtils;
import com.zy.asrs.service.BasWrkStatusService;
import com.zy.asrs.entity.BasWrkStatus;
import com.core.common.SpringUtils;
import com.zy.asrs.service.BasWrkIotypeService;
import com.zy.asrs.entity.BasWrkIotype;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.core.common.SpringUtils;
import com.zy.system.service.UserService;
import com.zy.system.entity.User;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.core.common.SpringUtils;
import com.zy.system.service.UserService;
import com.zy.system.entity.User;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import com.baomidou.mybatisplus.annotations.TableName;
import java.io.Serializable;
@Data
@TableName("asr_bas_crnp_err_log")
public class BasCrnpErrLog implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * ç¼–号
     */
    @ApiModelProperty(value= "编号")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * å·¥ä½œå·
     */
    @ApiModelProperty(value= "工作号")
    @TableField("wrk_no")
    private Integer wrkNo;
    /**
     * å‘生时间
     */
    @ApiModelProperty(value= "发生时间")
    @TableField("start_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date startTime;
    /**
     * ç»“束时间
     */
    @ApiModelProperty(value= "结束时间")
    @TableField("end_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date endTime;
    /**
     * å·¥ä½œçŠ¶æ€
     */
    @ApiModelProperty(value= "工作状态")
    @TableField("wrk_sts")
    private Long wrkSts;
    /**
     * å…¥å‡ºåº“类型
     */
    @ApiModelProperty(value= "入出库类型")
    @TableField("io_type")
    private Integer ioType;
    /**
     * å †åž›æœºå·
     */
    @ApiModelProperty(value= "堆垛机号")
    @TableField("crn_no")
    private Integer crnNo;
    /**
     * ç›®æ ‡åº“位
     */
    @ApiModelProperty(value= "目标库位")
    @TableField("loc_no")
    private String locNo;
    /**
     * ç›®æ ‡ç«™
     */
    @ApiModelProperty(value= "目标站")
    @TableField("sta_no")
    private Integer staNo;
    /**
     * æºç«™
     */
    @ApiModelProperty(value= "源站")
    @TableField("source_sta_no")
    private Integer sourceStaNo;
    /**
     * æºåº“位
     */
    @ApiModelProperty(value= "源库位")
    @TableField("source_loc_no")
    private String sourceLocNo;
    /**
     * æ¡ç 
     */
    @ApiModelProperty(value= "条码")
    private String barcode;
    /**
     * å¼‚常码
     */
    @ApiModelProperty(value= "异常码")
    @TableField("err_code")
    private Integer errCode;
    /**
     * å¼‚常
     */
    @ApiModelProperty(value= "异常")
    private String error;
    /**
     * å¼‚常情况 1: æœªå¤„理  2: å·²ä¿®å¤
     */
    @ApiModelProperty(value= "异常情况 1: æœªå¤„理  2: å·²ä¿®å¤  ")
    private Integer status;
    /**
     * æ·»åŠ æ—¶é—´
     */
    @ApiModelProperty(value= "添加时间")
    @TableField("create_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    /**
     * æ·»åŠ äººå‘˜
     */
    @ApiModelProperty(value= "添加人员")
    @TableField("create_by")
    private Long createBy;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @ApiModelProperty(value= "修改时间")
    @TableField("update_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
    /**
     * ä¿®æ”¹äººå‘˜
     */
    @ApiModelProperty(value= "修改人员")
    @TableField("update_by")
    private Long updateBy;
    /**
     * å¤‡æ³¨
     */
    @ApiModelProperty(value= "备注")
    private String memo;
    /**
     * ç³»ç»ŸçŠ¶æ€æ•°æ®
     */
    @ApiModelProperty(value= "系统状态数据")
    @TableField("system_status")
    private String systemStatus;
    public BasCrnpErrLog() {}
    public BasCrnpErrLog(Integer wrkNo,Date startTime,Date endTime,Long wrkSts,Integer ioType,Integer crnNo,String locNo,Integer staNo,Integer sourceStaNo,String sourceLocNo,String barcode,Integer errCode,String error,Integer status,Date createTime,Long createBy,Date updateTime,Long updateBy,String memo,String systemStatus) {
        this.wrkNo = wrkNo;
        this.startTime = startTime;
        this.endTime = endTime;
        this.wrkSts = wrkSts;
        this.ioType = ioType;
        this.crnNo = crnNo;
        this.locNo = locNo;
        this.staNo = staNo;
        this.sourceStaNo = sourceStaNo;
        this.sourceLocNo = sourceLocNo;
        this.barcode = barcode;
        this.errCode = errCode;
        this.error = error;
        this.status = status;
        this.createTime = createTime;
        this.createBy = createBy;
        this.updateTime = updateTime;
        this.updateBy = updateBy;
        this.memo = memo;
        this.systemStatus = systemStatus;
    }
//    BasCrnpErrLog basCrnpErrLog = new BasCrnpErrLog(
//            null,    // å·¥ä½œå·
//            null,    // å‘生时间
//            null,    // ç»“束时间
//            null,    // å·¥ä½œçŠ¶æ€
//            null,    // å…¥å‡ºåº“类型
//            null,    // å †åž›æœºå·
//            null,    // ç›®æ ‡åº“位
//            null,    // ç›®æ ‡ç«™
//            null,    // æºç«™
//            null,    // æºåº“位
//            null,    // æ¡ç 
//            null,    // å¼‚常码
//            null,    // å¼‚常
//            null,    // å¼‚常情况
//            null,    // æ·»åŠ æ—¶é—´
//            null,    // æ·»åŠ äººå‘˜
//            null,    // ä¿®æ”¹æ—¶é—´
//            null,    // ä¿®æ”¹äººå‘˜
//            null,    // å¤‡æ³¨
//            null    // ç³»ç»ŸçŠ¶æ€æ•°æ®
//    );
    public String getStartTime$(){
        if (Cools.isEmpty(this.startTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.startTime);
    }
    public String getEndTime$(){
        if (Cools.isEmpty(this.endTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.endTime);
    }
    public String getWrkSts$(){
        BasWrkStatusService service = SpringUtils.getBean(BasWrkStatusService.class);
        BasWrkStatus basWrkStatus = service.selectById(this.wrkSts);
        if (!Cools.isEmpty(basWrkStatus)){
            return String.valueOf(basWrkStatus.getWrkDesc());
        }
        return null;
    }
    public String getIoType$(){
        BasWrkIotypeService service = SpringUtils.getBean(BasWrkIotypeService.class);
        BasWrkIotype basWrkIotype = service.selectById(this.ioType);
        if (!Cools.isEmpty(basWrkIotype)){
            return String.valueOf(basWrkIotype.getIoDesc());
        }
        return null;
    }
    public String getStatus$(){
        if (null == this.status){ return null; }
        switch (this.status){
            case 1:
                return "未处理";
            case 2:
                return "已修复";
            default:
                return String.valueOf(this.status);
        }
    }
    public String getCreateTime$(){
        if (Cools.isEmpty(this.createTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
    }
    public String getCreateBy$(){
        UserService service = SpringUtils.getBean(UserService.class);
        User user = service.selectById(this.createBy);
        if (!Cools.isEmpty(user)){
            return String.valueOf(user.getId());
        }
        return null;
    }
    public String getUpdateTime$(){
        if (Cools.isEmpty(this.updateTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
    }
    public String getUpdateBy$(){
        UserService service = SpringUtils.getBean(UserService.class);
        User user = service.selectById(this.updateBy);
        if (!Cools.isEmpty(user)){
            return String.valueOf(user.getId());
        }
        return null;
    }
}
src/main/java/com/zy/asrs/entity/BasCrnpOpt.java
New file
@@ -0,0 +1,191 @@
package com.zy.asrs.entity;
import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.enums.IdType;
import com.baomidou.mybatisplus.annotations.TableField;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.core.common.SpringUtils;
import com.zy.system.service.UserService;
import com.zy.system.entity.User;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import com.baomidou.mybatisplus.annotations.TableName;
import java.io.Serializable;
@Data
@TableName("asr_bas_crnp_opt")
public class BasCrnpOpt implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * ç¼–号
     */
    @ApiModelProperty(value= "编号")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * å·¥ä½œå·
     */
    @ApiModelProperty(value= "工作号")
    @TableField("wrk_no")
    private Integer wrkNo;
    /**
     * å †åž›æœºå·
     */
    @ApiModelProperty(value= "堆垛机号")
    @TableField("crn_no")
    private Integer crnNo;
    /**
     * ä¸‹å‘æ—¶é—´
     */
    @ApiModelProperty(value= "下发时间")
    @TableField("send_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date sendTime;
    /**
     * ä½œä¸š
     */
    @ApiModelProperty(value= "作业")
    private String mode;
    /**
     * èµ·ç‚¹åº“位
     */
    @ApiModelProperty(value= "起点库位")
    @TableField("source_loc_no")
    private String sourceLocNo;
    /**
     * ç›®æ ‡åº“位
     */
    @ApiModelProperty(value= "目标库位")
    @TableField("target_loc_no")
    private String targetLocNo;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @ApiModelProperty(value= "修改时间")
    @TableField("update_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
    /**
     * ä¿®æ”¹äººå‘˜
     */
    @ApiModelProperty(value= "修改人员")
    @TableField("update_by")
    private Long updateBy;
    /**
     * å¤‡æ³¨
     */
    @ApiModelProperty(value= "备注")
    private String memo;
    /**
     * å‘½ä»¤
     */
    @ApiModelProperty(value= "命令")
    private String command;
    /**
     * ç³»ç»ŸçŠ¶æ€
     */
    @ApiModelProperty(value= "系统状态")
    @TableField("system_status")
    private String systemStatus;
    /**
     * ä¸‹å‘状态 0: æœªä¸‹å‘  1: å·²ä¸‹å‘
     */
    @ApiModelProperty(value= "下发状态 0: æœªä¸‹å‘  1: å·²ä¸‹å‘  ")
    private Integer send;
    /**
     * è¯·æ±‚响应
     */
    @ApiModelProperty(value= "请求响应")
    private String response;
    public BasCrnpOpt() {}
    public BasCrnpOpt(Integer wrkNo,Integer crnNo,Date sendTime,String mode,String sourceLocNo,String targetLocNo,Date updateTime,Long updateBy,String memo,String command,String systemStatus,Integer send,String response) {
        this.wrkNo = wrkNo;
        this.crnNo = crnNo;
        this.sendTime = sendTime;
        this.mode = mode;
        this.sourceLocNo = sourceLocNo;
        this.targetLocNo = targetLocNo;
        this.updateTime = updateTime;
        this.updateBy = updateBy;
        this.memo = memo;
        this.command = command;
        this.systemStatus = systemStatus;
        this.send = send;
        this.response = response;
    }
//    BasCrnpOpt basCrnpOpt = new BasCrnpOpt(
//            null,    // å·¥ä½œå·
//            null,    // å †åž›æœºå·
//            null,    // ä¸‹å‘æ—¶é—´
//            null,    // ä½œä¸š
//            null,    // èµ·ç‚¹åº“位
//            null,    // ç›®æ ‡åº“位
//            null,    // ä¿®æ”¹æ—¶é—´
//            null,    // ä¿®æ”¹äººå‘˜
//            null,    // å¤‡æ³¨
//            null,    // å‘½ä»¤
//            null,    // ç³»ç»ŸçŠ¶æ€
//            null,    // ä¸‹å‘状态
//            null    // è¯·æ±‚响应
//    );
    public String getSendTime$(){
        if (Cools.isEmpty(this.sendTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.sendTime);
    }
    public String getUpdateTime$(){
        if (Cools.isEmpty(this.updateTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
    }
    public String getUpdateBy$(){
        UserService service = SpringUtils.getBean(UserService.class);
        User user = service.selectById(this.updateBy);
        if (!Cools.isEmpty(user)){
            return String.valueOf(user.getId());
        }
        return null;
    }
    public String getSend$(){
        if (null == this.send){ return null; }
        switch (this.send){
            case 0:
                return "未下发";
            case 1:
                return "已下发";
            default:
                return String.valueOf(this.send);
        }
    }
}
src/main/java/com/zy/asrs/entity/BasLift.java
File was deleted
src/main/java/com/zy/asrs/entity/BasLiftErr.java
File was deleted
src/main/java/com/zy/asrs/entity/BasLiftErrLog.java
File was deleted
src/main/java/com/zy/asrs/entity/BasLiftOpt.java
File was deleted
src/main/java/com/zy/asrs/entity/BasShuttle.java
File was deleted
src/main/java/com/zy/asrs/entity/BasShuttleCharge.java
File was deleted
src/main/java/com/zy/asrs/entity/BasShuttleErr.java
File was deleted
src/main/java/com/zy/asrs/entity/BasShuttleErrLog.java
File was deleted
src/main/java/com/zy/asrs/entity/BasShuttleOpt.java
File was deleted
src/main/java/com/zy/asrs/mapper/BasCrnpErrLogMapper.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.mapper;
import com.zy.asrs.entity.BasCrnpErrLog;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface BasCrnpErrLogMapper extends BaseMapper<BasCrnpErrLog> {
}
src/main/java/com/zy/asrs/mapper/BasCrnpErrMapper.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.mapper;
import com.zy.asrs.entity.BasCrnpErr;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface BasCrnpErrMapper extends BaseMapper<BasCrnpErr> {
}
src/main/java/com/zy/asrs/mapper/BasCrnpMapper.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.mapper;
import com.zy.asrs.entity.BasCrnp;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface BasCrnpMapper extends BaseMapper<BasCrnp> {
}
src/main/java/com/zy/asrs/mapper/BasCrnpOptMapper.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.mapper;
import com.zy.asrs.entity.BasCrnpOpt;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface BasCrnpOptMapper extends BaseMapper<BasCrnpOpt> {
}
src/main/java/com/zy/asrs/mapper/BasLiftErrLogMapper.java
File was deleted
src/main/java/com/zy/asrs/mapper/BasLiftErrMapper.java
File was deleted
src/main/java/com/zy/asrs/mapper/BasLiftMapper.java
File was deleted
src/main/java/com/zy/asrs/mapper/BasLiftOptMapper.java
File was deleted
src/main/java/com/zy/asrs/mapper/BasShuttleChargeMapper.java
File was deleted
src/main/java/com/zy/asrs/mapper/BasShuttleErrLogMapper.java
File was deleted
src/main/java/com/zy/asrs/mapper/BasShuttleErrMapper.java
File was deleted
src/main/java/com/zy/asrs/mapper/BasShuttleMapper.java
File was deleted
src/main/java/com/zy/asrs/mapper/BasShuttleOptMapper.java
File was deleted
src/main/java/com/zy/asrs/service/BasCrnpErrLogService.java
New file
@@ -0,0 +1,8 @@
package com.zy.asrs.service;
import com.zy.asrs.entity.BasCrnpErrLog;
import com.baomidou.mybatisplus.service.IService;
public interface BasCrnpErrLogService extends IService<BasCrnpErrLog> {
}
src/main/java/com/zy/asrs/service/BasCrnpErrService.java
New file
@@ -0,0 +1,8 @@
package com.zy.asrs.service;
import com.zy.asrs.entity.BasCrnpErr;
import com.baomidou.mybatisplus.service.IService;
public interface BasCrnpErrService extends IService<BasCrnpErr> {
}
src/main/java/com/zy/asrs/service/BasCrnpOptService.java
New file
@@ -0,0 +1,8 @@
package com.zy.asrs.service;
import com.zy.asrs.entity.BasCrnpOpt;
import com.baomidou.mybatisplus.service.IService;
public interface BasCrnpOptService extends IService<BasCrnpOpt> {
}
src/main/java/com/zy/asrs/service/BasCrnpService.java
New file
@@ -0,0 +1,8 @@
package com.zy.asrs.service;
import com.zy.asrs.entity.BasCrnp;
import com.baomidou.mybatisplus.service.IService;
public interface BasCrnpService extends IService<BasCrnp> {
}
src/main/java/com/zy/asrs/service/BasLiftErrLogService.java
File was deleted
src/main/java/com/zy/asrs/service/BasLiftErrService.java
File was deleted
src/main/java/com/zy/asrs/service/BasLiftOptService.java
File was deleted
src/main/java/com/zy/asrs/service/BasLiftService.java
File was deleted
src/main/java/com/zy/asrs/service/BasShuttleChargeService.java
File was deleted
src/main/java/com/zy/asrs/service/BasShuttleErrLogService.java
File was deleted
src/main/java/com/zy/asrs/service/BasShuttleErrService.java
File was deleted
src/main/java/com/zy/asrs/service/BasShuttleOptService.java
File was deleted
src/main/java/com/zy/asrs/service/BasShuttleService.java
File was deleted
src/main/java/com/zy/asrs/service/impl/BasCrnpErrLogServiceImpl.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.service.impl;
import com.zy.asrs.mapper.BasCrnpErrLogMapper;
import com.zy.asrs.entity.BasCrnpErrLog;
import com.zy.asrs.service.BasCrnpErrLogService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service("basCrnpErrLogService")
public class BasCrnpErrLogServiceImpl extends ServiceImpl<BasCrnpErrLogMapper, BasCrnpErrLog> implements BasCrnpErrLogService {
}
src/main/java/com/zy/asrs/service/impl/BasCrnpErrServiceImpl.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.service.impl;
import com.zy.asrs.mapper.BasCrnpErrMapper;
import com.zy.asrs.entity.BasCrnpErr;
import com.zy.asrs.service.BasCrnpErrService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service("basCrnpErrService")
public class BasCrnpErrServiceImpl extends ServiceImpl<BasCrnpErrMapper, BasCrnpErr> implements BasCrnpErrService {
}
src/main/java/com/zy/asrs/service/impl/BasCrnpOptServiceImpl.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.service.impl;
import com.zy.asrs.mapper.BasCrnpOptMapper;
import com.zy.asrs.entity.BasCrnpOpt;
import com.zy.asrs.service.BasCrnpOptService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service("basCrnpOptService")
public class BasCrnpOptServiceImpl extends ServiceImpl<BasCrnpOptMapper, BasCrnpOpt> implements BasCrnpOptService {
}
src/main/java/com/zy/asrs/service/impl/BasCrnpServiceImpl.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.service.impl;
import com.zy.asrs.mapper.BasCrnpMapper;
import com.zy.asrs.entity.BasCrnp;
import com.zy.asrs.service.BasCrnpService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service("basCrnpService")
public class BasCrnpServiceImpl extends ServiceImpl<BasCrnpMapper, BasCrnp> implements BasCrnpService {
}
src/main/java/com/zy/asrs/service/impl/BasLiftErrLogServiceImpl.java
File was deleted
src/main/java/com/zy/asrs/service/impl/BasLiftErrServiceImpl.java
File was deleted
src/main/java/com/zy/asrs/service/impl/BasLiftOptServiceImpl.java
File was deleted
src/main/java/com/zy/asrs/service/impl/BasLiftServiceImpl.java
File was deleted
src/main/java/com/zy/asrs/service/impl/BasShuttleChargeServiceImpl.java
File was deleted
src/main/java/com/zy/asrs/service/impl/BasShuttleErrLogServiceImpl.java
File was deleted
src/main/java/com/zy/asrs/service/impl/BasShuttleErrServiceImpl.java
File was deleted
src/main/java/com/zy/asrs/service/impl/BasShuttleOptServiceImpl.java
File was deleted
src/main/java/com/zy/asrs/service/impl/BasShuttleServiceImpl.java
File was deleted
src/main/java/com/zy/asrs/service/impl/ForkMainServiceImpl.java
File was deleted
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -1,33 +1,7 @@
package com.zy.asrs.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.zy.asrs.domain.enums.NotifyMsgType;
import com.zy.asrs.entity.*;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.NotifyUtils;
import com.zy.asrs.utils.Utils;
import com.zy.common.model.*;
import com.zy.common.model.enums.NavigationMapType;
import com.zy.common.service.CommonService;
import com.zy.common.utils.*;
import com.zy.core.News;
import com.zy.core.action.LiftAction;
import com.zy.core.action.ShuttleAction;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.dispatcher.LiftDispatchUtils;
import com.zy.core.dispatcher.ShuttleDispatchUtils;
import com.zy.core.enums.*;
import com.zy.core.model.command.*;
import com.zy.core.model.protocol.*;
import com.zy.core.thread.*;
import com.zy.system.entity.Config;
import com.zy.system.service.ConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
/**
 * ç«‹ä½“仓库WCS系统主流程业务
@@ -36,2009 +10,5 @@
@Slf4j
@Service("mainService")
public class MainServiceImpl {
    @Autowired
    private WrkMastService wrkMastService;
    @Autowired
    private BasShuttleErrLogService basShuttleErrLogService;
    @Autowired
    private BasLiftErrLogService basLiftErrLogService;
    @Autowired
    private BasShuttleErrService basShuttleErrService;
    @Autowired
    private BasLiftErrService basLiftErrService;
    @Autowired
    private CommonService commonService;
    @Autowired
    private BasMapService basMapService;
    @Autowired
    private ShuttleDispatchUtils shuttleDispatchUtils;
    @Autowired
    private RedisUtil redisUtil;
    @Autowired
    private ConfigService configService;
    @Autowired
    private NavigateMapData navigateMapData;
    @Autowired
    private NavigateUtils navigateUtils;
    @Autowired
    private ShuttleOperaUtils shuttleOperaUtils;
    @Autowired
    private ShuttleAction shuttleAction;
    @Autowired
    private LiftAction liftAction;
    @Autowired
    private NotifyUtils notifyUtils;
    @Autowired
    private BasShuttleChargeService basShuttleChargeService;
    @Autowired
    private DeviceConfigService deviceConfigService;
    @Autowired
    private LiftDispatchUtils liftDispatchUtils;
    @Autowired
    private BasShuttleService basShuttleService;
    /**
     * åˆå§‹åŒ–实时地图
     */
    public synchronized void initRealtimeBasMap() {
        try {
            List<BasMap> basMaps = basMapService.selectList(new EntityWrapper<BasMap>().orderBy("lev", true));
            for (BasMap basMap : basMaps) {
                Integer lev = basMap.getLev();
                Object data = redisUtil.get(RedisKeyType.MAP.key + lev);
                if (data == null) {//redis地图数据为空
                    //载入地图
                    List<List<MapNode>> lists = navigateMapData.getJsonOriginData(lev, NavigationMapType.getMapTypes(NavigationMapType.NONE), null, null);//获取完整地图(包括入库出库)
                    //存入数据库
                    basMap.setData(JSON.toJSONString(lists));
                    basMap.setCreateTime(new Date());
                    basMap.setUpdateTime(new Date());
                    if (!basMapService.updateById(basMap)) {
                        log.info("地图数据存储失败");
                    }
                    //将数据库地图数据存入redis
                    redisUtil.set(RedisKeyType.MAP.key + lev, lists);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * å…¥åº“  ===>>  å››å‘穿梭车入库作业下发
     */
    public synchronized void shuttleInExecute() {
        try {
            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                    .in("wrk_sts"
                            , WrkStsType.INBOUND_LIFT_RUN_COMPLETE.sts
                    )
                    .orderBy("io_pri", false)
                    .orderBy("appe_time", true)
            );
            for (WrkMast wrkMast : wrkMasts) {
                boolean step1 = this.shuttleInExecuteStep1(wrkMast);//小车搬入库中
                Thread.sleep(100);
                if (!step1) {
                    continue;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * å…¥åº“-小车搬入库中
     * å¦‚需主方法执行continue,请返回false
     * ps:返回值true并不代表该方法执行成功,返回值仅做标记用于主方法是否执行continue
     */
    public synchronized boolean shuttleInExecuteStep1(WrkMast wrkMast) {
        if (wrkMast.getWrkSts() == WrkStsType.INBOUND_LIFT_RUN_COMPLETE.sts) {
            //获取目标站
            LiftStaProtocol liftSta = LiftUtils.getLiftStaByStaNo(wrkMast.getStaNo());
            if (liftSta == null) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,缺少站点信息,禁止派发", wrkMast.getWrkNo());
                return false;
            }
            if (wrkMast.getShuttleNo() == null) {//没有绑定小车,进行调度
                boolean result = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), liftSta.getLocNo());//调度小车到货物所在输送站点进行取货
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,调度小车{}系统等待中", wrkMast.getWrkNo(), result ? "成功" : "失败");
                return false;
            }
            //获取四向穿梭车线程
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
            if (shuttleThread == null) {
                return false;
            }
            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
            if (shuttleProtocol == null) {
                return false;
            }
            if (!shuttleThread.isIdle()) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车忙碌中", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                return false;
            }
            //判断小车是否存在移动任务
            WrkMast hasMoveWorking = wrkMastService.selectShuttleHasMoveWorking(wrkMast.getShuttleNo());
            if (hasMoveWorking != null) {
                News.taskInfo(wrkMast.getWrkNo(), "{}号小车,存在移动任务,禁止派发任务", wrkMast.getShuttleNo());
                return false;//存在移动任务,禁止执行入库任务
            }
            //判断小车是否到达输送站点库位
            if (!shuttleProtocol.getCurrentLocNo().equals(liftSta.getLocNo())) {
                //小车不在输送站点位置
                shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), liftSta.getLocNo(), wrkMast.getShuttleNo());//调度小车到货物所在输送站点进行取货
                News.info("{}任务,{}小车,未到达输送站点,系统等待中", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                return false;
            }
            //检测障碍物车
            int checkObstacle = shuttleOperaUtils.checkObstacle(wrkMast.getLocNo(), new ArrayList<Integer>() {{
                add(shuttleProtocol.getShuttleNo());
            }}, new ArrayList<>());
            if (checkObstacle > 0) {
                News.info("{}任务,避障范围有小车,等待障碍小车调离中", wrkMast.getWrkNo());
                return false;
            }
            ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); // å››å‘穿梭车编号
            assignCommand.setTaskMode(ShuttleTaskModeType.TRANSPORT.id);//小车移库任务
            assignCommand.setTaskNo(wrkMast.getWrkNo());//任务号
            assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//源库位
            assignCommand.setLocNo(wrkMast.getLocNo());//目标库位
            assignCommand.setAuto(true);//自动模式
            //获取小车到目标库位命令
            List<ShuttleCommand> commands = shuttleOperaUtils.getStartToTargetCommands(liftSta.getLocNo(), wrkMast.getLocNo(), NavigationMapType.getDfxWithDevice(), assignCommand, shuttleThread);
            if (commands == null) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车,路径计算失败", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                return false;
            }
            List<ShuttleCommand> liftCommand = shuttleOperaUtils.getShuttleLiftCommand(assignCommand, shuttleThread, true);
            if (liftCommand == null) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车获取顶升命令失败", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                return false;
            }
            List<ShuttleCommand> liftCommand2 = shuttleOperaUtils.getShuttleLiftCommand(assignCommand, shuttleThread, false);
            if (liftCommand2 == null) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车获取下降命令失败", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                return false;
            }
            commands.add(0, liftCommand.get(0));
            commands.add(liftCommand2.get(0));
            assignCommand.setCommands(commands);
            wrkMast.setWrkSts(WrkStsType.INBOUND_SHUTTLE_RUN.sts);//小车搬运中  4.提升机搬运完成 ==> 5.小车搬运中
            wrkMast.setModiTime(new Date());
            wrkMast.setSystemMsg("");//清空消息
            if (wrkMastService.updateById(wrkMast)) {
                //下发任务
                shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand);
                //触发通知
                notifyUtils.notify(String.valueOf(SlaveType.Shuttle), shuttleProtocol.getShuttleNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.SHUTTLE_TRANSPORT);
                return false;
            }
            return false;
        }
        return true;
    }
    /**
     * å‡ºåº“  ===>>  å››å‘穿梭车出库作业下发
     */
    public synchronized void shuttleOutExecute() {
        try {
            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                    .in("wrk_sts"
                            , WrkStsType.NEW_OUTBOUND.sts
                    )
                    .orderBy("io_pri", false)
                    .orderBy("appe_time", true)
            );
            for (WrkMast wrkMast : wrkMasts) {
                boolean step1 = this.shuttleOutExecuteStep1(wrkMast);//小车搬出库中
                Thread.sleep(100);
                if (!step1) {
                    continue;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * å‡ºåº“-小车搬出库中
     * å¦‚需主方法执行continue,请返回false
     * ps:返回值true并不代表该方法执行成功,返回值仅做标记用于主方法是否执行continue
     */
    public synchronized boolean shuttleOutExecuteStep1(WrkMast wrkMast) {
        //101.生成出库任务 => 102.小车搬运中
        if (wrkMast.getWrkSts() == WrkStsType.NEW_OUTBOUND.sts) {
            Integer liftNo = wrkMast.getLiftNo();
            if (liftNo == null) {
                //通过输送线站号获取提升机号
                liftNo = LiftUtils.getConveyorBindLiftNo(wrkMast.getStaNo());
                if (liftNo == null) {
                    News.taskInfo(wrkMast.getWrkNo(), "{}任务,未找到匹配的提升机", wrkMast.getWrkNo());
                    return false;
                }
            }
            LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, liftNo);
            if (liftThread == null) {
                return false;
            }
            LiftProtocol liftProtocol = liftThread.getStatus();
            if (liftProtocol == null) {
                return false;
            }
            //判断提升机是否处于出库模式
            if (!liftProtocol.getIOModeType().equals(LiftIoModeType.OUT)) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,提升机不处于出库模式,禁止出库", wrkMast.getWrkNo());
                return false;
            }
            //获取源站
            LiftStaProtocol liftSta = LiftUtils.getLiftStaByLev(liftNo, Utils.getLev(wrkMast.getSourceLocNo()));
            if (liftSta == null) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,缺少站点信息,禁止派发", wrkMast.getWrkNo());
                return false;
            }
            if (liftSta.getHasCar()) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}站点存在小车,禁止派发", wrkMast.getWrkNo(), liftSta.getSiteId());
                return false;
            }
            if (liftSta.getHasTray()) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}站点有托盘,禁止派发", wrkMast.getWrkNo(), liftSta.getSiteId());
                return false;
            }
            List<WrkMast> shuttleMoveList = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                    .eq("io_type", 200)
            );
            for (WrkMast moveWrkMast : shuttleMoveList) {
                if(Utils.getLev(moveWrkMast.getLocNo()) != Utils.getLev(wrkMast.getSourceLocNo())) {
                    continue;
                }
                if(Utils.getLev(moveWrkMast.getLocNo()) == Utils.getLev(moveWrkMast.getSourceLocNo())) {
                    continue;
                }
                //存在换层任务,出库任务暂时不执行
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,存在换层任务,出库任务等待中", wrkMast.getWrkNo());
                return false;
            }
            boolean checkLocPathIsAvailable = navigateUtils.checkLocPathIsAvailable(wrkMast.getSourceLocNo(), liftSta.getLocNo());
            if(!checkLocPathIsAvailable) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,未计算到可执行路径,等待中", wrkMast.getWrkNo());
                return false;
            }
            if (wrkMast.getShuttleNo() == null) {//没有绑定小车,进行调度
                //强制预留一台小车给入库任务
                int lev = Utils.getLev(wrkMast.getSourceLocNo());
                //获取当前楼层有几台可用小车
                int shuttleCount = shuttleDispatchUtils.getShuttleEnableUseCountByLev(lev);
                if (shuttleCount >= 2) {//只有可用小车数量大于2,才进行入库任务预留小车
                    int shuttleWrkInObligateCount = 1;//预留小车数量
                    Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "shuttleWrkInObligateCount").eq("status", 1));
                    if (config != null) {
                        shuttleWrkInObligateCount = Integer.parseInt(config.getValue());
                    }
                    //可用出库小车数量(给入库任务预留一台车)
                    int useShuttleCount = shuttleCount - shuttleWrkInObligateCount;
                    //查询楼层已分配车辆的出库任务数量
                    List<WrkMast> wrkMasts = wrkMastService.selectShuttleOutWrkByLev(lev);
                    if (wrkMasts.size() >= useShuttleCount) {
                        News.taskInfo(wrkMast.getWrkNo(), "{}任务,当前楼层可用小车{}台,出库任务已分配{}台,系统等待中。", wrkMast.getWrkNo(), useShuttleCount, wrkMasts.size());
                        return false;
                    }
                }
                boolean result = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), wrkMast.getSourceLocNo());//调度小车到货物所在库位进行取货
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,调度小车{}系统等待中。", wrkMast.getWrkNo(), result ? "成功" : "失败");
                return false;
            }
            //获取四向穿梭车线程
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
            if (shuttleThread == null) {
                return false;
            }
            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
            if (shuttleProtocol == null) {
                return false;
            }
            if (!shuttleThread.isIdle()) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车,忙碌中", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                return false;
            }
            //判断小车是否到达货物库位
            if (!shuttleProtocol.getCurrentLocNo().equals(wrkMast.getSourceLocNo())) {
                //检测障碍物车
                int checkObstacle = shuttleOperaUtils.checkObstacle(wrkMast.getSourceLocNo(), new ArrayList<Integer>() {{
                    add(shuttleProtocol.getShuttleNo());
                }}, new ArrayList<>());
                if (checkObstacle > 0) {
                    News.info("{}任务,避障范围有小车,等待障碍小车调离中", wrkMast.getWrkNo());
                    return false;
                }
                //小车不在输送站点位置
                shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), wrkMast.getSourceLocNo(), wrkMast.getShuttleNo());//调度小车到货物所在库位进行取货
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车,未到达输送站点,系统等待中", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                return false;
            }
            //检测是否存在移动任务
            WrkMast moveWorking = wrkMastService.selectShuttleHasMoveWorking(wrkMast.getShuttleNo());
            if (moveWorking != null) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,小车存在移动任务", wrkMast.getWrkNo());
                return false;
            }
            ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); // å››å‘穿梭车编号
            assignCommand.setTaskMode(ShuttleTaskModeType.TRANSPORT.id);//小车移库任务
            assignCommand.setTaskNo(wrkMast.getWrkNo());//任务号
            assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//源库位
            assignCommand.setLocNo(liftSta.getLocNo());//目标库位
            assignCommand.setAuto(true);//自动模式
            //获取小车到输送站点行走命令
            List<ShuttleCommand> commands = shuttleOperaUtils.getStartToTargetCommands(wrkMast.getSourceLocNo(), liftSta.getLocNo(), NavigationMapType.getDfxWithDevice(), assignCommand, shuttleThread);
            if (commands == null) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车,路径计算失败", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                return false;
            }
            List<ShuttleCommand> liftCommand = shuttleOperaUtils.getShuttleLiftCommand(assignCommand, shuttleThread, true);
            if (liftCommand == null) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车获取顶升命令失败", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                return false;
            }
            List<ShuttleCommand> liftCommand2 = shuttleOperaUtils.getShuttleLiftCommand(assignCommand, shuttleThread, false);
            if (liftCommand2 == null) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车获取下降命令失败", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                return false;
            }
            commands.add(0, liftCommand.get(0));
            commands.add(liftCommand2.get(0));
            assignCommand.setCommands(commands);
            wrkMast.setWrkSts(WrkStsType.OUTBOUND_SHUTTLE_RUN.sts);//小车搬运中  101.生成出库任务 ==> 102.小车搬运中
            wrkMast.setSourceStaNo(liftSta.getSiteId());
            wrkMast.setModiTime(new Date());
            wrkMast.setSystemMsg("");//清空消息
            if (wrkMastService.updateById(wrkMast)) {
                //下发任务
                shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand);
                //触发通知
                notifyUtils.notify(String.valueOf(SlaveType.Shuttle), shuttleProtocol.getShuttleNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.SHUTTLE_TRANSPORT);
                return false;
            }
            return false;
        }
        return true;
    }
    /**
     * æ‰§è¡Œç§»åº“任务
     */
    public synchronized void shuttleLocMoveExecute() {
        try {
            //查询移库任务
            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                    .in("wrk_sts", WrkStsType.NEW_LOC_MOVE.sts)
                    .orderBy("io_pri", false)
                    .orderBy("appe_time", true)
            );
            for (WrkMast wrkMast : wrkMasts) {
                boolean stepToTarget = this.shuttleLocMoveExecuteToTarget(wrkMast);//移库任务-小车去目标点
                if (!stepToTarget) {
                    continue;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * ç§»åº“任务-小车去目标点
     * å¦‚需主方法执行continue,请返回false
     * ps:返回值true并不代表该方法执行成功,返回值仅做标记用于主方法是否执行continue
     */
    private boolean shuttleLocMoveExecuteToTarget(WrkMast wrkMast) {
        //--------------------------------------小车移动至站点-----------------------------------------//
        Date now = new Date();
        //小车移动至站点  501.生成移库任务 ==> 502.小车搬运中
        if (wrkMast.getWrkSts() == WrkStsType.NEW_LOC_MOVE.sts) {
            boolean checkLocPathIsAvailable = navigateUtils.checkLocPathIsAvailable(wrkMast.getSourceLocNo(), wrkMast.getLocNo());
            if(!checkLocPathIsAvailable) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,未计算到可执行路径,等待中", wrkMast.getWrkNo());
                return false;
            }
            if (wrkMast.getShuttleNo() == null) {//没有绑定小车,进行调度
                boolean result = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), wrkMast.getSourceLocNo());//调度小车到货物点进行取货
                News.info("{}任务,调度小车{}系统等待中", wrkMast.getWrkNo(), result ? "成功" : "失败");
                return false;
            }
            //获取四向穿梭车线程
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
            if (shuttleThread == null) {
                return false;
            }
            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
            if (shuttleProtocol == null) {
                return false;
            }
            if (shuttleProtocol.getCurrentLocNo() == null) {
                return false;
            }
            //判断小车是否到达货物库位
            if (!shuttleProtocol.getCurrentLocNo().equals(wrkMast.getSourceLocNo())) {
                //任务被避障取消
                Object cancelLock = redisUtil.get(RedisKeyType.TRAFFIC_CONTROL_SHUTTLE_OBSTACLE_CANCEL_TASK_LOCK.key + wrkMast.getShuttleNo());
                if(cancelLock != null) {
                    return false;
                }
                //小车未到达取货位置
                shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), wrkMast.getSourceLocNo(), wrkMast.getShuttleNo());//调度小车到货物所在库位进行取货
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,小车未到达取货位置", wrkMast.getWrkNo(), wrkMast.getSourceLocNo());
                return false;
            }
            //检测是否存在移动任务
            WrkMast moveWorking = wrkMastService.selectShuttleHasMoveWorking(wrkMast.getShuttleNo());
            if (moveWorking != null) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,小车存在移动任务", wrkMast.getWrkNo());
                return false;
            }
            //检测障碍物车
            int checkObstacle = shuttleOperaUtils.checkObstacle(wrkMast.getLocNo(), new ArrayList<Integer>() {{
                add(shuttleProtocol.getShuttleNo());
            }}, new ArrayList<>());
            if (checkObstacle > 0) {
                News.info("{}任务,避障范围有小车,等待障碍小车调离中", wrkMast.getWrkNo());
                return false;
            }
            ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); // å››å‘穿梭车编号
            assignCommand.setTaskMode(ShuttleTaskModeType.TRANSPORT.id);//小车移库任务
            assignCommand.setTaskNo(wrkMast.getWrkNo());//任务号
            assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//源库位
            assignCommand.setLocNo(wrkMast.getLocNo());//目标库位
            assignCommand.setAuto(true);//自动模式
            //获取小车到输送站点行走命令
            List<ShuttleCommand> commands = shuttleOperaUtils.getStartToTargetCommands(wrkMast.getSourceLocNo(), wrkMast.getLocNo(), NavigationMapType.getMapTypes(NavigationMapType.DFX), assignCommand, shuttleThread);
            if (commands == null) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车,路径计算失败", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                return false;
            }
            List<ShuttleCommand> liftCommand = shuttleOperaUtils.getShuttleLiftCommand(assignCommand, shuttleThread, true);
            if (liftCommand == null) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车获取顶升命令失败", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                return false;
            }
            List<ShuttleCommand> liftCommand2 = shuttleOperaUtils.getShuttleLiftCommand(assignCommand, shuttleThread, false);
            if (liftCommand2 == null) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车获取下降命令失败", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                return false;
            }
            commands.add(0, liftCommand.get(0));
            commands.add(liftCommand2.get(0));
            assignCommand.setCommands(commands);
            wrkMast.setWrkSts(WrkStsType.LOC_MOVE_SHUTTLE_RUN.sts);//小车搬运中  501.生成移库任务 ==> 502.小车搬运中
            wrkMast.setModiTime(now);
            wrkMast.setSystemMsg("");//清空消息
            if (wrkMastService.updateById(wrkMast)) {
                //下发任务
                shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand);
                //触发通知
                notifyUtils.notify(String.valueOf(SlaveType.Shuttle), shuttleProtocol.getShuttleNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.SHUTTLE_MOVING);
                return false;
            }
            return false;
        }
        return true;
    }
    /**
     * æå‡æœºä»»åŠ¡
     */
    public synchronized void liftIoExecute() {
        try {
            //搜索是否有待处理的任务
            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                    .in("wrk_sts", WrkStsType.NEW_INBOUND.sts, WrkStsType.OUTBOUND_SHUTTLE_RUN_COMPLETE.sts));
            if (wrkMasts.isEmpty()) {
                return;
            }
            for (WrkMast wrkMast : wrkMasts) {
                boolean stepIn = this.liftIoExecuteStepIn(wrkMast);//提升机入库
                if (!stepIn) {
                    continue;
                }
                boolean stepOut = this.liftIoExecuteStepOut(wrkMast);//提升机出库
                if (!stepOut) {
                    continue;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * æå‡æœºå…¥åº“
     * å¦‚需主方法执行continue,请返回false
     * ps:返回值true并不代表该方法执行成功,返回值仅做标记用于主方法是否执行continue
     */
    private boolean liftIoExecuteStepIn(WrkMast wrkMast) {
        //--------------------------------------提升机入库-----------------------------------------//
        Date now = new Date();
        //1.生成入库任务 ==> 3.提升机搬运中
        if (wrkMast.getWrkSts() == WrkStsType.NEW_INBOUND.sts) {
            //获取源输送站
            LiftStaProtocol sourceLiftSta = LiftUtils.getLiftStaByStaNo(wrkMast.getSourceStaNo());
            if (sourceLiftSta == null) {
                return false;//找不到站点
            }
            if (!sourceLiftSta.getHasTray()) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,源站无托盘", wrkMast.getWrkNo());
                return false;
            }
            //获取目标输送站
            LiftStaProtocol liftSta = LiftUtils.getLiftStaByStaNo(wrkMast.getStaNo());
            if (liftSta == null) {
                return false;//找不到站点
            }
            if (liftSta.getHasTray()) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,目标站存在托盘", wrkMast.getWrkNo());
                return false;
            }
            //检测楼层是否有可用穿梭车
            boolean checkLevHasShuttle = Utils.checkLevHasShuttle(liftSta.getLev());
            if (!checkLevHasShuttle) {
                if (wrkMast.getShuttleNo() != null) {
                    return false;
                }
                String targetLocNo = navigateUtils.calcEndLocation(wrkMast.getLocNo(), liftSta.getLocNo(), NavigationMapType.getMapTypes(NavigationMapType.NORMAL), null, null, 2);
                if (targetLocNo == null) {//出输送线站点计算失败
                    News.taskInfo(wrkMast.getWrkNo(), "{}任务,调度小车去入库层近点计算失败", wrkMast.getWrkNo());
                    return false;
                }
                //调度小车去待机位
                boolean dispatchShuttle = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), targetLocNo);
                if (!dispatchShuttle) {
                    News.taskInfo(wrkMast.getWrkNo(), "{}任务,调度小车去入库层失败", wrkMast.getWrkNo());
                    return false;
                }
                return false;
            }
            Integer liftNo = wrkMast.getLiftNo();
            if (liftNo == null) {
                //未分配提升机
                Integer staNo = wrkMast.getSourceStaNo();
                liftNo = LiftUtils.getConveyorBindLiftNo(staNo);
                if(liftNo == null) {
                    News.taskInfo(wrkMast.getWrkNo(), "{}任务,未找到匹配的提升机", wrkMast.getWrkNo());
                    return false;
                }
                //申请提升机资源
                boolean applyLift = liftAction.applyLift(liftNo, wrkMast.getWrkNo());
                if(!applyLift) {
                    News.taskInfo(wrkMast.getWrkNo(), "{}任务,申请提升机资源失败,禁止入库", wrkMast.getWrkNo());
                    return false;
                }
                return false;
            }
            LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, liftNo);
            if (liftThread == null) {
                return false;
            }
            LiftProtocol liftProtocol = liftThread.getStatus();
            if (liftProtocol == null) {
                return false;
            }
            if (!liftThread.isIdle()) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}号提升机,忙碌中", wrkMast.getWrkNo(), liftSta.getLiftNo());
                return false;
            }
            //判断提升机是否处于入库模式
            if (!liftProtocol.getIOModeType().equals(LiftIoModeType.IN)) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,提升机不处于入库模式,禁止入库", wrkMast.getWrkNo());
                return false;
            }
            //请求上级系统,是否允许入库
            boolean inMission = LiftUtils.queryInMission(wrkMast.getSourceStaNo(), liftSta.getLiftNo(), wrkMast.getWmsWrkNo());
            if (!inMission) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,上级系统不允许入库", wrkMast.getWrkNo());
                return false;
            }
            //获取提升机命令
            LiftCommand liftCommand = liftThread.getPickAndPutCommand(wrkMast.getWrkNo(), wrkMast.getSourceStaNo(), liftSta.getSiteId());
            ArrayList<LiftCommand> commands = new ArrayList<>();
            commands.add(liftCommand);
            //提交到线程去工作
            LiftAssignCommand assignCommand = new LiftAssignCommand();
            assignCommand.setCommands(commands);
            assignCommand.setLiftNo(liftNo);
            assignCommand.setTaskNo(wrkMast.getWrkNo());
            assignCommand.setTaskMode(LiftTaskModeType.PICK_PUT.id);
            wrkMast.setWrkSts(WrkStsType.INBOUND_LIFT_RUN.sts);//提升机搬运中  1.生成入库任务 ==> 3.提升机搬运中
            wrkMast.setSystemMsg("");//清空消息
            wrkMast.setModiTime(now);
            if (wrkMastService.updateById(wrkMast)) {
                //下发任务
                liftAction.assignWork(wrkMast.getLiftNo(), assignCommand);
            }
            return false;
        }
        return true;
    }
    /**
     * æå‡æœºå‡ºåº“
     * å¦‚需主方法执行continue,请返回false
     * ps:返回值true并不代表该方法执行成功,返回值仅做标记用于主方法是否执行continue
     */
    private boolean liftIoExecuteStepOut(WrkMast wrkMast) {
        //--------------------------------------提升机出库-----------------------------------------//
        //103.小车搬运完成 ==> 104.提升机搬运中
        if (wrkMast.getWrkSts() == WrkStsType.OUTBOUND_SHUTTLE_RUN_COMPLETE.sts) {
            //获取源站
            LiftStaProtocol liftSta = LiftUtils.getLiftStaByStaNo(wrkMast.getSourceStaNo());
            if (liftSta == null) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,找不到站点,禁止派发", wrkMast.getWrkNo());
                return false;//找不到站点
            }
            if(wrkMast.getShuttleNo() != null) {
                ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
                if (shuttleThread == null) {
                    return false;
                }
                ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
                if(shuttleProtocol == null) {
                    return false;
                }
                if (shuttleProtocol.getCurrentLocNo().equals(liftSta.getLocNo())) {
                    //小车还在输送站点
                    //小车出提升机近点距离
                    int shuttleOutLiftLocationDistance = 2;
                    Config shuttleOutLiftLocationDistanceConfig = configService.selectOne(new EntityWrapper<Config>().eq("code", "shuttleOutLiftLocationDistance"));
                    if (shuttleOutLiftLocationDistanceConfig != null) {
                        shuttleOutLiftLocationDistance = Integer.parseInt(shuttleOutLiftLocationDistanceConfig.getValue());
                    }
                    String targetLocNo = navigateUtils.calcFirstLocation(shuttleProtocol.getCurrentLocNo(), wrkMast.getSourceLocNo(), NavigationMapType.getMapTypes(NavigationMapType.NORMAL), null, null, shuttleOutLiftLocationDistance);
                    if (targetLocNo == null) {//出输送线站点计算失败
                        News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车,出输送线站点计算失败", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                        return false;
                    }
                    //调度小车去待机位
                    boolean dispatchShuttle = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), targetLocNo, wrkMast.getShuttleNo());
                    if (!dispatchShuttle) {
                        News.taskInfo(wrkMast.getWrkNo(), "{}任务,小车在输送站点调度小车避让失败", wrkMast.getWrkNo());
                        return false;
                    }
                } else {
                    //小车已不在输送站点位置,释放小车
                    wrkMast.setShuttleNo(null);//释放小车
                    wrkMast.setModiTime(new Date());
                    wrkMastService.updateById(wrkMast);
                    return false;
                }
                return false;
            }
            if (!liftSta.getHasTray()) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}站点无托盘,禁止派发", wrkMast.getWrkNo(), liftSta.getSiteId());
                return false;
            }
            Integer liftNo = wrkMast.getLiftNo();
            if (liftNo == null) {
                //未分配提升机
                Integer staNo = wrkMast.getStaNo();
                liftNo = LiftUtils.getConveyorBindLiftNo(staNo);
                if(liftNo == null) {
                    News.taskInfo(wrkMast.getWrkNo(), "{}任务,未找到匹配的提升机", wrkMast.getWrkNo());
                    return false;
                }
                //申请提升机资源
                boolean applyLift = liftAction.applyLift(liftSta.getLiftNo(), wrkMast.getWrkNo());
                if(!applyLift) {
                    News.taskInfo(wrkMast.getWrkNo(), "{}任务,申请提升机资源失败,禁止执行出库", wrkMast.getWrkNo());
                    return false;
                }
                return false;
            }
            LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, liftNo);
            if (liftThread == null) {
                return false;
            }
            LiftProtocol liftProtocol = liftThread.getStatus();
            if (liftProtocol == null) {
                return false;
            }
            if (!liftThread.isIdle()) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}号提升机,忙碌中", wrkMast.getWrkNo(), liftSta.getLiftNo());
                return false;
            }
            //判断提升机是否处于出库模式
            if (!liftProtocol.getIOModeType().equals(LiftIoModeType.OUT)) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,提升机不处于出库模式,禁止出库", wrkMast.getWrkNo());
                return false;
            }
            //请求上级系统,是否允许出库
            boolean outMission = LiftUtils.queryOutMission(wrkMast.getStaNo());
            if (!outMission) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,上级系统不允许出库", wrkMast.getWrkNo());
                return false;
            }
            //获取提升机命令
            LiftCommand liftCommand = liftThread.getPickAndPutCommand(wrkMast.getWrkNo(), liftSta.getSiteId(), wrkMast.getStaNo());
            ArrayList<LiftCommand> commands = new ArrayList<>();
            commands.add(liftCommand);
            //提交到线程去工作
            LiftAssignCommand assignCommand = new LiftAssignCommand();
            assignCommand.setCommands(commands);
            assignCommand.setLiftNo(liftNo);
            assignCommand.setTaskNo(wrkMast.getWrkNo());
            assignCommand.setTaskMode(LiftTaskModeType.PICK_PUT.id);
            wrkMast.setWrkSts(WrkStsType.OUTBOUND_LIFT_RUN.sts);//提升机搬运中  103.生成入库任务 ==> 104.提升机搬运中
            wrkMast.setShuttleNo(null);//释放小车
            wrkMast.setSystemMsg("");//清空消息
            wrkMast.setModiTime(new Date());
            if (wrkMastService.updateById(wrkMast)) {
                //下发任务
                liftAction.assignWork(wrkMast.getLiftNo(), assignCommand);
            }
            return false;
        }
        return true;
    }
    /**
     * æå‡æœºä»»åŠ¡å®Œæˆ
     */
    public synchronized void liftFinished() {
        try {
            List<DeviceConfig> liftList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                    .eq("device_type", String.valueOf(SlaveType.Lift)));
            for (DeviceConfig device : liftList) {
                //获取提升机信息
                LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, device.getDeviceNo());
                if(liftThread == null) {
                    continue;
                }
                LiftProtocol liftProtocol = liftThread.getStatus();
                if (liftProtocol == null) {
                    continue;
                }
                if (!liftThread.isDeviceIdle()) {
                    continue;
                }
                //提升机为等待确认且空闲
                if (liftProtocol.getProtocolStatus() == LiftProtocolStatusType.WAITING.id
                        && liftProtocol.getTaskNo() != 0
                ) {
                    //将任务档标记为完成
                    WrkMast wrkMast = wrkMastService.selectByWorkNo(liftProtocol.getTaskNo());
                    if (wrkMast != null) {
                        if (wrkMast.getWrkSts() == WrkStsType.INBOUND_LIFT_RUN.sts) {
                            //3.提升机搬运中 ==> 4.提升机搬运完成
                            wrkMast.setWrkSts(WrkStsType.INBOUND_LIFT_RUN_COMPLETE.sts);
                            wrkMast.setLiftNo(null);//释放提升机
                        }else if (wrkMast.getWrkSts() == WrkStsType.MOVE_NEARBY_COMPLETE.sts) {
                            //303.小车移动至近点完成 -- è°ƒåº¦æå‡æœºåˆ°å°è½¦å±‚
                        } else if (wrkMast.getWrkSts() == WrkStsType.OUTBOUND_LIFT_RUN.sts) {
                            //304.提升机搬运中 ==> 109.出库完成
                            wrkMast.setWrkSts(WrkStsType.COMPLETE_OUTBOUND.sts);
                            wrkMast.setLiftNo(null);//释放提升机
                        } else if (wrkMast.getWrkSts() == WrkStsType.MOVE_LIFT_RUN.sts) {
                            //306.提升机搬运中 ==> 307.提升机搬运完成
                            wrkMast.setWrkSts(WrkStsType.MOVE_LIFT_RUN_COMPLETE.sts);
                        } else {
                            News.error("提升机确认失败,提升机号={},工作号={}", liftProtocol.getLiftNo(), liftProtocol.getTaskNo());
                            return;
                        }
                        wrkMast.setModiTime(new Date());
                        if (wrkMastService.updateById(wrkMast)) {
                            liftThread.reset();
                            News.info("提升机已确认且任务完成状态。提升机号={}", liftProtocol.getLiftNo());
                        } else {
                            News.error("提升机已确认且任务完成状态,复位失败,但未找到工作档。提升机号={},工作号={}", liftProtocol.getLiftNo(), liftProtocol.getTaskNo());
                        }
                    }else {
                        boolean checkPreviewDispatchLift = commonService.checkWorkNoContainMk(liftProtocol.getTaskNo(), WrkIoType.PREVIEW_LIFT_MOVE.id);
                        if (checkPreviewDispatchLift) {
                            //属于提升机预调度移动任务
                            //无工作档支撑,直接确认完成
                            liftThread.setSyncTaskNo(0);
                            liftThread.reset();
                            News.info("已确认提升机预调度移动任务。提升机号={}", liftProtocol.getLiftNo());
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * å¼‚常信息记录
     */
    public void recErr() {
        try {
            this.recShuttleErr();
            this.recLiftErr();
        } catch (Exception e) {
            News.error("recErr fail", e);
        }
    }
    /**
     * å››å‘穿梭车异常信息记录
     */
    private void recShuttleErr() {
        Date now = new Date();
        List<DeviceConfig> shuttleList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.Shuttle)));
        for (DeviceConfig device : shuttleList) {
            // èŽ·å–å››å‘ç©¿æ¢­è½¦ä¿¡æ¯
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getDeviceNo());
            if (shuttleThread == null) {
                continue;
            }
            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
            if (shuttleProtocol == null) {
                continue;
            }
            if (shuttleProtocol.getTaskNo() != 0) {
                //有任务
                BasShuttleErrLog latest = basShuttleErrLogService.findLatestByTaskNo(device.getDeviceNo(), shuttleProtocol.getTaskNo());
                // æœ‰å¼‚常
                if (latest == null) {
                    if (shuttleProtocol.getErrorCode() != null && Integer.parseInt(shuttleProtocol.getErrorCode()) != 0) {
                        WrkMast wrkMast = wrkMastService.selectByWorkNo(shuttleProtocol.getTaskNo());
                        if (wrkMast == null) {
                            continue;
                        }
                        int errorCode = Integer.parseInt(shuttleProtocol.getErrorCode());
                        BasShuttleErr basShuttleErr = basShuttleErrService.queryByCode(errorCode);
                        String errName = basShuttleErr==null? "未知异常":basShuttleErr.getErrName();
                        BasShuttleErrLog basShuttleErrLog = new BasShuttleErrLog(
                                null,    // ç¼–号
                                wrkMast.getWrkNo(),    // å·¥ä½œå·
                                now,    // å‘生时间
                                null,    // ç»“束时间
                                wrkMast.getWrkSts(),    // å·¥ä½œçŠ¶æ€
                                wrkMast.getIoType(),    // å…¥å‡ºåº“类型
                                device.getDeviceNo(),    // å››å‘穿梭车
                                null,    // plc
                                wrkMast.getLocNo(),    // ç›®æ ‡åº“位
                                wrkMast.getStaNo(),    // ç›®æ ‡ç«™
                                wrkMast.getSourceStaNo(),    // æºç«™
                                wrkMast.getSourceLocNo(),    // æºåº“位
                                wrkMast.getBarcode(),    // æ¡ç 
                                errorCode,    // å¼‚常码
                                errName,    // å¼‚常
                                1,    // å¼‚常情况
                                now,    // æ·»åŠ æ—¶é—´
                                null,    // æ·»åŠ äººå‘˜
                                now,    // ä¿®æ”¹æ—¶é—´
                                null,    // ä¿®æ”¹äººå‘˜
                                "任务中异常",    // å¤‡æ³¨
                                JSON.toJSONString(shuttleProtocol)    // ç³»ç»ŸçŠ¶æ€æ•°æ®
                        );
                        if (!basShuttleErrLogService.insert(basShuttleErrLog)) {
                            News.error("四向穿梭车plc异常记录失败 ===>> [id:{}] [error:{}]", device.getDeviceNo(), errName);
                        }
                    }
                } else {
                    // å¼‚常修复
                    if (shuttleProtocol.getErrorCode() == null || Integer.parseInt(shuttleProtocol.getErrorCode()) == 0) {
                        latest.setEndTime(now);
                        latest.setUpdateTime(now);
                        latest.setStatus(2);
                        if (!basShuttleErrLogService.updateById(latest)) {
                            News.error("四向穿梭车plc异常记录修复失败 ===>> [id:{}] [errLogId:{}]", device.getDeviceNo(), latest.getId());
                        }
                    }
                }
            }
        }
    }
    /**
     * æå‡æœºå¼‚常信息记录
     */
    private void recLiftErr() {
        Date now = new Date();
        List<DeviceConfig> liftList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.Lift)));
        for (DeviceConfig device : liftList) {
            // èŽ·å–æå‡æœºä¿¡æ¯
            LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, device.getDeviceNo());
            if (liftThread == null) {
                continue;
            }
            LiftProtocol liftProtocol = liftThread.getStatus();
            if (liftProtocol == null) {
                continue;
            }
            if (liftProtocol.getTaskNo() != 0) {
                //有任务
                BasLiftErrLog latest = basLiftErrLogService.findLatestByTaskNo(device.getDeviceNo(), liftProtocol.getTaskNo());
                // æœ‰å¼‚常
                if (latest == null) {
                    if (liftProtocol.getErrorCode() != null && liftProtocol.getErrorCode() != 0) {
                        WrkMast wrkMast = wrkMastService.selectByWorkNo(liftProtocol.getTaskNo());
                        if (wrkMast == null) {
                            continue;
                        }
                        BasLiftErr basLiftErr = basLiftErrService.queryByCode(liftProtocol.getErrorCode());
                        String errName = basLiftErr==null? "未知异常":basLiftErr.getErrName();
                        BasLiftErrLog basLiftErrLog = new BasLiftErrLog(
                                null,    // ç¼–号
                                wrkMast.getWrkNo(),    // å·¥ä½œå·
                                now,    // å‘生时间
                                null,    // ç»“束时间
                                wrkMast.getWrkSts(),    // å·¥ä½œçŠ¶æ€
                                wrkMast.getIoType(),    // å…¥å‡ºåº“类型
                                device.getDeviceNo(),    // æå‡æœº
                                null,    // plc
                                wrkMast.getLocNo(),    // ç›®æ ‡åº“位
                                wrkMast.getStaNo(),    // ç›®æ ‡ç«™
                                wrkMast.getSourceStaNo(),    // æºç«™
                                wrkMast.getSourceLocNo(),    // æºåº“位
                                wrkMast.getBarcode(),    // æ¡ç 
                                null,    // å¼‚常码
                                errName,    // å¼‚常
                                1,    // å¼‚常情况
                                now,    // æ·»åŠ æ—¶é—´
                                null,    // æ·»åŠ äººå‘˜
                                now,    // ä¿®æ”¹æ—¶é—´
                                null,    // ä¿®æ”¹äººå‘˜
                                "任务中异常",    // å¤‡æ³¨
                                JSON.toJSONString(liftProtocol)    // ç³»ç»ŸçŠ¶æ€æ•°æ®
                        );
                        if (!basLiftErrLogService.insert(basLiftErrLog)) {
                            News.error("提升机plc异常记录失败 ===>> [id:{}] [error:{}]", device.getDeviceNo(), errName);
                        }
                    }
                } else {
                    // å¼‚常修复
                    if (liftProtocol.getErrorCode() == null || liftProtocol.getErrorCode() == 0) {
                        latest.setEndTime(now);
                        latest.setUpdateTime(now);
                        latest.setStatus(2);
                        if (!basLiftErrLogService.updateById(latest)) {
                            News.error("提升机plc异常记录修复失败 ===>> [id:{}] [errLogId:{}]", device.getDeviceNo(), latest.getId());
                        }
                    }
                }
            }
        }
    }
    /**
     * å››å‘穿梭车电量检测 ===>> å‘起充电
     */
    public synchronized void loopShuttleCharge() {
        try {
            List<BasShuttleCharge> charges = basShuttleChargeService.selectList(new EntityWrapper<BasShuttleCharge>().orderBy("charge_id", true));
            if (charges.isEmpty()) {
                return;//无充电桩
            }
            List<DeviceConfig> shuttleList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                    .eq("device_type", String.valueOf(SlaveType.Shuttle)));
            for (DeviceConfig device : shuttleList) {
                //获取四向穿梭车线程
                ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getDeviceNo());
                ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
                if (shuttleProtocol == null) {
                    continue;
                }
                //判断当前小车是否满足需要充电要求
                if (shuttleThread.isRequireCharge().equals(ShuttleRequireChargeType.NONE)) {
                    continue;//无需充电
                }
                boolean forceCharge = true;
                if (shuttleThread.isRequireCharge().equals(ShuttleRequireChargeType.SUGGEST_CHARGE)) {
                    BasShuttle basShuttle = basShuttleService.selectOne(new EntityWrapper<BasShuttle>().eq("shuttle_no", device.getDeviceNo()));
                    if (basShuttle != null) {
                        Integer suggestChargeLine = basShuttle.getSuggestChargeLine();
                        boolean chargeSuggestResult = Integer.parseInt(shuttleProtocol.getBatteryPower()) < suggestChargeLine;
                        if (chargeSuggestResult) {
                            //检测系统是否有任务
                            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("io_type", 1, 101, 201));
                            if (wrkMasts.isEmpty()) {
                                forceCharge = false;
                            }else {
                                continue;
                            }
                        }
                    }
                }
                WrkMast wrkMast1 = wrkMastService.selectShuttleWorking(shuttleProtocol.getShuttleNo());
                if (wrkMast1 != null) {
                    continue;
                }
                WrkMast wrkMast2 = wrkMastService.selectShuttleHasMoveWorking(shuttleProtocol.getShuttleNo());
                if (wrkMast2 != null) {
                    continue;
                }
                WrkMast wrkMast = wrkMastService.selectChargeWorking(shuttleProtocol.getShuttleNo());
                if (wrkMast != null) {//已有充电任务
                    continue;
                }
                //小车所在楼层
                int lev = Utils.getLev(shuttleProtocol.getCurrentLocNo());
                BasShuttleCharge shuttleCharge = null;
                //搜索小车所在楼层有没有充电桩
                for (BasShuttleCharge charge : charges) {
                    if (lev != Utils.getLev(charge.getLocNo())) {
                        continue;//小车和充电桩不在同一层
                    }
                    if (charge.getStatus() == 0) {
                        continue;//充电桩被禁用
                    }
                    //小车和充电桩在同一层
                    if (wrkMastService.selectChargeWorkingByChargeSta(charge.getChargeId()) == null) {
                        shuttleCharge = charge;
                        break;
                    }
                }
                if (shuttleCharge == null) {
                    //同楼层没有找到充电桩,找可用充电桩
                    //小车同楼层没有充电桩,只要充电桩可用就生成充电任务
                    for (BasShuttleCharge charge : charges) {
                        if (wrkMastService.selectChargeWorkingByChargeSta(charge.getChargeId()) == null) {
                            //判断当前充电桩是否有小车,如有小车,不分配该充电桩
                            ArrayList<String> locs = new ArrayList<>();
                            locs.add(charge.getLocNo());
                            Integer checkHasShuttle = Utils.checkGroupLocHasShuttle(locs);
                            if(checkHasShuttle != null) {
                                //当前充电桩有穿梭车,不分配该充电桩
                                continue;
                            }
                            if (charge.getStatus() == 0) {
                                continue;//充电桩被禁用
                            }
                            shuttleCharge = charge;
                            break;
                        }
                    }
                }
                if (shuttleCharge == null) {
                    continue;
                }
                String chargeLocNo = shuttleCharge.getLocNo();
                wrkMast = new WrkMast();
                wrkMast.setMk(String.valueOf(shuttleCharge.getChargeId()));
                wrkMast.setWrkNo(commonService.getWorkNo(WrkIoType.SHUTTLE_CHARGE.id));
                wrkMast.setWrkSts(WrkStsType.NEW_CHARGE.sts);
                wrkMast.setIoType(WrkIoType.SHUTTLE_CHARGE.id);//300.充电
                wrkMast.setIoPri((double) 999);
                wrkMast.setLocNo(chargeLocNo);
                wrkMast.setShuttleNo(device.getDeviceNo());
                wrkMast.setMemo(forceCharge ? "forceCharge" : "suggestCharge");
                wrkMast.setAppeTime(new Date());
                if (!wrkMastService.insert(wrkMast)) {
                    News.error("保存{}号四向穿梭车充电任务失败!!!", device.getDeviceNo());
                    continue;
                }
                News.info("保存{}号四向穿梭车充电任务成功!!!", device.getDeviceNo());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * æ‰§è¡Œå››å‘穿梭车充电任务
     */
    public synchronized void executeShuttleCharge() {
        try {
            //查询小车充电任务
            List<DeviceConfig> shuttleList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                    .eq("device_type", String.valueOf(SlaveType.Shuttle)));
            for (DeviceConfig device : shuttleList) {
                WrkMast wrkMast = wrkMastService.selectChargeWorking(device.getDeviceNo());
                if(wrkMast == null) {
                    continue;
                }
                boolean result1 = this.executeShuttleChargeStepGoToChargeSta(wrkMast);//小车等待充电桩
                if (!result1) {
                    continue;
                }
                boolean result2 = this.executeShuttleChargeStepArrivalChargeSta(wrkMast);//小车到达充电桩
                if (!result2) {
                    continue;
                }
                boolean result3 = this.executeShuttleChargeStepStartCharge(wrkMast);//小车开始充电
                if (!result3) {
                    continue;
                }
                boolean result4 = this.executeShuttleChargeStepStopCharge(wrkMast);//小车停止充电
                if (!result4) {
                    continue;
                }
                boolean result5 = this.executeShuttleChargeStepLeaveCharge(wrkMast);//小车离开充电桩
                if (!result5) {
                    continue;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * å°è½¦å‰å¾€å……电桩
     */
    private synchronized boolean executeShuttleChargeStepGoToChargeSta(WrkMast wrkMast) {
        if (wrkMast.getWrkSts() == WrkStsType.NEW_CHARGE.sts) {
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
            if (shuttleThread == null) {
                return false;
            }
            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
            if (shuttleProtocol == null) {
                return false;
            }
            if (wrkMast.getLocNo().equals(shuttleProtocol.getCurrentLocNo())) {
                //小车在充电桩位置
                wrkMast.setWrkSts(WrkStsType.CHARGE_SHUTTLE_RUN_COMPLETE.sts);
                wrkMast.setModiTime(new Date());
                wrkMastService.updateById(wrkMast);
                return false;
            }
            //调度小车去充电桩
            boolean dispatched = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), wrkMast.getLocNo(), wrkMast.getShuttleNo());
            if (!dispatched) {
                return false;
            }
            wrkMast.setWrkSts(WrkStsType.CHARGE_SHUTTLE_RUN.sts);//小车前往充电桩
            wrkMast.setModiTime(new Date());
            wrkMastService.updateById(wrkMast);
            return false;
        }
        return true;
    }
    /**
     * å°è½¦åˆ°è¾¾å……电桩
     */
    private synchronized boolean executeShuttleChargeStepArrivalChargeSta(WrkMast wrkMast) {
        if (wrkMast.getWrkSts() == WrkStsType.CHARGE_SHUTTLE_RUN.sts) {
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
            if (shuttleThread == null) {
                return false;
            }
            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
            if (shuttleProtocol == null) {
                return false;
            }
            //判断是否存在未完成的移动任务
            WrkMast moveWrk = wrkMastService.selectShuttleHasMoveWorking(wrkMast.getShuttleNo());
            if(moveWrk != null) {
                return false;
            }
            if (!wrkMast.getLocNo().equals(shuttleProtocol.getCurrentLocNo())) {
                return false;
            }
            //小车在充电桩位置
            wrkMast.setWrkSts(WrkStsType.CHARGE_SHUTTLE_RUN_COMPLETE.sts);//小车到达充电桩
            wrkMast.setModiTime(new Date());
            wrkMastService.updateById(wrkMast);
            return false;
        }
        return true;
    }
    //小车开始充电
    private synchronized boolean executeShuttleChargeStepStartCharge(WrkMast wrkMast) {
        if (wrkMast.getWrkSts() == WrkStsType.CHARGE_SHUTTLE_RUN_COMPLETE.sts) {
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
            if (shuttleThread == null) {
                return false;
            }
            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
            if (shuttleProtocol == null) {
                return false;
            }
            //小车已经在充电桩位置,下发充电命令
            ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo());//四向穿梭车号
            assignCommand.setTaskNo(wrkMast.getWrkNo());//任务号
            assignCommand.setTaskMode(ShuttleTaskModeType.CHARGE_ON.id);//充电开
            assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//源库位(小车当前位置)
            List<ShuttleCommand> commands = shuttleOperaUtils.getShuttleChargeCommand(assignCommand, shuttleThread, true);
            assignCommand.setCommands(commands);//运行命令
            wrkMast.setWrkSts(WrkStsType.CHARGE_SHUTTLE_START_CHARGING.sts);
            wrkMast.setModiTime(new Date());
            if (!wrkMastService.updateById(wrkMast)) {
                return false;
            }
            //下发任务
            shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand);
            notifyUtils.notify(String.valueOf(SlaveType.Shuttle), shuttleProtocol.getShuttleNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.SHUTTLE_POWER_START);//触发通知
            return false;
        }
        return true;
    }
    //小车停止充电
    private synchronized boolean executeShuttleChargeStepStopCharge(WrkMast wrkMast) {
        if (wrkMast.getWrkSts() == WrkStsType.CHARGE_SHUTTLE_CHARGING.sts) {
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
            if (shuttleThread == null) {
                return false;
            }
            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
            if (shuttleProtocol == null) {
                return false;
            }
            boolean stopCharge = false;
            if (wrkMast.getMemo().equals("suggestChargeTaskStop")) {
                stopCharge = true;
            }else {
                if (shuttleThread.isChargingCompleted()) {
                    stopCharge = true;
                }
            }
            if (!stopCharge) {
                return false;
            }
            Object limitObj = redisUtil.get(RedisKeyType.TASK_RUN_LIMIT.key + wrkMast.getWrkNo());
            if (limitObj != null) {
                return false;
            }
            //小车已经在充电桩位置,下发停止充电命令
            ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo());//四向穿梭车号
            assignCommand.setTaskNo(wrkMast.getWrkNo());//任务号
            assignCommand.setTaskMode(ShuttleTaskModeType.CHARGE_OFF.id);//充电关
            assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//源库位(小车当前位置)
            List<ShuttleCommand> commands = shuttleOperaUtils.getShuttleChargeCommand(assignCommand, shuttleThread, false);
            assignCommand.setCommands(commands);//运行命令
            //下发任务
            shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand);
            redisUtil.set(RedisKeyType.TASK_RUN_LIMIT.key + wrkMast.getWrkNo(), "limit", 10);
            return false;
        }
        return true;
    }
    //小车离开充电桩
    private synchronized boolean executeShuttleChargeStepLeaveCharge(WrkMast wrkMast) {
        if (wrkMast.getWrkSts() == WrkStsType.CHARGE_SHUTTLE_CHARGING_COMPLETE.sts) {
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
            if (shuttleThread == null) {
                return false;
            }
            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
            if (shuttleProtocol == null) {
                return false;
            }
            BasShuttleCharge basShuttleCharge = basShuttleChargeService.selectOne(new EntityWrapper<BasShuttleCharge>().eq("charge_id", wrkMast.getMk()));
            if(basShuttleCharge == null) {
                return false;
            }
            //检测障碍物车
            int checkObstacle = shuttleOperaUtils.checkObstacle(basShuttleCharge.getWaitLocNo(), new ArrayList<Integer>() {{
                add(shuttleProtocol.getShuttleNo());
            }}, new ArrayList<>());
            if (checkObstacle > 0) {
                News.info("{}任务,避障范围有小车,等待障碍小车调离中", wrkMast.getWrkNo());
                return false;
            }
            //调度小车去待机位
            boolean dispatched = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), basShuttleCharge.getWaitLocNo(), wrkMast.getShuttleNo());
            if (!dispatched) {
                return false;
            }
            wrkMast.setWrkSts(WrkStsType.COMPLETE_CHARGE.sts);
            wrkMast.setModiTime(new Date());
            if (wrkMastService.updateById(wrkMast)) {
                return false;
            }
            return false;
        }
        return true;
    }
    /**
     * æ‰§è¡Œå°è½¦ç§»åº“任务
     */
    public synchronized void shuttleMoveExecute() {
        try {
            //查询小车移库任务
            List<WrkMast> wrkMasts = wrkMastService.selectShuttleMoveWrk();
            for (WrkMast wrkMast : wrkMasts) {
                boolean stepMoveNearby = this.shuttleMoveExecuteStepMoveNearby(wrkMast);//小车移动到近点
                if (!stepMoveNearby) {
                    continue;
                }
                boolean stepMoveInLift = this.shuttleMoveExecuteStepMoveInLift(wrkMast);//小车迁入提升机中
                if (!stepMoveInLift) {
                    continue;
                }
                boolean stepLiftMove = this.shuttleMoveExecuteStepLiftMove(wrkMast);//提升机搬运中
                if (!stepLiftMove) {
                    continue;
                }
                boolean updateShuttleLocation = this.shuttleMoveExecuteStepUpdateShuttleLocation(wrkMast);//提升机搬运完成更新小车坐标
                if (!updateShuttleLocation) {
                    continue;
                }
                boolean stepMoveLoc = this.shuttleMoveExecuteStepMoveLoc(wrkMast);//小车移动到目标库位中
                if (!stepMoveLoc) {
                    continue;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * å°è½¦è¿ç§»-小车移动到近点中
     * å¦‚需主方法执行continue,请返回false
     * ps:返回值true并不代表该方法执行成功,返回值仅做标记用于主方法是否执行continue
     */
    private boolean shuttleMoveExecuteStepMoveNearby(WrkMast wrkMast) {
        //--------------------------------------小车移动到近点中-----------------------------------------//
        Date now = new Date();
        //小车移动到近点  301.生成小车移库任务 ==> 302.小车移动至站点中
        if (wrkMast.getWrkSts() == WrkStsType.NEW_MOVE.sts) {
            //获取四向穿梭车线程
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
            if (shuttleThread == null) {
                return false;
            }
            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
            if (shuttleProtocol == null) {
                return false;
            }
            //小车处于空闲状态
            if (!shuttleThread.isIdle()) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车,小车忙碌中", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                return false;
            }
            if (Utils.getLev(wrkMast.getLocNo()) == Utils.getLev(shuttleProtocol.getCurrentLocNo())) {
                //目标库位和小车库位处于同一楼层,不需要通过提升机调度
                wrkMast.setWrkSts(WrkStsType.MOVE_OUT_LIFT_COMPLETE.sts);// 309.小车迁出提升机完成 ==> 310.小车移动中
                wrkMast.setModiTime(now);
                if (wrkMastService.updateById(wrkMast)) {
                    //下发任务
                    return true;//直接进入309.小车迁出提升机完成 ==> 310.小车移动中
                }
                return false;
            }
            //搜索最近且无故障提升机
            LiftStaProtocol recentLiftStation = liftDispatchUtils.getRecentLiftStation(shuttleProtocol.getShuttleNo(), Utils.getLev(shuttleProtocol.getCurrentLocNo()));
            if(recentLiftStation == null) {
                News.info("{}号小车,{}目标库位,没有可用空闲输送站点", shuttleProtocol.getShuttleNo(), wrkMast.getLocNo());
                return false;
            }
            LiftStaProtocol targetLiftSta = LiftUtils.getLiftStaByLev(recentLiftStation.getLiftNo(), Utils.getLev(wrkMast.getLocNo()));
            if(targetLiftSta == null) {
                return false;
            }
            //计算近点位置
            String endLocation = navigateUtils.calcEndLocation(shuttleProtocol.getCurrentLocNo(), recentLiftStation.getLocNo(), NavigationMapType.getMapTypes(NavigationMapType.NORMAL), null, null, 1);
            if (endLocation == null) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,小车近点位置计算失败", wrkMast.getWrkNo());
                return false;
            }
            //小车已在近点位置无需前往
            if (shuttleProtocol.getCurrentLocNo().equals(endLocation)) {
                wrkMast.setWrkSts(WrkStsType.MOVE_NEARBY_COMPLETE.sts);//小车移动到提升机中  301.生成小车移库任务 ==> 303.小车移动至近点完成
                wrkMast.setSourceStaNo(recentLiftStation.getSiteId());
                wrkMast.setStaNo(targetLiftSta.getSiteId());
                wrkMast.setModiTime(now);
                wrkMast.setSystemMsg("");//清空消息
                wrkMastService.updateById(wrkMast);
                return true;
            }
            ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); // å››å‘穿梭车编号
            assignCommand.setTaskMode(ShuttleTaskModeType.MOVE_LOC_NO.id);//小车移库任务
            assignCommand.setTaskNo(wrkMast.getWrkNo());//任务号
            assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//源库位
            assignCommand.setLocNo(endLocation);
            assignCommand.setAuto(true);//自动模式
            //获取小车到近点行走命令
            List<ShuttleCommand> commands = shuttleOperaUtils.getStartToTargetCommands(shuttleProtocol.getCurrentLocNo(), endLocation, NavigationMapType.getMapTypes(NavigationMapType.NORMAL, NavigationMapType.SHUTTLE), assignCommand, shuttleThread);
            if (commands == null) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车,路径计算失败", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                return false;//路径解锁失败
            }
            assignCommand.setCommands(commands);
            wrkMast.setWrkSts(WrkStsType.MOVE_NEARBY.sts);//小车移动到提升机中  301.生成小车移库任务 ==> 302.小车移动至近点中
            wrkMast.setSourceStaNo(recentLiftStation.getSiteId());
            wrkMast.setStaNo(targetLiftSta.getSiteId());
            wrkMast.setModiTime(now);
            wrkMast.setSystemMsg("");//清空消息
            if (wrkMastService.updateById(wrkMast)) {
                //下发任务
                shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand);
                notifyUtils.notify(String.valueOf(SlaveType.Shuttle), shuttleProtocol.getShuttleNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.SHUTTLE_MOVING);
                //触发通知
                return false;
            }
            return false;
        }
        return true;
    }
    /**
     * å°è½¦è¿ç§»-小车迁入提升机中
     * å¦‚需主方法执行continue,请返回false
     * ps:返回值true并不代表该方法执行成功,返回值仅做标记用于主方法是否执行continue
     */
    private boolean shuttleMoveExecuteStepMoveInLift(WrkMast wrkMast) {
        //--------------------------------------小车迁入提升机中-----------------------------------------//
        Date now = new Date();
        //小车迁入提升机  303.小车移动至近点完成 ==> 304.小车迁入提升机中
        if (wrkMast.getWrkSts() == WrkStsType.MOVE_NEARBY_COMPLETE.sts) {
            //获取四向穿梭车线程
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
            if (shuttleThread == null) {
                return false;
            }
            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
            if (shuttleProtocol == null) {
                return false;
            }
            //小车处于空闲状态
            if (!shuttleThread.isIdle()) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车,小车忙碌中", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                return false;
            }
            //获取源输送站
            LiftStaProtocol liftSta = LiftUtils.getLiftStaByStaNo(wrkMast.getSourceStaNo());
            if (liftSta == null) {
                return false;//找不到站点
            }
            if (liftSta.getHasCar()) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,源站存在小车", wrkMast.getWrkNo());
                return false;
            }
            //获取目标输送站
            LiftStaProtocol liftStaTarget = LiftUtils.getLiftStaByStaNo(wrkMast.getStaNo());
            if (liftStaTarget == null) {
                return false;//找不到站点
            }
            if (liftStaTarget.getHasCar()) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,目标站存在小车", wrkMast.getWrkNo());
                return false;
            }
            if (wrkMast.getLiftNo() == null) {
                //申请提升机资源
                boolean applyLift = liftAction.applyLift(liftSta.getLiftNo(), wrkMast.getWrkNo());
                if(!applyLift) {
                    News.taskInfo(wrkMast.getWrkNo(), "{}任务,申请提升机资源失败,禁止移动", wrkMast.getWrkNo());
                    return false;
                }
                return false;
            }
            LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, wrkMast.getLiftNo());
            if (liftThread == null) {
                return false;
            }
            LiftProtocol liftProtocol = liftThread.getStatus();
            if (liftProtocol == null) {
                return false;
            }
            if (!liftThread.isIdle()) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}号提升机,提升机忙碌中,禁止派发", wrkMast.getWrkNo(), wrkMast.getLiftNo());
                return false;
            }
            Object object = redisUtil.get(RedisKeyType.LIFT_MOVE_TO_SHUTTLE_LIMIT.key + wrkMast.getWrkNo());
            int targetLev = Utils.getLev(shuttleProtocol.getCurrentLocNo());
            if (object == null || liftProtocol.getLev() != targetLev) {
                //获取提升机命令
                LiftStaProtocol startSta = LiftUtils.getLiftStaByLev(liftProtocol.getLiftNo(), liftProtocol.getLev());
                LiftStaProtocol targetSta = LiftUtils.getLiftStaByLev(liftProtocol.getLiftNo(), targetLev);
                if (startSta == null || targetSta == null) {
                    News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}号提升机,站点数据不存在", wrkMast.getWrkNo(), wrkMast.getLiftNo());
                    return false;
                }
                LiftCommand liftCommand = liftThread.getMoveCommand(commonService.getWorkNo(WrkIoType.PREVIEW_LIFT_MOVE.id), startSta.getSiteId(), targetSta.getSiteId());
                ArrayList<LiftCommand> commands = new ArrayList<>();
                commands.add(liftCommand);
                //提交到线程去工作
                LiftAssignCommand assignCommand = new LiftAssignCommand();
                assignCommand.setCommands(commands);
                assignCommand.setLiftNo(wrkMast.getLiftNo());
                assignCommand.setTaskNo(wrkMast.getWrkNo());
                assignCommand.setTaskMode(LiftTaskModeType.MOVE.id);
                //下发任务
                liftAction.assignWork(wrkMast.getLiftNo(), assignCommand);
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}号提升机在{}层,提升机不在小车层,调度移动中", wrkMast.getWrkNo(), liftProtocol.getLev(), wrkMast.getLiftNo());
                redisUtil.set(RedisKeyType.LIFT_MOVE_TO_SHUTTLE_LIMIT.key + wrkMast.getWrkNo(), "lift_moving", 60 * 3);
                redisUtil.set(RedisKeyType.TASK_RUN_LIMIT.key + wrkMast.getWrkNo(), "lock", 8);
                return false;
            }
            Object limitObj = redisUtil.get(RedisKeyType.TASK_RUN_LIMIT.key + wrkMast.getWrkNo());
            if (limitObj != null) {
                return false;
            }
            String liftLocNo = liftThread.getCurrentLocNo();
            ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); // å››å‘穿梭车编号
            assignCommand.setTaskMode(ShuttleTaskModeType.MOVE_LOC_NO.id);//小车移库任务
            assignCommand.setTaskNo(wrkMast.getWrkNo());//任务号
            assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//源库位
            assignCommand.setLocNo(liftLocNo);
            assignCommand.setAuto(true);//自动模式
            //获取小车到提升机行走命令
            List<ShuttleCommand> commands = shuttleOperaUtils.getStartToTargetCommands(shuttleProtocol.getCurrentLocNo(), liftLocNo, NavigationMapType.getMapTypes(NavigationMapType.NORMAL), assignCommand, shuttleThread, "inLift");
            if (commands == null) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车,路径计算失败", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                return false;//路径解锁失败
            }
            assignCommand.setCommands(commands);
            wrkMast.setWrkSts(WrkStsType.MOVE_IN_LIFT.sts);//303.小车移动至近点完成 ==> 304.小车迁入提升机中
            wrkMast.setModiTime(now);
            wrkMast.setSystemMsg("");//清空消息
            if (wrkMastService.updateById(wrkMast)) {
                //下发任务
                shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand);
                notifyUtils.notify(String.valueOf(SlaveType.Shuttle), shuttleProtocol.getShuttleNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.SHUTTLE_MOVING);
                //触发通知
                return false;
            }
            return false;
        }
        return true;
    }
    /**
     * å°è½¦è¿ç§»-提升机搬运中
     * å¦‚需主方法执行continue,请返回false
     * ps:返回值true并不代表该方法执行成功,返回值仅做标记用于主方法是否执行continue
     */
    private boolean shuttleMoveExecuteStepLiftMove(WrkMast wrkMast) {
        //--------------------------------------提升机搬运中-----------------------------------------//
        Date now = new Date();
        //提升机搬运中  305.小车迁入提升机完成 ==> 306.提升机搬运中
        if (wrkMast.getWrkSts() == WrkStsType.MOVE_IN_LIFT_COMPLETE.sts) {
            LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, wrkMast.getLiftNo());
            if (liftThread == null) {
                return false;
            }
            LiftProtocol liftProtocol = liftThread.getStatus();
            if (liftProtocol == null) {
                return false;
            }
            if (!liftThread.isIdle()) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}号提升机,提升机忙碌中,禁止派发", wrkMast.getWrkNo(), wrkMast.getLiftNo());
                return false;
            }
            //获取源站
            LiftStaProtocol sourceLiftSta = LiftUtils.getLiftStaByStaNo(wrkMast.getSourceStaNo());
            //获取目标站
            LiftStaProtocol liftSta = LiftUtils.getLiftStaByStaNo(wrkMast.getStaNo());
            if (sourceLiftSta == null || liftSta == null) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,缺少站点信息,禁止派发", wrkMast.getWrkNo());
                return false;//缺少站点信息
            }
            if (liftSta.getHasCar()) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,目标站存在小车,禁止派发", wrkMast.getWrkNo());
                return false;//有托盘跳过
            }
            //获取提升机命令
            LiftCommand liftCommand = liftThread.getShuttleSwitchCommand(wrkMast.getWrkNo(), sourceLiftSta.getSiteId(), liftSta.getSiteId());
            ArrayList<LiftCommand> commands = new ArrayList<>();
            commands.add(liftCommand);
            //提交到线程去工作
            LiftAssignCommand assignCommand = new LiftAssignCommand();
            assignCommand.setCommands(commands);
            assignCommand.setLiftNo(wrkMast.getLiftNo());
            assignCommand.setTaskNo(wrkMast.getWrkNo());
            assignCommand.setTaskMode(LiftTaskModeType.SHUTTLE_SWITCH.id);
            wrkMast.setWrkSts(WrkStsType.MOVE_LIFT_RUN.sts);//提升机搬运中  305.小车迁入提升机完成 ==> 306.提升机搬运中
            wrkMast.setSystemMsg("");//清空消息
            wrkMast.setModiTime(now);
            if (wrkMastService.updateById(wrkMast)) {
                //下发任务
                liftAction.assignWork(wrkMast.getLiftNo(), assignCommand);
            }
        }
        return true;
    }
    /**
     * å°è½¦è¿ç§»-提升机搬运完成更新小车坐标
     * å¦‚需主方法执行continue,请返回false
     * ps:返回值true并不代表该方法执行成功,返回值仅做标记用于主方法是否执行continue
     */
    private boolean shuttleMoveExecuteStepUpdateShuttleLocation(WrkMast wrkMast) {
        //--------------------------------------提升机搬运中-----------------------------------------//
        Date now = new Date();
        //提升机搬运中  307.提升机搬运完成 ==> 308.小车迁出提升机中
        if (wrkMast.getWrkSts() == WrkStsType.MOVE_LIFT_RUN_COMPLETE.sts) {
            //获取四向穿梭车线程
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
            if (shuttleThread == null) {
                return false;
            }
            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
            if (shuttleProtocol == null) {
                return false;
            }
            //小车处于空闲状态
            if (!shuttleThread.isIdle()) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车,小车忙碌中,禁止派发", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                return false;
            }
            if (Utils.getLev(shuttleProtocol.getCurrentLocNo()) != Utils.getLev(wrkMast.getLocNo())) {
                Object object = redisUtil.get(RedisKeyType.SHUTTLE_UPDATE_LOCATION.key + shuttleProtocol.getShuttleNo());
                if(object != null) {
                    return false;
                }
                ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
                assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); // å››å‘穿梭车编号
                assignCommand.setTaskMode(ShuttleTaskModeType.UPDATE_LOCATION.id);//更新坐标
                assignCommand.setTaskNo(wrkMast.getWrkNo());//任务号
                assignCommand.setAuto(true);//自动模式
                assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//源库位
                assignCommand.setLocNo(wrkMast.getLocNo());//目标库位
                //更新小车坐标
                ShuttleCommand command = shuttleThread.getUpdateLocationCommand(wrkMast.getWrkNo(), wrkMast.getLocNo());
                ArrayList<ShuttleCommand> commands = new ArrayList<>();
                commands.add(command);
                assignCommand.setCommands(commands);
                //下发任务
                shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand);
                redisUtil.set(RedisKeyType.SHUTTLE_UPDATE_LOCATION.key + shuttleProtocol.getShuttleNo(), "update", 10);
                return false;
            }
            //小车出提升机近点距离
            int shuttleOutLiftLocationDistance = 2;
            Config shuttleOutLiftLocationDistanceConfig = configService.selectOne(new EntityWrapper<Config>().eq("code", "shuttleOutLiftLocationDistance"));
            if (shuttleOutLiftLocationDistanceConfig != null) {
                shuttleOutLiftLocationDistance = Integer.parseInt(shuttleOutLiftLocationDistanceConfig.getValue());
            }
            String targetLocNo = navigateUtils.calcFirstLocation(shuttleProtocol.getCurrentLocNo(), wrkMast.getLocNo(), NavigationMapType.getMapTypes(NavigationMapType.NORMAL), null, null, shuttleOutLiftLocationDistance);
            if (targetLocNo == null) {//出提升机近点计算失败
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车,出提升机近点计算失败", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                return false;
            }
            ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); // å››å‘穿梭车编号
            assignCommand.setTaskMode(ShuttleTaskModeType.MOVE_LOC_NO.id);//小车移库任务
            assignCommand.setTaskNo(wrkMast.getWrkNo());//任务号
            assignCommand.setAuto(true);//自动模式
            assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//源库位
            assignCommand.setLocNo(targetLocNo);//目标库位
            //获取小车到近点命令
            List<ShuttleCommand> commands = shuttleOperaUtils.getStartToTargetCommands(shuttleProtocol.getCurrentLocNo(), targetLocNo, NavigationMapType.getMapTypes(NavigationMapType.NORMAL), assignCommand, shuttleThread);
            if (commands == null) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车,路径计算失败", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                return false;//路径计算失败
            }
            assignCommand.setCommands(commands);
            wrkMast.setWrkSts(WrkStsType.MOVE_OUT_LIFT.sts);//小车迁出提升机中
            wrkMast.setSystemMsg("");//清空消息
            wrkMast.setModiTime(now);
            if (wrkMastService.updateById(wrkMast)) {
                //下发任务
                shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand);
            }
        }
        return true;
    }
    /**
     * å°è½¦è¿ç§»-小车移动到目标库位中
     * å¦‚需主方法执行continue,请返回false
     * ps:返回值true并不代表该方法执行成功,返回值仅做标记用于主方法是否执行continue
     */
    private boolean shuttleMoveExecuteStepMoveLoc(WrkMast wrkMast) {
        //--------------------------------------小车移动到目标库位中-----------------------------------------//
        Date now = new Date();
        //小车移动到目标库位中  309.小车迁出提升机完成 ==> 310.小车移动中
        if (wrkMast.getWrkSts() == WrkStsType.MOVE_OUT_LIFT_COMPLETE.sts) {
            //获取四向穿梭车线程
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
            if (shuttleThread == null) {
                return false;
            }
            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
            if (shuttleProtocol == null) {
                return false;
            }
            //小车处于空闲状态
            if (!shuttleThread.isIdle()) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车,小车忙碌中,禁止派发", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                return false;
            }
            //小车已经在目标库位,直接认定小车移动任务完成
            if (shuttleProtocol.getCurrentLocNo().equals(wrkMast.getLocNo())) {
                wrkMast.setWrkSts(WrkStsType.COMPLETE_MOVE.sts);//311.小车移动完成
                wrkMast.setLiftNo(null);//释放提升机
                wrkMast.setModiTime(now);
                wrkMastService.updateById(wrkMast);
                return false;
            }
            ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); // å››å‘穿梭车编号
            assignCommand.setTaskMode(ShuttleTaskModeType.MOVE_LOC_NO.id);//小车移库任务
            assignCommand.setTaskNo(wrkMast.getWrkNo());//任务号
            assignCommand.setAuto(true);//自动模式
            assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//源库位
            assignCommand.setLocNo(wrkMast.getLocNo());//目标库位
            //获取小车到目标库位命令
            List<ShuttleCommand> commands = shuttleOperaUtils.getStartToTargetCommands(shuttleProtocol.getCurrentLocNo(), wrkMast.getLocNo(), NavigationMapType.getMapTypes(NavigationMapType.NORMAL), assignCommand, shuttleThread);
            if (commands == null) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车,路径计算失败", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                return false;//路径计算失败
            }
            assignCommand.setCommands(commands);
            wrkMast.setWrkSts(WrkStsType.MOVE_SHUTTLE.sts);//小车移动到目标库位中  309.小车迁出提升机完成 ==> 310.小车移动中
            wrkMast.setLiftNo(null);//释放提升机
            wrkMast.setSystemMsg("");//清空消息
            wrkMast.setModiTime(now);
            if (wrkMastService.updateById(wrkMast)) {
                //下发任务
                shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand);
            }
        }
        return true;
    }
    //自动切换出入库模式
    public void autoSwitchLiftIOMode() {
        List<DeviceConfig> liftList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.Lift)));
        for (DeviceConfig device : liftList) {
            Integer liftNo = device.getDeviceNo();
            LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, liftNo);
            if (liftThread == null) {
                continue;
            }
            LiftProtocol liftProtocol = liftThread.getStatus();
            if (liftProtocol == null) {
                continue;
            }
            List<Integer> liftAllStaNo = LiftUtils.getLiftAllStaNo(liftNo);
            if (liftAllStaNo.isEmpty()) {
                continue;
            }
            List<Integer> conveyorBindLiftAllStaNo = LiftUtils.getConveyorBindLiftAllStaNo(liftNo);
            if (conveyorBindLiftAllStaNo.isEmpty()) {
                continue;
            }
            //获取入库任务
            List<WrkMast> inWrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                    .in("sta_no", liftAllStaNo)
                    .in("wrk_sts"
                            , WrkStsType.NEW_INBOUND.sts
                            , WrkStsType.INBOUND_DEVICE_RUN.sts
                            , WrkStsType.INBOUND_LIFT_RUN.sts
                            , WrkStsType.INBOUND_LIFT_RUN_COMPLETE.sts
                            , WrkStsType.INBOUND_SHUTTLE_RUN.sts
                            , WrkStsType.INBOUND_SHUTTLE_RUN_COMPLETE.sts
                    ));
            //获取出库任务
            List<WrkMast> outWrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                    .in("sta_no", conveyorBindLiftAllStaNo)
                    .in("wrk_sts"
                            , WrkStsType.NEW_OUTBOUND.sts
                            , WrkStsType.OUTBOUND_SHUTTLE_RUN.sts
                            , WrkStsType.OUTBOUND_SHUTTLE_RUN_COMPLETE.sts
                            , WrkStsType.OUTBOUND_LIFT_RUN.sts
                            , WrkStsType.OUTBOUND_LIFT_RUN_COMPLETE.sts
                    ));
            if (liftProtocol.getIOModeType().equals(LiftIoModeType.NONE)) {
                //未知模式
                if (!inWrkMasts.isEmpty()) {
                    liftThread.switchIOMode(LiftIoModeType.IN);
                } else if (!outWrkMasts.isEmpty()) {
                    liftThread.switchIOMode(LiftIoModeType.OUT);
                }else {
                    liftThread.switchIOMode(LiftIoModeType.IN);
                }
            } else if (liftProtocol.getIOModeType().equals(LiftIoModeType.IN)) {
                //入库模式
                if (inWrkMasts.isEmpty() && !outWrkMasts.isEmpty()) {
                    liftThread.switchIOMode(LiftIoModeType.OUT);
                }
            } else if (liftProtocol.getIOModeType().equals(LiftIoModeType.OUT)) {
                //出库模式
                if (outWrkMasts.isEmpty() && !inWrkMasts.isEmpty()) {
                    liftThread.switchIOMode(LiftIoModeType.IN);
                }
            }
        }
    }
}
src/main/java/com/zy/asrs/task/NotifyScheduler.java
@@ -39,19 +39,19 @@
    @Scheduled(cron = "0/3 * * * * ? ")
    public synchronized void notifyShuttle(){
        List<DeviceConfig> shuttleList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.Shuttle)));
        for (DeviceConfig device : shuttleList) {
            notifyMsg(String.valueOf(SlaveType.Shuttle), device.getDeviceNo());
        List<DeviceConfig> deviceList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.Crn)));
        for (DeviceConfig device : deviceList) {
            notifyMsg(String.valueOf(SlaveType.Crn), device.getDeviceNo());
        }
    }
    @Scheduled(cron = "0/3 * * * * ? ")
    public synchronized void notifyForkLift(){
        List<DeviceConfig> forkLiftList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.ForkLift)));
        for (DeviceConfig device : forkLiftList) {
            notifyMsg(String.valueOf(SlaveType.ForkLift), device.getDeviceNo());
        List<DeviceConfig> deviceList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.Rgv)));
        for (DeviceConfig device : deviceList) {
            notifyMsg(String.valueOf(SlaveType.Rgv), device.getDeviceNo());
        }
    }
src/main/java/com/zy/asrs/task/ShuttleChargePowerScheduler.java
File was deleted
src/main/java/com/zy/asrs/task/ShuttlePowerEarlyWarning.java
File was deleted
src/main/java/com/zy/asrs/task/main/ShuttleTaskExecuteScheduler.java
File was deleted
src/main/java/com/zy/asrs/utils/NotifyUtils.java
@@ -1,6 +1,5 @@
package com.zy.asrs.utils;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.SnowflakeIdWorker;
import com.zy.asrs.domain.NotifyDto;
@@ -55,10 +54,12 @@
    public String getKey(String notifyType, Integer device) {
        String key = null;
        if (notifyType.equals(String.valueOf(SlaveType.Shuttle))) {
            key = RedisKeyType.QUEUE_SHUTTLE.key + device;
        } else if (notifyType.equals(String.valueOf(SlaveType.ForkLift))) {
            key = RedisKeyType.QUEUE_FORK_LIFT.key + device;
        if (notifyType.equals(String.valueOf(SlaveType.Crn))) {
            key = RedisKeyType.QUEUE_CRN.key + device;
        } else if (notifyType.equals(String.valueOf(SlaveType.Devp))) {
            key = RedisKeyType.QUEUE_DEVP.key + device;
        } else if (notifyType.equals(String.valueOf(SlaveType.Rgv))) {
            key = RedisKeyType.QUEUE_RGV.key + device;
        } else if (notifyType.equals("task")) {
            key = RedisKeyType.QUEUE_TASK.key + device;
        } else {
src/main/java/com/zy/asrs/utils/ShuttleTaskUtils.java
File was deleted
src/main/java/com/zy/asrs/utils/Utils.java
@@ -2,26 +2,9 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Arith;
import com.core.common.Cools;
import com.core.common.SpringUtils;
import com.zy.asrs.entity.DeviceConfig;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.service.DeviceConfigService;
import com.zy.asrs.service.LocMastService;
import com.zy.asrs.service.WrkMastService;
import com.zy.common.model.NavigateNode;
import com.zy.common.model.enums.NavigationMapType;
import com.zy.common.utils.NavigatePositionConvert;
import com.zy.common.utils.NavigateUtils;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.protocol.ShuttleProtocol;
import com.zy.core.thread.ShuttleThread;
import java.text.DecimalFormat;
import java.util.*;
public class Utils {
@@ -80,220 +63,6 @@
    public static String getLocNo(Number row, Number bay, Number lev) {
        return zerofill(String.valueOf(row), 2) + zerofill(String.valueOf(bay), 3) + zerofill(String.valueOf(lev), 2);
    }
    public static List<String> getGroupLoc(String locNo) {
        return null;
    }
    //获取穿梭车xy坐标点
    public static int[] getShuttlePoint(Integer shuttleNo) {
        //获取穿梭车所在节点位置
        ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleNo);
        if (shuttleThread == null) {
            return null;
        }
        ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
        if (shuttleProtocol == null) {
            return null;
        }
        String currentLocNo = shuttleProtocol.getCurrentLocNo();
        if (currentLocNo == null) {
            return null;
        }
        if (shuttleProtocol.getCurrentLocNo() == null) {
            return null;
        }
        return NavigatePositionConvert.positionToXY(shuttleProtocol.getCurrentLocNo());
    }
    //获取除白名单外的指定楼层全部穿梭车xy坐标点
    public static List<int[]> getShuttlePoints(Integer whiteShuttle, Integer lev) {
        DeviceConfigService deviceConfigService = SpringUtils.getBean(DeviceConfigService.class);
        ArrayList<int[]> list = new ArrayList<>();
        List<DeviceConfig> shuttleList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.Shuttle)));
        for (DeviceConfig device : shuttleList) {
            if (device.getDeviceNo().intValue() == whiteShuttle) {
                continue;//跳过白名单
            }
            //获取穿梭车所在节点位置
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getDeviceNo());
            if (shuttleThread == null) {
                continue;
            }
            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
            if (shuttleProtocol == null) {
                continue;
            }
            String currentLocNo = shuttleProtocol.getCurrentLocNo();
            if (currentLocNo == null) {
                continue;
            }
            if (lev != Utils.getLev(currentLocNo)) {
                continue;//楼层不同
            }
            if (shuttleProtocol.getCurrentLocNo() == null) {
                continue;
            }
            int[] xyPosition = NavigatePositionConvert.positionToXY(shuttleProtocol.getCurrentLocNo());//通过库位号获取xy坐标
            list.add(xyPosition);
        }
        return list;
    }
    public static ShuttleThread searchShuttle(String locNo) {
        DeviceConfigService deviceConfigService = SpringUtils.getBean(DeviceConfigService.class);
        List<DeviceConfig> shuttleList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.Shuttle)));
        for (DeviceConfig device : shuttleList) {
            //获取穿梭车所在节点位置
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getDeviceNo());
            if (shuttleThread == null) {
                continue;
            }
            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
            if (shuttleProtocol == null) {
                continue;
            }
            String currentLocNo = shuttleProtocol.getCurrentLocNo();
            if (currentLocNo == null) {
                continue;
            }
            if (currentLocNo.equals(locNo)) {
                return shuttleThread;
            }
        }
        return null;
    }
    //检测楼层是否有可用穿梭车
    public static boolean checkLevHasShuttle(Integer lev) {
        DeviceConfigService deviceConfigService = SpringUtils.getBean(DeviceConfigService.class);
        WrkMastService wrkMastService = SpringUtils.getBean(WrkMastService.class);
        List<DeviceConfig> shuttleList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.Shuttle)));
        for (DeviceConfig device : shuttleList) {
            //获取四向穿梭车线程
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getDeviceNo());
            if (shuttleThread == null) {
                continue;
            }
            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
            if (shuttleProtocol == null) {
                continue;
            }
            String currentLocNo = shuttleProtocol.getCurrentLocNo();
            if (currentLocNo == null) {
                continue;
            }
            //小车正在充电
            if (shuttleThread.isCharging()) {
                continue;
            }
            //小车有充电任务
            WrkMast chargeWorking = wrkMastService.selectChargeWorking(shuttleProtocol.getShuttleNo());
            if (chargeWorking != null) {//已有充电任务
                continue;
            }
            //小车处于故障状态
            if (shuttleThread.isFault()) {
                continue;
            }
            if (lev == Utils.getLev(currentLocNo)) {
                return true;//指定楼层有穿梭车
            }
        }
        return false;//指定楼层没有穿梭车
    }
    //检测库位组是否存在小车,存在返回小车号。
    public static Integer checkGroupLocHasShuttle(List<String> groupLoc) {
        if (groupLoc == null) {
            return null;
        }
        if (groupLoc.isEmpty()) {
            return null;
        }
        DeviceConfigService deviceConfigService = SpringUtils.getBean(DeviceConfigService.class);
        if (deviceConfigService == null) {
            return null;
        }
        List<DeviceConfig> shuttleList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.Shuttle)));
        for (String loc : groupLoc) {
            for (DeviceConfig device : shuttleList) {
                ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getDeviceNo());
                if (shuttleThread == null) {
                    continue;
                }
                ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
                if (shuttleProtocol == null) {
                    continue;
                }
                if (shuttleProtocol.getCurrentLocNo() == null) {
                    continue;
                }
                if (shuttleProtocol.getCurrentLocNo().equals(loc)) {
                    //存在小车
                    return device.getDeviceNo();
                }
            }
        }
        return null;
    }
    //获取小车待机位
    public static String getShuttleStandbyLocNo(String locNo) {
        LocMastService locMastService = SpringUtils.getBean(LocMastService.class);
        NavigateUtils navigateUtils = SpringUtils.getBean(NavigateUtils.class);
        List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
                .eq("loc_type", "standby")
                .eq("lev1", Utils.getLev(locNo)));
        if (locMasts.isEmpty()) {
            return null;
        }
        Integer recentDistance = Integer.MAX_VALUE;
        String recentLocNo = null;
        for (LocMast locMast : locMasts) {
            //待机位到目标点距离
            List<NavigateNode> currentShuttlePath = navigateUtils.calc(locNo, locMast.getLocNo(), NavigationMapType.getMapTypes(NavigationMapType.NORMAL), Utils.getShuttlePoints(0, Utils.getLev(locNo)), null);//搜索空闲穿梭车,使用正常通道地图
            if (currentShuttlePath == null) {
                continue;
            }
            Integer currentAllDistance = navigateUtils.getOriginPathAllDistance(currentShuttlePath);//计算当前路径行走总距离
            if (currentAllDistance < recentDistance) {
                recentDistance = currentAllDistance;
                recentLocNo = locMast.getLocNo();
            }
        }
        return recentLocNo;
    }
    public static boolean isJSON(String value) {
src/main/java/com/zy/asrs/ws/ConsoleWebSocket.java
@@ -1,13 +1,6 @@
package com.zy.asrs.ws;
import com.alibaba.fastjson.JSON;
import com.core.common.R;
import com.core.common.SpringUtils;
import com.zy.asrs.controller.ConsoleController;
import com.zy.asrs.controller.ForkLiftController;
import com.zy.asrs.controller.LiftController;
import com.zy.asrs.controller.ShuttleController;
import com.zy.common.model.WebSocketMessage;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@@ -71,40 +64,6 @@
     */
    @OnMessage
    public void onMessage(String message, Session session) throws IOException {
        ShuttleController shuttleController = SpringUtils.getBean(ShuttleController.class);
        ForkLiftController forkLiftController = SpringUtils.getBean(ForkLiftController.class);
        LiftController liftController = SpringUtils.getBean(LiftController.class);
        ConsoleController consoleController = SpringUtils.getBean(ConsoleController.class);
        WebSocketMessage socketMessage = JSON.parseObject(message, WebSocketMessage.class);
        if (socketMessage.getUrl().equals("/shuttle/table/shuttle/state")) {
            R result = shuttleController.shuttleStateTable();
            socketMessage.setData(JSON.toJSONString(result));
            this.sendMessage(JSON.toJSONString(socketMessage));
        } else if (socketMessage.getUrl().equals("/forkLift/table/lift/state")) {
            R result = forkLiftController.liftStateTable();
            socketMessage.setData(JSON.toJSONString(result));
            this.sendMessage(JSON.toJSONString(socketMessage));
        } else if (socketMessage.getUrl().equals("/lift/table/lift/state")) {
            R result = liftController.liftStateTable();
            socketMessage.setData(JSON.toJSONString(result));
            this.sendMessage(JSON.toJSONString(socketMessage));
        } else if (socketMessage.getUrl().equals("/console/map/auth")) {
            R result = consoleController.getMapFromRedis(Integer.parseInt(socketMessage.getData()));
            socketMessage.setData(JSON.toJSONString(result));
            this.sendMessage(JSON.toJSONString(socketMessage));
        } else if (socketMessage.getUrl().equals("/console/locMap/auth")) {
            R result = consoleController.getLocMap(Integer.parseInt(socketMessage.getData()));
            socketMessage.setData(JSON.toJSONString(result));
            this.sendMessage(JSON.toJSONString(socketMessage));
        } else if (socketMessage.getUrl().equals("/console/getMoveAdvancePath/auth")) {
            R result = consoleController.getMoveAdvancePath(Integer.parseInt(socketMessage.getData()));
            socketMessage.setData(JSON.toJSONString(result));
            this.sendMessage(JSON.toJSONString(socketMessage));
        } else if (socketMessage.getUrl().equals("/console/getLockPath/auth")) {
            R result = consoleController.getLockPath(Integer.parseInt(socketMessage.getData()));
            socketMessage.setData(JSON.toJSONString(result));
            this.sendMessage(JSON.toJSONString(socketMessage));
        }
//        log.info("收到来自连接:" + sessionId + "的信息:" + message);
    }
src/main/java/com/zy/asrs/ws/ShuttleWebSocket.java
File was deleted
src/main/java/com/zy/common/CodeBuilder.java
@@ -12,10 +12,10 @@
        CoolGenerator generator = new CoolGenerator();
        // mysql
        generator.sqlOsType = SqlOsType.MYSQL;
        generator.url="localhost:3306/shuttle_rcs";
        generator.url="localhost:3306/wcs";
        generator.username="root";
        generator.password="root";
        generator.table="rcs_device_config";
        generator.table="asr_bas_crnp_opt";
        // sqlserver
//        generator.sqlOsType = SqlOsType.SQL_SERVER;
//        generator.url="127.0.0.1:1433;databasename=tzskasrs";
src/main/java/com/zy/common/model/LiftPointModel.java
File was deleted
src/main/java/com/zy/common/model/MatDto.java
File was deleted
src/main/java/com/zy/common/model/NavigateNode.java
File was deleted
src/main/java/com/zy/common/model/SearchLocParam.java
File was deleted
src/main/java/com/zy/common/model/ShuttleOperaResult.java
File was deleted
src/main/java/com/zy/common/utils/ForkLiftUtils.java
File was deleted
src/main/java/com/zy/common/utils/LiftUtils.java
File was deleted
src/main/java/com/zy/common/utils/NavigateMapData.java
File was deleted
src/main/java/com/zy/common/utils/NavigateMapUtils.java
File was deleted
src/main/java/com/zy/common/utils/NavigatePositionConvert.java
File was deleted
src/main/java/com/zy/common/utils/NavigateSolution.java
File was deleted
src/main/java/com/zy/common/utils/NavigateUtils.java
File was deleted
src/main/java/com/zy/common/utils/RobotUtils.java
File was deleted
src/main/java/com/zy/common/utils/ShuttleOperaUtils.java
File was deleted
src/main/java/com/zy/core/MainProcess.java
@@ -1,12 +1,10 @@
package com.zy.core;
import com.zy.asrs.service.impl.ForkMainServiceImpl;
import com.zy.asrs.service.impl.MainServiceImpl;
import com.zy.core.properties.SystemProperties;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PreDestroy;
@@ -20,12 +18,8 @@
@Component
public class MainProcess {
    @Value("${deviceExecuteConfig.liftType}")
    private String liftType;
    @Autowired
    private MainServiceImpl mainService;
    @Autowired
    private ForkMainServiceImpl forkMainService;
    // æ‰€å±žçº¿ç¨‹
    private Thread thread;
    // é¢‘率
@@ -35,14 +29,6 @@
     * =====>>  å¼€å§‹å·¥ä½œ
     */
    public void start(){
        if(liftType.equals("ForkLift")){
            initForkMain();
        }else {
            initMain();
        }
    }
    private void initMain() {
        thread = new Thread(() -> {
            while (!Thread.currentThread().isInterrupted()) {
                try {
@@ -54,84 +40,6 @@
                    if (!SystemProperties.WCS_RUNNING_STATUS.get()) {
                        continue;
                    }
                    //初始化实时地图
                    mainService.initRealtimeBasMap();
                    // å…¥åº“  ===>>  å››å‘穿梭车入库作业下发
                    mainService.shuttleInExecute();
                    // å‡ºåº“  ===>>  å››å‘穿梭车出库作业下发
                    mainService.shuttleOutExecute();
//                    //四向穿梭车任务完成
//                    mainService.shuttleFinished();
                    //执行移库任务
                    mainService.shuttleLocMoveExecute();
                    //提升机任务
                    mainService.liftIoExecute();
                    //提升机任务完成
                    mainService.liftFinished();
                    //执行小车移动任务
                    mainService.shuttleMoveExecute();
                    // å¼‚常信息记录
                    mainService.recErr();
                    // ç©¿æ¢­è½¦ ===>> å°è½¦ç”µé‡æ£€æµ‹å……电
                    mainService.loopShuttleCharge();
                    mainService.executeShuttleCharge();
                    //自动切换出入库模式
                    mainService.autoSwitchLiftIOMode();
                    // é—´éš”
                    Thread.sleep(200);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        thread.start();
    }
    private void initForkMain() {
        thread = new Thread(() -> {
            while (!Thread.currentThread().isInterrupted()) {
                try {
                    // é—´éš”
                    Thread.sleep(300);
                    // ç³»ç»Ÿè¿è¡ŒçŠ¶æ€åˆ¤æ–­
                    if (!SystemProperties.WCS_RUNNING_STATUS.get()) {
                        continue;
                    }
                    //初始化实时地图
                    forkMainService.initRealtimeBasMap();
                    //出库任务预调度提升机
                    forkMainService.outTaskPreviewDispatchForkLift();
                    // å…¥åº“  ===>>  å››å‘穿梭车入库作业下发
                    forkMainService.shuttleInExecute();
                    // å‡ºåº“  ===>>  å››å‘穿梭车出库作业下发
                    forkMainService.shuttleOutExecute();
//                    //四向穿梭车任务完成
//                    mainService.shuttleFinished();
                    //执行移库任务
                    forkMainService.shuttleLocMoveExecute();
                    //货叉提升机任务
                    forkMainService.forkLiftIoExecute();
                    //货叉提升机任务完成
                    forkMainService.forkLiftFinished();
                    //执行小车移动任务
                    forkMainService.shuttleMoveExecute();
                    // å¼‚常信息记录
                    forkMainService.recErr();
                    // ç©¿æ¢­è½¦ ===>> å°è½¦ç”µé‡æ£€æµ‹å……电
                    forkMainService.loopShuttleCharge();
                    forkMainService.executeShuttleCharge();
                    //自动切换出入库模式
                    forkMainService.autoSwitchForkLiftIOMode();
                    // é—´éš”
                    Thread.sleep(200);
src/main/java/com/zy/core/ServerBootstrap.java
@@ -1,37 +1,18 @@
package com.zy.core;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.exception.CoolException;
import com.zy.asrs.entity.BasLift;
import com.zy.asrs.entity.DeviceConfig;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.service.BasLiftService;
import com.zy.asrs.service.DeviceConfigService;
import com.zy.asrs.service.LocMastService;
import com.zy.asrs.utils.Utils;
import com.zy.common.utils.RedisUtil;
import com.zy.core.action.ShuttleAction;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.SlaveType;
import com.zy.core.task.ShuttleExecuteScheduler;
import com.zy.core.thread.TrafficControlThread;
import com.zy.core.thread.impl.NyLiftThread;
import com.zy.core.thread.impl.NyShuttleThread;
import com.zy.core.thread.impl.TrafficControlImplThread;
import com.zy.core.thread.impl.ZyForkLiftThread;
import com.zy.core.utils.DeviceMsgUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.util.ArrayList;
import java.util.List;
/**
@@ -41,23 +22,12 @@
@Component
public class ServerBootstrap {
    @Value("${deviceExecuteConfig.threadControlCount}")
    private int threadControlCount;
    @Autowired
    private MainProcess mainProcess;
    @Autowired
    private RedisUtil redisUtil;
    @Autowired
    private DeviceConfigService deviceConfigService;
    @Autowired
    private ShuttleAction shuttleAction;
    @Autowired
    private DeviceMsgUtils deviceMsgUtils;
    @Autowired
    private BasLiftService basLiftService;
    @Autowired
    private LocMastService locMastService;
    @PostConstruct
    @Async
@@ -74,126 +44,65 @@
    }
    private void initMq(){
        // åˆå§‹åŒ–货叉提升机mq
        List<DeviceConfig> forkLiftList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.ForkLift)));
        for (DeviceConfig forkLift : forkLiftList) {
            MessageQueue.init(SlaveType.ForkLift, forkLift.getDeviceNo());
        // åˆå§‹åŒ–堆垛机mq
        List<DeviceConfig> crnList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.Crn)));
        for (DeviceConfig crn : crnList) {
            MessageQueue.init(SlaveType.Crn, crn.getDeviceNo());
        }
        // åˆå§‹åŒ–提升机mq
        List<DeviceConfig> liftList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.Lift)));
        for (DeviceConfig lift : liftList) {
            MessageQueue.init(SlaveType.Lift, lift.getDeviceNo());
        // åˆå§‹åŒ–Rgv小车mq
        List<DeviceConfig> rgvList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.Rgv)));
        for (DeviceConfig rgv : rgvList) {
            MessageQueue.init(SlaveType.Rgv, rgv.getDeviceNo());
        }
        // åˆå§‹åŒ–四向穿梭车mq
        List<DeviceConfig> shuttleList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.Shuttle)));
        for (DeviceConfig shuttle : shuttleList) {
            MessageQueue.init(SlaveType.Shuttle, shuttle.getDeviceNo());
        // åˆå§‹åŒ–输送线mq
        List<DeviceConfig> devpList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.Devp)));
        for (DeviceConfig devp : devpList) {
            MessageQueue.init(SlaveType.Devp, devp.getDeviceNo());
        }
        MessageQueue.init(SlaveType.TrafficControl, 1);
        // åˆå§‹åŒ–条码扫描仪mq
        List<DeviceConfig> barcodeList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.Barcode)));
        for (DeviceConfig barcode : barcodeList) {
            MessageQueue.init(SlaveType.Barcode, barcode.getDeviceNo());
        }
        // åˆå§‹åŒ–Led灯mq
        List<DeviceConfig> ledList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.Led)));
        for (DeviceConfig led : ledList) {
            MessageQueue.init(SlaveType.Led, led.getDeviceNo());
        }
    }
    private void initThread(){
        List<DeviceConfig> allDevices = new ArrayList<>();
        List<DeviceConfig> fakeDevices = new ArrayList<>();
//        News.info("初始化堆垛机........................................................");
//        List<DeviceConfig> crnList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
//                .eq("device_type", String.valueOf(SlaveType.Crn)));
//        for (DeviceConfig deviceConfig : crnList) {
//            BasLift basLift = basLiftService.selectOne(new EntityWrapper<BasLift>().eq("lift_no", deviceConfig.getDeviceNo()));
//            if (basLift == null) {
//                throw new CoolException("未配置货叉提升机数据");
//            }
//
//            ThreadHandler thread = null;
//            if (deviceConfig.getThreadImpl().equals("ZyForkLiftThread")) {
//                thread = new ZyForkLiftThread(deviceConfig, basLift.getStationList$(), redisUtil);
//            } else {
//                throw new CoolException("未知的线程实现");
//            }
//
//            new Thread(thread).start();
//            SlaveConnection.put(SlaveType.ForkLift, deviceConfig.getDeviceNo(), thread);
//
//            if (deviceConfig.getFake() == 1) {
//                fakeDevices.add(deviceConfig);
//            }else {
//                allDevices.add(deviceConfig);
//            }
//        }
        // åˆå§‹åŒ–货叉提升机
        News.info("初始化货叉提升机........................................................");
        List<DeviceConfig> forkLiftList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.ForkLift)));
        for (DeviceConfig deviceConfig : forkLiftList) {
            BasLift basLift = basLiftService.selectOne(new EntityWrapper<BasLift>().eq("lift_no", deviceConfig.getDeviceNo()));
            if (basLift == null) {
                throw new CoolException("未配置货叉提升机数据");
            }
            ThreadHandler thread = null;
            if (deviceConfig.getThreadImpl().equals("ZyForkLiftThread")) {
                thread = new ZyForkLiftThread(deviceConfig, basLift.getStationList$(), redisUtil);
            } else {
                throw new CoolException("未知的线程实现");
            }
            new Thread(thread).start();
            SlaveConnection.put(SlaveType.ForkLift, deviceConfig.getDeviceNo(), thread);
            if (deviceConfig.getFake() == 1) {
                fakeDevices.add(deviceConfig);
            }else {
                allDevices.add(deviceConfig);
            }
        }
        // åˆå§‹åŒ–提升机
        News.info("初始化提升机........................................................");
        List<DeviceConfig> liftList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.Lift)));
        for (DeviceConfig deviceConfig : liftList) {
            BasLift basLift = basLiftService.selectOne(new EntityWrapper<BasLift>().eq("lift_no", deviceConfig.getDeviceNo()));
            if (basLift == null) {
                throw new CoolException("未配置提升机数据");
            }
            ThreadHandler thread = null;
            if (deviceConfig.getThreadImpl().equals("NyLiftThread")) {
                thread = new NyLiftThread(deviceConfig, basLift.getPoint$(), basLift.getStationList$(), redisUtil);
            } else {
                throw new CoolException("未知的线程实现");
            }
            new Thread(thread).start();
            SlaveConnection.put(SlaveType.Lift, deviceConfig.getDeviceNo(), thread);
            String locNo = Utils.getLocNo(basLift.getPoint$().getRow(), basLift.getPoint$().getBay(), 1);
            LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locNo));
            JSONObject point = JSON.parseObject(locMast.getQrCodeValue());
            if (point == null) {
                continue;
            }
            deviceConfig.setOtherData(point.getInteger("x") + "-" + point.getInteger("y"));
            if (deviceConfig.getFake() == 1) {
                fakeDevices.add(deviceConfig);
            }else {
                allDevices.add(deviceConfig);
            }
        }
        // åˆå§‹åŒ–四向穿梭车
        News.info("初始化四向穿梭车......................................................");
        List<DeviceConfig> shuttleList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.Shuttle)));
        for (DeviceConfig deviceConfig : shuttleList) {
            ThreadHandler thread = null;
            if (deviceConfig.getThreadImpl().equals("NyShuttleThread")) {
                thread = new NyShuttleThread(deviceConfig, redisUtil);
            } else {
                throw new CoolException("未知的线程实现");
            }
            new Thread(thread).start();
            SlaveConnection.put(SlaveType.Shuttle, deviceConfig.getDeviceNo(), thread);
            if (deviceConfig.getFake() == 1) {
                fakeDevices.add(deviceConfig);
            }else {
                allDevices.add(deviceConfig);
            }
        }
        //设备初始化完毕
        deviceMsgUtils.sendDeviceConfig(JSON.toJSONString(allDevices));
        deviceMsgUtils.sendFakeDeviceConfig(JSON.toJSONString(fakeDevices));
        TrafficControlThread trafficControlThread = new TrafficControlImplThread(redisUtil);
        new Thread(trafficControlThread).start();
        SlaveConnection.put(SlaveType.TrafficControl, 1, trafficControlThread);
        ShuttleExecuteScheduler shuttleExecuteScheduler = new ShuttleExecuteScheduler(shuttleAction, deviceConfigService, redisUtil, threadControlCount);
        new Thread(shuttleExecuteScheduler).start();
    }
src/main/java/com/zy/core/action/ForkLiftAction.java
File was deleted
src/main/java/com/zy/core/action/LiftAction.java
File was deleted
src/main/java/com/zy/core/action/ShuttleAction.java
File was deleted
src/main/java/com/zy/core/cache/MessageQueue.java
@@ -6,6 +6,7 @@
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.LinkedBlockingQueue;
/**
 * æ¶ˆæ¯é˜Ÿåˆ—
@@ -13,36 +14,41 @@
 */
public class MessageQueue {
    //四向穿梭车mq交换机
    private static final Map<Integer, ConcurrentLinkedQueue<Task>> SHUTTLE_EXCHANGE = new ConcurrentHashMap<>();
    //提升机mq交换机
    private static final Map<Integer, ConcurrentLinkedQueue<Task>> LIFT_EXCHANGE = new ConcurrentHashMap<>();
    //货叉提升机mq交换机
    private static final Map<Integer, ConcurrentLinkedQueue<Task>> FORK_LIFT_EXCHANGE = new ConcurrentHashMap<>();
    //货叉提升机Master mq交换机
    private static final Map<Integer, ConcurrentLinkedQueue<Task>> FORK_LIFT_MASTER_EXCHANGE = new ConcurrentHashMap<>();
    //Traffic Control mq交换机
    private static final Map<Integer, ConcurrentLinkedQueue<Task>> TRAFFIC_CONTROL_EXCHANGE = new ConcurrentHashMap<>();
    // å †åž›æœºmq交换机
    private static final Map<Integer, LinkedBlockingQueue<Task>> CRN_EXCHANGE = new ConcurrentHashMap<>();
    // è¾“送线mq交换机
    private static final Map<Integer, ConcurrentLinkedQueue<Task>> DEVP_EXCHANGE = new ConcurrentHashMap<>();
    // æ¡ç æ‰«æä»ªmq交换机
    private static final Map<Integer, ConcurrentLinkedQueue<Task>> BARCODE_EXCHANGE = new ConcurrentHashMap<>();
    // Led灯 mq交换机
    private static final Map<Integer, LinkedBlockingQueue<Task>> LED_EXCHANGE = new ConcurrentHashMap<>();
    // ç£…ç§°mq交换机
    private static final Map<Integer, ConcurrentLinkedQueue<Task>> SCALE_EXCHANGE = new ConcurrentHashMap<>();
    // RGVmq交换机
    private static final Map<Integer, LinkedBlockingQueue<Task>> RGV_EXCHANGE = new ConcurrentHashMap<>();
    /**
     * mq äº¤æ¢æœºåˆå§‹åŒ–
     */
    public static void init(SlaveType type, Integer id) {
        switch (type) {
            case Shuttle:
                SHUTTLE_EXCHANGE.put(id, new ConcurrentLinkedQueue<>());
            case Crn:
                CRN_EXCHANGE.put(id, new LinkedBlockingQueue<>(1));
                break;
            case ForkLift:
                FORK_LIFT_EXCHANGE.put(id, new ConcurrentLinkedQueue<>());
            case Rgv:
                RGV_EXCHANGE.put(id, new LinkedBlockingQueue<>(1));
                break;
            case ForkLiftMaster:
                FORK_LIFT_MASTER_EXCHANGE.put(id, new ConcurrentLinkedQueue<>());
            case Devp:
                DEVP_EXCHANGE.put(id, new ConcurrentLinkedQueue<>());
                break;
            case Lift:
                LIFT_EXCHANGE.put(id, new ConcurrentLinkedQueue<>());
            case Barcode:
                BARCODE_EXCHANGE.put(id, new ConcurrentLinkedQueue<>());
                break;
            case TrafficControl:
                TRAFFIC_CONTROL_EXCHANGE.put(id, new ConcurrentLinkedQueue<>());
            case Led:
                LED_EXCHANGE.put(id, new LinkedBlockingQueue<>(1));
                break;
            case Scale:
                SCALE_EXCHANGE.put(id, new ConcurrentLinkedQueue<>());
                break;
            default:
                break;
@@ -55,16 +61,18 @@
     */
    public static boolean offer(SlaveType type, Integer id, Task task) {
        switch (type) {
            case Shuttle:
                return SHUTTLE_EXCHANGE.get(id).offer(task);
            case ForkLift:
                return FORK_LIFT_EXCHANGE.get(id).offer(task);
            case ForkLiftMaster:
                return FORK_LIFT_MASTER_EXCHANGE.get(id).offer(task);
            case Lift:
                return LIFT_EXCHANGE.get(id).offer(task);
            case TrafficControl:
                return TRAFFIC_CONTROL_EXCHANGE.get(id).offer(task);
            case Crn:
                return CRN_EXCHANGE.get(id).offer(task);
            case Rgv:
                return RGV_EXCHANGE.get(id).offer(task);
            case Devp:
                return DEVP_EXCHANGE.get(id).offer(task);
            case Barcode:
                return BARCODE_EXCHANGE.get(id).offer(task);
            case Led:
                return LED_EXCHANGE.get(id).offer(task);
            case Scale:
                return SCALE_EXCHANGE.get(id).offer(task);
            default:
                return false;
        }
@@ -76,16 +84,18 @@
     */
    public static Task poll(SlaveType type, Integer id) {
        switch (type) {
            case Shuttle:
                return SHUTTLE_EXCHANGE.get(id).poll();
            case ForkLift:
                return FORK_LIFT_EXCHANGE.get(id).poll();
            case ForkLiftMaster:
                return FORK_LIFT_MASTER_EXCHANGE.get(id).poll();
            case Lift:
                return LIFT_EXCHANGE.get(id).poll();
            case TrafficControl:
                return TRAFFIC_CONTROL_EXCHANGE.get(id).poll();
            case Crn:
                return CRN_EXCHANGE.get(id).poll();
            case Rgv:
                return RGV_EXCHANGE.get(id).poll();
            case Devp:
                return DEVP_EXCHANGE.get(id).poll();
            case Barcode:
                return BARCODE_EXCHANGE.get(id).poll();
            case Led:
                return LED_EXCHANGE.get(id).poll();
            case Scale:
                return SCALE_EXCHANGE.get(id).poll();
            default:
                return null;
        }
@@ -96,16 +106,18 @@
     */
    public static Task peek(SlaveType type, Integer id) {
        switch (type) {
            case Shuttle:
                return SHUTTLE_EXCHANGE.get(id).peek();
            case ForkLift:
                return FORK_LIFT_EXCHANGE.get(id).peek();
            case ForkLiftMaster:
                return FORK_LIFT_MASTER_EXCHANGE.get(id).peek();
            case Lift:
                return LIFT_EXCHANGE.get(id).peek();
            case TrafficControl:
                return TRAFFIC_CONTROL_EXCHANGE.get(id).peek();
            case Crn:
                return CRN_EXCHANGE.get(id).peek();
            case Rgv:
                return RGV_EXCHANGE.get(id).peek();
            case Devp:
                return DEVP_EXCHANGE.get(id).peek();
            case Barcode:
                return BARCODE_EXCHANGE.get(id).peek();
            case Led:
                return LED_EXCHANGE.get(id).peek();
            case Scale:
                return SCALE_EXCHANGE.get(id).peek();
            default:
                return null;
        }
@@ -113,20 +125,23 @@
    public static void clear(SlaveType type, Integer id){
        switch (type) {
            case Shuttle:
                SHUTTLE_EXCHANGE.get(id).clear();
            case Crn:
                CRN_EXCHANGE.get(id).clear();
                break;
            case ForkLift:
                FORK_LIFT_EXCHANGE.get(id).clear();
            case Rgv:
                RGV_EXCHANGE.get(id).clear();
                break;
            case ForkLiftMaster:
                FORK_LIFT_MASTER_EXCHANGE.get(id).clear();
            case Devp:
                DEVP_EXCHANGE.get(id).clear();
                break;
            case Lift:
                LIFT_EXCHANGE.get(id).clear();
            case Barcode:
                BARCODE_EXCHANGE.get(id).clear();
                break;
            case TrafficControl:
                TRAFFIC_CONTROL_EXCHANGE.get(id).clear();
            case Led:
                LED_EXCHANGE.get(id).clear();
                break;
            case Scale:
                SCALE_EXCHANGE.get(id).clear();
                break;
            default:
                break;
src/main/java/com/zy/core/config/PointInitializer.java
File was deleted
src/main/java/com/zy/core/config/ShuttleConfigInitializer.java
File was deleted
src/main/java/com/zy/core/dispatcher/ForkLiftDispatchUtils.java
File was deleted
src/main/java/com/zy/core/dispatcher/LiftDispatchUtils.java
File was deleted
src/main/java/com/zy/core/dispatcher/ShuttleDispatchUtils.java
File was deleted
src/main/java/com/zy/core/enums/CrnForkPosType.java
New file
@@ -0,0 +1,43 @@
package com.zy.core.enums;
public enum CrnForkPosType {
    NONE(-1, "不在定位"),   // è´§å‰åŽŸä½
    HOME(0, "货叉原位"),   // è´§å‰åŽŸä½
    LEFT(1, "货叉在左侧"),  // è´§å‰åœ¨å·¦ä¾§
    RIGHT(2, "货叉在右侧"),   // è´§å‰åœ¨å³ä¾§
    _LEFT(3, "货叉在左侧远"),   // è´§å‰åœ¨å³ä¾§è¿œ
    _RIGHT(4, "货叉在右侧远"),   // è´§å‰åœ¨å³ä¾§è¿œ
    ;
    public Integer id;
    public String desc;
    CrnForkPosType(Integer id, String desc) {
        this.id = id;
        this.desc = desc;
    }
    public static CrnForkPosType get(Integer id) {
        if (null == id) {
            return null;
        }
        for (CrnForkPosType type : CrnForkPosType.values()) {
            if (type.id.equals(id)) {
                return type;
            }
        }
        return null;
    }
    public static CrnForkPosType get(CrnForkPosType type) {
        if (null == type) {
            return null;
        }
        for (CrnForkPosType crnForkPosType : CrnForkPosType.values()) {
            if (crnForkPosType == type) {
                return crnForkPosType;
            }
        }
        return null;
    }
}
src/main/java/com/zy/core/enums/CrnLiftPosType.java
New file
@@ -0,0 +1,44 @@
package com.zy.core.enums;
public enum CrnLiftPosType {
    ERROR(-1, "未知"),   // ä¸åœ¨å®šä½
    NONE(0, "不在定位"),   // ä¸åœ¨å®šä½
    _DOWN(1, "双深低位"),  //
    DOWN(2, "单深低位"),  //
    _UP(3, "单深高位"),   //
    UP(4, "双深高位"),   //
    ;
    public Integer id;
    public String desc;
    CrnLiftPosType(Integer id, String desc) {
        this.id = id;
        this.desc = desc;
    }
    public static CrnLiftPosType get(Integer id) {
        if (null == id) {
            return null;
        }
        for (CrnLiftPosType type : CrnLiftPosType.values()) {
            if (type.id.equals(id)) {
                return type;
            }
        }
        return null;
    }
    public static CrnLiftPosType get(CrnLiftPosType type) {
        if (null == type) {
            return null;
        }
        for (CrnLiftPosType crnLiftPosType : CrnLiftPosType.values()) {
            if (crnLiftPosType == type) {
                return crnLiftPosType;
            }
        }
        return null;
    }
}
src/main/java/com/zy/core/enums/CrnModeType.java
New file
@@ -0,0 +1,42 @@
package com.zy.core.enums;
public enum CrnModeType {
    NONE(-1, "离线"),
    STOP(0, "ç»´ä¿®"),
    HAND(1, "手动"),
    HALF_AUTO(2, "半自动"),
    AUTO(3, "自动"),
    ;
    public Integer id;
    public String desc;
    CrnModeType(Integer id, String desc) {
        this.id = id;
        this.desc = desc;
    }
    public static CrnModeType get(Integer id) {
        if (null == id) {
            return null;
        }
        for (CrnModeType type : CrnModeType.values()) {
            if (type.id.equals(id)) {
                return type;
            }
        }
        return null;
    }
    public static CrnModeType get(CrnModeType type) {
        if (null == type) {
            return null;
        }
        for (CrnModeType crnModeType : CrnModeType.values()) {
            if (crnModeType == type) {
                return crnModeType;
            }
        }
        return null;
    }
}
src/main/java/com/zy/core/enums/CrnStatusType.java
New file
@@ -0,0 +1,52 @@
package com.zy.core.enums;
public enum CrnStatusType {
    NONE(-1, "离线"),
    IDLE(0, "空闲"),
    FETCH_MOVING(1, "取货行走"),
    FETCH_WAITING(2, "取货等待"),
    FETCHING(3, "取货中"),
    PUT_MOVING(4, "放货走行"),
    PUT_WAITING(5, "放货等待"),
    PUTTING(6, "放货中"),
    ORIGIN_GO(7, "回原点"),
    ORIGIN_BACK(8, "回反原点"),
    MOVING(9, "走行中"),
    WAITING(90, "任务完成等待WCS确认"),
    PAUSE(11, "任务暂停"),
    SOS(99, "报警"),
    UNKNOW(100, "其他"),
    ;
    public Integer id;
    public String desc;
    CrnStatusType(Integer id, String desc) {
        this.id = id;
        this.desc = desc;
    }
    public static CrnStatusType get(Integer id) {
        if (null == id) {
            return null;
        }
        for (CrnStatusType type : CrnStatusType.values()) {
            if (type.id.equals(id)) {
                return type;
            }
        }
        return NONE;
    }
    public static CrnStatusType get(CrnStatusType type) {
        if (null == type) {
            return null;
        }
        for (CrnStatusType crnStatusType : CrnStatusType.values()) {
            if (crnStatusType == type) {
                return crnStatusType;
            }
        }
        return null;
    }
}
src/main/java/com/zy/core/enums/ForkLiftIoModeType.java
File was deleted
src/main/java/com/zy/core/enums/ForkLiftProtocolStatusType.java
File was deleted
src/main/java/com/zy/core/enums/ForkLiftTaskModeType.java
File was deleted
src/main/java/com/zy/core/enums/LiftDeviceStatusType.java
File was deleted
src/main/java/com/zy/core/enums/LiftIoModeType.java
File was deleted
src/main/java/com/zy/core/enums/LiftProtocolStatusType.java
File was deleted
src/main/java/com/zy/core/enums/LiftTaskModeType.java
File was deleted
src/main/java/com/zy/core/enums/RedisKeyType.java
@@ -9,58 +9,12 @@
    LIFT_WORK_FLAG("lift_wrk_no_"),
    LIFT_FLAG("lift_"),
    MAP("realtimeBasMap_"),
    BASIC_MAP("basicMap_"),
    QUEUE_SHUTTLE("queue_shuttle_"),
    QUEUE_FORK_LIFT("queue_fork_lift_"),
    QUEUE_CRN("queue_crn_"),
    QUEUE_DEVP("queue_devp_"),
    QUEUE_RGV("queue_rgv_"),
    QUEUE_TASK("queue_task_"),
    FORK_LIFT_PUT_COMPLETE("fork_lift_put_complete_"),
    OUT_TASK_PREVIEW_DISPATCH_FORKLIFT("out_task_preview_dispatch_forklift_"),
    //小车重新规划路径频率
    SHUTTLE_RESTART_CALC_PATH("shuttle_restart_calc_path_"),
    //小车更新楼层坐标频率
    SHUTTLE_UPDATE_LOCATION("shuttle_update_location_"),
    //提升机移动至小车层频率
    LIFT_MOVE_TO_SHUTTLE_LIMIT("lift_move_to_shuttle_LIMIT_"),
    //任务运行限制
    TASK_RUN_LIMIT("task_run_limit_"),
    //交管信息
    TRAFFIC_CONTROL_MAP("traffic_control_map"),
    TRAFFIC_CONTROL_APPLY("traffic_control_apply_"),
    TRAFFIC_CONTROL_SUCCESS_APPLY("traffic_control_success_apply_"),
    TRAFFIC_CONTROL_REPORT_LIST("traffic_control_report_list_"),
    TRAFFIC_CONTROL_CANCEL_LIST("traffic_control_cancel_list_"),
    TRAFFIC_CONTROL_LOCK_APPLY("traffic_control_lock_apply_"),
    TRAFFIC_CONTROL_SHUTTLE_APPLY_COUNT("traffic_control_shuttle_apply_count_"),
    TRAFFIC_CONTROL_SHUTTLE_OBSTACLE_CANCEL_TASK("traffic_control_shuttle_obstacle_cancel_task_"),
    TRAFFIC_CONTROL_SHUTTLE_OBSTACLE_CANCEL_TASK_LOCK("traffic_control_shuttle_obstacle_cancel_task_lock_"),
    //地图锁定节点
    LOCK_MAP_NODES("lock_map_nodes_"),
    //设备消息KEY
    DEVICE_SHUTTLE_MSG_KEY_("deviceShuttleMsgKey_"),
    DEVICE_FORK_LIFT_MSG_KEY_("deviceForkLiftMsgKey_"),
    DEVICE_LIFT_MSG_KEY_("deviceLiftMsgKey_"),
    //设备指令消息KEY
    DEVICE_SHUTTLE_COMMAND_MSG_KEY("deviceShuttleCommandMsgKey_"),
    DEVICE_FORK_LIFT_COMMAND_MSG_KEY("deviceForkLiftCommandMsgKey_"),
    DEVICE_LIFT_COMMAND_MSG_KEY("deviceLiftCommandMsgKey_"),
    //设备配置文件
    DEVICE_CONFIG("deviceConfig"),
    //虚拟设备配置文件
    FAKE_DEVICE_CONFIG("fakeDeviceConfig"),
    LOG_LIMIT("log_limit_"),
    POINT_MAP("point_map"),
    LOC_MAP("loc_map"),
    SHUTTLE_SPEED_MAP("shuttle_speed_map"),
    SYSTEM_CONFIG_MAP("system_config_map"),
    ;
src/main/java/com/zy/core/enums/ShuttleCheckCommandResultType.java
File was deleted
src/main/java/com/zy/core/enums/ShuttleCommandModeType.java
File was deleted
src/main/java/com/zy/core/enums/ShuttleProtocolStatusType.java
File was deleted
src/main/java/com/zy/core/enums/ShuttleRequireChargeType.java
File was deleted
src/main/java/com/zy/core/enums/ShuttleRunDirection.java
File was deleted
src/main/java/com/zy/core/enums/ShuttleStatusType.java
File was deleted
src/main/java/com/zy/core/enums/ShuttleTaskModeType.java
File was deleted
src/main/java/com/zy/core/enums/ShuttleTaskNoType.java
File was deleted
src/main/java/com/zy/core/enums/SlaveType.java
@@ -2,11 +2,12 @@
public enum SlaveType {
    Shuttle,
    Lift,
    ForkLift,
    ForkLiftMaster,
    TrafficControl,
    Crn,
    Devp,
    Barcode,
    Led,
    Scale,
    Rgv
    ;
    public static SlaveType findInstance(String s){
src/main/java/com/zy/core/model/ForkLiftSlave.java
File was deleted
src/main/java/com/zy/core/model/LiftSlave.java
File was deleted
src/main/java/com/zy/core/model/LiftStation.java
File was deleted
src/main/java/com/zy/core/model/PythonResult.java
File was deleted
src/main/java/com/zy/core/model/PythonSimilarityResult.java
File was deleted
src/main/java/com/zy/core/model/ShuttleSlave.java
File was deleted
src/main/java/com/zy/core/model/TrafficControlDataModel.java
File was deleted
src/main/java/com/zy/core/model/command/ForkLiftAssignCommand.java
File was deleted
src/main/java/com/zy/core/model/command/ForkLiftCommand.java
File was deleted
src/main/java/com/zy/core/model/command/ForkLiftRedisCommand.java
File was deleted
src/main/java/com/zy/core/model/command/LiftAssignCommand.java
File was deleted
src/main/java/com/zy/core/model/command/LiftCommand.java
File was deleted
src/main/java/com/zy/core/model/command/LiftRedisCommand.java
File was deleted
src/main/java/com/zy/core/model/command/NyShuttleHttpCommand.java
File was deleted
src/main/java/com/zy/core/model/command/ShuttleAssignCommand.java
File was deleted
src/main/java/com/zy/core/model/command/ShuttleCommand.java
File was deleted
src/main/java/com/zy/core/model/command/ShuttleRedisCommand.java
File was deleted
src/main/java/com/zy/core/model/param/OperateTrafficControlParam.java
File was deleted
src/main/java/com/zy/core/model/param/ShuttleMoveLocParam.java
File was deleted
src/main/java/com/zy/core/model/protocol/CrnProtocol.java
New file
@@ -0,0 +1,207 @@
package com.zy.core.model.protocol;
import com.zy.core.enums.CrnForkPosType;
import com.zy.core.enums.CrnLiftPosType;
import com.zy.core.enums.CrnModeType;
import com.zy.core.enums.CrnStatusType;
import lombok.Data;
/**
 * Created by vincent on 2020/8/7
 */
@Data
public class CrnProtocol {
    private Integer crnNo;
    /**
     * 1 = æ‰‹åŠ¨æ¨¡å¼
     * 2 = è‡ªåŠ¨æ¨¡å¼
     * 3 = ç”µè„‘模式
     */
    public Integer mode;
    public CrnModeType modeType;
    /**
     * 1 = æ€¥åœ
     */
    public Integer eStop;
    /**
     * å¼‚常码
     */
    public Integer alarm;
    /**
     * ä»»åŠ¡å·
     */
    public Integer taskNo = 0;
    /**
     * å †åž›æœºå½“前状态
     * 0:空闲,无任务
     * 1:取货定位中
     * 2:取货中
     * 3:取货完成,放货定位中
     * 4:放货中
     * 5:回原点中
     * 6:反原点
     * 7:库位移位
     * 90:任务完成等待WCS确认
     * 99:报警
     */
    public Integer status;
    /**
     * çŠ¶æ€æžšä¸¾
     */
    public CrnStatusType statusType;
    /**
     * å †åž›æœºå½“前列号
     */
    public Integer bay;
    /**
     * å †åž›æœºå½“前层号
     */
    public Integer level;
    /**
     * å½“前货叉位置
     * 0 = è´§å‰åŽŸä½
     * 1 = è´§å‰åœ¨å·¦ä¾§
     * 2 = è´§å‰åœ¨å³ä¾§
     */
    public Integer forkPos;
    public CrnForkPosType forkPosType;
    /**
     * å½“前载货台位置
     * 0 = ä¸‹å®šä½
     * 1 = ä¸Šå®šä½
     */
    public Integer liftPos;
    public CrnLiftPosType liftPosType;
    /**
     * èµ°è¡Œåœ¨å®šä½
     * 0 = åœ¨å®šä½
     * 1 = ä¸åœ¨å®šä½
     */
    public Integer walkPos;
    /**
     * è½½è´§å°æœ‰ç‰©
     */
    public Integer loaded;
    private Integer temp1;
    private Integer temp2;
    private Integer temp3;
    private Integer temp4;
    /**
     * X行走线速度m/min
     */
    private Float xSpeed;
    /**
     * Y行走线速度m/min
     */
    private Float ySpeed;
    /**
     * Z行走线速度m/min
     */
    private Float zSpeed;
    /**
     * å †åž›æœºç´¯è®¡èµ°è¡Œè·ç¦»km
     */
    public Float xDistance;
    /**
     * å †åž›æœºç´¯è®¡å‡é™è·ç¦»km
     */
    public Float yDistance;
    /**
     * å †åž›æœºç´¯è®¡èµ°è¡Œæ—¶é•¿h
     */
    public Float xDuration;
    /**
     * å †åž›æœºç´¯è®¡å‡é™æ—¶é•¿h
     */
    public Float yDuration;
    /**
     * æœ€è¿‘一次入出库类型
     *       I:入库
     *       O:出库
     */
    private String lastIo = "I";
    /**
     * å †åž›æœºæ‰€åœ¨å··é“
     */
    private Integer crnLane = 1;
    /**
     * æ—¥å¿—采集时间
     */
    private Long deviceDataLog = System.currentTimeMillis();
    /**
     * ä¸Šä¸€æ¬¡æŒ‡ä»¤ä¸‹å‘æ—¶é—´
     */
    private Long lastCommandTime = System.currentTimeMillis();
    public void setMode(Integer mode) {
        this.mode = mode;
        this.modeType = CrnModeType.get(mode);
    }
    public void setMode(CrnModeType type) {
        this.modeType = type;
        this.mode = CrnModeType.get(type).id;
    }
    public void setForkPos(Integer forkPos) {
        this.forkPos = forkPos;
        this.forkPosType = CrnForkPosType.get(forkPos);
    }
    public void setForkPos(CrnForkPosType type) {
        this.forkPosType = type;
        this.forkPos = CrnForkPosType.get(type).id;
    }
    public void setLiftPos(Integer liftPos) {
        this.liftPos = liftPos;
        this.liftPosType = CrnLiftPosType.get(liftPos);
    }
    public void setLiftPos(CrnLiftPosType type) {
        this.liftPosType = type;
        this.liftPos = CrnLiftPosType.get(type).id;
    }
    public void setStatus(Integer status){
        this.status = status;
        this.statusType = CrnStatusType.get(status);
    }
    public void setStatus(CrnStatusType type){
        this.statusType = type;
        this.status = CrnStatusType.get(type).id;
    }
}
src/main/java/com/zy/core/model/protocol/ForkLiftProtocol.java
File was deleted
src/main/java/com/zy/core/model/protocol/ForkLiftStaProtocol.java
File was deleted
src/main/java/com/zy/core/model/protocol/LiftProtocol.java
File was deleted
src/main/java/com/zy/core/model/protocol/LiftStaProtocol.java
File was deleted
src/main/java/com/zy/core/model/protocol/ShuttleProtocol.java
File was deleted
src/main/java/com/zy/core/properties/SlaveProperties.java
File was deleted
src/main/java/com/zy/core/task/DeviceLogScheduler.java
New file
@@ -0,0 +1,69 @@
package com.zy.core.task;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.zy.asrs.entity.DeviceConfig;
import com.zy.asrs.entity.DeviceDataLog;
import com.zy.asrs.service.DeviceConfigService;
import com.zy.asrs.service.DeviceDataLogService;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.SlaveType;
import com.zy.core.thread.ShuttleThread;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
@Slf4j
@Component
public class DeviceLogScheduler {
    @Autowired
    private DeviceConfigService deviceConfigService;
    @Autowired
    private DeviceDataLogService deviceDataLogService;
    @Scheduled(cron = "0/3 * * * * ? ")
    public void execute() {
//        List<DeviceConfig> shuttleList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
//                .eq("device_type", String.valueOf(SlaveType.Shuttle)));
//        for (DeviceConfig deviceConfig : shuttleList) {
//            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, deviceConfig.getDeviceNo());
//            if(shuttleThread == null){
//                continue;
//            }
//
//            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
//            if (shuttleProtocol == null) {
//                continue;
//            }
//
//            if (System.currentTimeMillis() - shuttleProtocol.getDeviceDataLog() > 500) {
//                if (shuttleThread.getOriginDeviceData() != null) {
//                    //采集时间超过5s,保存一次数据记录
//
//                    //离线不做日志存储
//                    if (shuttleProtocol.getProtocolStatusType().equals(ShuttleProtocolStatusType.OFFLINE)) {
//                        continue;
//                    }
//
//                    //保存数据记录
//                    DeviceDataLog deviceDataLog = new DeviceDataLog();
//                    deviceDataLog.setOriginData(JSON.toJSONString(shuttleThread.getOriginDeviceData()));
//                    deviceDataLog.setWcsData(JSON.toJSONString(shuttleProtocol));
//                    deviceDataLog.setType(String.valueOf(SlaveType.Shuttle));
//                    deviceDataLog.setDeviceNo(deviceConfig.getDeviceNo());
//                    deviceDataLog.setCreateTime(new Date());
//                    deviceDataLogService.insert(deviceDataLog);
//
//                    //更新采集时间
//                    shuttleThread.updateDeviceDataLogTime(System.currentTimeMillis());
//                }
//            }
//        }
    }
}
src/main/java/com/zy/core/task/ShuttleDemoScheduler.java
File was deleted
src/main/java/com/zy/core/task/ShuttleDeviceLogScheduler.java
File was deleted
src/main/java/com/zy/core/task/ShuttleExecuteScheduler.java
File was deleted
src/main/java/com/zy/core/task/TrafficApplyProcess.java
File was deleted
src/main/java/com/zy/core/thread/CrnThread.java
New file
@@ -0,0 +1,10 @@
package com.zy.core.thread;
import com.zy.core.ThreadHandler;
import com.zy.core.model.protocol.CrnProtocol;
public interface CrnThread extends ThreadHandler {
    CrnProtocol getCrnProtocol();
}
src/main/java/com/zy/core/thread/ForkLiftThread.java
File was deleted
src/main/java/com/zy/core/thread/LiftThread.java
File was deleted
src/main/java/com/zy/core/thread/ShuttleThread.java
@@ -1,94 +1,10 @@
package com.zy.core.thread;
import com.alibaba.fastjson.JSONObject;
import com.zy.common.ExecuteSupport;
import com.zy.common.model.NavigateNode;
import com.zy.core.ThreadHandler;
import com.zy.core.enums.ShuttleProtocolStatusType;
import com.zy.core.enums.ShuttleRequireChargeType;
import com.zy.core.enums.ShuttleTaskNoType;
import com.zy.core.model.CommandResponse;
import com.zy.core.model.command.ShuttleCommand;
import com.zy.core.model.param.ShuttleMoveLocParam;
import com.zy.core.model.protocol.ShuttleProtocol;
import java.util.List;
import com.zy.core.ThreadHandler;
public interface ShuttleThread extends ThreadHandler {
    ShuttleProtocol getStatus(boolean clone);//获取四向穿梭车状态
    ShuttleProtocol getStatus();//获取四向穿梭车状态-默认clone
    Object getOriginDeviceData();
    CommandResponse movePath(List<NavigateNode> nodes, Integer taskNo);//路径下发
    CommandResponse move(ShuttleCommand command);//移动
    CommandResponse lift(ShuttleCommand command);//顶升
    CommandResponse charge(ShuttleCommand command);//充电开关
    CommandResponse reset(ShuttleCommand command);//复位开关
    CommandResponse updateLocation(ShuttleCommand command);//更新坐标
    boolean isIdle();
    boolean isIdle(ExecuteSupport support);//是否空闲
    boolean isDeviceIdle();//设备是否空闲
    boolean isDeviceIdle(ExecuteSupport support);//设备是否空闲
    ShuttleRequireChargeType isRequireCharge();//是否满足充电状态
    boolean isCharging();//是否充电中
    boolean isChargingCompleted();//是否充电完成
    boolean isFault();//是否故障
    List<NavigateNode> getMoveAdvancePath();//获取穿梭车任务路径
    int generateDeviceTaskNo(int taskNo, ShuttleTaskNoType type);//生成硬件设备工作号
    boolean setProtocolStatus(ShuttleProtocolStatusType status);//设置工作状态
    boolean setTaskNo(Integer taskNo);//设置工作号
    boolean setSyncTaskNo(Integer taskNo);//设置工作号
    boolean setPakMk(boolean pakMk);//设置标记
    boolean enableMoveLoc(ShuttleMoveLocParam param, boolean enable);
    boolean requestWaiting();
    boolean enableDemo(boolean enable);//演示模式
    boolean offerSystemMsg(String format, Object... arguments);
    boolean setTrafficControl(boolean enable, List<NavigateNode> nodeList);
    void updateDeviceDataLogTime(long time);
    JSONObject parseStatusToMsg(ShuttleProtocol shuttleProtocol);
    boolean restartCalcPath();//重新规划路径
    //***************获取命令*****************
    ShuttleCommand getMoveCommand(Integer taskNo, String startCodeNum, String distCodeNum, Integer allDistance, Integer runDirection, Integer runSpeed, List<NavigateNode> nodes, Boolean shuttleDirectionReverse);//获取移动命令
    ShuttleCommand getMoveLiftCommand(Integer taskNo, String startCodeNum, String distCodeNum, Integer allDistance, Integer runDirection, Integer runSpeed, List<NavigateNode> nodes, Boolean moveIn, Boolean shuttleDirectionReverse);//获取移动命令
    ShuttleCommand getLiftCommand(Integer taskNo, Boolean lift);//顶升命令 true=>顶升 false=>下降
    ShuttleCommand getChargeCommand(Integer taskNo, Boolean charge);//充电开关命令 true=>开 false=>关
    ShuttleCommand getUpdateLocationCommand(Integer taskNo, String locNo);//获取更新坐标命令
}
src/main/java/com/zy/core/thread/TrafficControlThread.java
File was deleted
src/main/java/com/zy/core/thread/impl/LfdZyForkLiftMasterThread.java
File was deleted
src/main/java/com/zy/core/thread/impl/LfdZyForkLiftSlaveThread.java
File was deleted
src/main/java/com/zy/core/thread/impl/NyLiftThread.java
File was deleted
src/main/java/com/zy/core/thread/impl/NyShuttleThread.java
@@ -1,1235 +1,15 @@
package com.zy.core.thread.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.DateUtils;
import com.core.common.SpringUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.zy.asrs.entity.BasShuttle;
import com.zy.asrs.entity.DeviceConfig;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.service.BasShuttleService;
import com.zy.asrs.service.LocMastService;
import com.zy.asrs.utils.Utils;
import com.zy.common.ExecuteSupport;
import com.zy.common.model.MapNode;
import com.zy.common.model.NavigateNode;
import com.zy.common.model.enums.NavigationMapType;
import com.zy.common.utils.NavigateMapData;
import com.zy.common.utils.NavigatePositionConvert;
import com.zy.common.utils.RedisUtil;
import com.zy.common.utils.ShuttleOperaUtils;
import com.zy.core.News;
import com.zy.core.action.ShuttleAction;
import com.zy.core.model.DeviceCommandMsgModel;
import com.zy.core.model.command.ShuttleAssignCommand;
import com.zy.core.utils.DeviceMsgUtils;
import com.zy.core.cache.OutputQueue;
import com.zy.core.enums.*;
import com.zy.core.model.CommandResponse;
import com.zy.core.model.DeviceMsgModel;
import com.zy.core.model.command.NyShuttleHttpCommand;
import com.zy.core.model.command.ShuttleCommand;
import com.zy.core.model.command.ShuttleRedisCommand;
import com.zy.core.model.param.ShuttleMoveLocParam;
import com.zy.core.model.protocol.ShuttleProtocol;
import com.zy.core.thread.ShuttleThread;
import com.zy.system.entity.Config;
import com.zy.system.service.ConfigService;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.*;
@Slf4j
@SuppressWarnings("all")
public class NyShuttleThread implements ShuttleThread {
    private DeviceConfig deviceConfig;
    private RedisUtil redisUtil;
    private ShuttleProtocol shuttleProtocol;
    private ShuttleAction shuttleAction = null;
    private static final boolean DEBUG = false;//调试模式
    private List<JSONObject> socketReadResults = new ArrayList<>();
    private List<DeviceMsgModel> socketResults = new ArrayList<>();
    private Long requestReadTime = System.currentTimeMillis();
    //原始设备数据
    private Object originDeviceData;
    public NyShuttleThread(DeviceConfig deviceConfig, RedisUtil redisUtil) {
        this.deviceConfig = deviceConfig;
        this.redisUtil = redisUtil;
    }
    @Override
    public void run() {
        News.info("{}号四向车线程启动", deviceConfig.getDeviceNo());
        //设备读取
        Thread readThread = new Thread(() -> {
            while (true) {
                try {
                    listenMessageFromRedis();
                    listenInit();//监听初始化事件
                    readStatus();
                    Thread.sleep(100);
//                    //小车空闲且有跑库程序
//                    shuttleAction.moveLoc(deviceConfig.getDeviceNo());
                } catch (Exception e) {
                    log.error("ShuttleThread Fail", e);
                }
            }
        });
        readThread.start();
//        //设备执行
//        Thread executeThread = new Thread(() -> {
//            while (true) {
//                try {
//                    if (shuttleAction == null) {
//                        try {
//                            shuttleAction = SpringUtils.getBean(ShuttleAction.class);
//                        }catch (Exception e){
//                        }
//                        continue;
//                    }
//
//                    Object object = redisUtil.get(RedisKeyType.SHUTTLE_FLAG.key + deviceConfig.getDeviceNo());
//                    if (object == null) {
//                        continue;
//                    }
//
//                    Integer taskNo = Integer.valueOf(String.valueOf(object));
//                    if (taskNo != 0) {
//                        //存在任务需要执行
//                        boolean result = shuttleAction.executeWork(deviceConfig.getDeviceNo(), taskNo);
//                    }
//                    Thread.sleep(100);
//                } catch (Exception e) {
//                    e.printStackTrace();
//                }
//            }
//        });
//        executeThread.start();
    }
    private void listenMessageFromRedis() {
        try {
            DeviceMsgUtils deviceMsgUtils = null;
            try {
                deviceMsgUtils = SpringUtils.getBean(DeviceMsgUtils.class);
            }catch (Exception e){
            }
            if (deviceMsgUtils == null) {
                return;
            }
            DeviceMsgModel deviceMsg = deviceMsgUtils.getDeviceMsg(SlaveType.Shuttle, deviceConfig.getDeviceNo());
            if(deviceMsg == null){
                return;
            }
            JSONObject data = JSON.parseObject(JSON.toJSONString(deviceMsg.getDeviceMsg()));
            if (deviceMsg.getDeviceMsgType().equals("status")) {
                data.put("originDeviceData", deviceMsg.getDeviceOriginMsg());
                socketReadResults.add(data);
            } else {
                socketResults.add(deviceMsg);//添加数据
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public JSONObject getRequestBody(String resultKey) {
        try {
            // èŽ·å–æœåŠ¡å™¨å“åº”
            JSONObject result = null;
            int idx = -1;
            for (int i = 0; i < socketResults.size(); i++) {
                DeviceMsgModel deviceMsgModel = socketResults.get(i);
                if(deviceMsgModel.getResultKey().equals(resultKey)){
                    idx = i;
                    result = JSON.parseObject(JSON.toJSONString(deviceMsgModel.getDeviceMsg()));
                    break;
                }
            }
            if (result == null) {
                return null;//无响应结果
            }
            socketResults.remove(idx);
            return filterBodyData(result);//返回Body结果集
        } catch (Exception e) {
            return null;
        }
    }
    private void readStatus() {
        try {
            if (null == shuttleProtocol) {
                shuttleProtocol = new ShuttleProtocol();
                shuttleProtocol.setShuttleNo(deviceConfig.getDeviceNo());
                shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE);
                InnerSuhttleExtend extend = new InnerSuhttleExtend();
                shuttleProtocol.setExtend(extend);
            }
            //----------读取四向穿梭车状态-----------
            DeviceMsgUtils deviceMsgUtils = null;
            try {
                deviceMsgUtils = SpringUtils.getBean(DeviceMsgUtils.class);
            }catch (Exception e){
            }
            if(deviceMsgUtils == null){
                return;
            }
            NyShuttleHttpCommand readStatusCommand = getReadStatusCommand(deviceConfig.getDeviceNo());
            //指令超过2条,不再下发任务状态请求
            TreeSet<String> deviceCommandMsgListKey = deviceMsgUtils.getDeviceCommandMsgListKey(SlaveType.Shuttle, deviceConfig.getDeviceNo());
            if (deviceCommandMsgListKey.size() < 2) {
                if ((System.currentTimeMillis() - requestReadTime) > 500) {
                    requestCommand(readStatusCommand);//请求状态
                    requestReadTime = System.currentTimeMillis();
                }
            }
            if (this.socketReadResults.isEmpty()) {
                if (System.currentTimeMillis() - shuttleProtocol.getLastOnlineTime() > 1000 * 60) {
                    //最后一次上线时间超过60s,认定离线
                    this.shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.OFFLINE);
                }
                return;
            }
            JSONObject data = this.socketReadResults.get(0);
            this.socketReadResults.remove(0);
            //----------读取四向穿梭车状态-----------
            //小车设备状态
            shuttleProtocol.setDeviceStatus(data.getInteger("deviceStatus"));
            //小车模式
            shuttleProtocol.setMode(data.getInteger("mode"));
            //当前二维码
            shuttleProtocol.setCurrentCode(data.getString("currentCode"));
            //电池电量
            shuttleProtocol.setBatteryPower(data.getString("batteryPower"));
            //电池电压
            shuttleProtocol.setBatteryVoltage(data.getInteger("batteryVoltage"));
            //故障
            shuttleProtocol.setErrorCode(data.getString("errorCode"));
            //是否顶升
            shuttleProtocol.setHasLift(data.getBoolean("hasLift"));
            //是否有托盘
            shuttleProtocol.setHasPallet(data.getBoolean("hasPallet"));
            //行驶方向
            shuttleProtocol.setRunDirection(data.getString("runDirection"));
            //是否为充电状态
            shuttleProtocol.setHasCharge(data.getBoolean("hasCharge"));
            //运行速度
            shuttleProtocol.setSpeed(data.getInteger("speed"));
            //*********读取扩展字段**********
            JSONObject extendData = data.getJSONObject("extend");
            InnerSuhttleExtend extend = (InnerSuhttleExtend) shuttleProtocol.getExtend();
            //管制状态
            extend.setSuspendState(extendData.getInteger("suspendState"));
            //最高电芯电压(mV)
            extend.setMaxCellVoltage(extendData.getInteger("maxCellVoltage"));
            //最低电芯电压(mV)
            extend.setMinCellVoltage(extendData.getInteger("minCellVoltage"));
            //电池电压
            extend.setVoltage(extendData.getInteger("voltage"));
            //充放电循环次数
            extend.setChargeCycleTimes(extendData.getInteger("chargeCycleTimes"));
            //剩余电量
            extend.setSurplusQuantity(extendData.getInteger("surplusQuantity"));
            //总电量
            extend.setCountQuantity(extendData.getInteger("countQuantity"));
            shuttleProtocol.setExtend(extend);//扩展字段
            //最近一次在线时间
            shuttleProtocol.setLastOnlineTime(System.currentTimeMillis());
            //读取四向穿梭车状态-end
            //小车处于运行中,将标记置为true
            if (shuttleProtocol.getDeviceStatus() == 0) {
                shuttleProtocol.setPakMk(true);
            }
            if (shuttleProtocol.getProtocolStatusType() == null && shuttleProtocol.getDeviceStatus().intValue() == 1) {
                //小车空闲状态、小车任务状态为未知,认定曾离线过,需要复位成空闲
                this.shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE);
            }
            if (shuttleProtocol.getProtocolStatusType().equals(ShuttleProtocolStatusType.OFFLINE) && shuttleProtocol.getDeviceStatus().intValue() == 1) {
                this.shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE);
            }
            this.originDeviceData = data.getString("originDeviceData");
            OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< å®žæ—¶æ•°æ®æ›´æ–°æˆåŠŸ",DateUtils.convert(new Date()), deviceConfig.getDeviceNo()));
        } catch (Exception e) {
            e.printStackTrace();
            OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】四向穿梭车Socket状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), deviceConfig.getDeviceNo(), deviceConfig.getIp(), deviceConfig.getPort()));
        }
    }
    /**
     * ç›‘听小车复位初始化信号
     */
    public void listenInit() {
        try {
            // èŽ·å–æœåŠ¡å™¨å“åº”
            JSONObject result = null;
            int removeIdx = -1;
            JSONObject socketResult = null;
            for (int i = 0; i < socketResults.size(); i++) {
                DeviceMsgModel deviceMsgModel = socketResults.get(i);
                if (!deviceMsgModel.getDeviceMsgType().equals("shuttleInit")) {
                    continue;
                }
                removeIdx = i;
                socketResult = JSON.parseObject(JSON.toJSONString(deviceMsgModel.getDeviceMsg()));
                break;
            }
            if (socketResult == null) {
                return;
            }
            JSONObject resultResponse = JSON.parseObject(socketResult.get("request").toString());
            JSONObject resultHeader = JSON.parseObject(resultResponse.get("header").toString());
            JSONObject resultBody = JSON.parseObject(resultResponse.get("body").toString());
            String requestType = resultBody.getString("requestType");
            Integer requestId = resultHeader.getInteger("requestId");
            if (requestType.equals("init")) {
                socketResults.remove(removeIdx);
                Integer code = resultBody.getInteger("code");
                //小车复位请求
                ShuttleCommand initCommand = getInitCommand(requestId, code);
                //发出请求
                NyShuttleHttpCommand httpCommand = JSON.parseObject(initCommand.getBody(), NyShuttleHttpCommand.class);
                requestCommand(httpCommand);
                log.info(MessageFormat.format("【{0}】四向车复位上报 ===>> [code:{1}] [ip:{2}] [port:{3}]", deviceConfig.getDeviceNo(), code, deviceConfig.getIp(), deviceConfig.getPort()));
                OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】四向车复位上报 ===>> [code:{1}] [ip:{2}] [port:{3}]", deviceConfig.getDeviceNo(), code, deviceConfig.getIp(), deviceConfig.getPort()));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Override
    public ShuttleProtocol getStatus() {
        return getStatus(true);
    }
    @Override
    public ShuttleProtocol getStatus(boolean clone) {
        if (this.shuttleProtocol == null) {
            return null;
        }
        return clone ? this.shuttleProtocol.clone() : this.shuttleProtocol;
    }
    @Override
    public CommandResponse movePath(List<NavigateNode> nodes, Integer taskNo) {
        CommandResponse response = new CommandResponse(true);
        return response;
    }
//    @Override
//    public CommandResponse move(ShuttleCommand command) {
//        CommandResponse response = new CommandResponse(false);
//        try {
//            //发出请求
//            NyShuttleHttpCommand httpCommand = JSON.parseObject(command.getBody(), NyShuttleHttpCommand.class);
//            Map<String, Object> body = httpCommand.getRequest().getBody();
//            Object pathObj = body.get("path");
//            int taskId = Integer.parseInt(body.get("taskId").toString());
//            List<JSONObject> path = JSON.parseArray(JSON.toJSONString(pathObj), JSONObject.class);
//            ArrayList<NyShuttleHttpCommand> commandList = new ArrayList<>();
//            while (!path.isEmpty()) {
//                ArrayList<Map<String, Object>> list = new ArrayList<>();
//                if (path.size() > 10) {
//                    List<JSONObject> subList = path.subList(0, 10);
//                    list.addAll(subList);
//
//                    List<JSONObject> tmp = new ArrayList<>();
//                    for (int i = 10; i < path.size(); i++) {
//                        tmp.add(path.get(i));
//                    }
//                    path = tmp;
//                }else  {
//                    list.addAll(path);
//                    path.clear();
//                }
//
//                NyShuttleHttpCommand httpCommandCopy = JSON.parseObject(JSON.toJSONString(httpCommand), NyShuttleHttpCommand.class);
//                JSONObject bodyCopy = JSON.parseObject(JSON.toJSONString(body));
//
//                NyShuttleHttpCommand.NyRequest request = httpCommandCopy.getRequest();
//                bodyCopy.put("path", list);
//                bodyCopy.put("taskId", taskId++);
//                request.setBody(bodyCopy);
//                httpCommandCopy.setRequest(request);
//
//                commandList.add(httpCommandCopy);//add copy
//            }
//
//            for (NyShuttleHttpCommand requestCommand : commandList) {
//                while (true) {
//                    JSONObject result = requestCommand(requestCommand);
//                    if (result == null) {
////                        return response;//请求失败
//                        continue;//请求失败尝试重新请求
//                    }
//                    this.shuttleProtocol.setSendTime(System.currentTimeMillis());//指令下发时间
//                    response.setMessage(JSON.toJSONString(result));
//                    response.setResult(true);
//                    break;
//                }
//            }
//            return response;
//        } catch (Exception e) {
//            e.printStackTrace();
//            response.setMessage(e.getMessage());
//            return response;
//        }
//    }
    @Override
    public CommandResponse move(ShuttleCommand command) {
        CommandResponse response = new CommandResponse(false);
        try {
            //发出请求
            NyShuttleHttpCommand httpCommand = JSON.parseObject(command.getBody(), NyShuttleHttpCommand.class);
            String resultKey = requestCommand(httpCommand);
            //查询请求结果
            JSONObject result = queryCommandStatus(resultKey);
            if (result == null) {
                return response;//请求失败
            }
            this.shuttleProtocol.setSendTime(System.currentTimeMillis());//指令下发时间
            response.setMessage(JSON.toJSONString(result));
            response.setResult(true);
            return response;
        } catch (Exception e) {
            e.printStackTrace();
            response.setMessage(e.getMessage());
            return response;
        }
    }
    @Override
    public CommandResponse lift(ShuttleCommand command) {
        CommandResponse response = new CommandResponse(false);
        try {
            //发出请求
            NyShuttleHttpCommand httpCommand = JSON.parseObject(command.getBody(), NyShuttleHttpCommand.class);
            String resultKey = requestCommand(httpCommand);
            //查询请求结果
            JSONObject result = queryCommandStatus(resultKey);
            if (result == null) {
                return response;//请求失败
            }
            this.shuttleProtocol.setSendTime(System.currentTimeMillis());//指令下发时间
            response.setMessage(JSON.toJSONString(result));
            response.setResult(true);
            return response;
        } catch (Exception e) {
            e.printStackTrace();
            return response;
        }
    }
    @Override
    public CommandResponse charge(ShuttleCommand command) {
        CommandResponse response = new CommandResponse(false);
        try {
            //发出请求
            NyShuttleHttpCommand httpCommand = JSON.parseObject(command.getBody(), NyShuttleHttpCommand.class);
            String resultKey = requestCommand(httpCommand);
            //查询请求结果
            JSONObject result = queryCommandStatus(resultKey);
            if (result == null) {
                return response;//请求失败
            }
            this.shuttleProtocol.setSendTime(System.currentTimeMillis());//指令下发时间
            response.setMessage(JSON.toJSONString(result));
            response.setResult(true);
            return response;
        } catch (Exception e) {
            e.printStackTrace();
            return response;
        }
    }
    @Override
    public CommandResponse reset(ShuttleCommand command) {
        setSyncTaskNo(0);
        setProtocolStatus(ShuttleProtocolStatusType.IDLE);
        enableMoveLoc(null, false);
        return new CommandResponse(true, JSON.toJSONString(command));
    }
    @Override
    public CommandResponse updateLocation(ShuttleCommand command) {
        CommandResponse response = new CommandResponse(false);
        try {
            //发出请求
            NyShuttleHttpCommand httpCommand = JSON.parseObject(command.getBody(), NyShuttleHttpCommand.class);
            String resultKey = requestCommand(httpCommand);
            //查询请求结果
            JSONObject result = queryCommandStatus(resultKey);
            if (result == null) {
                return response;//请求失败
            }
            this.shuttleProtocol.setSendTime(System.currentTimeMillis());//指令下发时间
            response.setMessage(JSON.toJSONString(result));
            response.setResult(true);
            return response;
        } catch (Exception e) {
            e.printStackTrace();
            return response;
        }
    }
    @Override
    public boolean isIdle() {
        return this.isIdle(null);
    }
    @Override
    public boolean isIdle(ExecuteSupport support) {
        if (null != support) {
            Boolean judgement = support.judgement();
            if (judgement != null && !judgement) {
                return true;
            }
        }
        if (this.shuttleProtocol.getDeviceStatus() == null
                || this.shuttleProtocol.getPakMk() == null
                || this.shuttleProtocol.getErrorCode() == null
                || this.shuttleProtocol.getProtocolStatus() == null
                || this.shuttleProtocol.getMode() == null
                || this.shuttleProtocol.getExtend() == null
        ) {
            return false;
        }
        InnerSuhttleExtend extend = (InnerSuhttleExtend) this.shuttleProtocol.getExtend();
        boolean res = this.shuttleProtocol.getDeviceStatus() == 1
                && this.shuttleProtocol.getMode() == 1
                && this.shuttleProtocol.getPakMk()
                && this.shuttleProtocol.getErrorCode().equals("0")
                && this.shuttleProtocol.getTaskNo() == 0
                && (this.shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.IDLE.id
                || this.shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.WAITING.id
                || this.shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.CHARGING_WAITING.id)
                && extend.getSuspendState() == 0;
        return res;
    }
    @Override
    public boolean isDeviceIdle() {
        return isDeviceIdle(null);
    }
    @Override
    public boolean isDeviceIdle(ExecuteSupport support) {
        if (null != support) {
            Boolean judgement = support.judgement();
            if (judgement != null && !judgement) {
                return true;
            }
        }
        if (this.shuttleProtocol.getDeviceStatus() == null
                || this.shuttleProtocol.getPakMk() == null
                || this.shuttleProtocol.getErrorCode() == null
                || this.shuttleProtocol.getMode() == null
                || this.shuttleProtocol.getExtend() == null
        ) {
            return false;
        }
        InnerSuhttleExtend extend = (InnerSuhttleExtend) this.shuttleProtocol.getExtend();
        boolean res = this.shuttleProtocol.getDeviceStatus() == 1
                && this.shuttleProtocol.getMode() == 1
                && this.shuttleProtocol.getPakMk()
                && this.shuttleProtocol.getErrorCode().equals("0")
                && extend.getSuspendState() == 0
                ;
        return res;
    }
    @Override
    public ShuttleRequireChargeType isRequireCharge() {
        if (this.shuttleProtocol.getDeviceStatus() == null
                || this.shuttleProtocol.getPakMk() == null
                || this.shuttleProtocol.getErrorCode() == null
                || this.shuttleProtocol.getProtocolStatus() == null
                || this.shuttleProtocol.getMode() == null
                || this.shuttleProtocol.getExtend() == null
        ) {
            return ShuttleRequireChargeType.NONE;
        }
        InnerSuhttleExtend extend = (InnerSuhttleExtend) this.shuttleProtocol.getExtend();
        boolean res = this.shuttleProtocol.getDeviceStatus() == 1
                && this.shuttleProtocol.getMode() == 1
                && this.shuttleProtocol.getPakMk()
                && this.shuttleProtocol.getErrorCode().equals("0")
                && this.shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.IDLE.id
                && extend.getSuspendState() == 0
                ;
        if (!res) {
            return ShuttleRequireChargeType.NONE;
        } else {
            // ç”µé‡å°äºŽé˜ˆå€¼éœ€è¦è¿›è¡Œå……电
            try {
                BasShuttleService shuttleService = SpringUtils.getBean(BasShuttleService.class);
                if (shuttleService == null) {
                    return ShuttleRequireChargeType.NONE;
                }
                BasShuttle basShuttle = shuttleService.selectOne(new EntityWrapper<BasShuttle>().eq("shuttle_no", deviceConfig.getDeviceNo()));
                if (basShuttle == null) {
                    return ShuttleRequireChargeType.NONE;
                }
                Integer chargeLine = basShuttle.getChargeLine();
                if (chargeLine == null) {
                    return ShuttleRequireChargeType.NONE;
                }
                boolean chargeResult = Integer.valueOf(this.shuttleProtocol.getBatteryPower()) < chargeLine;
                if (chargeResult) {
                    return ShuttleRequireChargeType.FORCE_CHARGE;//需要强制充电
                }
                Integer suggestChargeLine = basShuttle.getSuggestChargeLine();
                if (suggestChargeLine == null) {
                    return ShuttleRequireChargeType.NONE;
                }
                boolean suggestChargeResult = Integer.valueOf(this.shuttleProtocol.getBatteryPower()) < suggestChargeLine;
                if (suggestChargeResult) {
                    return ShuttleRequireChargeType.SUGGEST_CHARGE;//建议充电
                }
                return ShuttleRequireChargeType.NONE;
            } catch (Exception e) {
                return ShuttleRequireChargeType.NONE;
            }
        }
    }
    @Override
    public boolean isCharging() {
        if (this.shuttleProtocol.getDeviceStatus() == null || this.shuttleProtocol.getHasCharge() == null) {
            return false;
        }
        if (this.shuttleProtocol.getDeviceStatus() == 0 && this.shuttleProtocol.getHasCharge()) {
            //运行中 && å……电中
            return true;
        }
        return false;
    }
    @Override
    public boolean isChargingCompleted() {
        Integer maxPower = 100;
        ConfigService configService = SpringUtils.getBean(ConfigService.class);
        if (configService != null) {
            Config chargeMaxValue = configService.selectOne(new EntityWrapper<Config>()
                    .eq("code", "chargeMaxValue")
                    .eq("status", 1));
            if (chargeMaxValue != null) {
                maxPower = Integer.parseInt(chargeMaxValue.getValue());
            }
        }
        //***************判断是否满充校准***************
        Config shuttleMaxPowerVerifyConfig = configService.selectOne(new EntityWrapper<Config>()
                .eq("code", "shuttleMaxPowerVerify")
                .eq("status", 1));
        if (shuttleMaxPowerVerifyConfig != null) {
            if (shuttleMaxPowerVerifyConfig.getValue().equals("true")) {
                if (this.shuttleProtocol.getBatteryPower() == null) {
                    return false;
                }
                if (this.shuttleProtocol.getBatteryVoltage() < 5630) {
                    return false;//电压不够继续充电
                }
            }
        }
        //***************判断是否满充校准***************
        if (this.shuttleProtocol.getHasCharge() == null) {
            return false;
        }
        if (this.shuttleProtocol.getBatteryPower() == null) {
            return false;
        }
        if (!this.shuttleProtocol.getHasCharge()) {
            return false;
        }
        if (Integer.valueOf(this.shuttleProtocol.getBatteryPower()) >= maxPower) {
            return true;
        }
        return false;
    }
    @Override
    public boolean isFault() {
        if (this.shuttleProtocol.getErrorCode() == null
                || this.shuttleProtocol.getMode() == null
                || this.shuttleProtocol.getExtend() == null
        ) {
            return false;
        }
        if (this.shuttleProtocol.getMode() == 0) {
            return true;
        }
        if (!this.shuttleProtocol.getErrorCode().equals("0")) {
            return true;
        }
        InnerSuhttleExtend extend = (InnerSuhttleExtend) this.shuttleProtocol.getExtend();
        if (extend.getSuspendState() == 1) {
            return true;
        }
        return false;
    }
    @Override
    public List<NavigateNode> getMoveAdvancePath() {
        ObjectMapper objectMapper = SpringUtils.getBean(ObjectMapper.class);
        NavigateMapData navigateMapData = SpringUtils.getBean(NavigateMapData.class);
        ArrayList<NavigateNode> path = new ArrayList<>();
        if (shuttleProtocol.getTaskNo() != 0) {
            //存在任务,获取指令
            Object object = redisUtil.get(RedisKeyType.SHUTTLE_WORK_FLAG.key + shuttleProtocol.getTaskNo());
            if (object != null) {
                ShuttleRedisCommand redisCommand = null;
                try {
                    redisCommand = objectMapper.readValue(String.valueOf(object), ShuttleRedisCommand.class);
                } catch (IOException e) {
                    return path;
                }
                List<NavigateNode> nodes = redisCommand.getAssignCommand().getNodes();//穿梭车预计路径
                if (nodes == null) {
                    return path;
                }
                if (!nodes.isEmpty()) {
                    path.addAll(nodes);
                }
                NavigateNode navigateNode = path.get(0);
                int lev = navigateNode.getZ();
                //将路径锁与小车路径进行匹配
                ArrayList<NavigateNode> tmp = new ArrayList<>();
                //检测路径是否被锁定
                int[][] map = navigateMapData.getDataFromRedis(lev, NavigationMapType.getDfxWithDevice(), null, null);
                for (NavigateNode node : path) {
                    if(map[node.getX()][node.getY()] == -999) {
                        tmp.add(node);
                    }
                }
                path = tmp;
            }
        }
        return path;
    }
    @Override
    public int generateDeviceTaskNo(int taskNo, ShuttleTaskNoType type) {
        return taskNo;
    }
    @Override
    public synchronized boolean setProtocolStatus(ShuttleProtocolStatusType status) {
        if (status.equals(ShuttleProtocolStatusType.IDLE)) {
            this.shuttleProtocol.setIdleTime(System.currentTimeMillis());
        }
        this.shuttleProtocol.setProtocolStatus(status);
        return true;
    }
    @Override
    public synchronized boolean setTaskNo(Integer taskNo) {
        redisUtil.set(RedisKeyType.SHUTTLE_FLAG.key + shuttleProtocol.getShuttleNo(), taskNo);
        this.shuttleProtocol.setTaskNo(taskNo);
        return true;
    }
    @Override
    public synchronized boolean setSyncTaskNo(Integer taskNo) {
        redisUtil.setSync(RedisKeyType.SHUTTLE_FLAG.key + shuttleProtocol.getShuttleNo(), taskNo);
        this.shuttleProtocol.setTaskNo(taskNo);
        return true;
    }
    @Override
    public synchronized boolean setPakMk(boolean pakMk) {
        this.shuttleProtocol.setPakMk(pakMk);
        return true;
    }
    @Override
    public boolean enableMoveLoc(ShuttleMoveLocParam param, boolean enable) {
        if (enable) {
            shuttleProtocol.setMoveLoc(true);//开启跑库
            shuttleProtocol.setMoveType(param.getMoveType());
            shuttleProtocol.setXStart(param.getStartX());
            shuttleProtocol.setXTarget(param.getTargetX());
            shuttleProtocol.setXCurrent(param.getStartX());
            shuttleProtocol.setYStart(param.getStartY());
            shuttleProtocol.setYTarget(param.getTargetY());
            shuttleProtocol.setYCurrent(param.getStartY());
        }else {
            shuttleProtocol.setMoveLoc(false);
            shuttleProtocol.setMoveType(0);
            shuttleProtocol.setXStart(0);
            shuttleProtocol.setXTarget(0);
            shuttleProtocol.setXCurrent(0);
            shuttleProtocol.setYStart(0);
            shuttleProtocol.setYTarget(0);
            shuttleProtocol.setYCurrent(0);
        }
        return true;
    }
    @Override
    public boolean requestWaiting() {
        if (this.shuttleProtocol.getProtocolStatusType().equals(ShuttleProtocolStatusType.IDLE)) {
            this.shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.WAITING);
            return true;
        }
        return false;
    }
    @Override
    public boolean enableDemo(boolean enable) {
        shuttleProtocol.setDemo(enable);
        return true;
    }
    @Override
    public boolean offerSystemMsg(String format, Object... arguments) {
        String msg = News.replace(format, arguments);
        shuttleProtocol.setSystemMsg(msg);
        return true;
    }
    @Override
    public boolean setTrafficControl(boolean enable, List<NavigateNode> nodeList) {
        shuttleProtocol.setTrafficControl(enable);
        shuttleProtocol.setTrafficControlNodes(nodeList);
        return true;
    }
    @Override
    public void updateDeviceDataLogTime(long time) {
        shuttleProtocol.setDeviceDataLog(time);
    }
    @Override
    public JSONObject parseStatusToMsg(ShuttleProtocol shuttleProtocol) {
        JSONObject result = new JSONObject();
        result.put("msgType", "responseMsg");
        result.put("robotId", 5002);
        JSONObject header = new JSONObject();
        header.put("responseId", 5005631);
        header.put("version", "RGV-APP-F427-N24036-1112");
        JSONObject body = new JSONObject();
        body.put("responseType", "state");
        return null;
    }
    @Override
    public boolean restartCalcPath() {
        ConfigService configService = SpringUtils.getBean(ConfigService.class);
        if (configService == null) {
            return false;
        }
        ShuttleAction shuttleAction = SpringUtils.getBean(ShuttleAction.class);
        if (shuttleAction == null) {
            return false;
        }
        ShuttleOperaUtils shuttleOperaUtils = SpringUtils.getBean(ShuttleOperaUtils.class);
        if (shuttleOperaUtils == null) {
            return false;
        }
        ObjectMapper objectMapper = SpringUtils.getBean(ObjectMapper.class);
        if (objectMapper == null) {
            return false;
        }
        boolean trafficControlRestartCalcPath = false;
        Config trafficControlRestartCalcPathConfig = configService.selectOne(new EntityWrapper<Config>()
                .eq("code", "trafficControlRestartCalcPath")
        );
        if(trafficControlRestartCalcPathConfig != null) {
            trafficControlRestartCalcPath = trafficControlRestartCalcPathConfig.getValue().equals("Y") ? true : false;
        }
        if (!trafficControlRestartCalcPath) {
            return false;
        }
        if (shuttleProtocol.getTaskNo() == 0) {
            return false;
        }
        if (!this.isDeviceIdle()) {
            return false;
        }
        Object object = redisUtil.get(RedisKeyType.SHUTTLE_RESTART_CALC_PATH.key + shuttleProtocol.getShuttleNo());
        if (object != null) {
            return false;
        }
        Integer taskNo = shuttleProtocol.getTaskNo();
        Object obj = redisUtil.get(RedisKeyType.SHUTTLE_WORK_FLAG.key + taskNo);
        if (obj == null) {
            return false;
        }
        ShuttleRedisCommand redisCommand = null;
        try {
            redisCommand = objectMapper.readValue(String.valueOf(obj), ShuttleRedisCommand.class);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        if (redisCommand == null) {
            return false;
        }
        ShuttleAssignCommand assignCommand = redisCommand.getAssignCommand();
        String locNo = assignCommand.getLocNo();
        List<NavigationMapType> mapTypes = assignCommand.getMapTypes();
        if (locNo == null) {
            return false;
        }
        if (mapTypes == null) {
            return false;
        }
        List<NavigationMapType> restartCalcMapTypes = new ArrayList<>(mapTypes);
        restartCalcMapTypes.add(NavigationMapType.SHUTTLE);
        if (assignCommand.getTaskMode() == ShuttleTaskModeType.TRANSPORT.id) {
            restartCalcMapTypes.add(NavigationMapType.DFX);
        }
        String currentLocNo = shuttleProtocol.getCurrentLocNo();
        List<ShuttleCommand> commands = shuttleOperaUtils.getStartToTargetCommands(currentLocNo, locNo, restartCalcMapTypes, assignCommand, this);
        if (commands == null) {
            return false;
        }
        if (assignCommand.getTaskMode() == ShuttleTaskModeType.TRANSPORT.id) {
            List<ShuttleCommand> originCommands = assignCommand.getCommands();
            if (originCommands == null) {
                return false;
            }
            ShuttleCommand firstCommand = originCommands.get(0);
            ShuttleCommand endCommand = originCommands.get(originCommands.size() - 1);
            if (firstCommand.getMode() != ShuttleCommandModeType.PALLET_LIFT.id) {
                return false;
            }
            if (endCommand.getMode() != ShuttleCommandModeType.PALLET_DOWN.id) {
                return false;
            }
            commands.add(0, firstCommand);
            commands.add(endCommand);
        }
        assignCommand.setCommands(commands);
        //下发任务
        shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand);
        redisUtil.set(RedisKeyType.SHUTTLE_RESTART_CALC_PATH.key + shuttleProtocol.getShuttleNo(), true, 60);
        return true;
    }
    @Override
    public ShuttleCommand getMoveCommand(Integer taskNo, String startCodeNum, String distCodeNum, Integer allDistance, Integer runDirection, Integer runSpeed, List<NavigateNode> nodes, Boolean shuttleDirectionReverse) {
        NavigateMapData navigateMapData = SpringUtils.getBean(NavigateMapData.class);
        NyShuttleHttpCommand httpStandard = getHttpStandard(deviceConfig.getDeviceNo(), taskNo);
        NyShuttleHttpCommand.NyRequest request = httpStandard.getRequest();
        ArrayList<HashMap<String, Object>> path = new ArrayList<>();
        Integer taskId = getTaskId();
        HashMap<String, Object> body = new HashMap<>();
        body.put("requestType", "move");//移动命令
        body.put("taskId", taskId);//TaskID需要随机
        body.put("path", path);
        request.setBody(body);
        NavigateNode startNode = nodes.get(0);
        List<List<MapNode>> mapData = navigateMapData.getJsonData(startNode.getZ(), NavigationMapType.getMapTypes(NavigationMapType.NONE), null, null);
        for (NavigateNode node : nodes) {
            HashMap<String, Object> data = new HashMap<>();
            String codeNum = NavigatePositionConvert.xyToPosition(node.getX(), node.getY(), node.getZ());
            Map<String, Object> nyNode = navigateNodeToNyPointNode(NavigatePositionConvert.codeToNode(codeNum));
            int xp = Integer.parseInt(String.valueOf(nyNode.get("x")));
            int yp = Integer.parseInt(String.valueOf(nyNode.get("y")));
            if (shuttleDirectionReverse) {
                xp = Integer.parseInt(String.valueOf(nyNode.get("y")));
                yp = Integer.parseInt(String.valueOf(nyNode.get("x")));
            }
            int z = Integer.parseInt(String.valueOf(nyNode.get("z")));
            List<MapNode> mapNodes = mapData.get(node.getX());
            MapNode mapNode = mapNodes.get(node.getY());
            data.put("xp", xp);
            data.put("yp", yp);
            data.put("z", z);
            data.put("x", mapNode.getXBase());
            data.put("y", mapNode.getYBase());
            path.add(data);
        }
        httpStandard.setRequest(request);
        Object object = redisUtil.get(RedisKeyType.LOC_MAP.key);
        HashMap<String, String> locMap = (HashMap<String, String>) object;
        String targetLocNo = locMap.get(distCodeNum);
        ShuttleCommand command = new ShuttleCommand();
        command.setShuttleNo(deviceConfig.getDeviceNo());
        command.setBody(JSON.toJSONString(httpStandard));
        command.setMode(ShuttleCommandModeType.MOVE.id);
        command.setTargetLocNo(targetLocNo);
        command.setTaskNo(taskId);
        return command;
    }
    @Override
    public ShuttleCommand getMoveLiftCommand(Integer taskNo, String startCodeNum, String distCodeNum, Integer allDistance, Integer runDirection, Integer runSpeed, List<NavigateNode> nodes, Boolean moveIn, Boolean shuttleDirectionReverse) {
        NavigateMapData navigateMapData = SpringUtils.getBean(NavigateMapData.class);
        NyShuttleHttpCommand httpStandard = getHttpStandard(deviceConfig.getDeviceNo(), taskNo);
        NyShuttleHttpCommand.NyRequest request = httpStandard.getRequest();
        ArrayList<HashMap<String, Object>> path = new ArrayList<>();
        Integer taskId = getTaskId();
        HashMap<String, Object> body = new HashMap<>();
//        if (moveIn) {
//            body.put("requestType", "intoLift");//进提升机
//        } else {
//            body.put("requestType", "outLift");//出提升机
//        }
        body.put("requestType", "move");//移动命令
        body.put("taskId", taskId);//TaskID需要随机
        body.put("path", path);
        request.setBody(body);
        NavigateNode startNode = nodes.get(0);
        List<List<MapNode>> mapData = navigateMapData.getJsonData(startNode.getZ(), NavigationMapType.getMapTypes(NavigationMapType.NONE), null, null);
        for (NavigateNode node : nodes) {
            HashMap<String, Object> data = new HashMap<>();
            String codeNum = NavigatePositionConvert.xyToPosition(node.getX(), node.getY(), node.getZ());
            Map<String, Object> nyNode = navigateNodeToNyPointNode(NavigatePositionConvert.codeToNode(codeNum));
            int xp = Integer.parseInt(String.valueOf(nyNode.get("x")));
            int yp = Integer.parseInt(String.valueOf(nyNode.get("y")));
            if (shuttleDirectionReverse) {
                xp = Integer.parseInt(String.valueOf(nyNode.get("y")));
                yp = Integer.parseInt(String.valueOf(nyNode.get("x")));
            }
            int z = Integer.parseInt(String.valueOf(nyNode.get("z")));
            List<MapNode> mapNodes = mapData.get(node.getX());
            MapNode mapNode = mapNodes.get(node.getY());
            data.put("xp", xp);
            data.put("yp", yp);
            data.put("z", z);
            data.put("x", mapNode.getXBase());
            data.put("y", mapNode.getYBase());
            path.add(data);
        }
        httpStandard.setRequest(request);
        Object object = redisUtil.get(RedisKeyType.LOC_MAP.key);
        HashMap<String, String> locMap = (HashMap<String, String>) object;
        String targetLocNo = locMap.get(distCodeNum);
        ShuttleCommand command = new ShuttleCommand();
        command.setShuttleNo(deviceConfig.getDeviceNo());
        command.setBody(JSON.toJSONString(httpStandard));
        command.setMode(ShuttleCommandModeType.MOVE.id);
        command.setTargetLocNo(targetLocNo);
        command.setTaskNo(taskId);
        return command;
    }
    @Override
    public ShuttleCommand getLiftCommand(Integer taskNo, Boolean lift) {
        NyShuttleHttpCommand httpStandard = getHttpStandard(deviceConfig.getDeviceNo(), taskNo);
        NyShuttleHttpCommand.NyRequest request = httpStandard.getRequest();
        Integer taskId = getTaskId();//TaskID需要随机
        HashMap<String, Object> body = new HashMap<>();
        body.put("requestType", lift ? "liftUp" : "liftDown");//顶升或下降命令
        body.put("taskId", taskId);
        request.setBody(body);
        httpStandard.setRequest(request);
        ShuttleCommand command = new ShuttleCommand();
        command.setShuttleNo(deviceConfig.getDeviceNo());
        command.setBody(JSON.toJSONString(httpStandard));
        command.setMode(lift ? ShuttleCommandModeType.PALLET_LIFT.id : ShuttleCommandModeType.PALLET_DOWN.id);
        command.setTaskNo(taskId);
        return command;
    }
    @Override
    public ShuttleCommand getChargeCommand(Integer taskNo, Boolean charge) {
        NyShuttleHttpCommand httpStandard = getHttpStandard(deviceConfig.getDeviceNo(), taskNo);
        NyShuttleHttpCommand.NyRequest request = httpStandard.getRequest();
        Integer taskId = getTaskId();//TaskID需要随机
        HashMap<String, Object> body = new HashMap<>();
        body.put("requestType", charge ? "charge" : "stopCharge");//充电或停止充电
        body.put("taskId", taskId);
        request.setBody(body);
        httpStandard.setRequest(request);
        ShuttleCommand command = new ShuttleCommand();
        command.setShuttleNo(deviceConfig.getDeviceNo());
        command.setBody(JSON.toJSONString(httpStandard));
        command.setMode(charge ? ShuttleCommandModeType.CHARGE_OPEN.id : ShuttleCommandModeType.CHARGE_CLOSE.id);
        command.setTaskNo(taskId);
        return command;
    }
    @Override
    public ShuttleCommand getUpdateLocationCommand(Integer taskNo, String locNo) {
        NyShuttleHttpCommand httpStandard = getHttpStandard(deviceConfig.getDeviceNo(), taskNo);
        NyShuttleHttpCommand.NyRequest request = httpStandard.getRequest();
        HashMap<String, Object> body = new HashMap<>();
        body.put("requestType", "updateFloor");//更新层Z
        body.put("z", Utils.getLev(locNo));//坐标Z
        request.setBody(body);
        httpStandard.setRequest(request);
        ShuttleCommand command = new ShuttleCommand();
        command.setShuttleNo(deviceConfig.getDeviceNo());
        command.setBody(JSON.toJSONString(httpStandard));
        command.setMode(ShuttleCommandModeType.UPDATE_LOCATION.id);
        command.setTaskNo(taskNo);
        return command;
    }
    //获取小车复位响应命令
    public ShuttleCommand getInitCommand(Integer taskNo, Integer code) {
        NavigateMapData navigateMapData = SpringUtils.getBean(NavigateMapData.class);
        NyShuttleHttpCommand httpStandard = getHttpStandard(deviceConfig.getDeviceNo(), taskNo);
        NyShuttleHttpCommand.NyRequest request = httpStandard.getRequest();
        //code -> {Integer@13781} 1101101
        int lev = code % 100;
        int bay = code / 100 % 1000;
        int row = code / 100000;
        HashMap<String, Object> map = new HashMap<>();
        map.put("x", row);
        map.put("y", bay);
        map.put("z", lev);
        String mapStr = JSON.toJSONString(map);
        Object object = redisUtil.get(RedisKeyType.LOC_MAP.key);
        HashMap<String, String> locMap = (HashMap<String, String>) object;
        String targetLocNo = locMap.get(mapStr);
        List<List<MapNode>> mapData = navigateMapData.getJsonData(lev, NavigationMapType.getMapTypes(NavigationMapType.NONE), null, null);
        List<MapNode> mapNodes = mapData.get(Utils.getRow(targetLocNo));
        MapNode mapNode = mapNodes.get(Utils.getBay(targetLocNo));
        HashMap<String, Object> location = new HashMap<>();
        location.put("xp", row);
        location.put("yp", bay);
        location.put("z", lev);
        location.put("x", mapNode.getXBase());
        location.put("y", mapNode.getYBase());
        HashMap<String, Object> body = new HashMap<>();
        body.put("responseType", "init");//复位
        body.put("location", location);//初始化坐标
        body.put("devicePoints", new ArrayList<>());//提升机点位
        body.put("specialPoints", new ArrayList<>());//特殊条码坐标
        request.setBody(body);
        httpStandard.setRequest(request);
        ShuttleCommand command = new ShuttleCommand();
        command.setShuttleNo(deviceConfig.getDeviceNo());
        command.setBody(JSON.toJSONString(httpStandard));
        command.setMode(ShuttleCommandModeType.RESET.id);
        command.setTaskNo(taskNo);
        return command;
    }
    @Override
    public boolean connect() {
        return true;
        return false;
    }
    @Override
@@ -1237,178 +17,8 @@
    }
    //获取HTTP请求标准结构体
    private NyShuttleHttpCommand getHttpStandard(Integer shuttleNo, Integer taskNo) {
        NyShuttleHttpCommand httpStandard = new NyShuttleHttpCommand();
        httpStandard.setMsgType("requestMsg");//请求消息
        httpStandard.setRobotId(shuttleNo);//车辆编号
        httpStandard.setTaskNo(taskNo);//工作号
        //设置请求消息
        NyShuttleHttpCommand.NyRequest request = new NyShuttleHttpCommand.NyRequest();
        NyShuttleHttpCommand.NyRequest.NyHeader header = new NyShuttleHttpCommand.NyRequest.NyHeader();
        header.setVersion("1.0");//版本号
        header.setRequestId(getRequestId());//消息编号
        //设置请求头
        request.setHeader(header);
        httpStandard.setRequest(request);
        return httpStandard;
    }
    //获取请求编号
    private Integer getRequestId() {
        Random random = new Random();
        return random.nextInt(9999999);
    }
    //获取TaskId
    private static Integer getTaskId() {
        Random random = new Random();
        return random.nextInt(999999);
    }
    //获取读FAS状态信息命令
    private NyShuttleHttpCommand getReadStatusCommand(Integer shuttleNo) {
        NyShuttleHttpCommand httpStandard = getHttpStandard(shuttleNo, 9999);
        NyShuttleHttpCommand.NyRequest request = httpStandard.getRequest();
        HashMap<String, Object> body = new HashMap<>();
        body.put("requestType", "readState");//读FAS状态信息
        request.setBody(body);
        httpStandard.setRequest(request);
        return httpStandard;
    }
    //发出请求
    private String requestCommand(NyShuttleHttpCommand httpCommand) throws IOException {
        try {
            DeviceMsgUtils deviceMsgUtils = SpringUtils.getBean(DeviceMsgUtils.class);
            if (deviceMsgUtils == null) {
                return null;
            }
            //压缩数据包
            JSONObject data = JSON.parseObject(JSON.toJSONString(httpCommand));
            data.remove("nodes");
            DeviceCommandMsgModel commandMsgModel = new DeviceCommandMsgModel();
            commandMsgModel.setDeviceId(deviceConfig.getDeviceNo());
            commandMsgModel.setDeviceType(String.valueOf(SlaveType.Shuttle));
            commandMsgModel.setCommand(data);
            String key = deviceMsgUtils.sendDeviceCommand(SlaveType.Shuttle, deviceConfig.getDeviceNo(), commandMsgModel);
            return key;
        }catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    private JSONObject queryCommandStatus(String resultKey) {
        // èŽ·å–æœåŠ¡å™¨å“åº”
        JSONObject result = null;
        long startTime = System.currentTimeMillis();
        while (true) {
            if((System.currentTimeMillis() - startTime) > 1000 * 10) {
                break;
            }
            result = getRequestBody(resultKey);
            if (result == null) {
                continue;
            }else {
                break;
            }
        }
        return result;
    }
    private JSONObject filterBodyData(JSONObject data) {
        Object response = data.get("response");
        if (response == null) {
            return null;
        }
        JSONObject result = JSON.parseObject(response.toString());
        Object body = result.get("body");
        if (body == null) {
            return null;
        }
        JSONObject jsonBody = JSON.parseObject(body.toString());
        return jsonBody;
    }
    //地图节点转换牛眼节点
    private static Map<String, Object> navigateNodeToNyPointNode(NavigateNode node) {
        int[] NyPosition = WCSXyzToNyXyz(node.getX(), node.getY(), node.getZ());//WCS系统坐标转牛眼坐标
        HashMap<String, Object> point = new HashMap<>();
        point.put("x", NyPosition[0]);
        point.put("y", NyPosition[1]);
        point.put("z", NyPosition[2]);
        return point;
    }
    //WCS系统坐标转牛眼坐标
    private static int[] WCSXyzToNyXyz(int x, int y, int z) {
        LocMastService locMastService = SpringUtils.getBean(LocMastService.class);
        LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>()
                .eq("row1", x)
                .eq("bay1", y)
                .eq("lev1", z)
                .eq("status", 1));
        if (locMast == null) {
            return null;
        }
        String qrCodeValue = locMast.getQrCodeValue();
        JSONObject data = JSON.parseObject(qrCodeValue);
        return new int[]{data.getInteger("x"), data.getInteger("y"), z};
    }
    @Override
    public Object getOriginDeviceData() {
        return this.originDeviceData;
    }
    @Data
    private class InnerSuhttleExtend {
        /**
         * ç®¡åˆ¶çŠ¶æ€ä¸åœ¨ç®¡åˆ¶ä¸‹/被管制中
         * 0/1
         */
        private Integer suspendState;
        /**
         * æœ€é«˜ç”µèŠ¯ç”µåŽ‹(mV)
         */
        private Integer maxCellVoltage;
        /**
         * æœ€ä½Žç”µèŠ¯ç”µåŽ‹(mV),低于2900mv需要立即充电
         */
        private Integer minCellVoltage;
        /**
         * ç”µæ± ç”µåŽ‹ï¼ˆmV)
         */
        private Integer voltage;
        /**
         * å……放电循环次数
         */
        private Integer chargeCycleTimes;
        /**
         * å‰©ä½™ç”µé‡/10(A)
         */
        private Integer surplusQuantity;
        /**
         * æ€»ç”µé‡/10(A)
         */
        private Integer countQuantity;
    public void run() {
    }
}
src/main/java/com/zy/core/thread/impl/NyShuttleThread2.java
File was deleted
src/main/java/com/zy/core/thread/impl/TrafficControlImplThread.java
File was deleted
src/main/java/com/zy/core/thread/impl/ZyForkLiftThread.java
File was deleted
src/main/java/com/zy/core/thread/impl/ZyForkLiftThread2.java
File was deleted
src/main/java/com/zy/core/utils/DeviceMsgUtils.java
File was deleted
src/main/java/com/zy/core/utils/TrafficControlUtils.java
File was deleted
src/main/resources/application.yml
@@ -43,13 +43,6 @@
swagger:
  enable: false
pythonCalcPath: D:\\path\\cpu.py
pythonCalcSimilarity: D:\\path\\similarity.py
deviceMsgConfig:
  # è¯»å–数据后自动删除
  destroyAfterReading: true
deviceExecuteConfig:
  # æ¯ä¸ªçº¿ç¨‹ç®¡æŽ§è®¾å¤‡æ‰§è¡Œæ•°é‡
  threadControlCount: 10
src/main/resources/docs/̨ÉýËÄÏò¿âWCSÓë»õ²æÌáÉý»úPLCͨѶ½Ó¿ÚЭÒé1.0.docx
Binary files differ
src/main/resources/docs/̨ÉýËÄÏò¿âWCSÓë»õ²æÌáÉý»úPLCͨѶ½Ó¿ÚЭÒé1.1.docx
Binary files differ
src/main/resources/docs/ËÄÏò³µ»õ²æÊ½ÌáÉý»úWCS½Ó¿ÚV1.0.docx
Binary files differ
src/main/resources/docs/ËÄÏò³µ»õ²æÊ½ÌáÉý»úWCS½Ó¿ÚV1.1.docx
Binary files differ
src/main/resources/docs/ËÄÏò³µ»õ²æÊ½ÌáÉý»úWCS½Ó¿ÚV1.2.docx
Binary files differ
src/main/resources/docs/ËÄÏò³µ»õ²æÊ½ÌáÉý»úWCS½Ó¿ÚV1.3.docx
Binary files differ
src/main/resources/docs/ËÄÏò³µ»õ²æÊ½ÌáÉý»úWCS½Ó¿ÚV1.4.docx
Binary files differ
src/main/resources/map/qlsxk_map.xlsx
Binary files differ
src/main/resources/mapper/BasCrnpErrLogMapper.xml
New file
@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zy.asrs.mapper.BasCrnpErrLogMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasCrnpErrLog">
        <id column="id" property="id" />
        <result column="wrk_no" property="wrkNo" />
        <result column="start_time" property="startTime" />
        <result column="end_time" property="endTime" />
        <result column="wrk_sts" property="wrkSts" />
        <result column="io_type" property="ioType" />
        <result column="crn_no" property="crnNo" />
        <result column="loc_no" property="locNo" />
        <result column="sta_no" property="staNo" />
        <result column="source_sta_no" property="sourceStaNo" />
        <result column="source_loc_no" property="sourceLocNo" />
        <result column="barcode" property="barcode" />
        <result column="err_code" property="errCode" />
        <result column="error" property="error" />
        <result column="status" property="status" />
        <result column="create_time" property="createTime" />
        <result column="create_by" property="createBy" />
        <result column="update_time" property="updateTime" />
        <result column="update_by" property="updateBy" />
        <result column="memo" property="memo" />
        <result column="system_status" property="systemStatus" />
    </resultMap>
</mapper>
src/main/resources/mapper/BasCrnpErrMapper.xml
New file
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zy.asrs.mapper.BasCrnpErrMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasCrnpErr">
        <id column="id" property="id" />
        <result column="error_code" property="errorCode" />
        <result column="err_name" property="errName" />
        <result column="modi_user" property="modiUser" />
        <result column="modi_time" property="modiTime" />
        <result column="appe_user" property="appeUser" />
        <result column="appe_time" property="appeTime" />
    </resultMap>
</mapper>
src/main/resources/mapper/BasCrnpMapper.xml
New file
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zy.asrs.mapper.BasCrnpMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasCrnp">
        <id column="crn_no" property="crnNo" />
        <result column="status" property="status" />
        <result column="wrk_no" property="wrkNo" />
        <result column="in_enable" property="inEnable" />
        <result column="out_enable" property="outEnable" />
        <result column="create_by" property="createBy" />
        <result column="create_time" property="createTime" />
        <result column="update_by" property="updateBy" />
        <result column="update_time" property="updateTime" />
        <result column="memo" property="memo" />
    </resultMap>
</mapper>
src/main/resources/mapper/BasCrnpOptMapper.xml
New file
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zy.asrs.mapper.BasCrnpOptMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasCrnpOpt">
        <id column="id" property="id" />
        <result column="wrk_no" property="wrkNo" />
        <result column="crn_no" property="crnNo" />
        <result column="send_time" property="sendTime" />
        <result column="mode" property="mode" />
        <result column="source_loc_no" property="sourceLocNo" />
        <result column="target_loc_no" property="targetLocNo" />
        <result column="update_time" property="updateTime" />
        <result column="update_by" property="updateBy" />
        <result column="memo" property="memo" />
        <result column="command" property="command" />
        <result column="system_status" property="systemStatus" />
        <result column="send" property="send" />
        <result column="response" property="response" />
    </resultMap>
</mapper>
src/main/resources/mapper/BasLiftErrLogMapper.xml
File was deleted
src/main/resources/mapper/BasLiftErrMapper.xml
File was deleted
src/main/resources/mapper/BasLiftMapper.xml
File was deleted
src/main/resources/mapper/BasLiftOptMapper.xml
File was deleted
src/main/resources/mapper/BasShuttleChargeMapper.xml
File was deleted
src/main/resources/mapper/BasShuttleErrLogMapper.xml
File was deleted
src/main/resources/mapper/BasShuttleErrMapper.xml
File was deleted
src/main/resources/mapper/BasShuttleMapper.xml
File was deleted
src/main/resources/mapper/BasShuttleOptMapper.xml
File was deleted
src/main/resources/sql/20251016145740_qlsxk.nb3
Binary files differ
src/main/resources/sql/30̨³µÊý¾Ý¿â.nb3
Binary files differ
src/main/resources/sql/40̨³µÊý¾Ý¿â.nb3
Binary files differ
src/main/resources/sql/5̨³µÊý¾Ý¿â.nb3
Binary files differ
src/main/resources/sql/³ö¿âÈÎÎñÔ¤µ÷¶ÈÌáÉý»úsql
File was deleted
src/main/resources/sql/С³µ±ÜÕÏÅäÖÃsql
File was deleted
src/main/resources/sql/¿âλµØÍ¼sql
File was deleted
src/main/resources/sql/»õ²æÌáÉý»úÒì³£Âësql
File was deleted
src/main/webapp/static/css/console_vue.css
@@ -22,11 +22,39 @@
    background: #f0f0f0;
}
.shelf {
    height: 35px;
    border-right: none;
    cursor: default;
    color: rgb(194, 76, 65);
    display: flex;
    justify-content: center;
    align-items: center;
    user-select: none;
    background: #f0f0f0;
}
.track-item {
    width: 100%;
    height: 35px;
    border-right: none;
    cursor: default;
    color: rgb(194, 76, 65);
    display: flex;
    justify-content: center;
    align-items: center;
    user-select: none;
    background: #f5d88f;;
    padding: 0;
    margin: 0;
    position: relative;
    z-index: 1;
}
/* ç«™ç‚¹ */
.site {
    color: #333;
    height: 35px;
    width: 35px;
    height: 100%;
    cursor: pointer;
    text-align: center;
    background-color: rgb(120, 255, 129);
@@ -37,10 +65,88 @@
    user-select: none;
}
.crn-item {
    color: #333;
    height: 35px;
    cursor: pointer;
    text-align: center;
    background-color: rgb(120, 255, 129);
    font-size: 13px;
    display: flex;
    justify-content: center;
    align-items: center;
    user-select: none;
    margin: 1px;
    position: absolute;
    z-index: 2;
}
/* rgv */
.rgv-item {
    color: #333;
    height: 35px;
    cursor: pointer;
    text-align: center;
    background-color: rgb(120, 255, 129);
    font-size: 13px;
    display: flex;
    justify-content: center;
    align-items: center;
    user-select: none;
    padding: 0;
    margin: 0;
    position: absolute;
    z-index: 2;
}
/*空站点*/
.site-k {
    border: 1px solid rgb(108, 167, 168);
    /*border: 1px solid rgb(108, 167, 168);*/
    background-color: rgb(108, 167, 168);
}
/* å…¥åº“ */
.machine-pakin {
    background-color: rgb(163, 214, 242);
}
/* å‡ºåº“ */
.machine-pakout {
    background-color: rgb(151, 180, 0);
}
/* åº“到库 */
.machine-stock-move {
    background-color: rgb(58, 77, 249);
}
/* ç«™åˆ°ç«™ */
.machine-site-move {
    background-color: rgb(240, 140, 10);
}
/* PToP */
.machine-p-move {
    background-color: rgb(29, 152, 23);
}
/* å¼‚常 */
.machine-error {
    background-color: rgb(252, 48, 48);
}
/* è‡ªåЍ */
.machine-auto {
    background-color: rgb(132, 255, 115);
}
/* éžè‡ªåЍ/手动 */
.machine-un-auto {
    background-color: rgb(184, 184, 184);
}
.machine-working {
    background-color: rgb(255, 214, 11);
}
/* å…¥åº“ */
@@ -171,6 +277,19 @@
    background-color: rgb(0, 0, 0);
}
/* å †åž›æœºå¼¹çª— */
#crnWindow {
    width: 291px;
    height: 365px;
    background-image: url(../images/Popup-yellow.png);
    position: fixed;
    color:white;
    left: 50%;
    top: 50%;
    transform: translate(-50%,-50%);
    z-index: 101;
}
/* è¾“送设备弹窗 */
#siteWindow {
    width: 300px;
@@ -181,6 +300,19 @@
    transform: translate(-50%, -50%);
    border-radius: 20px 20px 0 0;
    overflow: hidden;
}
/* RGV弹窗 */
#rgvWindow {
    width: 291px;
    height: 365px;
    background-image: url(../images/Popup-yellow.png);
    position: fixed;
    color:white;
    left: 50%;
    top: 50%;
    transform: translate(-50%,-50%);
    z-index: 101;
}
#siteWindow-head {
@@ -210,6 +342,58 @@
    display: inline-block;
    float: right;
    margin-right: 20px;
}
#crnWindow-head {
    width: 291px;
    height: 55px;
    line-height: 55px;
    margin-left: 55px;
    color: #000000;
    font-weight: 700;
    letter-spacing: 2px;
}
#crnWindow-head .detailed {
    display: inline-block;
}
#crnWindow-head button {
    width: 25px;
    height: 25px;
    padding: 0px;
    border: none;
    border-radius: 25px;
    background-image: url(../images/siteclose.png);
    display: inline-block;
    float: right;
    margin-top: 15px;
    margin-right: 80px;
}
#rgvWindow-head {
    width: 291px;
    height: 55px;
    line-height: 55px;
    margin-left: 55px;
    color: #000000;
    font-weight: 700;
    letter-spacing: 2px;
}
#rgvWindow-head .detailed {
    display: inline-block;
}
#rgvWindow-head button {
    width: 25px;
    height: 25px;
    padding: 0px;
    border: none;
    border-radius: 25px;
    background-image: url(../images/siteclose.png);
    display: inline-block;
    float: right;
    margin-top: 15px;
    margin-right: 80px;
}
.siteWindow-body {
@@ -434,3 +618,60 @@
    transform: translate(var(--x-pos), var(--y-pos));
    transition: transform 0.5s ease-in-out;
}
/* å¼¹çª— */
form .form-item {
    display: inline-block;
    padding-left: 10px;
}
form .form-item-label {
    display: inline-block;
    width: 90px;
    font-size: 10px;
}
form .form-item-input {
    display: inline-block;
    width: 180px;
}
form .form-item-input input {
    background-color: rgba(255,255,255,.3);
    color: #FFFFFF;
    padding: 0;
    border: none;
    border-radius: 2px;
    height: 18px;
    padding-left: 10px;
}
/* checkbox */
form .form-item-checkbox {
    display: inline-block;
    padding-left: 10px;
    width: 20%;
}
form .form-item-label-checkbox {
    display: inline-block;
    width: auto;
    font-size: 14px;
}
form .form-item-input-checkbox {
    display: inline-block;
    width: auto;
}
.excel-table {
    border-collapse: collapse;
    width: 100%;
    padding: 0;
    margin: 0;
}
.excel-table td {
    padding: 0;
    margin: 0;
    text-align: center;
}
.excel-table .merged {
    display: none;
}
src/main/webapp/static/js/basCrnp/basCrnp.js
New file
@@ -0,0 +1,264 @@
var pageCurr;
layui.config({
    base: baseUrl + "/static/layui/lay/modules/"
}).use(['table','laydate', 'form', 'admin'], function(){
    var table = layui.table;
    var $ = layui.jquery;
    var layer = layui.layer;
    var layDate = layui.laydate;
    var form = layui.form;
    var admin = layui.admin;
    // æ•°æ®æ¸²æŸ“
    tableIns = table.render({
        elem: '#basCrnp',
        headers: {token: localStorage.getItem('token')},
        url: baseUrl+'/basCrnp/list/auth',
        page: true,
        limit: 15,
        limits: [15, 30, 50, 100, 200, 500],
        toolbar: '#toolbar',
        cellMinWidth: 50,
        height: 'full-120',
        cols: [[
            {type: 'checkbox'}
            ,{field: 'crnNo', align: 'center',title: '编号'}
            ,{field: 'status$', align: 'center',title: '状态'}
            ,{field: 'wrkNo', align: 'center',title: '工作号'}
            ,{field: 'inEnable', align: 'center',title: '可入(checkBox)'}
            ,{field: 'outEnable', align: 'center',title: '可出(checkBox)'}
            ,{field: 'createBy', align: 'center',title: '创建人员'}
            ,{field: 'createTime$', align: 'center',title: '创建时间'}
            ,{field: 'updateBy', align: 'center',title: '修改人员'}
            ,{field: 'updateTime$', align: 'center',title: '修改时间'}
            ,{field: 'memo', align: 'center',title: '备注'}
            ,{fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width:120}
        ]],
        request: {
            pageName: 'curr',
            pageSize: 'limit'
        },
        parseData: function (res) {
            return {
                'code': res.code,
                'msg': res.msg,
                'count': res.data.total,
                'data': res.data.records
            }
        },
        response: {
            statusCode: 200
        },
        done: function(res, curr, count) {
            if (res.code === 403) {
                top.location.href = baseUrl+"/";
            }
            pageCurr=curr;
            limit();
        }
    });
    // ç›‘听排序事件
    table.on('sort(basCrnp)', function (obj) {
        var searchData = {};
        $.each($('#search-box [name]').serializeArray(), function() {
            searchData[this.name] = this.value;
        });
        searchData['orderByField'] = obj.field;
        searchData['orderByType'] = obj.type;
        tableIns.reload({
            where: searchData,
            page: {curr: 1}
        });
    });
    // ç›‘听头工具栏事件
    table.on('toolbar(basCrnp)', function (obj) {
        var checkStatus = table.checkStatus(obj.config.id).data;
        switch(obj.event) {
            case 'addData':
                showEditModel();
                break;
            case 'deleteData':
               if (checkStatus.length === 0) {
                   layer.msg('请选择要删除的数据', {icon: 2});
                   return;
               }
               del(checkStatus.map(function (d) {
                   return d.crnNo;
               }));
               break;
            case 'exportData':
                admin.confirm('确定导出Excel吗', {shadeClose: true}, function(){
                    var titles=[];
                    var fields=[];
                    obj.config.cols[0].map(function (col) {
                        if (col.type === 'normal' && col.hide === false && col.toolbar == null) {
                            titles.push(col.title);
                            fields.push(col.field);
                        }
                    });
                    var exportData = {};
                    $.each($('#search-box [name]').serializeArray(), function() {
                        exportData[this.name] = this.value;
                    });
                    var param = {
                        'basCrnp': exportData,
                        'fields': fields
                    };
                    $.ajax({
                        url: baseUrl+"/basCrnp/export/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: JSON.stringify(param),
                        dataType:'json',
                        contentType:'application/json;charset=UTF-8',
                        method: 'POST',
                        success: function (res) {
                            layer.closeAll();
                            if (res.code === 200) {
                                table.exportFile(titles,res.data,'xls');
                            } else if (res.code === 403) {
                                top.location.href = baseUrl+"/";
                            } else {
                                layer.msg(res.msg, {icon: 2})
                            }
                        }
                    });
                });
                break;
        }
    });
    // ç›‘听行工具事件
    table.on('tool(basCrnp)', function(obj){
        var data = obj.data;
        switch (obj.event) {
            case 'edit':
                showEditModel(data);
                break;
            case "del":
                del([data.crnNo]);
                break;
        }
    });
    /* å¼¹çª— - æ–°å¢žã€ä¿®æ”¹ */
    function showEditModel(mData) {
        admin.open({
            type: 1,
            area: '600px',
            title: (mData ? '修改' : '添加') + '订单状态',
            content: $('#editDialog').html(),
            success: function (layero, dIndex) {
                layDateRender(mData);
                form.val('detail', mData);
                form.on('submit(editSubmit)', function (data) {
                    var loadIndex = layer.load(2);
                    $.ajax({
                        url: baseUrl+"/basCrnp/"+(mData?'update':'add')+"/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: data.field,
                        method: 'POST',
                        success: function (res) {
                            layer.close(loadIndex);
                            if (res.code === 200){
                                layer.close(dIndex);
                                layer.msg(res.msg, {icon: 1});
                                tableReload();
                            } else if (res.code === 403){
                                top.location.href = baseUrl+"/";
                            }else {
                                layer.msg(res.msg, {icon: 2});
                            }
                        }
                    })
                    return false;
                });
                $(layero).children('.layui-layer-content').css('overflow', 'visible');
                layui.form.render('select');
            }
        });
    }
    /* åˆ é™¤ */
    function del(ids) {
        layer.confirm('确定要删除选中数据吗?', {
            skin: 'layui-layer-admin',
            shade: .1
        }, function (i) {
            layer.close(i);
            var loadIndex = layer.load(2);
            $.ajax({
                url: baseUrl+"/basCrnp/delete/auth",
                headers: {'token': localStorage.getItem('token')},
                data: {ids: ids},
                method: 'POST',
                success: function (res) {
                    layer.close(loadIndex);
                    if (res.code === 200){
                        layer.msg(res.msg, {icon: 1});
                        tableReload();
                    } else if (res.code === 403){
                        top.location.href = baseUrl+"/";
                    } else {
                        layer.msg(res.msg, {icon: 2});
                    }
                }
            })
        });
    }
    // æœç´¢
    form.on('submit(search)', function (data) {
        pageCurr = 1;
        tableReload(false);
    });
    // é‡ç½®
    form.on('submit(reset)', function (data) {
        pageCurr = 1;
        clearFormVal($('#search-box'));
        tableReload(false);
    });
    // æ—¶é—´é€‰æ‹©å™¨
    function layDateRender(data) {
        setTimeout(function () {
            layDate.render({
                elem: '.layui-laydate-range'
                ,type: 'datetime'
                ,range: true
            });
            layDate.render({
                elem: '#createTime\\$',
                type: 'datetime',
                value: data!==undefined?data['createTime\\$']:null
            });
            layDate.render({
                elem: '#updateTime\\$',
                type: 'datetime',
                value: data!==undefined?data['updateTime\\$']:null
            });
        }, 300);
    }
    layDateRender();
});
// å…³é—­åŠ¨ä½œ
$(document).on('click','#data-detail-close', function () {
    parent.layer.closeAll();
});
function tableReload(child) {
    var searchData = {};
    $.each($('#search-box [name]').serializeArray(), function() {
        searchData[this.name] = this.value;
    });
    tableIns.reload({
        where: searchData,
        page: {curr: pageCurr}
     });
}
src/main/webapp/static/js/basCrnpErr/basCrnpErr.js
New file
@@ -0,0 +1,261 @@
var pageCurr;
layui.config({
    base: baseUrl + "/static/layui/lay/modules/"
}).use(['table','laydate', 'form', 'admin'], function(){
    var table = layui.table;
    var $ = layui.jquery;
    var layer = layui.layer;
    var layDate = layui.laydate;
    var form = layui.form;
    var admin = layui.admin;
    // æ•°æ®æ¸²æŸ“
    tableIns = table.render({
        elem: '#basCrnpErr',
        headers: {token: localStorage.getItem('token')},
        url: baseUrl+'/basCrnpErr/list/auth',
        page: true,
        limit: 15,
        limits: [15, 30, 50, 100, 200, 500],
        toolbar: '#toolbar',
        cellMinWidth: 50,
        height: 'full-120',
        cols: [[
            {type: 'checkbox'}
            ,{field: 'id', align: 'center',title: '编号'}
            ,{field: 'errorCode', align: 'center',title: '异常码'}
            ,{field: 'errName', align: 'center',title: '异常'}
            ,{field: 'modiUser$', align: 'center',title: '修改人员'}
            ,{field: 'modiTime$', align: 'center',title: '修改时间'}
            ,{field: 'appeUser$', align: 'center',title: '添加人员'}
            ,{field: 'appeTime$', align: 'center',title: '添加时间'}
            ,{fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width:120}
        ]],
        request: {
            pageName: 'curr',
            pageSize: 'limit'
        },
        parseData: function (res) {
            return {
                'code': res.code,
                'msg': res.msg,
                'count': res.data.total,
                'data': res.data.records
            }
        },
        response: {
            statusCode: 200
        },
        done: function(res, curr, count) {
            if (res.code === 403) {
                top.location.href = baseUrl+"/";
            }
            pageCurr=curr;
            limit();
        }
    });
    // ç›‘听排序事件
    table.on('sort(basCrnpErr)', function (obj) {
        var searchData = {};
        $.each($('#search-box [name]').serializeArray(), function() {
            searchData[this.name] = this.value;
        });
        searchData['orderByField'] = obj.field;
        searchData['orderByType'] = obj.type;
        tableIns.reload({
            where: searchData,
            page: {curr: 1}
        });
    });
    // ç›‘听头工具栏事件
    table.on('toolbar(basCrnpErr)', function (obj) {
        var checkStatus = table.checkStatus(obj.config.id).data;
        switch(obj.event) {
            case 'addData':
                showEditModel();
                break;
            case 'deleteData':
               if (checkStatus.length === 0) {
                   layer.msg('请选择要删除的数据', {icon: 2});
                   return;
               }
               del(checkStatus.map(function (d) {
                   return d.id;
               }));
               break;
            case 'exportData':
                admin.confirm('确定导出Excel吗', {shadeClose: true}, function(){
                    var titles=[];
                    var fields=[];
                    obj.config.cols[0].map(function (col) {
                        if (col.type === 'normal' && col.hide === false && col.toolbar == null) {
                            titles.push(col.title);
                            fields.push(col.field);
                        }
                    });
                    var exportData = {};
                    $.each($('#search-box [name]').serializeArray(), function() {
                        exportData[this.name] = this.value;
                    });
                    var param = {
                        'basCrnpErr': exportData,
                        'fields': fields
                    };
                    $.ajax({
                        url: baseUrl+"/basCrnpErr/export/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: JSON.stringify(param),
                        dataType:'json',
                        contentType:'application/json;charset=UTF-8',
                        method: 'POST',
                        success: function (res) {
                            layer.closeAll();
                            if (res.code === 200) {
                                table.exportFile(titles,res.data,'xls');
                            } else if (res.code === 403) {
                                top.location.href = baseUrl+"/";
                            } else {
                                layer.msg(res.msg, {icon: 2})
                            }
                        }
                    });
                });
                break;
        }
    });
    // ç›‘听行工具事件
    table.on('tool(basCrnpErr)', function(obj){
        var data = obj.data;
        switch (obj.event) {
            case 'edit':
                showEditModel(data);
                break;
            case "del":
                del([data.id]);
                break;
        }
    });
    /* å¼¹çª— - æ–°å¢žã€ä¿®æ”¹ */
    function showEditModel(mData) {
        admin.open({
            type: 1,
            area: '600px',
            title: (mData ? '修改' : '添加') + '订单状态',
            content: $('#editDialog').html(),
            success: function (layero, dIndex) {
                layDateRender(mData);
                form.val('detail', mData);
                form.on('submit(editSubmit)', function (data) {
                    var loadIndex = layer.load(2);
                    $.ajax({
                        url: baseUrl+"/basCrnpErr/"+(mData?'update':'add')+"/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: data.field,
                        method: 'POST',
                        success: function (res) {
                            layer.close(loadIndex);
                            if (res.code === 200){
                                layer.close(dIndex);
                                layer.msg(res.msg, {icon: 1});
                                tableReload();
                            } else if (res.code === 403){
                                top.location.href = baseUrl+"/";
                            }else {
                                layer.msg(res.msg, {icon: 2});
                            }
                        }
                    })
                    return false;
                });
                $(layero).children('.layui-layer-content').css('overflow', 'visible');
                layui.form.render('select');
            }
        });
    }
    /* åˆ é™¤ */
    function del(ids) {
        layer.confirm('确定要删除选中数据吗?', {
            skin: 'layui-layer-admin',
            shade: .1
        }, function (i) {
            layer.close(i);
            var loadIndex = layer.load(2);
            $.ajax({
                url: baseUrl+"/basCrnpErr/delete/auth",
                headers: {'token': localStorage.getItem('token')},
                data: {ids: ids},
                method: 'POST',
                success: function (res) {
                    layer.close(loadIndex);
                    if (res.code === 200){
                        layer.msg(res.msg, {icon: 1});
                        tableReload();
                    } else if (res.code === 403){
                        top.location.href = baseUrl+"/";
                    } else {
                        layer.msg(res.msg, {icon: 2});
                    }
                }
            })
        });
    }
    // æœç´¢
    form.on('submit(search)', function (data) {
        pageCurr = 1;
        tableReload(false);
    });
    // é‡ç½®
    form.on('submit(reset)', function (data) {
        pageCurr = 1;
        clearFormVal($('#search-box'));
        tableReload(false);
    });
    // æ—¶é—´é€‰æ‹©å™¨
    function layDateRender(data) {
        setTimeout(function () {
            layDate.render({
                elem: '.layui-laydate-range'
                ,type: 'datetime'
                ,range: true
            });
            layDate.render({
                elem: '#modiTime\\$',
                type: 'datetime',
                value: data!==undefined?data['modiTime\\$']:null
            });
            layDate.render({
                elem: '#appeTime\\$',
                type: 'datetime',
                value: data!==undefined?data['appeTime\\$']:null
            });
        }, 300);
    }
    layDateRender();
});
// å…³é—­åŠ¨ä½œ
$(document).on('click','#data-detail-close', function () {
    parent.layer.closeAll();
});
function tableReload(child) {
    var searchData = {};
    $.each($('#search-box [name]').serializeArray(), function() {
        searchData[this.name] = this.value;
    });
    tableIns.reload({
        where: searchData,
        page: {curr: pageCurr}
     });
}
src/main/webapp/static/js/basCrnpErrLog/basCrnpErrLog.js
New file
@@ -0,0 +1,285 @@
var pageCurr;
layui.config({
    base: baseUrl + "/static/layui/lay/modules/"
}).use(['table','laydate', 'form', 'admin'], function(){
    var table = layui.table;
    var $ = layui.jquery;
    var layer = layui.layer;
    var layDate = layui.laydate;
    var form = layui.form;
    var admin = layui.admin;
    // æ•°æ®æ¸²æŸ“
    tableIns = table.render({
        elem: '#basCrnpErrLog',
        headers: {token: localStorage.getItem('token')},
        url: baseUrl+'/basCrnpErrLog/list/auth',
        page: true,
        limit: 15,
        limits: [15, 30, 50, 100, 200, 500],
        toolbar: '#toolbar',
        cellMinWidth: 50,
        height: 'full-120',
        cols: [[
            {type: 'checkbox'}
            ,{field: 'id', align: 'center',title: '编号'}
            ,{field: 'wrkNo', align: 'center',title: '工作号'}
            ,{field: 'startTime$', align: 'center',title: '发生时间'}
            ,{field: 'endTime$', align: 'center',title: '结束时间'}
            ,{field: 'wrkSts$', align: 'center',title: '工作状态'}
            ,{field: 'ioType$', align: 'center',title: '入出库类型'}
            ,{field: 'crnNo', align: 'center',title: '堆垛机号'}
            ,{field: 'locNo', align: 'center',title: '目标库位'}
            ,{field: 'staNo', align: 'center',title: '目标站'}
            ,{field: 'sourceStaNo', align: 'center',title: '源站'}
            ,{field: 'sourceLocNo', align: 'center',title: '源库位'}
            ,{field: 'barcode', align: 'center',title: '条码'}
            ,{field: 'errCode', align: 'center',title: '异常码'}
            ,{field: 'error', align: 'center',title: '异常'}
            ,{field: 'status$', align: 'center',title: '异常情况'}
            ,{field: 'createTime$', align: 'center',title: '添加时间'}
            ,{field: 'createBy$', align: 'center',title: '添加人员'}
            ,{field: 'updateTime$', align: 'center',title: '修改时间'}
            ,{field: 'updateBy$', align: 'center',title: '修改人员'}
            ,{field: 'memo', align: 'center',title: '备注'}
            ,{field: 'systemStatus', align: 'center',title: '系统状态数据'}
            ,{fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width:120}
        ]],
        request: {
            pageName: 'curr',
            pageSize: 'limit'
        },
        parseData: function (res) {
            return {
                'code': res.code,
                'msg': res.msg,
                'count': res.data.total,
                'data': res.data.records
            }
        },
        response: {
            statusCode: 200
        },
        done: function(res, curr, count) {
            if (res.code === 403) {
                top.location.href = baseUrl+"/";
            }
            pageCurr=curr;
            limit();
        }
    });
    // ç›‘听排序事件
    table.on('sort(basCrnpErrLog)', function (obj) {
        var searchData = {};
        $.each($('#search-box [name]').serializeArray(), function() {
            searchData[this.name] = this.value;
        });
        searchData['orderByField'] = obj.field;
        searchData['orderByType'] = obj.type;
        tableIns.reload({
            where: searchData,
            page: {curr: 1}
        });
    });
    // ç›‘听头工具栏事件
    table.on('toolbar(basCrnpErrLog)', function (obj) {
        var checkStatus = table.checkStatus(obj.config.id).data;
        switch(obj.event) {
            case 'addData':
                showEditModel();
                break;
            case 'deleteData':
               if (checkStatus.length === 0) {
                   layer.msg('请选择要删除的数据', {icon: 2});
                   return;
               }
               del(checkStatus.map(function (d) {
                   return d.id;
               }));
               break;
            case 'exportData':
                admin.confirm('确定导出Excel吗', {shadeClose: true}, function(){
                    var titles=[];
                    var fields=[];
                    obj.config.cols[0].map(function (col) {
                        if (col.type === 'normal' && col.hide === false && col.toolbar == null) {
                            titles.push(col.title);
                            fields.push(col.field);
                        }
                    });
                    var exportData = {};
                    $.each($('#search-box [name]').serializeArray(), function() {
                        exportData[this.name] = this.value;
                    });
                    var param = {
                        'basCrnpErrLog': exportData,
                        'fields': fields
                    };
                    $.ajax({
                        url: baseUrl+"/basCrnpErrLog/export/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: JSON.stringify(param),
                        dataType:'json',
                        contentType:'application/json;charset=UTF-8',
                        method: 'POST',
                        success: function (res) {
                            layer.closeAll();
                            if (res.code === 200) {
                                table.exportFile(titles,res.data,'xls');
                            } else if (res.code === 403) {
                                top.location.href = baseUrl+"/";
                            } else {
                                layer.msg(res.msg, {icon: 2})
                            }
                        }
                    });
                });
                break;
        }
    });
    // ç›‘听行工具事件
    table.on('tool(basCrnpErrLog)', function(obj){
        var data = obj.data;
        switch (obj.event) {
            case 'edit':
                showEditModel(data);
                break;
            case "del":
                del([data.id]);
                break;
        }
    });
    /* å¼¹çª— - æ–°å¢žã€ä¿®æ”¹ */
    function showEditModel(mData) {
        admin.open({
            type: 1,
            area: '600px',
            title: (mData ? '修改' : '添加') + '订单状态',
            content: $('#editDialog').html(),
            success: function (layero, dIndex) {
                layDateRender(mData);
                form.val('detail', mData);
                form.on('submit(editSubmit)', function (data) {
                    var loadIndex = layer.load(2);
                    $.ajax({
                        url: baseUrl+"/basCrnpErrLog/"+(mData?'update':'add')+"/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: data.field,
                        method: 'POST',
                        success: function (res) {
                            layer.close(loadIndex);
                            if (res.code === 200){
                                layer.close(dIndex);
                                layer.msg(res.msg, {icon: 1});
                                tableReload();
                            } else if (res.code === 403){
                                top.location.href = baseUrl+"/";
                            }else {
                                layer.msg(res.msg, {icon: 2});
                            }
                        }
                    })
                    return false;
                });
                $(layero).children('.layui-layer-content').css('overflow', 'visible');
                layui.form.render('select');
            }
        });
    }
    /* åˆ é™¤ */
    function del(ids) {
        layer.confirm('确定要删除选中数据吗?', {
            skin: 'layui-layer-admin',
            shade: .1
        }, function (i) {
            layer.close(i);
            var loadIndex = layer.load(2);
            $.ajax({
                url: baseUrl+"/basCrnpErrLog/delete/auth",
                headers: {'token': localStorage.getItem('token')},
                data: {ids: ids},
                method: 'POST',
                success: function (res) {
                    layer.close(loadIndex);
                    if (res.code === 200){
                        layer.msg(res.msg, {icon: 1});
                        tableReload();
                    } else if (res.code === 403){
                        top.location.href = baseUrl+"/";
                    } else {
                        layer.msg(res.msg, {icon: 2});
                    }
                }
            })
        });
    }
    // æœç´¢
    form.on('submit(search)', function (data) {
        pageCurr = 1;
        tableReload(false);
    });
    // é‡ç½®
    form.on('submit(reset)', function (data) {
        pageCurr = 1;
        clearFormVal($('#search-box'));
        tableReload(false);
    });
    // æ—¶é—´é€‰æ‹©å™¨
    function layDateRender(data) {
        setTimeout(function () {
            layDate.render({
                elem: '.layui-laydate-range'
                ,type: 'datetime'
                ,range: true
            });
            layDate.render({
                elem: '#startTime\\$',
                type: 'datetime',
                value: data!==undefined?data['startTime\\$']:null
            });
            layDate.render({
                elem: '#endTime\\$',
                type: 'datetime',
                value: data!==undefined?data['endTime\\$']:null
            });
            layDate.render({
                elem: '#createTime\\$',
                type: 'datetime',
                value: data!==undefined?data['createTime\\$']:null
            });
            layDate.render({
                elem: '#updateTime\\$',
                type: 'datetime',
                value: data!==undefined?data['updateTime\\$']:null
            });
        }, 300);
    }
    layDateRender();
});
// å…³é—­åŠ¨ä½œ
$(document).on('click','#data-detail-close', function () {
    parent.layer.closeAll();
});
function tableReload(child) {
    var searchData = {};
    $.each($('#search-box [name]').serializeArray(), function() {
        searchData[this.name] = this.value;
    });
    tableIns.reload({
        where: searchData,
        page: {curr: pageCurr}
     });
}
src/main/webapp/static/js/basCrnpOpt/basCrnpOpt.js
New file
@@ -0,0 +1,268 @@
var pageCurr;
layui.config({
    base: baseUrl + "/static/layui/lay/modules/"
}).use(['table','laydate', 'form', 'admin'], function(){
    var table = layui.table;
    var $ = layui.jquery;
    var layer = layui.layer;
    var layDate = layui.laydate;
    var form = layui.form;
    var admin = layui.admin;
    // æ•°æ®æ¸²æŸ“
    tableIns = table.render({
        elem: '#basCrnpOpt',
        headers: {token: localStorage.getItem('token')},
        url: baseUrl+'/basCrnpOpt/list/auth',
        page: true,
        limit: 15,
        limits: [15, 30, 50, 100, 200, 500],
        toolbar: '#toolbar',
        cellMinWidth: 50,
        height: 'full-120',
        cols: [[
            {type: 'checkbox'}
            ,{field: 'id', align: 'center',title: '编号'}
            ,{field: 'wrkNo', align: 'center',title: '工作号'}
            ,{field: 'crnNo', align: 'center',title: '堆垛机号'}
            ,{field: 'sendTime$', align: 'center',title: '下发时间'}
            ,{field: 'mode', align: 'center',title: '作业'}
            ,{field: 'sourceLocNo', align: 'center',title: '起点库位'}
            ,{field: 'targetLocNo', align: 'center',title: '目标库位'}
            ,{field: 'updateTime$', align: 'center',title: '修改时间'}
            ,{field: 'updateBy$', align: 'center',title: '修改人员'}
            ,{field: 'memo', align: 'center',title: '备注'}
            ,{field: 'command', align: 'center',title: '命令'}
            ,{field: 'systemStatus', align: 'center',title: '系统状态'}
            ,{field: 'send$', align: 'center',title: '下发状态'}
            ,{field: 'response', align: 'center',title: '请求响应'}
            ,{fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width:120}
        ]],
        request: {
            pageName: 'curr',
            pageSize: 'limit'
        },
        parseData: function (res) {
            return {
                'code': res.code,
                'msg': res.msg,
                'count': res.data.total,
                'data': res.data.records
            }
        },
        response: {
            statusCode: 200
        },
        done: function(res, curr, count) {
            if (res.code === 403) {
                top.location.href = baseUrl+"/";
            }
            pageCurr=curr;
            limit();
        }
    });
    // ç›‘听排序事件
    table.on('sort(basCrnpOpt)', function (obj) {
        var searchData = {};
        $.each($('#search-box [name]').serializeArray(), function() {
            searchData[this.name] = this.value;
        });
        searchData['orderByField'] = obj.field;
        searchData['orderByType'] = obj.type;
        tableIns.reload({
            where: searchData,
            page: {curr: 1}
        });
    });
    // ç›‘听头工具栏事件
    table.on('toolbar(basCrnpOpt)', function (obj) {
        var checkStatus = table.checkStatus(obj.config.id).data;
        switch(obj.event) {
            case 'addData':
                showEditModel();
                break;
            case 'deleteData':
               if (checkStatus.length === 0) {
                   layer.msg('请选择要删除的数据', {icon: 2});
                   return;
               }
               del(checkStatus.map(function (d) {
                   return d.id;
               }));
               break;
            case 'exportData':
                admin.confirm('确定导出Excel吗', {shadeClose: true}, function(){
                    var titles=[];
                    var fields=[];
                    obj.config.cols[0].map(function (col) {
                        if (col.type === 'normal' && col.hide === false && col.toolbar == null) {
                            titles.push(col.title);
                            fields.push(col.field);
                        }
                    });
                    var exportData = {};
                    $.each($('#search-box [name]').serializeArray(), function() {
                        exportData[this.name] = this.value;
                    });
                    var param = {
                        'basCrnpOpt': exportData,
                        'fields': fields
                    };
                    $.ajax({
                        url: baseUrl+"/basCrnpOpt/export/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: JSON.stringify(param),
                        dataType:'json',
                        contentType:'application/json;charset=UTF-8',
                        method: 'POST',
                        success: function (res) {
                            layer.closeAll();
                            if (res.code === 200) {
                                table.exportFile(titles,res.data,'xls');
                            } else if (res.code === 403) {
                                top.location.href = baseUrl+"/";
                            } else {
                                layer.msg(res.msg, {icon: 2})
                            }
                        }
                    });
                });
                break;
        }
    });
    // ç›‘听行工具事件
    table.on('tool(basCrnpOpt)', function(obj){
        var data = obj.data;
        switch (obj.event) {
            case 'edit':
                showEditModel(data);
                break;
            case "del":
                del([data.id]);
                break;
        }
    });
    /* å¼¹çª— - æ–°å¢žã€ä¿®æ”¹ */
    function showEditModel(mData) {
        admin.open({
            type: 1,
            area: '600px',
            title: (mData ? '修改' : '添加') + '订单状态',
            content: $('#editDialog').html(),
            success: function (layero, dIndex) {
                layDateRender(mData);
                form.val('detail', mData);
                form.on('submit(editSubmit)', function (data) {
                    var loadIndex = layer.load(2);
                    $.ajax({
                        url: baseUrl+"/basCrnpOpt/"+(mData?'update':'add')+"/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: data.field,
                        method: 'POST',
                        success: function (res) {
                            layer.close(loadIndex);
                            if (res.code === 200){
                                layer.close(dIndex);
                                layer.msg(res.msg, {icon: 1});
                                tableReload();
                            } else if (res.code === 403){
                                top.location.href = baseUrl+"/";
                            }else {
                                layer.msg(res.msg, {icon: 2});
                            }
                        }
                    })
                    return false;
                });
                $(layero).children('.layui-layer-content').css('overflow', 'visible');
                layui.form.render('select');
            }
        });
    }
    /* åˆ é™¤ */
    function del(ids) {
        layer.confirm('确定要删除选中数据吗?', {
            skin: 'layui-layer-admin',
            shade: .1
        }, function (i) {
            layer.close(i);
            var loadIndex = layer.load(2);
            $.ajax({
                url: baseUrl+"/basCrnpOpt/delete/auth",
                headers: {'token': localStorage.getItem('token')},
                data: {ids: ids},
                method: 'POST',
                success: function (res) {
                    layer.close(loadIndex);
                    if (res.code === 200){
                        layer.msg(res.msg, {icon: 1});
                        tableReload();
                    } else if (res.code === 403){
                        top.location.href = baseUrl+"/";
                    } else {
                        layer.msg(res.msg, {icon: 2});
                    }
                }
            })
        });
    }
    // æœç´¢
    form.on('submit(search)', function (data) {
        pageCurr = 1;
        tableReload(false);
    });
    // é‡ç½®
    form.on('submit(reset)', function (data) {
        pageCurr = 1;
        clearFormVal($('#search-box'));
        tableReload(false);
    });
    // æ—¶é—´é€‰æ‹©å™¨
    function layDateRender(data) {
        setTimeout(function () {
            layDate.render({
                elem: '.layui-laydate-range'
                ,type: 'datetime'
                ,range: true
            });
            layDate.render({
                elem: '#sendTime\\$',
                type: 'datetime',
                value: data!==undefined?data['sendTime\\$']:null
            });
            layDate.render({
                elem: '#updateTime\\$',
                type: 'datetime',
                value: data!==undefined?data['updateTime\\$']:null
            });
        }, 300);
    }
    layDateRender();
});
// å…³é—­åŠ¨ä½œ
$(document).on('click','#data-detail-close', function () {
    parent.layer.closeAll();
});
function tableReload(child) {
    var searchData = {};
    $.each($('#search-box [name]').serializeArray(), function() {
        searchData[this.name] = this.value;
    });
    tableIns.reload({
        where: searchData,
        page: {curr: pageCurr}
     });
}
src/main/webapp/static/js/basLift/basLift.js
File was deleted
src/main/webapp/static/js/basLiftErr/basLiftErr.js
File was deleted
src/main/webapp/static/js/basLiftErrLog/basLiftErrLog.js
File was deleted
src/main/webapp/static/js/basLiftOpt/basLiftOpt.js
File was deleted
src/main/webapp/static/js/basShuttle/basShuttle.js
File was deleted
src/main/webapp/static/js/basShuttleCharge/basShuttleCharge.js
File was deleted
src/main/webapp/static/js/basShuttleErr/basShuttleErr.js
File was deleted
src/main/webapp/static/js/basShuttleErrLog/basShuttleErrLog.js
File was deleted
src/main/webapp/static/js/basShuttleErrLog/basShuttleOpt.js
File was deleted
src/main/webapp/static/js/common.js
@@ -1,4 +1,4 @@
var baseUrl = "/rcs";
var baseUrl = "/wcs";
// èµ‹å€¼
function setVal(el, val) {
src/main/webapp/views/admin/basCrnp/basCrnp.html
New file
@@ -0,0 +1,120 @@
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title></title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <link rel="stylesheet" href="../../../static/layui/css/layui.css" media="all">
    <link rel="stylesheet" href="../../../static/css/admin.css?v=318" media="all">
    <link rel="stylesheet" href="../../../static/css/cool.css" media="all">
</head>
<body>
<div class="layui-fluid">
    <div class="layui-card">
        <div class="layui-card-body">
            <div class="layui-form toolbar" id="search-box">
                <div class="layui-form-item">
                    <div class="layui-inline">
                        <div class="layui-input-inline">
                            <input class="layui-input" type="text" name="id" placeholder="编号" autocomplete="off">
                        </div>
                    </div>
                     <div class="layui-inline" style="width: 300px">
                        <div class="layui-input-inline">
                            <input class="layui-input layui-laydate-range" name="create_time" type="text" placeholder="起始时间 - ç»ˆæ­¢æ—¶é—´" autocomplete="off" style="width: 300px">
                        </div>
                    </div>
                    <div class="layui-inline">
                        <div class="layui-input-inline">
                            <input class="layui-input" type="text" name="condition" placeholder="请输入" autocomplete="off">
                        </div>
                    </div>
                    <div class="layui-inline">&emsp;
                        <button class="layui-btn icon-btn" lay-filter="search" lay-submit>
                            <i class="layui-icon">&#xe615;</i>搜索
                        </button>
                        <button class="layui-btn icon-btn" lay-filter="reset" lay-submit>
                            <i class="layui-icon">&#xe666;</i>重置
                        </button>
                    </div>
                </div>
            </div>
            <table class="layui-hide" id="basCrnp" lay-filter="basCrnp"></table>
        </div>
    </div>
</div>
<script type="text/html" id="toolbar">
    <div class="layui-btn-container">
        <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">新增</button>
        <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">删除</button>
        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right">导出</button>
    </div>
</script>
<script type="text/html" id="operate">
    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">修改</a>
    <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">删除</a>
</script>
<script type="text/javascript" src="../../../static/js/jquery/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="../../../static/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="../../../static/js/common.js" charset="utf-8"></script>
<script type="text/javascript" src="../../../static/js/cool.js" charset="utf-8"></script>
<script type="text/javascript" src="../../../static/js/basCrnp/basCrnp.js" charset="utf-8"></script>
</body>
<!-- è¡¨å•弹窗 -->
<script type="text/html" id="editDialog">
    <form id="detail" lay-filter="detail" class="layui-form admin-form model-form">
        <input name="crnNo" type="hidden">
        <div class="layui-row">
            <div class="layui-col-md12">
                <div class="layui-form-item">
                    <label class="layui-form-label">状态: </label>
                    <div class="layui-input-block">
                        <select name="status">
                            <option value="">请选择状态</option>
                            <option value="1">正常</option>
                            <option value="0">禁用</option>
                        </select>
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">工作号: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="wrkNo" placeholder="请输入工作号">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">可入(checkBox): </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="inEnable" placeholder="请输入可入(checkBox)">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">可出(checkBox): </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="outEnable" placeholder="请输入可出(checkBox)">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">备注: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="memo" placeholder="请输入备注">
                    </div>
                </div>
             </div>
        </div>
        <hr class="layui-bg-gray">
        <div class="layui-form-item text-right">
            <button class="layui-btn" lay-filter="editSubmit" lay-submit="">保存</button>
            <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
        </div>
    </form>
</script>
</html>
src/main/webapp/views/admin/basCrnp/basCrnp_detail.html
New file
@@ -0,0 +1,112 @@
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title></title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
    <link rel="stylesheet" href="../../static/css/common.css" media="all">
</head>
<body>
<!-- è¯¦æƒ… -->
<div id="data-detail" class="layer_self_wrap">
    <form id="detail" class="layui-form">
    <!--
        <div class="layui-inline"  style="display: none">
            <label class="layui-form-label"><span class="not-null">*</span>编  号:</label>
            <div class="layui-input-inline">
                <input id="id" class="layui-input" type="text" placeholder="编号">
            </div>
        </div>
    -->
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label"><span class="not-null">*</span>编  号:</label>
            <div class="layui-input-inline">
                <input id="crnNo" class="layui-input" type="text" onkeyup="check(this.id, 'basCrnp')" lay-verify="number" >
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">状  态:</label>
            <div class="layui-input-inline">
                <select id="status">
                    <option value="" style="display: none"></option>
                    <option value="1">正常</option>
                    <option value="0">禁用</option>
                </select>
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">å·¥ ä½œ å·ï¼š</label>
            <div class="layui-input-inline">
                <input id="wrkNo" class="layui-input" type="text" lay-verify="number" >
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label" style="font-size: x-small">可入(checkBox):</label>
            <div class="layui-input-inline">
                <input id="inEnable" class="layui-input" type="text">
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label" style="font-size: x-small">可出(checkBox):</label>
            <div class="layui-input-inline">
                <input id="outEnable" class="layui-input" type="text">
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">创建人员:</label>
            <div class="layui-input-inline">
                <input id="createBy" class="layui-input" type="text" lay-verify="number" >
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">创建时间:</label>
            <div class="layui-input-inline">
                <input id="createTime$" class="layui-input" type="text" autocomplete="off">
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">修改人员:</label>
            <div class="layui-input-inline">
                <input id="updateBy" class="layui-input" type="text" lay-verify="number" >
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">修改时间:</label>
            <div class="layui-input-inline">
                <input id="updateTime$" class="layui-input" type="text" autocomplete="off">
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">备  注:</label>
            <div class="layui-input-inline">
                <input id="memo" class="layui-input" type="text">
            </div>
        </div>
        <hr class="layui-bg-gray">
        <div id="data-detail-btn" class="layui-btn-container layui-form-item">
            <div id="data-detail-submit-save" type="button" class="layui-btn layui-btn-normal" lay-submit lay-filter="save">保存</div>
            <div id="data-detail-submit-edit" type="button" class="layui-btn layui-btn-normal" lay-submit lay-filter="edit">修改</div>
            <div id="data-detail-close" type="button" class="layui-btn" lay-submit lay-filter="close">关闭</div>
        </div>
        <div id="prompt">
            æ¸©é¦¨æç¤ºï¼šè¯·ä»”细填写相关信息,<span class="extrude"><span class="not-null">*</span> ä¸ºå¿…填选项。</span>
        </div>
    </form>
</div>
</body>
<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/basCrnp/basCrnp.js" charset="utf-8"></script>
</html>
src/main/webapp/views/admin/basCrnpErr/basCrnpErr.html
New file
@@ -0,0 +1,98 @@
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title></title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <link rel="stylesheet" href="../../../static/layui/css/layui.css" media="all">
    <link rel="stylesheet" href="../../../static/css/admin.css?v=318" media="all">
    <link rel="stylesheet" href="../../../static/css/cool.css" media="all">
</head>
<body>
<div class="layui-fluid">
    <div class="layui-card">
        <div class="layui-card-body">
            <div class="layui-form toolbar" id="search-box">
                <div class="layui-form-item">
                    <div class="layui-inline">
                        <div class="layui-input-inline">
                            <input class="layui-input" type="text" name="id" placeholder="编号" autocomplete="off">
                        </div>
                    </div>
                     <div class="layui-inline" style="width: 300px">
                        <div class="layui-input-inline">
                            <input class="layui-input layui-laydate-range" name="create_time" type="text" placeholder="起始时间 - ç»ˆæ­¢æ—¶é—´" autocomplete="off" style="width: 300px">
                        </div>
                    </div>
                    <div class="layui-inline">
                        <div class="layui-input-inline">
                            <input class="layui-input" type="text" name="condition" placeholder="请输入" autocomplete="off">
                        </div>
                    </div>
                    <div class="layui-inline">&emsp;
                        <button class="layui-btn icon-btn" lay-filter="search" lay-submit>
                            <i class="layui-icon">&#xe615;</i>搜索
                        </button>
                        <button class="layui-btn icon-btn" lay-filter="reset" lay-submit>
                            <i class="layui-icon">&#xe666;</i>重置
                        </button>
                    </div>
                </div>
            </div>
            <table class="layui-hide" id="basCrnpErr" lay-filter="basCrnpErr"></table>
        </div>
    </div>
</div>
<script type="text/html" id="toolbar">
    <div class="layui-btn-container">
        <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">新增</button>
        <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">删除</button>
        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right">导出</button>
    </div>
</script>
<script type="text/html" id="operate">
    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">修改</a>
    <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">删除</a>
</script>
<script type="text/javascript" src="../../../static/js/jquery/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="../../../static/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="../../../static/js/common.js" charset="utf-8"></script>
<script type="text/javascript" src="../../../static/js/cool.js" charset="utf-8"></script>
<script type="text/javascript" src="../../../static/js/basCrnpErr/basCrnpErr.js" charset="utf-8"></script>
</body>
<!-- è¡¨å•弹窗 -->
<script type="text/html" id="editDialog">
    <form id="detail" lay-filter="detail" class="layui-form admin-form model-form">
        <input name="id" type="hidden">
        <div class="layui-row">
            <div class="layui-col-md12">
                <div class="layui-form-item">
                    <label class="layui-form-label">异常码: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="errorCode" placeholder="请输入异常码">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">异常: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="errName" placeholder="请输入异常">
                    </div>
                </div>
             </div>
        </div>
        <hr class="layui-bg-gray">
        <div class="layui-form-item text-right">
            <button class="layui-btn" lay-filter="editSubmit" lay-submit="">保存</button>
            <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
        </div>
    </form>
</script>
</html>
src/main/webapp/views/admin/basCrnpErr/basCrnpErr_detail.html
New file
@@ -0,0 +1,102 @@
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title></title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
    <link rel="stylesheet" href="../../static/css/common.css" media="all">
</head>
<body>
<!-- è¯¦æƒ… -->
<div id="data-detail" class="layer_self_wrap">
    <form id="detail" class="layui-form">
    <!--
        <div class="layui-inline"  style="display: none">
            <label class="layui-form-label"><span class="not-null">*</span>编  号:</label>
            <div class="layui-input-inline">
                <input id="id" class="layui-input" type="text" placeholder="编号">
            </div>
        </div>
    -->
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label"><span class="not-null">*</span>编  号:</label>
            <div class="layui-input-inline">
                <input id="id" class="layui-input" type="text" onkeyup="check(this.id, 'basCrnpErr')" lay-verify="number" >
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">异 å¸¸ ç ï¼š</label>
            <div class="layui-input-inline">
                <input id="errorCode" class="layui-input" type="text" lay-verify="number" >
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">异  常:</label>
            <div class="layui-input-inline">
                <input id="errName" class="layui-input" type="text">
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">修改人员:</label>
            <div class="layui-input-inline cool-auto-complete">
                <input id="modiUser" class="layui-input" type="text" lay-verify="number"  style="display: none">
                <input id="modiUser$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="请输入..." onfocus=this.blur()>
                <div class="cool-auto-complete-window">
                    <input class="cool-auto-complete-window-input" data-key="userQueryBymodiUser" onkeyup="autoLoad(this.getAttribute('data-key'))">
                    <select class="cool-auto-complete-window-select" data-key="userQueryBymodiUserSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
                    </select>
                </div>
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">修改时间:</label>
            <div class="layui-input-inline">
                <input id="modiTime$" class="layui-input" type="text" autocomplete="off">
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">添加人员:</label>
            <div class="layui-input-inline cool-auto-complete">
                <input id="appeUser" class="layui-input" type="text" lay-verify="number"  style="display: none">
                <input id="appeUser$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="请输入..." onfocus=this.blur()>
                <div class="cool-auto-complete-window">
                    <input class="cool-auto-complete-window-input" data-key="userQueryByappeUser" onkeyup="autoLoad(this.getAttribute('data-key'))">
                    <select class="cool-auto-complete-window-select" data-key="userQueryByappeUserSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
                    </select>
                </div>
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">添加时间:</label>
            <div class="layui-input-inline">
                <input id="appeTime$" class="layui-input" type="text" autocomplete="off">
            </div>
        </div>
        <hr class="layui-bg-gray">
        <div id="data-detail-btn" class="layui-btn-container layui-form-item">
            <div id="data-detail-submit-save" type="button" class="layui-btn layui-btn-normal" lay-submit lay-filter="save">保存</div>
            <div id="data-detail-submit-edit" type="button" class="layui-btn layui-btn-normal" lay-submit lay-filter="edit">修改</div>
            <div id="data-detail-close" type="button" class="layui-btn" lay-submit lay-filter="close">关闭</div>
        </div>
        <div id="prompt">
            æ¸©é¦¨æç¤ºï¼šè¯·ä»”细填写相关信息,<span class="extrude"><span class="not-null">*</span> ä¸ºå¿…填选项。</span>
        </div>
    </form>
</div>
</body>
<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/basCrnpErr/basCrnpErr.js" charset="utf-8"></script>
</html>
src/main/webapp/views/admin/basCrnpErrLog/basCrnpErrLog.html
New file
@@ -0,0 +1,234 @@
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title></title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <link rel="stylesheet" href="../../../static/layui/css/layui.css" media="all">
    <link rel="stylesheet" href="../../../static/css/admin.css?v=318" media="all">
    <link rel="stylesheet" href="../../../static/css/cool.css" media="all">
</head>
<body>
<div class="layui-fluid">
    <div class="layui-card">
        <div class="layui-card-body">
            <div class="layui-form toolbar" id="search-box">
                <div class="layui-form-item">
                    <div class="layui-inline">
                        <div class="layui-input-inline">
                            <input class="layui-input" type="text" name="id" placeholder="编号" autocomplete="off">
                        </div>
                    </div>
                     <div class="layui-inline" style="width: 300px">
                        <div class="layui-input-inline">
                            <input class="layui-input layui-laydate-range" name="create_time" type="text" placeholder="起始时间 - ç»ˆæ­¢æ—¶é—´" autocomplete="off" style="width: 300px">
                        </div>
                    </div>
                    <div class="layui-inline">
                        <div class="layui-input-inline">
                            <input class="layui-input" type="text" name="condition" placeholder="请输入" autocomplete="off">
                        </div>
                    </div>
                    <div class="layui-inline">&emsp;
                        <button class="layui-btn icon-btn" lay-filter="search" lay-submit>
                            <i class="layui-icon">&#xe615;</i>搜索
                        </button>
                        <button class="layui-btn icon-btn" lay-filter="reset" lay-submit>
                            <i class="layui-icon">&#xe666;</i>重置
                        </button>
                    </div>
                </div>
            </div>
            <table class="layui-hide" id="basCrnpErrLog" lay-filter="basCrnpErrLog"></table>
        </div>
    </div>
</div>
<script type="text/html" id="toolbar">
    <div class="layui-btn-container">
<!--        <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">新增</button>-->
        <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">删除</button>
        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right">导出</button>
    </div>
</script>
<script type="text/html" id="operate">
<!--    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">修改</a>-->
    <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">删除</a>
</script>
<script type="text/javascript" src="../../../static/js/jquery/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="../../../static/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="../../../static/js/common.js" charset="utf-8"></script>
<script type="text/javascript" src="../../../static/js/cool.js" charset="utf-8"></script>
<script type="text/javascript" src="../../../static/js/basCrnpErrLog/basCrnpErrLog.js" charset="utf-8"></script>
</body>
<!-- è¡¨å•弹窗 -->
<script type="text/html" id="editDialog">
    <form id="detail" lay-filter="detail" class="layui-form admin-form model-form">
        <input name="id" type="hidden">
        <div class="layui-row">
            <div class="layui-col-md12">
                <div class="layui-form-item">
                    <label class="layui-form-label">工作号: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="wrkNo" placeholder="请输入工作号">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">发生时间: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="startTime" id="startTime$" placeholder="请输入发生时间">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">结束时间: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="endTime" id="endTime$" placeholder="请输入结束时间">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">工作状态: </label>
                    <div class="layui-input-block cool-auto-complete">
                        <input class="layui-input" name="wrkSts" placeholder="请输入工作状态" style="display: none">
                        <input id="wrkSts$" name="wrkSts$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="请输入工作状态" onfocus=this.blur()>
                        <div class="cool-auto-complete-window">
                            <input class="cool-auto-complete-window-input" data-key="basWrkStatusQueryBywrkSts" onkeyup="autoLoad(this.getAttribute('data-key'))">
                            <select class="cool-auto-complete-window-select" data-key="basWrkStatusQueryBywrkStsSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
                            </select>
                        </div>
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">入出库类型: </label>
                    <div class="layui-input-block cool-auto-complete">
                        <input class="layui-input" name="ioType" placeholder="请输入入出库类型" style="display: none">
                        <input id="ioType$" name="ioType$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="请输入入出库类型" onfocus=this.blur()>
                        <div class="cool-auto-complete-window">
                            <input class="cool-auto-complete-window-input" data-key="basWrkIotypeQueryByioType" onkeyup="autoLoad(this.getAttribute('data-key'))">
                            <select class="cool-auto-complete-window-select" data-key="basWrkIotypeQueryByioTypeSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
                            </select>
                        </div>
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">堆垛机号: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="crnNo" placeholder="请输入堆垛机号">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">目标库位: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="locNo" placeholder="请输入目标库位">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">目标站: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="staNo" placeholder="请输入目标站">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">源站: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="sourceStaNo" placeholder="请输入源站">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">源库位: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="sourceLocNo" placeholder="请输入源库位">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">条码: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="barcode" placeholder="请输入条码">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">异常码: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="errCode" placeholder="请输入异常码">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">异常: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="error" placeholder="请输入异常">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">异常情况: </label>
                    <div class="layui-input-block">
                        <select name="status">
                            <option value="">请选择异常情况</option>
                            <option value="1">未处理</option>
                            <option value="2">已修复</option>
                        </select>
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">添加时间: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="createTime" id="createTime$" placeholder="请输入添加时间">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">添加人员: </label>
                    <div class="layui-input-block cool-auto-complete">
                        <input class="layui-input" name="createBy" placeholder="请输入添加人员" style="display: none">
                        <input id="createBy$" name="createBy$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="请输入添加人员" onfocus=this.blur()>
                        <div class="cool-auto-complete-window">
                            <input class="cool-auto-complete-window-input" data-key="userQueryBycreateBy" onkeyup="autoLoad(this.getAttribute('data-key'))">
                            <select class="cool-auto-complete-window-select" data-key="userQueryBycreateBySelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
                            </select>
                        </div>
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">修改时间: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="updateTime" id="updateTime$" placeholder="请输入修改时间">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">修改人员: </label>
                    <div class="layui-input-block cool-auto-complete">
                        <input class="layui-input" name="updateBy" placeholder="请输入修改人员" style="display: none">
                        <input id="updateBy$" name="updateBy$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="请输入修改人员" onfocus=this.blur()>
                        <div class="cool-auto-complete-window">
                            <input class="cool-auto-complete-window-input" data-key="userQueryByupdateBy" onkeyup="autoLoad(this.getAttribute('data-key'))">
                            <select class="cool-auto-complete-window-select" data-key="userQueryByupdateBySelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
                            </select>
                        </div>
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">备注: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="memo" placeholder="请输入备注">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">系统状态数据: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="systemStatus" placeholder="请输入系统状态数据">
                    </div>
                </div>
             </div>
        </div>
        <hr class="layui-bg-gray">
        <div class="layui-form-item text-right">
            <button class="layui-btn" lay-filter="editSubmit" lay-submit="">保存</button>
            <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
        </div>
    </form>
</script>
</html>
src/main/webapp/views/admin/basCrnpErrLog/basCrnpErrLog_detail.html
New file
@@ -0,0 +1,202 @@
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title></title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
    <link rel="stylesheet" href="../../static/css/common.css" media="all">
</head>
<body>
<!-- è¯¦æƒ… -->
<div id="data-detail" class="layer_self_wrap">
    <form id="detail" class="layui-form">
    <!--
        <div class="layui-inline"  style="display: none">
            <label class="layui-form-label"><span class="not-null">*</span>编  号:</label>
            <div class="layui-input-inline">
                <input id="id" class="layui-input" type="text" placeholder="编号">
            </div>
        </div>
    -->
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label"><span class="not-null">*</span>编  号:</label>
            <div class="layui-input-inline">
                <input id="id" class="layui-input" type="text" onkeyup="check(this.id, 'basCrnpErrLog')" lay-verify="number" >
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">å·¥ ä½œ å·ï¼š</label>
            <div class="layui-input-inline">
                <input id="wrkNo" class="layui-input" type="text" lay-verify="number" >
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">发生时间:</label>
            <div class="layui-input-inline">
                <input id="startTime$" class="layui-input" type="text" autocomplete="off">
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">结束时间:</label>
            <div class="layui-input-inline">
                <input id="endTime$" class="layui-input" type="text" autocomplete="off">
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">工作状态:</label>
            <div class="layui-input-inline cool-auto-complete">
                <input id="wrkSts" class="layui-input" type="text" lay-verify="number"  style="display: none">
                <input id="wrkSts$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="请输入..." onfocus=this.blur()>
                <div class="cool-auto-complete-window">
                    <input class="cool-auto-complete-window-input" data-key="basWrkStatusQueryBywrkSts" onkeyup="autoLoad(this.getAttribute('data-key'))">
                    <select class="cool-auto-complete-window-select" data-key="basWrkStatusQueryBywrkStsSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
                    </select>
                </div>
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">入出库类型:</label>
            <div class="layui-input-inline cool-auto-complete">
                <input id="ioType" class="layui-input" type="text" lay-verify="number"  style="display: none">
                <input id="ioType$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="请输入..." onfocus=this.blur()>
                <div class="cool-auto-complete-window">
                    <input class="cool-auto-complete-window-input" data-key="basWrkIotypeQueryByioType" onkeyup="autoLoad(this.getAttribute('data-key'))">
                    <select class="cool-auto-complete-window-select" data-key="basWrkIotypeQueryByioTypeSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
                    </select>
                </div>
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">堆垛机号:</label>
            <div class="layui-input-inline">
                <input id="crnNo" class="layui-input" type="text" lay-verify="number" >
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">目标库位:</label>
            <div class="layui-input-inline">
                <input id="locNo" class="layui-input" type="text">
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">目 æ ‡ ç«™ï¼š</label>
            <div class="layui-input-inline">
                <input id="staNo" class="layui-input" type="text" lay-verify="number" >
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">源  站:</label>
            <div class="layui-input-inline">
                <input id="sourceStaNo" class="layui-input" type="text" lay-verify="number" >
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">源 åº“ ä½ï¼š</label>
            <div class="layui-input-inline">
                <input id="sourceLocNo" class="layui-input" type="text">
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">条  码:</label>
            <div class="layui-input-inline">
                <input id="barcode" class="layui-input" type="text">
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">异 å¸¸ ç ï¼š</label>
            <div class="layui-input-inline">
                <input id="errCode" class="layui-input" type="text" lay-verify="number" >
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">异  常:</label>
            <div class="layui-input-inline">
                <input id="error" class="layui-input" type="text">
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">异常情况:</label>
            <div class="layui-input-inline">
                <select id="status">
                    <option value="" style="display: none"></option>
                    <option value="1">未处理</option>
                    <option value="2">已修复</option>
                </select>
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">添加时间:</label>
            <div class="layui-input-inline">
                <input id="createTime$" class="layui-input" type="text" autocomplete="off">
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">添加人员:</label>
            <div class="layui-input-inline cool-auto-complete">
                <input id="createBy" class="layui-input" type="text" lay-verify="number"  style="display: none">
                <input id="createBy$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="请输入..." onfocus=this.blur()>
                <div class="cool-auto-complete-window">
                    <input class="cool-auto-complete-window-input" data-key="userQueryBycreateBy" onkeyup="autoLoad(this.getAttribute('data-key'))">
                    <select class="cool-auto-complete-window-select" data-key="userQueryBycreateBySelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
                    </select>
                </div>
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">修改时间:</label>
            <div class="layui-input-inline">
                <input id="updateTime$" class="layui-input" type="text" autocomplete="off">
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">修改人员:</label>
            <div class="layui-input-inline cool-auto-complete">
                <input id="updateBy" class="layui-input" type="text" lay-verify="number"  style="display: none">
                <input id="updateBy$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="请输入..." onfocus=this.blur()>
                <div class="cool-auto-complete-window">
                    <input class="cool-auto-complete-window-input" data-key="userQueryByupdateBy" onkeyup="autoLoad(this.getAttribute('data-key'))">
                    <select class="cool-auto-complete-window-select" data-key="userQueryByupdateBySelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
                    </select>
                </div>
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">备  注:</label>
            <div class="layui-input-inline">
                <input id="memo" class="layui-input" type="text">
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label" style="font-size: x-small">系统状态数据:</label>
            <div class="layui-input-inline">
                <input id="systemStatus" class="layui-input" type="text">
            </div>
        </div>
        <hr class="layui-bg-gray">
        <div id="data-detail-btn" class="layui-btn-container layui-form-item">
            <div id="data-detail-submit-save" type="button" class="layui-btn layui-btn-normal" lay-submit lay-filter="save">保存</div>
            <div id="data-detail-submit-edit" type="button" class="layui-btn layui-btn-normal" lay-submit lay-filter="edit">修改</div>
            <div id="data-detail-close" type="button" class="layui-btn" lay-submit lay-filter="close">关闭</div>
        </div>
        <div id="prompt">
            æ¸©é¦¨æç¤ºï¼šè¯·ä»”细填写相关信息,<span class="extrude"><span class="not-null">*</span> ä¸ºå¿…填选项。</span>
        </div>
    </form>
</div>
</body>
<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/basCrnpErrLog/basCrnpErrLog.js" charset="utf-8"></script>
</html>
src/main/webapp/views/admin/basCrnpOpt/basCrnpOpt.html
New file
@@ -0,0 +1,174 @@
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title></title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <link rel="stylesheet" href="../../../static/layui/css/layui.css" media="all">
    <link rel="stylesheet" href="../../../static/css/admin.css?v=318" media="all">
    <link rel="stylesheet" href="../../../static/css/cool.css" media="all">
</head>
<body>
<div class="layui-fluid">
    <div class="layui-card">
        <div class="layui-card-body">
            <div class="layui-form toolbar" id="search-box">
                <div class="layui-form-item">
                    <div class="layui-inline">
                        <div class="layui-input-inline">
                            <input class="layui-input" type="text" name="id" placeholder="编号" autocomplete="off">
                        </div>
                    </div>
                     <div class="layui-inline" style="width: 300px">
                        <div class="layui-input-inline">
                            <input class="layui-input layui-laydate-range" name="create_time" type="text" placeholder="起始时间 - ç»ˆæ­¢æ—¶é—´" autocomplete="off" style="width: 300px">
                        </div>
                    </div>
                    <div class="layui-inline">
                        <div class="layui-input-inline">
                            <input class="layui-input" type="text" name="condition" placeholder="请输入" autocomplete="off">
                        </div>
                    </div>
                    <div class="layui-inline">&emsp;
                        <button class="layui-btn icon-btn" lay-filter="search" lay-submit>
                            <i class="layui-icon">&#xe615;</i>搜索
                        </button>
                        <button class="layui-btn icon-btn" lay-filter="reset" lay-submit>
                            <i class="layui-icon">&#xe666;</i>重置
                        </button>
                    </div>
                </div>
            </div>
            <table class="layui-hide" id="basCrnpOpt" lay-filter="basCrnpOpt"></table>
        </div>
    </div>
</div>
<script type="text/html" id="toolbar">
    <div class="layui-btn-container">
<!--        <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">新增</button>-->
        <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">删除</button>
        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right">导出</button>
    </div>
</script>
<script type="text/html" id="operate">
<!--    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">修改</a>-->
    <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">删除</a>
</script>
<script type="text/javascript" src="../../../static/js/jquery/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="../../../static/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="../../../static/js/common.js" charset="utf-8"></script>
<script type="text/javascript" src="../../../static/js/cool.js" charset="utf-8"></script>
<script type="text/javascript" src="../../../static/js/basCrnpOpt/basCrnpOpt.js" charset="utf-8"></script>
</body>
<!-- è¡¨å•弹窗 -->
<script type="text/html" id="editDialog">
    <form id="detail" lay-filter="detail" class="layui-form admin-form model-form">
        <input name="id" type="hidden">
        <div class="layui-row">
            <div class="layui-col-md12">
                <div class="layui-form-item">
                    <label class="layui-form-label">工作号: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="wrkNo" placeholder="请输入工作号">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">堆垛机号: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="crnNo" placeholder="请输入堆垛机号">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">下发时间: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="sendTime" id="sendTime$" placeholder="请输入下发时间">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">作业: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="mode" placeholder="请输入作业">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">起点库位: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="sourceLocNo" placeholder="请输入起点库位">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">目标库位: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="targetLocNo" placeholder="请输入目标库位">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">修改时间: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="updateTime" id="updateTime$" placeholder="请输入修改时间">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">修改人员: </label>
                    <div class="layui-input-block cool-auto-complete">
                        <input class="layui-input" name="updateBy" placeholder="请输入修改人员" style="display: none">
                        <input id="updateBy$" name="updateBy$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="请输入修改人员" onfocus=this.blur()>
                        <div class="cool-auto-complete-window">
                            <input class="cool-auto-complete-window-input" data-key="userQueryByupdateBy" onkeyup="autoLoad(this.getAttribute('data-key'))">
                            <select class="cool-auto-complete-window-select" data-key="userQueryByupdateBySelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
                            </select>
                        </div>
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">备注: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="memo" placeholder="请输入备注">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">命令: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="command" placeholder="请输入命令">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">系统状态: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="systemStatus" placeholder="请输入系统状态">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">下发状态: </label>
                    <div class="layui-input-block">
                        <select name="send">
                            <option value="">请选择下发状态</option>
                            <option value="0">未下发</option>
                            <option value="1">已下发</option>
                        </select>
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">请求响应: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="response" placeholder="请输入请求响应">
                    </div>
                </div>
             </div>
        </div>
        <hr class="layui-bg-gray">
        <div class="layui-form-item text-right">
            <button class="layui-btn" lay-filter="editSubmit" lay-submit="">保存</button>
            <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
        </div>
    </form>
</script>
</html>
src/main/webapp/views/admin/basCrnpOpt/basCrnpOpt_detail.html
New file
@@ -0,0 +1,142 @@
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title></title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
    <link rel="stylesheet" href="../../static/css/common.css" media="all">
</head>
<body>
<!-- è¯¦æƒ… -->
<div id="data-detail" class="layer_self_wrap">
    <form id="detail" class="layui-form">
    <!--
        <div class="layui-inline"  style="display: none">
            <label class="layui-form-label"><span class="not-null">*</span>编  号:</label>
            <div class="layui-input-inline">
                <input id="id" class="layui-input" type="text" placeholder="编号">
            </div>
        </div>
    -->
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label"><span class="not-null">*</span>编  号:</label>
            <div class="layui-input-inline">
                <input id="id" class="layui-input" type="text" onkeyup="check(this.id, 'basCrnpOpt')" lay-verify="number" >
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">å·¥ ä½œ å·ï¼š</label>
            <div class="layui-input-inline">
                <input id="wrkNo" class="layui-input" type="text" lay-verify="number" >
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">堆垛机号:</label>
            <div class="layui-input-inline">
                <input id="crnNo" class="layui-input" type="text" lay-verify="number" >
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">下发时间:</label>
            <div class="layui-input-inline">
                <input id="sendTime$" class="layui-input" type="text" autocomplete="off">
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">作  业:</label>
            <div class="layui-input-inline">
                <input id="mode" class="layui-input" type="text">
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">起点库位:</label>
            <div class="layui-input-inline">
                <input id="sourceLocNo" class="layui-input" type="text">
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">目标库位:</label>
            <div class="layui-input-inline">
                <input id="targetLocNo" class="layui-input" type="text">
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">修改时间:</label>
            <div class="layui-input-inline">
                <input id="updateTime$" class="layui-input" type="text" autocomplete="off">
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">修改人员:</label>
            <div class="layui-input-inline cool-auto-complete">
                <input id="updateBy" class="layui-input" type="text" lay-verify="number"  style="display: none">
                <input id="updateBy$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="请输入..." onfocus=this.blur()>
                <div class="cool-auto-complete-window">
                    <input class="cool-auto-complete-window-input" data-key="userQueryByupdateBy" onkeyup="autoLoad(this.getAttribute('data-key'))">
                    <select class="cool-auto-complete-window-select" data-key="userQueryByupdateBySelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
                    </select>
                </div>
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">备  注:</label>
            <div class="layui-input-inline">
                <input id="memo" class="layui-input" type="text">
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">命  令:</label>
            <div class="layui-input-inline">
                <input id="command" class="layui-input" type="text">
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">系统状态:</label>
            <div class="layui-input-inline">
                <input id="systemStatus" class="layui-input" type="text">
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">下发状态:</label>
            <div class="layui-input-inline">
                <select id="send">
                    <option value="" style="display: none"></option>
                    <option value="0">未下发</option>
                    <option value="1">已下发</option>
                </select>
            </div>
        </div>
        <div class="layui-inline"  style="width:31%;">
            <label class="layui-form-label">请求响应:</label>
            <div class="layui-input-inline">
                <input id="response" class="layui-input" type="text">
            </div>
        </div>
        <hr class="layui-bg-gray">
        <div id="data-detail-btn" class="layui-btn-container layui-form-item">
            <div id="data-detail-submit-save" type="button" class="layui-btn layui-btn-normal" lay-submit lay-filter="save">保存</div>
            <div id="data-detail-submit-edit" type="button" class="layui-btn layui-btn-normal" lay-submit lay-filter="edit">修改</div>
            <div id="data-detail-close" type="button" class="layui-btn" lay-submit lay-filter="close">关闭</div>
        </div>
        <div id="prompt">
            æ¸©é¦¨æç¤ºï¼šè¯·ä»”细填写相关信息,<span class="extrude"><span class="not-null">*</span> ä¸ºå¿…填选项。</span>
        </div>
    </form>
</div>
</body>
<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/basCrnpOpt/basCrnpOpt.js" charset="utf-8"></script>
</html>
src/main/webapp/views/admin/basLift/basLift.html
File was deleted
src/main/webapp/views/admin/basLiftErr/basLiftErr.html
File was deleted
src/main/webapp/views/admin/basLiftErrLog/basLiftErrLog.html
File was deleted
src/main/webapp/views/admin/basLiftOpt/basLiftOpt.html
File was deleted
src/main/webapp/views/admin/basShuttle/basShuttle.html
File was deleted
src/main/webapp/views/admin/basShuttleCharge/basShuttleCharge.html
File was deleted
src/main/webapp/views/admin/basShuttleCharge/basShuttleCharge_detail.html
File was deleted
src/main/webapp/views/admin/basShuttleErr/basShuttleErr.html
File was deleted
src/main/webapp/views/admin/basShuttleErrLog/basShuttleErrLog.html
File was deleted
src/main/webapp/views/admin/basShuttleErrLog/basShuttleOpt.html
File was deleted
src/main/webapp/views/car_vue.html
File was deleted
src/main/webapp/views/console.html
@@ -19,73 +19,46 @@
    </head>
    <body>
        <div id="app">
            <div style="display: flex;justify-content: center;align-items: center;width: 100%;margin-top: 150px;">
                <div id="mapDataId" style="zoom: 0.7;position: relative;">
                    <div class="pointContainer" v-for="(row,index) in map" :key="index">
                        <div v-for="(col,idx) in row" :key="idx">
                            <div v-if="col.value == 0">
                                <!-- å­è½¨é“ è·¯å¾„为穿梭车预计路径则显示穿梭车颜色和穿梭车号 -->
                                <div :style="{background: checkAdvancePath(index,idx).length == 0 ? '':shuttleColorList[checkAdvancePath(index,idx)[0]]}" class="item" v-if="col.data.length > 0">{{col.data}}</div>
                                <div :style="{background: checkAdvancePath(index,idx).length == 0 ? '':shuttleColorList[checkAdvancePath(index,idx)[0]]}" class="item" v-else>{{checkAdvancePath(index,idx).length == 0 ? idx:checkAdvancePath(index,idx)}}</div>
                            </div>
                            <div v-else-if="col.value == 3">
                                <!-- æ¯è½¨é“ è·¯å¾„为穿梭车预计路径则显示穿梭车颜色和穿梭车号 -->
                                <div :style="{background: checkAdvancePath(index,idx).length == 0 ? '#5af':shuttleColorList[checkAdvancePath(index,idx)[0]]}" class="item">{{checkAdvancePath(index,idx).length == 0 ? '&#x21c5;&#x21c4;':checkAdvancePath(index,idx)}}</div>
                            </div>
                            <div v-else-if="col.value == 4">
                                <!-- ç«™ç‚¹ -->
                                <div class="site" :id="'site-' + col.data" @click="openSite(col.data)">{{col.data}}</div>
                            </div>
                            <div v-else-if="col.value == 5">
                                <!-- å……电桩 -->
                                <div class="item" style="font-size: 24px">&#9889;</div>
                            </div>
                            <div v-else-if="col.value == -999">
                                <!-- è·¯å¾„占用区域 -->
                                <div class="item" style="background:#f83333;color: #fff;">{{idx}}</div>
                            </div>
                            <div v-else-if="col.value < 0">
                                <!-- ç¦æ­¢æ˜¾ç¤ºåŒºåŸŸ -->
                                <div class="item" style="visibility: hidden">{{idx}}</div>
                            </div>
                            <div v-else>
                                <div class="item" v-if="col.data.length > 0">{{col.data}}</div>
                                <div class="item" v-else>{{idx}}-{{col.value}}</div>
                            </div>
                        </div>
            <div style="display: flex;justify-content: center;align-items: center;width: 100%;margin-top: 30px;">
                <div id="mapDataId" style="zoom: 0.6;position: relative;">
                    <table class="excel-table">
                        <tr v-for="(row,index) in map" :key="index">
                            <td
                                    v-for="(col,idx) in row" :key="idx"
                                    :rowspan="col.rowSpan"
                                    :colspan="col.colSpan"
                                    :style="{width: col.width}"
                                    v-if="col.type != 'merge'"
                            >
                                <div v-if="col.type == 'none'">
                                    <div class="item" style="visibility: hidden">{{idx}}</div>
                                </div>
                                <div v-else-if="col.type == 'shelf'">
                                    <div class="shelf">{{col.shelfIdx}}</div>
                                </div>
                                <div v-else-if="col.type == 'devp'">
                                    <div class="site" :style="{height: col.rowPx}" :id="'site-' + col.value" @click="openSite(col.value)">{{col.value}}</div>
                                </div>
                                <div v-else-if="col.type == 'rgv'" style="position: relative;">
                                    <div class="rgv-item" v-if="getDeviceNo(col.value) != -1" :style="{width: col.width}" :id="'rgv-' + getDeviceNo(col.value)" @click="openRgv(getDeviceNo(col.value))">{{getDeviceNo(col.value)}}</div>
                                    <div class="track-item" v-if="getTrackSiteNo(col.value) == -1"></div>
                                    <div class="track-item" v-else :id="'rgvTrackSiteNo-' + getTrackSiteNo(col.value)"></div>
                                </div>
                                <div v-else-if="col.type == 'crn'">
                                    <div class="crn-item" v-if="getDeviceNo(col.value) != -1" :style="{width: col.width}" :id="'crn-' + getDeviceNo(col.value)" @click="openCrn(getDeviceNo(col.value))">{{getDeviceNo(col.value)}}</div>
                                    <div class="track-item" v-if="getTrackSiteNo(col.value) == -1"></div>
                                    <div class="track-item" v-else :id="'crnTrackSiteNo-' + getTrackSiteNo(col.value)"></div>
                                </div>
                            </td>
                        <div>
                            <!-- æ˜¾ç¤ºè¡Œå· -->
                            <div class="item" style="background: none;color: #000;">#{{index+1}}</div>
                        </div>
                    </div>
                    <div
                            v-for="(car, idx) in currentLevShuttleList"
                            :style="{
                                '--x-pos': getCarPosition(car.point.x, car.point.y)[1],
                                '--y-pos': getCarPosition(car.point.x, car.point.y)[0],
                                color: shuttleColorList[car.shuttleNo]
                              }"
                            class="sxcar"
                            :id="'sxcar-' + car.shuttleNo"
                    >
                        {{ car.shuttleNo }}
                    </div>
                            <td>
                                <!-- æ˜¾ç¤ºè¡Œå· -->
                                <div class="item" style="background: none;color: #000;">#{{index+1}}</div>
                            </td>
                        </tr>
                    </table>
                </div>
                <!--输出楼层-->
                <div style="height: 100%;">
                    <div class="floorBtnBox" v-for="(lev,idx) in floorList">
                        <el-button :style="{background:currentLev === lev ? '#7DCDFF':''}" @click="changFloor(lev)">{{lev}}F</el-button>
                    </div>
                    <div>
<!--                        <el-button @click="testMove()">测试移动车</el-button>-->
<!--                        <el-button @click="resetMap()">重置地图</el-button>-->
<!--                        <el-button @click="initLoc()">初始化库位</el-button>-->
                    </div>
                </div>
            </div>
            <div class="footer">
@@ -110,105 +83,83 @@
                        </div>
                    </div>
                </div>
                <!-- å››å‘穿梭车状态 -->
                <!-- å †åž›æœºçŠ¶æ€ -->
                <div class="line-status">
                    <div class="body-head">穿梭车状态</div>
                    <div class="body-head">堆垛机状态</div>
                    <div class="shuttle-status-box">
                        <div v-for="(item,idx) in shuttleList" class="state">
                            <span :style="{color: shuttleColorList[item.shuttleNo]}">四向穿梭车 {{item.shuttleNo}}</span>
                            <span v-if="item.protocolStatus == 1"
                                class="state-ss shuttle-idle">{{item.protocolStatus$}}</span>
                            <span v-else-if="item.protocolStatus == 2"
                                class="state-ss shuttle-working">{{item.protocolStatus$}}</span>
                            <span v-else-if="item.protocolStatus == 3"
                                class="state-ss shuttle-waiting">{{item.protocolStatus$}}</span>
                            <span v-else-if="item.protocolStatus == 4"
                                class="state-ss shuttle-charging">{{item.protocolStatus$}}</span>
                            <span v-else-if="item.protocolStatus == 5"
                                class="state-ss shuttle-charging-waiting">{{item.protocolStatus$}}</span>
                            <span v-else-if="item.protocolStatus == 6"
                                class="state-ss shuttle-fixing">{{item.protocolStatus$}}</span>
                            <span v-else-if="item.protocolStatus == 7"
                                class="state-ss shuttle-offline">{{item.protocolStatus$}}</span>
                            <span v-else class="state-ss shuttle-offline">{{item.protocolStatus$}}</span>
                        <div v-for="(item,idx) in crnList" class="state">
                            <span>堆垛机 {{item.crnNo}}</span>
                            <span v-if="item.crnStatus == 'machine-auto'"
                                class="state-ss machine-auto-flag">自动</span>
                            <span v-else-if="item.crnStatus == 'machine-un-auto'"
                                class="state-ss machine-unauto-flag">非自动/手动</span>
                            <span v-else-if="item.crnStatus == 'machine-error'"
                                class="state-ss machine-error-flag">异常</span>
                            <span v-else-if="item.crnStatus == 'machine-p-move'"
                                class="state-ss machine-p-move-flag">PToP</span>
                            <span v-else-if="item.crnStatus == 'machine-site-move'"
                                class="state-ss machine-site-move-flag">站到站</span>
                            <span v-else-if="item.crnStatus == 'machine-stock-move'"
                                class="state-ss machine-stock-move-flag">库到库</span>
                            <span v-else-if="item.crnStatus == 'machine-pakout'"
                                class="state-ss machine-take-flag">出库</span>
                            <span v-else-if="item.crnStatus == 'machine-pakin'"
                                  class="state-ss machine-put-flag">入库</span>
                            <span v-else class="state-ss">{{item.crnStatus}}</span>
                        </div>
                    </div>
                    <div class="allStatus"><span>所有状态</span></div>
                    <div class="allStatus item-group">
                        <span class="shuttle-idle">空闲</span>
                        <span class="shuttle-working">作业中</span>
                        <span class="shuttle-waiting">等待确认</span>
                        <span class="shuttle-charging">充电中</span>
                        <span class="shuttle-charging-waiting">充电任务等待确认</span>
                        <span class="shuttle-fixing">故障修复中</span>
                        <span class="shuttle-offline">离线</span>
                        <span class="machine-put-flag">入库</span>
                        <span class="machine-take-flag">出库</span>
                        <span class="machine-stock-move-flag">库到库</span>
                        <span class="machine-site-move-flag">站到站</span>
                        <span class="machine-p-move-flag">PToP</span>
                        <span class="machine-error-flag">异常</span>
                        <span class="machine-auto-flag">自动</span>
                        <span class="machine-unauto-flag">非自动/手动</span>
                    </div>
                </div>
                <!-- æå‡æœºçŠ¶æ€ -->
                <!-- è¾“送线状态 -->
                <div class="line-status">
                    <div class="body-head">提升机状态</div>
                    <div class="lift-status-box">
                        <div v-for="(item,idx) in liftList" class="state states">
                            <span>提升机 {{item.liftNo}}</span>
                            <span v-if="item.protocolStatus == 1"
                                class="state-ss lift-idle">{{item.protocolStatus$}}</span>
                            <span v-else-if="item.protocolStatus == 2"
                                class="state-ss lift-working">{{item.protocolStatus$}}</span>
                            <span v-else-if="item.protocolStatus == 3"
                                class="state-ss lift-waiting">{{item.protocolStatus$}}</span>
                            <span v-else-if="item.protocolStatus == 4"
                                class="state-ss lift-offline">{{item.protocolStatus$}}</span>
                            <span v-else class="state-ss lift-offline">{{item.protocolStatus$}}</span>
                        </div>
                    <div class="body-head">输送线状态</div>
                    <div class="state states">
                        <span>运输线总数</span>
                        <span class="line-ss">9</span>
                    </div>
                    <div class="allStatus"><span>所有状态</span></div>
                    <div class="allStatus item-group">
                        <span class="lift-idle">空闲</span>
                        <span class="lift-working">作业中</span>
                        <span class="lift-waiting">等待确认</span>
                        <span class="lift-offline">离线</span>
                        <span class="site-auto-run-id">自动+有物+ID</span>
                        <span class="site-auto-run">自动+有物</span>
                        <span class="site-auto-id">自动+ID</span>
                        <span class="site-auto">自动</span>
                        <span class="site-unauto">非自动/手动</span>
                    </div>
                </div>
<!--                &lt;!&ndash; è¾“送线状态 &ndash;&gt;-->
<!--                <div class="line-status">-->
<!--                    <div class="body-head">输送线状态</div>-->
<!--                    <div class="state states">-->
<!--                        <span>运输线总数</span>-->
<!--                        <span class="line-ss">9</span>-->
<!--                    </div>-->
<!--                    <div class="allStatus"><span>所有状态</span></div>-->
<!--                    <div class="allStatus item-group">-->
<!--                        <span class="site-auto-run-id">自动+有物+ID</span>-->
<!--                        <span class="site-auto-run">自动+有物</span>-->
<!--                        <span class="site-auto-id">自动+ID</span>-->
<!--                        <span class="site-auto">自动</span>-->
<!--                        <span class="site-unauto">非自动/手动</span>-->
<!--                    </div>-->
<!--                </div>-->
<!--                &lt;!&ndash; æ¡ç è¡¨æ ¼ &ndash;&gt;-->
<!--                <div class="bar-code">-->
<!--                    <div class="body-head" id="code">条码扫描器</div>-->
<!--                    <div class="tablebox">-->
<!--                        <div class="table-head">-->
<!--                            <li><span>条码名称</span><span class="right">扫码时间</span></li>-->
<!--                        </div>-->
<!--                        <div id="barcode1" class="table-body">-->
<!--                            <li v-for="(item,index) in codeList1" :key="index"><span>{{item.barcode}}</span><span class="right">{{item.time}}</span></li>-->
<!--                        </div>-->
<!--                    </div>-->
<!--                    <div class="tablebox">-->
<!--                        <div class="table-head">-->
<!--                            <li><span>条码名称</span><span class="right">扫码时间</span></li>-->
<!--                        </div>-->
<!--                        <div id="barcode2" class="table-body">-->
<!--                            <li v-for="(item,index) in codeList2" :key="index"><span>{{item.barcode}}</span><span class="right">{{item.time}}</span></li>-->
<!--                        </div>-->
<!--                    </div>-->
<!--                </div>-->
<!--            </div>-->
                <!-- æ¡ç è¡¨æ ¼ -->
                <div class="bar-code">
                    <div class="body-head" id="code">条码扫描器</div>
                    <div class="tablebox">
                        <div class="table-head">
                            <li><span>条码名称</span><span class="right">扫码时间</span></li>
                        </div>
                        <div id="barcode1" class="table-body">
                            <li v-for="(item,index) in codeList1" :key="index"><span>{{item.barcode}}</span><span class="right">{{item.time}}</span></li>
                        </div>
                    </div>
                    <div class="tablebox">
                        <div class="table-head">
                            <li><span>条码名称</span><span class="right">扫码时间</span></li>
                        </div>
                        <div id="barcode2" class="table-body">
                            <li v-for="(item,index) in codeList2" :key="index"><span>{{item.barcode}}</span><span class="right">{{item.time}}</span></li>
                        </div>
                    </div>
                </div>
            </div>
            <!-- è¾“送设备弹窗 -->
            <div id="siteWindow" :style="{display:siteWindow?'block':'none'}" class="animate__animated animate__fadeIn">
            <div id="siteWindow" :style="{display:siteWindow?'block':'none',zIndex: 999}" class="animate__animated animate__fadeIn">
                <!-- è¡¨å¤´ -->
                <div id="siteWindow-head">
                    <div class="detailed"></div>
@@ -331,24 +282,223 @@
                </div>
            </div>
            <!-- å †åž›æœºå¼¹çª— -->
            <div id="crnWindow" :style="{display:crnWindow?'block':'none',zIndex: 999}" class="animate__animated animate__fadeIn">
                <div id="crnWindow-head">
                    <div class='detailed'></div>
                    <button @click="crnWindow = false"></button>
                </div>
                <form>
                    <!-- å †åž›æœºå· -->
                    <div class="form-item">
                        <div class="form-item-label" style>
                            <span>堆垛机号:</span>
                        </div>
                        <div class="form-item-input">
                            <input type="text" name="crnNo" value="">
                        </div>
                    </div>
                    <!-- å·¥ä½œå· -->
                    <div class="form-item">
                        <div class="form-item-label">
                            <span>工作号:</span>
                        </div>
                        <div class="form-item-input">
                            <input type="text" name="workNo" value="">
                        </div>
                    </div>
                    <!-- ç«™æº -->
                    <div class="form-item">
                        <div class="form-item-label">
                            <span>站源:</span>
                        </div>
                        <div class="form-item-input">
                            <input type="text" name="sourceStaNo" value="">
                        </div>
                    </div>
                    <!-- ç›®æ ‡ç«™ -->
                    <div class="form-item">
                        <div class="form-item-label">
                            <span>目标站:</span>
                        </div>
                        <div class="form-item-input">
                            <input type="text" name="staNo" value="">
                        </div>
                    </div>
                    <!-- å·¥ä½œçŠ¶æ€ -->
                    <div class="form-item">
                        <div class="form-item-label">
                            <span>工作状态:</span>
                        </div>
                        <div class="form-item-input">
                            <input type="text" name="wrkSts" value="">
                        </div>
                    </div>
                    <!-- å‡ºå…¥ç±»åž‹ -->
                    <div class="form-item">
                        <div class="form-item-label">
                            <span>出入类型:</span>
                        </div>
                        <div class="form-item-input">
                            <input type="text" name="ioType" value="">
                        </div>
                    </div>
                    <!-- æºåº“位 -->
                    <div class="form-item">
                        <div class="form-item-label">
                            <span>源库位:</span>
                        </div>
                        <div class="form-item-input">
                            <input type="text" name="sourceLocNo" value="">
                        </div>
                    </div>
                    <!-- ç›®æ ‡åº“位 -->
                    <div class="form-item">
                        <div class="form-item-label">
                            <span>目标库位:</span>
                        </div>
                        <div class="form-item-input">
                            <input type="text" name="locNo" value="">
                        </div>
                    </div>
                    <!-- å †åž›æœºçŠ¶æ€ -->
                    <div class="form-item">
                        <div class="form-item-label">
                            <span>堆垛机状态:</span>
                        </div>
                        <div class="form-item-input">
                            <input type="text" name="crnStatus" value="">
                        </div>
                    </div>
                    <!-- å¼‚常 -->
                    <div class="form-item">
                        <div class="form-item-label">
                            <span>异常:</span>
                        </div>
                        <div class="form-item-input">
                            <input type="text" name="error" value="">
                        </div>
                    </div>
                </form>
            </div>
            <!-- RGV弹窗 -->
            <div id="rgvWindow" :style="{display:rgvWindow?'block':'none',zIndex: 999}" class="animate__animated animate__fadeIn">
                <div id="rgvWindow-head">
                    <div class='detailed'></div>
                    <button @click="rgvWindow = false"></button>
                </div>
                <form>
                    <!-- RGV号 -->
                    <div class="form-item">
                        <div class="form-item-label" style>
                            <span>RGV号:</span>
                        </div>
                        <div class="form-item-input">
                            <input type="text" name="rgvNo" value="">
                        </div>
                    </div>
                    <!-- å·¥ä½œå· -->
                    <div class="form-item">
                        <div class="form-item-label">
                            <span>工作号:</span>
                        </div>
                        <div class="form-item-input">
                            <input type="text" name="workNo" value="">
                        </div>
                    </div>
                    <!-- ç«™æº -->
                    <div class="form-item">
                        <div class="form-item-label">
                            <span>站源:</span>
                        </div>
                        <div class="form-item-input">
                            <input type="text" name="sourceStaNo" value="">
                        </div>
                    </div>
                    <!-- ç›®æ ‡ç«™ -->
                    <div class="form-item">
                        <div class="form-item-label">
                            <span>目标站:</span>
                        </div>
                        <div class="form-item-input">
                            <input type="text" name="staNo" value="">
                        </div>
                    </div>
                    <!-- å·¥ä½œçŠ¶æ€ -->
                    <div class="form-item">
                        <div class="form-item-label">
                            <span>工作状态:</span>
                        </div>
                        <div class="form-item-input">
                            <input type="text" name="wrkSts" value="">
                        </div>
                    </div>
                    <!-- å‡ºå…¥ç±»åž‹ -->
                    <div class="form-item">
                        <div class="form-item-label">
                            <span>出入类型:</span>
                        </div>
                        <div class="form-item-input">
                            <input type="text" name="ioType" value="">
                        </div>
                    </div>
                    <!-- æºåº“位 -->
                    <div class="form-item">
                        <div class="form-item-label">
                            <span>源库位:</span>
                        </div>
                        <div class="form-item-input">
                            <input type="text" name="sourceLocNo" value="">
                        </div>
                    </div>
                    <!-- ç›®æ ‡åº“位 -->
                    <div class="form-item">
                        <div class="form-item-label">
                            <span>目标库位:</span>
                        </div>
                        <div class="form-item-input">
                            <input type="text" name="locNo" value="">
                        </div>
                    </div>
                    <!-- RGV状态 -->
                    <div class="form-item">
                        <div class="form-item-label">
                            <span>RGV状态:</span>
                        </div>
                        <div class="form-item-input">
                            <input type="text" name="rgvStatus" value="">
                        </div>
                    </div>
                    <!-- å¼‚常 -->
                    <div class="form-item">
                        <div class="form-item-label">
                            <span>异常:</span>
                        </div>
                        <div class="form-item-input">
                            <input type="text" name="error" value="">
                        </div>
                    </div>
                </form>
            </div>
        </div>
        <script>
            var app = new Vue({
                el: '#app',
                data: {
                    map: [],//地图数据
                    currentLev: 1,//地图当前楼层
                    siteWindow: false, //站点弹窗显示默认不显示
                    floorList: [], //当前项目楼层
                    shuttleList: [], //四向穿梭车集合
                    currentLevShuttleList: [],//当前楼层四向穿梭车集合
                    shuttleColorList: [],//四向穿梭车颜色集合
                    crnWindow: false, //堆垛机弹窗显示默认不显示
                    rgvWindow: false, //rgv弹窗显示默认不显示
                    crnList: [], //堆垛机集合
                    liftList: [], //提升机集合
                    systemStatus: true,//系统运行状态
                    consoleInterval: null,//定时器存储变量
                    codeList1: [],//条码List
                    codeList2: [],//条码List
                    ws: null,
                    crnInitPosition: [],
                    rgvPosition: [],
                },
                created() {
                    this.init()
@@ -358,36 +508,95 @@
                },
                methods: {
                    init() {
                        this.getMap(this.currentLev)
                        this.getMap()
                        this.getSystemRunningStatus() //获取系统运行状态
                        this.initLev()//初始化楼层信息
                        this.consoleInterval = setInterval(() => {
                            this.websocketConnect()
                            this.getShuttleStateInfo() //获取四向穿梭车信息
                            this.getLiftStateInfo() //获取提升机信息
                            this.getCrnInfo() //获取堆垛机数据
                            this.getSiteInfo() //获取输送站点数据
                            this.getMap(this.currentLev) //获取实时地图数据
                            this.getCodeData()//获取条码
                            this.getRgvInfo() //获取RGV数据
                            // this.getCodeData()//获取条码
                        }, 1000)
                    },
                    //获取地图数据
                    getMap(lev) {
                        this.sendWs(JSON.stringify({
                            "url": "/console/map/auth",
                            "data": lev
                        }))
                    getMap() {
                        let rowPx = 35;
                        let colPx = 35;
                        $.ajax({
                            url: "./test.json",
                            method: "get",
                            success: (res) => {
                                let data = res.data;
                                let mapData = JSON.parse(data)
                                mapData.forEach((row) => {
                                    let shelfIdx = 1;
                                    row.forEach((col) => {
                                        if (col.type == 'shelf') {
                                            col.shelfIdx = shelfIdx;
                                            shelfIdx++;
                                        }
                                        col.rowPx = (col.rowSpan * rowPx) + "px";
                                        col.colPx = (col.colSpan * colPx) + "px";
                                        col.width = (col.cellWidth / 30) + "px";
                                    })
                                })
                                this.map = mapData;
                            }
                        })
                    },
                    setMap(res) {
                        //获取地图数据
                        let data = res.data
                        let tmp = []
                        for (let i = 1; i < data.length - 1; i++) {
                            tmp.push(data[i])
                        }
                        // console.log(tmp)
                        this.map = tmp
                    openCrn(id) {
                        this.crnWindow = true; //打开站点信息弹窗
                        $(".detailed").empty();
                        $('.detailed').append(id + '号堆垛机');
                        $.ajax({
                            url: baseUrl + "/console/crn/detail",
                            headers: {
                                'token': localStorage.getItem('token')
                            },
                            data: {
                                crnNo: id
                            },
                            method: 'post',
                            success: function(res) {
                                for (var val in res.data) {
                                    var find = $("#crnWindow").find(":input[name='" + val + "']");
                                    if (find[0].type === 'text') {
                                        find.val(res.data[val]);
                                    } else if (find[0].type === 'checkbox') {
                                        find.attr("checked", res.data[val] === 'Y');
                                    }
                                }
                            }
                        })
                    },
                    openRgv(id) {
                        this.rgvWindow = true; //打开RGV信息弹窗
                        $(".detailed").empty();
                        $('.detailed').append(id + '号RGV');
                        $.ajax({
                            url: baseUrl + "/console/rgv/detail",
                            headers: {
                                'token': localStorage.getItem('token')
                            },
                            data: {
                                rgvNo: id
                            },
                            method: 'post',
                            success: function(res) {
                                for (var val in res.data) {
                                    var find = $("#rgvWindow").find(":input[name='" + val + "']");
                                    if (find[0].type === 'text') {
                                        find.val(res.data[val]);
                                    } else if (find[0].type === 'checkbox') {
                                        find.attr("checked", res.data[val] === 'Y');
                                    }
                                }
                            }
                        })
                    },
                    openSite(id) {
                        this.siteWindow = true; //打开站点信息弹窗
@@ -417,77 +626,168 @@
                    },
                    getSiteInfo() {
                        //获取输送站点数据
                        this.sendWs(JSON.stringify({
                            "url": "/console/latest/data/site",
                            "data": {}
                        }))
                    },
                    setSiteInfo(res) {
                        //获取输送站点数据
                        if (res.code === 200){
                            var sites = res.data;
                            for (var i = 0; i < sites.length; i++){
                                var siteEl = $("#site-"+sites[i].siteId);
                                siteEl.attr("class", "site " + sites[i].siteStatus);
                                if (sites[i].workNo != null && sites[i].workNo>0) {
                                    siteEl.html(sites[i].siteId + "[" + sites[i].workNo + "]");
                                } else {
                                    siteEl.html(sites[i].siteId);
                                }
                            }
                        } else if (res.code === 403){
                            parent.location.href = baseUrl+"/login";
                        }  else {
                            console.log(res.msg);
                        }
                    },
                    changFloor(lev) {
                        this.currentLev = lev
                        this.currentLevShuttleList = []
                        this.getMap(lev)
                    },
                    getShuttleStateInfo() {
                        this.sendWs(JSON.stringify({
                            "url": "/shuttle/table/shuttle/state",
                            "data": {}
                        }))
                    },
                    setShuttleStateInfo(res) {
                        // å››å‘穿梭车信息表获取
                        let that = this
                        if (res.code == 200) {
                            let currentLevShuttle = []//当前楼层小车集合
                            res.data.forEach((item,idx) => {
                                if (item != null && item.point != undefined && item.point != null) {
                                    if (item.point.z == that.currentLev) {
                                        currentLevShuttle.push(item);
                        $.ajax({
                            url: baseUrl + "/console/latest/data/site",
                            headers: {'token': localStorage.getItem('token')},
                            method: 'POST',
                            success: function (res) {
                                if (res.code === 200) {
                                    var sites = res.data;
                                    for (var i = 0; i < sites.length; i++){
                                        var siteEl = $("#site-"+sites[i].siteId);
                                        siteEl.attr("class", "site " + sites[i].siteStatus);
                                        if (sites[i].workNo != null && sites[i].workNo>0) {
                                            siteEl.html(sites[i].siteId + "[" + sites[i].workNo + "]");
                                        } else {
                                            siteEl.html(sites[i].siteId);
                                        }
                                    }
                                } else if (res.code === 403) {
                                    parent.location.href = baseUrl + "/login";
                                } else {
                                    console.log(res.msg);
                                }
                            })
                            that.currentLevShuttleList = currentLevShuttle
                            that.shuttleList = res.data
                            if (that.shuttleColorList.length == 0) {
                                let colorList = []//随机小车颜色
                                res.data.forEach((item,idx) => {
                                    colorList[item.shuttleNo] = that.colorRGB()
                                })
                                that.shuttleColorList = colorList
                            }
                        }
                        });
                    },
                    getLiftStateInfo() {
                        // æå‡æœºä¿¡æ¯è¡¨èŽ·å–
                        this.sendWs(JSON.stringify({
                            "url": "/lift/table/lift/state",
                            "data": {}
                        }))
                    getCrnInfo() {
                        let that = this
                        //获取堆垛机数据
                        $.ajax({
                            url: baseUrl + "/console/latest/data/crn",
                            headers: {'token': localStorage.getItem('token')},
                            method: 'POST',
                            success: function (res) {
                                if (res.code === 200) {
                                    var crns = res.data;
                                    if (that.crnInitPosition.length == 0) {
                                        let position = []
                                        for (var i = 0; i < crns.length; i++) {
                                            var crnEl = $("#crn-" + crns[i].crnId);
                                            position.push({
                                                id: crns[i].crnId,
                                                left: crnEl.offset().left + crnEl.width()
                                            })
                                        }
                                        that.crnInitPosition = position
                                        return;
                                    }
                                    let crnList = []
                                    for (var i = 0; i < crns.length; i++) {
                                        var crnEl = $("#crn-" + crns[i].crnId);
                                        crnEl.attr("class", "crn-item " + crns[i].crnStatus);
                                        if (crns[i].bay < 0 || crns[i].bay === -2) {
                                            crns[i].bay = 1
                                        }
                                        let basePosition = 0;
                                        that.crnInitPosition.forEach((item) => {
                                            if (item.id == crns[i].crnId) {
                                                basePosition = item.left
                                            }
                                        })
                                        var offSet = crns[i].offset;
                                        let finalOffset = basePosition + offSet;
                                        if (finalOffset < basePosition) {
                                            finalOffset = basePosition;
                                        }
                                        crnEl.animate({left: finalOffset + 'px'}, 1000);
                                        crnList.push({
                                            crnNo: crns[i].crnId,
                                            crnStatus: crns[i].crnStatus
                                        })
                                    }
                                    that.crnList = crnList;
                                } else if (res.code === 403) {
                                    parent.location.href = baseUrl + "/login";
                                } else {
                                    console.log(res.msg);
                                }
                            }
                        });
                    },
                    setLiftStateInfo(res) {
                        // æå‡æœºä¿¡æ¯è¡¨èŽ·å–
                        if (res.code == 200) {
                            this.liftList = res.data
                        }
                    getRgvInfo() {
                        let that = this
                        //获取RGV数据
                        $.ajax({
                            url: baseUrl + "/console/latest/data/rgv",
                            headers: {'token': localStorage.getItem('token')},
                            method: 'POST',
                            success: function (res) {
                                if (res.code === 200) {
                                    var rgvs = res.data;
                                    if (that.rgvPosition.length == 0) {
                                        let position = []
                                        for (var i = 0; i < rgvs.length; i++) {
                                            var rgvEl = $("#rgv-" + rgvs[i].rgvId);
                                            position.push({
                                                id: rgvs[i].rgvId,
                                                trackSiteNo: rgvs[i].trackSiteNo,
                                                initLeft: rgvEl.offset().left
                                            })
                                        }
                                        that.rgvPosition = position
                                        return;
                                    }
                                    for (var i = 0; i < rgvs.length; i++) {
                                        var rgvEl = $("#rgv-" + rgvs[i].rgvId);
                                        if (rgvs[i].rgvStatus == 'IDLE') {
                                            rgvEl.attr("class", "rgv-item");
                                        }else if (rgvs[i].rgvStatus == 'WORKING') {
                                            rgvEl.attr("class", "rgv-item machine-working");
                                        }
                                        let trackSiteNo = rgvs[i].trackSiteNo;
                                        let trackSiteEl = $("#rgvTrackSiteNo-" + trackSiteNo);
                                        let flag = false;
                                        that.rgvPosition.forEach((item) => {
                                            if (item.id == rgvs[i].rgvId) {
                                                if (item.trackSiteNo != trackSiteNo) {
                                                    flag = true
                                                }
                                            }
                                        })
                                        if (flag) {
                                            let finalOffset = 0;
                                            let targetPosition = trackSiteEl.parent().parent().position().left;
                                            let rgvPosition = rgvEl.position().left;
                                            let calcResult = targetPosition - rgvPosition
                                            if (calcResult > 0) {
                                                finalOffset = targetPosition + trackSiteEl.width();
                                            }else {
                                                finalOffset = targetPosition;
                                            }
                                            rgvEl.animate({left: finalOffset + "px"}, 500);
                                            let position = []
                                            that.rgvPosition.forEach((item) => {
                                                if (item.id == rgvs[i].rgvId) {
                                                    item.trackSiteNo = trackSiteNo
                                                }
                                                position.push(item)
                                            })
                                            that.rgvPosition = position
                                        }
                                    }
                                } else if (res.code === 403) {
                                    parent.location.href = baseUrl + "/login";
                                } else {
                                    console.log(res.msg);
                                }
                            }
                        });
                    },
                    systemSwitch() {
                        // ç³»ç»Ÿå¼€å…³
@@ -576,123 +876,87 @@
                            }
                        });
                    },
                    getCarPosition(x,y) {
                        //计算四向穿梭车图标位置
                        let top = (x * 35 - 35) + "px" //需要减去小车自己所占高度
                        let left = (y * 35) + "px" //需要减去小车自己所占宽度
                        return [top,left];
                    },
                    testMove() {
                        let that = this
                        clearInterval(this.consoleInterval)//清理定时器
                        let shuttleList = this.currentLevShuttleList
                        $.ajax({
                            url: baseUrl + "/static/testMoveData.json",
                            headers: {
                                'token': localStorage.getItem('token')
                            },
                            method: 'GET',
                            success: function(res) {
                                shuttleList[0].moveAdvancePath = res
                                that.currentLevShuttleList = shuttleList
                                let index = 0
                                let tmp = null
                                tmp = setInterval(() => {
                                    if (index < res.length) {
                                        that.currentLevShuttleList[0].point.y = res[index].y
                                        that.currentLevShuttleList[0].point.x = res[index].x
                                        index++
                                    }else {
                                        clearInterval(tmp)
                                        that.init()
                                    }
                                },1000)
                            }
                        });
                    },
                    colorRGB(){
                        //随机颜色
                        const r = Math.floor(Math.random()*256);
                        const g = Math.floor(Math.random()*256);
                        const b = Math.floor(Math.random()*256);
                        return `rgb(${r},${g},${b})`;
                    },
                    checkAdvancePath(x,y) {
                        //检测路径是否为穿梭车预计路径,如x和y路径是穿梭车预计路径,则返回小车号
                        this.currentLevShuttleList.forEach((item,idx) => {
                            if (item.moveAdvancePath != null) {
                                item.moveAdvancePath.forEach((path,index) => {
                                    if (path.x === x && path.y === y) {
                                        return item.shuttleNo;
                                    }
                                })
                            }
                        })
                        let data = []
                        let shuttleList = this.currentLevShuttleList;
                        for (var i = 0; i < shuttleList.length; i++) {
                            let shuttle = shuttleList[i]
                            let moveAdvancePath = shuttle.moveAdvancePath
                            if (moveAdvancePath != null) {
                                for (var j = 0; j < moveAdvancePath.length; j++) {
                                    let path = moveAdvancePath[j]
                                    if (path.x-1 === x && path.y === y) {//路径符合
                                        data.push(shuttle.shuttleNo)
                                        continue;
                                    }
                                }
                            }
                        }
                        return data;//返回小车号集合
                    },
                    resetMap() {
                        //重置地图
                        let that = this
                        $.ajax({
                            url:baseUrl+"/console/map/resetMap/" + this.currentLev,
                            headers:{
                                'token': localStorage.getItem('token')
                            },
                            data:{},
                            method:'get',
                            success:function (res) {
                                that.$message({
                                    message: that.currentLev + '层地图重置完成',
                                    type: 'success'
                                });
                            }
                        })
                    },
                    initLev(){
                        let that = this
                        $.ajax({
                            url: baseUrl + "/console/map/lev/list",
                            headers: {
                                'token': localStorage.getItem('token')
                            },
                            data: {},
                            method: 'get',
                            success: function(res) {
                                if (res.code === 200) {
                                    that.floorList = res.data;
                                } else if (res.code === 403) {
                                    parent.location.href = baseUrl + "/login";
                                } else {
                                    that.$message({
                                        message: res.msg,
                                        type: 'error'
                                    });
                                }
                            }
                        });
                    },
                    getCodeData(){
                        this.sendWs(JSON.stringify({
                            "url": "/console/barcode/output/site",
                            "data": {}
                        }))
                        let that = this
                        //获取RGV数据
                        $.ajax({
                            url: baseUrl + "/console/barcode/output/site",
                            headers: {'token': localStorage.getItem('token')},
                            method: 'POST',
                            success: function (res) {
                                if (res.code === 200) {
                                    var rgvs = res.data;
                                    if (that.rgvPosition.length == 0) {
                                        let position = []
                                        for (var i = 0; i < rgvs.length; i++) {
                                            var rgvEl = $("#rgv-" + rgvs[i].rgvId);
                                            position.push({
                                                id: rgvs[i].rgvId,
                                                trackSiteNo: rgvs[i].trackSiteNo,
                                                initLeft: rgvEl.offset().left
                                            })
                                        }
                                        that.rgvPosition = position
                                        return;
                                    }
                                    for (var i = 0; i < rgvs.length; i++) {
                                        var rgvEl = $("#rgv-" + rgvs[i].rgvId);
                                        if (rgvs[i].rgvStatus == 'IDLE') {
                                            rgvEl.attr("class", "rgv-item");
                                        }else if (rgvs[i].rgvStatus == 'WORKING') {
                                            rgvEl.attr("class", "rgv-item machine-working");
                                        }
                                        let trackSiteNo = rgvs[i].trackSiteNo;
                                        let trackSiteEl = $("#rgvTrackSiteNo-" + trackSiteNo);
                                        let flag = false;
                                        that.rgvPosition.forEach((item) => {
                                            if (item.id == rgvs[i].rgvId) {
                                                if (item.trackSiteNo != trackSiteNo) {
                                                    flag = true
                                                }
                                            }
                                        })
                                        if (flag) {
                                            let finalOffset = 0;
                                            let targetPosition = trackSiteEl.parent().parent().position().left;
                                            let rgvPosition = rgvEl.position().left;
                                            let calcResult = targetPosition - rgvPosition
                                            if (calcResult > 0) {
                                                finalOffset = targetPosition + trackSiteEl.width();
                                            }else {
                                                finalOffset = targetPosition;
                                            }
                                            rgvEl.animate({left: finalOffset + "px"}, 500);
                                            let position = []
                                            that.rgvPosition.forEach((item) => {
                                                if (item.id == rgvs[i].rgvId) {
                                                    item.trackSiteNo = trackSiteNo
                                                }
                                                position.push(item)
                                            })
                                            that.rgvPosition = position
                                        }
                                    }
                                } else if (res.code === 403) {
                                    parent.location.href = baseUrl + "/login";
                                } else {
                                    console.log(res.msg);
                                }
                            }
                        });
                    },
                    setCodeData(res) {
                        if(res.code === 200){
@@ -705,47 +969,34 @@
                            }
                        }
                    },
                    websocketConnect() {
                        if (this.ws == null) {
                            this.ws = new WebSocket("ws://" + window.location.host + baseUrl + "/console/websocket");
                            this.ws.onopen = this.webSocketOnOpen
                            this.ws.onerror = this.webSocketOnError
                            this.ws.onmessage = this.webSocketOnMessage
                            this.ws.onclose = this.webSocketClose
                    getDeviceNo(obj) {
                        if (this.isJson(obj)) {
                            let data = JSON.parse(obj)
                            if (data.deviceNo == null || data.deviceNo == undefined) {
                                return -1;
                            }
                            return data.deviceNo;
                        }else {
                            return -1;
                        }
                    },
                    webSocketOnOpen(e) {
                        console.log("open");
                    },
                    webSocketOnError(e) {
                        this.ws = null;
                        console.log(e);
                    },
                    webSocketOnMessage(e) {
                        const result = JSON.parse(e.data);
                        if (result.url == "/shuttle/table/shuttle/state") {
                            this.setShuttleStateInfo(JSON.parse(result.data))
                        }else if (result.url == "/lift/table/lift/state") {
                            this.setLiftStateInfo(JSON.parse(result.data))
                        }else if (result.url == "/console/latest/data/site") {
                            this.setSiteInfo(JSON.parse(result.data))
                        }else if (result.url == "/console/map/auth") {
                            this.setMap(JSON.parse(result.data))
                        }else if (result.url == "/console/barcode/output/site") {
                            this.setCodeData(JSON.parse(result.data))
                    getTrackSiteNo(obj) {
                        if (this.isJson(obj)) {
                            let data = JSON.parse(obj)
                            if (data.trackSiteNo == null || data.trackSiteNo == undefined) {
                                return -1;
                            }
                            return data.trackSiteNo;
                        }else {
                            return -1;
                        }
                    },
                    webSocketClose(e) {
                        this.ws = null;
                        console.log("close");
                    },
                    sendWs(message) {
                        if (this.ws == null) {
                            return;
                        }
                        if (this.ws.readyState == WebSocket.OPEN) {
                            this.ws.send(message);
                    isJson(str) {
                        try {
                            JSON.parse(str);
                            return true;
                        } catch (e) {
                            return false;
                        }
                    }
                }
src/main/webapp/views/console1.html
File was deleted
src/main/webapp/views/console2.html
File was deleted
src/main/webapp/views/console3.html
File was deleted
src/main/webapp/views/console4.html
File was deleted
src/main/webapp/views/forklift.html
File was deleted