2021与蓝度共同重构项目,服务端
MercuryZ
2022-03-31 ef270bd1855b5ce3f398c5df024840a498e33a8f
Merge remote-tracking branch 'origin/master'
已添加73个文件
已修改48个文件
已删除3个文件
已重命名2个文件
6129 ■■■■■ 文件已修改
dao/src/main/java/com/sandu/ximon/dao/bo/C3ChargingBo.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/bo/IpVolumeMissionBo.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/domain/AliConfigEntity.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/domain/C3mCharging.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/domain/C3mChargingCharge.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/domain/IpVolumeMission.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/domain/LedPlayerEntity.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/domain/LightPoleHeeling.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/domain/LightPoleHeelingProcessing.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/domain/Pole.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/domain/WxConfigEntity.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/enums/C3mRedisConstant.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/enums/OrderStatus.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/enums/OrderType.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/mapper/C3mChargingChargeMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/mapper/C3mChargingMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/mapper/IpVolumeMissionMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/mapper/LightPoleHeelingMapper.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/mapper/LightPoleHeelingProcessingMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/mapper/UsrAlipayConfigMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/mapper/UsrWxPayConfigMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/resources/mapper/C3mChargingMapper.xml 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/resources/mapper/LightPoleHeelingMapper.xml 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/resources/mapper/LightPoleHeelingProcessingMapper.xml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/resources/mapper/LightReportDataMapper.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/resources/mapper/PoleMapper.xml 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/resources/mapper/UsrAlipayConfigMapper.xml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/resources/mapper/UsrWxPayConfigMapper.xml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sandu-common/src/main/java/com/sandu/common/third/pay/wx/WxFastPayService.java 176 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/pom.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/config/AlipayConfig.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/config/C3mRedisConfig.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/config/ServerConfig.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/AdminController.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/C3ChargingController.java 172 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/C3mChargingChargeController.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/C3mOrderController.java 221 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/ClientController.java 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/LedSFileController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/LightPoleHeelingController.java 90 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/LightPoleHeelingProcessingController.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/MonitorController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/PoleController.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/UsrPayConfigController.java 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/VnnoxController.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/XiXunController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/AdminDto.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/ClientDto.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/wxquery/WxOrderDto.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/wxquery/amount.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/wxquery/goods_detail.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/wxquery/payer.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/wxquery/promotion_detail.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/wxquery/scene_info.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/entity/ProgramPro.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/AmqpMessageListener.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/processor/AirDataProcessor.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/processor/PoleMonitorDataProcessor.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/processor/c3ChargingProcessor.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5C3CommonReportInnerFrame.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5C3HeartbeatReportInnerFrame.java 85 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5C3QueryReportInnerFrame.java 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5LightPoleHeelingHeartbeatReportInnerFrame.java 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5LightPoleHeelingOperationReportInnerFrame.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5LightPoleHeelingQueryReportInnerFrame.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/C3ClearedFaultCodeReqInnerFrame.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/C3QueryFaultCodeReqInnerFrame.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/C3ReadTheHeartbeatPackageReqInnerFrame.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/C3RestoreFactoryValueReqInnerFrame.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/C3SetAddressReqInnerFrame.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/C3SetCalendarReqInnerFrame.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/C3SetConstantReqInnerFrame.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/C3SetHeartbeatPacketTimeReqInnerFrame.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/LightPoleHeelingHeartbeatPackageReqInnerFrame.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/LightPoleHeelingQueryIntervalTimeReqInnerFrame.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/LightPoleHeelingRestartReqInnerFrame.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/LightPoleHeelingSetHeartbeatPacketTimeReqInnerFrame.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/LightPoleHeelingSetSensorStateReqInnerFrame.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/A5C3ReportEnum.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/C3ChargingEnum.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/C3ChargingReportEnum.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/LightPoleHeelingEnum.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/param/AlipayConfigParam.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/param/C3ChargingAddParam.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/param/C3ChargingParam.java 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/param/C3mChargingChargeParam.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/param/IpVolumeMissionParam.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/param/LightPoleHeelingListParam.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/param/LightPoleHeelingParam.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/param/LightPoleHeelingProcessingParam.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/param/MonitorParam.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/param/PayParam.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/param/ResetClientPasswordPrarm.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/param/WxpayConfigParam.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/pay/alipay/UsrAlipayConfigService.java 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/pay/wx/WxFastPayService.java 293 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/pay/wx/WxPayConfiguration.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/pay/wx/WxPayProperties.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/pay/wxpay/UsrWxPayConfigService.java 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/schedule/WaterQualityDataSchedule.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/security/base64_Img.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/security/ceshi.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/security/order/C3mOrderQueryEvent.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/security/order/OrderQueryListener.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/security/order/OrderQueryTask.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/security/order/OrderScanType.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3ChargingService.java 461 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3mChargingChargeService.java 159 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3mOrderService.java 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/ClientService.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/IpVolumeMissionService.java 59 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/LEDProgramFileService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightPoleHeelingProcessingServices.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightPoleHeelingService.java 210 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightTaskService.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/MenuService.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/MonitorService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleService.java 78 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/XiXunPlayerService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/AliPayUtils.java 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/ConfigCheckUtils.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/DateUtils.java 260 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/OrderUtils.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/vo/C3mOrderVO.java 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/vo/TaskVO.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/bo/C3ChargingBo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
package com.sandu.ximon.dao.bo;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class C3ChargingBo {
    /**
     *
     */
    private Long c3Id;
    /**
     * mcu udid
     */
    private String mcuUdid;
    /**
     * c3名称
     */
    private String c3Name;
    /**
     * c3物理地址(id hex)
     */
    private String c3Mac;
    /**
     * 1空闲/2.充电中/3.充电中断,等待服务器确认/4.充电结束,等待服务器确认/5.有故障/6.与充电桩对接中
     */
    private Integer statusBit;
    /**
     * è®¾å¤‡æ¸©åº¦
     */
    private String deviceTemperature;
    /**
     *
     */
    private String poleDevicesCode;
    /**
     *
     */
    private LocalDateTime updateTime;
    /**
     * ç¯æ†ç¼–号
     */
    private Long poleCode;
    /**
     * ç¯æ†åç§°
     */
    private String poleName;
}
dao/src/main/java/com/sandu/ximon/dao/bo/IpVolumeMissionBo.java
@@ -30,4 +30,8 @@
    private List<String> fileNames;
//    private List files;
//
//    private List IpVolumes;
}
dao/src/main/java/com/sandu/ximon/dao/domain/AliConfigEntity.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
package com.sandu.ximon.dao.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import lombok.Data;
/**
 *
 * @TableName alipay_config
 */
@TableName(value ="alipay_config")
@Data
public class AliConfigEntity implements Serializable {
    /**
     * ç´¢å¼•id
     */
    @TableId(type = IdType.AUTO)
    private Integer configId;
    /**
     * åº”用APPID
     */
    private String appId;
    /**
     * å•†æˆ·ç§é’¥/PKCS8格式RSA2私钥
     */
    private String privateKey;
    /**
     * æ”¯ä»˜å®å…¬é’¥/查看地址:https://openhome.alipay.com/platform/keyManage.htm å¯¹åº”APPID下的支付宝公钥
     */
    private String publicKey;
    /**
     * åˆä½œä¼™ä¼´èº«ä»½ï¼ˆPID)
     */
    private String pid;
    /**
     * å®¢æˆ·id
     */
    private Long clientId;
    /**
     * åˆ›å»ºé…ç½®çš„用户id
     */
    private Long createUserId;
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}
dao/src/main/java/com/sandu/ximon/dao/domain/C3mCharging.java
@@ -49,6 +49,11 @@
    /**
     * 
     */
    private String poleDevicesCode;
    /**
     *
     */
    private LocalDateTime updateTime;
    @TableField(exist = false)
dao/src/main/java/com/sandu/ximon/dao/domain/C3mChargingCharge.java
@@ -50,20 +50,8 @@
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
    @TableField(exist = false)
    private static final Double DEFAULT_CHARGE = 8.8;
    public C3mChargingCharge(){}
    public C3mChargingCharge(Integer c3Id,Integer hour,Integer min, Double charge,Long timestamp){
        this.c3Id = c3Id;
        this.hour = hour;
        this.min = min;
        this.charge = charge;
        this.timestamp = timestamp;
    }
    public static C3mChargingCharge getInitInstance(Integer c3Id) {
        return new C3mChargingCharge(c3Id,0,0, DEFAULT_CHARGE, new Date().getTime());
    }
}
dao/src/main/java/com/sandu/ximon/dao/domain/IpVolumeMission.java
@@ -8,6 +8,7 @@
import java.io.Serializable;
import java.math.BigInteger;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonIgnore;
@@ -50,6 +51,7 @@
    /**
     * æ–‡ä»¶url
     */
    @JsonIgnore
    private String missionFileUrl;
    /**
@@ -86,8 +88,17 @@
     */
    private Integer missionVolume;
    /*@TableField
    private List<IpVolumeFile> files;*/
//    @TableField(exist = false)
//    private List<IpVolumeFile> files=new ArrayList<>();
//
//    @TableField(exist = false)
//    private List<BroadcastTerminalV2Entity> BroadcastTerminal=new ArrayList<>();
    @TableField(exist = false)
    private List<Integer> fileIds=new ArrayList<>();
    @TableField(exist = false)
    private List<Integer> TerminalIds=new ArrayList<>();
    /*@TableField
    private List<String> fileNames;*/
dao/src/main/java/com/sandu/ximon/dao/domain/LedPlayerEntity.java
@@ -48,6 +48,14 @@
    private Long createTimestamp;
    @TableField(exist = false)
    private Long poleId;
    @TableField(exist = false)
    private String poleName;
    private static final long serialVersionUID = 1L;
    @TableField(exist = false)
    private Long streetlightId;
dao/src/main/java/com/sandu/ximon/dao/domain/LightPoleHeeling.java
@@ -1,39 +1,71 @@
package com.sandu.ximon.dao.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Data;
@Data
/**
 * ç¯æ†å€¾ä¾§
 * å€¾ä¾§å‘Šè­¦è¡¨
 * @TableName light_pole_heeling
 */
@TableName(value ="light_pole_heeling")
@Data
public class LightPoleHeeling implements Serializable {
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    //所属人
    private Long userId;
    //告警号
    private String warningNumber;
    //灯杆ID
    private Long lightPoleId;
    //灯杆名称
    private String lightPoleName;
    //告警等级
    private String warningLevel;
    //Xè½´
    private int theXAxis;
    //Yè½´
    private int theYAxis;
    //Zè½´
    private int theZAxis;
    //处理状态
    // 1:已处理;0:未处理
    private int processingState;
    //告警时间
    private Long warningNumber;
    /**
     * è®¾å¤‡MAC地址
     */
    private String mac;
    /**
     * è­¦å‘Šç­‰çº§
     */
    private Integer warningLevel;
    /**
     * Xè½´
     */
    private Double theXAxis;
    /**
     * Yè½´
     */
    private Double theYAxis;
    /**
     * Zè½´
     */
    private Double theZAxis;
    /**
     * å¤„理状态
     */
    private Integer processingState;
    /**
     *
     */
    private LocalDateTime createTime;
}
    /**
     * ç¯æ†ç¼–号
     */
    private Long poleCode;
    /**
     * ç¯æ†åç§°
     */
    private String poleName;
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}
dao/src/main/java/com/sandu/ximon/dao/domain/LightPoleHeelingProcessing.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
package com.sandu.ximon.dao.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Data;
/**
 *
 * @TableName light_pole_heeling_processing
 */
@TableName(value ="light_pole_heeling_processing")
@Data
public class LightPoleHeelingProcessing implements Serializable {
    /**
     * å¤„理号
     */
    @TableId
    private Long processingNumber;
    /**
     * è­¦å‘Šå·
     */
    private Long warningNumber;
    /**
     * å¤„理后状态
     */
    private Integer processingState;
    /**
     * å¤„理意见
     */
    private String processingOpinion;
    /**
     * å¤„理人
     */
    private String processingPerson;
    /**
     *
     */
    private LocalDateTime createTime;
    /**
     * å¤„理后Xè½´
     */
    private Double theXAxis;
    /**
     * å¤„理后Yè½´
     */
    private Double theYAxis;
    /**
     * å¤„理后Zè½´
     */
    private Double theZAxis;
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}
dao/src/main/java/com/sandu/ximon/dao/domain/Pole.java
@@ -38,6 +38,11 @@
    private Integer deviceType;
    /**
     *
     */
    private Long userId;
    /**
     * å®¢æˆ·id
     */
    private Long clientId;
dao/src/main/java/com/sandu/ximon/dao/domain/WxConfigEntity.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
package com.sandu.ximon.dao.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
/**
 * @TableName wx_config
 */
@TableName(value = "wx_config")
@Data
public class WxConfigEntity implements Serializable {
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    private Long configId;
    /**
     * appid
     */
    private String appid;
    /**
     * app端appid
     */
    private String appappid;
    /**
     *
     */
    private String mchId;
    /**
     *
     */
    private String privateKey;
    /**
     *
     */
    private Long clientId;
    /**
     *
     */
    private Long createUserId;
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}
dao/src/main/java/com/sandu/ximon/dao/enums/C3mRedisConstant.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.sandu.ximon.dao.enums;
public enum C3mRedisConstant {
    //  å……电桩心跳包存储(mac-list(充电桩口状态))
    C3_STATUS("m_c3_port_status:"),
    //  å……电桩订单
    C3_NO_PAY_ORDER("m_c3_no_pay_order:"),
    //  å……电桩进行中订单
    C3_CHARGING_ORDER("m_c3_charging_order:"),
    //  å……电桩故障码
    C3_ERROR("m_c3_error:"),
    ;
    private String code;
    public String getCode() {
        return code;
    }
    C3mRedisConstant(String code) {
        this.code = code;
    }
}
dao/src/main/java/com/sandu/ximon/dao/enums/OrderStatus.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.sandu.ximon.dao.enums;
public enum OrderStatus {
    //  æœªæ”¯ä»˜
    NO_PAY(0),
    //  å·²æ”¯ä»˜
    PAYED(1),
    //  å·²é€€æ¬¾
    REFUND(2),
    //  é€€æ¬¾ä¸­
    REFUNDING(3),
    //  é€€æ¬¾å¤±è´¥
    REFUND_FAILED(4),
    //  å·²å®Œæˆ
    COMPLETE(5),
    ;
    private Integer status;
    public Integer getStatus() {
        return status;
    }
    OrderStatus (Integer status) {
        this.status = status;
    }
}
dao/src/main/java/com/sandu/ximon/dao/enums/OrderType.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.sandu.ximon.dao.enums;
/**
 * è®¢å•类型
 */
public enum OrderType {
    ALIPAY("alipay"),
    WXPAY("wxpay"),
    ERROR("error");
    private String code;
    public String getCode() {
        return code;
    }
    public static OrderType getOrderType(String type){
        if(type.equals(OrderType.ALIPAY.getCode())) {
            return OrderType.ALIPAY;
        }else if(type.equals(OrderType.WXPAY.getCode())) {
            return OrderType.WXPAY;
        }else {
            return OrderType.ERROR;
        }
    }
    OrderType(String code) {
        this.code = code;
    }
}
dao/src/main/java/com/sandu/ximon/dao/mapper/C3mChargingChargeMapper.java
@@ -13,7 +13,7 @@
public interface C3mChargingChargeMapper extends BaseMapper<C3mChargingCharge> {
    @Delete("delete from c3_charging_charge where c3_id = #{id}")
    void deleteCharge(@Param("id") Integer c3Id);
    boolean deleteCharge(@Param("id") Integer c3Id);
    @Select("select * from c3_charging_charge where c3_id = #{c3Id} limit 5")
    List<C3mChargingCharge> getChargeByC3Id(@Param("c3Id") Integer c3Id);
dao/src/main/java/com/sandu/ximon/dao/mapper/C3mChargingMapper.java
@@ -1,8 +1,11 @@
package com.sandu.ximon.dao.mapper;
import com.sandu.ximon.dao.bo.C3ChargingBo;
import com.sandu.ximon.dao.domain.C3mCharging;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
 * @Entity com.sandu.ximon.dao.domain.C3mCharging
@@ -10,6 +13,12 @@
@Mapper
public interface C3mChargingMapper extends BaseMapper<C3mCharging> {
    C3mCharging  getAllByC3Mac(String c3Mac);
    List<C3ChargingBo> listC3mChargingDto(String keyword);
}
dao/src/main/java/com/sandu/ximon/dao/mapper/IpVolumeMissionMapper.java
@@ -18,6 +18,8 @@
   List<IpVolumeMissionBo> listAllByUserId(Long userId);// todo ä»»åŠ¡å½’å±ž
}
dao/src/main/java/com/sandu/ximon/dao/mapper/LightPoleHeelingMapper.java
@@ -1,9 +1,16 @@
package com.sandu.ximon.dao.mapper;
import com.sandu.common.domain.BaseMapper;
import com.sandu.ximon.dao.domain.LightPoleHeeling;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface LightPoleHeelingMapper extends BaseMapper<LightPoleHeeling> {
    List<LightPoleHeeling> listLightPoleHeeling(String keyword, Integer processingState);
}
dao/src/main/java/com/sandu/ximon/dao/mapper/LightPoleHeelingProcessingMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.sandu.ximon.dao.mapper;
import com.sandu.ximon.dao.domain.LightPoleHeelingProcessing;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
 * @Entity com.sandu.ximon.dao.domain.LightPoleHeelingProcessing
 */
@Mapper
public interface LightPoleHeelingProcessingMapper extends BaseMapper<LightPoleHeelingProcessing> {
}
dao/src/main/java/com/sandu/ximon/dao/mapper/UsrAlipayConfigMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.sandu.ximon.dao.mapper;
import com.sandu.ximon.dao.domain.AliConfigEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
 * @Entity com.sandu.ximon.dao.domain.UsrAlipayConfig
 */
@Mapper
public interface UsrAlipayConfigMapper extends BaseMapper<AliConfigEntity> {
}
dao/src/main/java/com/sandu/ximon/dao/mapper/UsrWxPayConfigMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.sandu.ximon.dao.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sandu.ximon.dao.domain.WxConfigEntity;
import org.apache.ibatis.annotations.Mapper;
/**
 * @Entity com.sandu.ximon.dao.domain.WxConfigEntity
 */
@Mapper
public interface UsrWxPayConfigMapper extends BaseMapper<WxConfigEntity> {
}
dao/src/main/resources/mapper/C3mChargingMapper.xml
@@ -11,12 +11,47 @@
            <result property="c3Mac" column="c3_mac" jdbcType="VARCHAR"/>
            <result property="statusBit" column="status_bit" jdbcType="INTEGER"/>
            <result property="deviceTemperature" column="device_temperature" jdbcType="VARCHAR"/>
            <result property="poleDevicesCode" column="pole_devices_code" jdbcType="VARCHAR"/>
            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
    </resultMap>
    <sql id="Base_Column_List">
        c3_id,mcu_udid,c3_name,
        c3_mac,status_bit,device_temperature,
        update_time
        pole_devices_code,update_time
    </sql>
    <select id="getAllByC3Mac" resultType="com.sandu.ximon.dao.domain.C3mCharging">
        select *
        from c3m_charging
        where c3_mac = #{c3Mac}
    </select>
    <select id="listC3mChargingDto" resultType="com.sandu.ximon.dao.bo.C3ChargingBo">
        SELECT t1.*, t3.pole_code,
        t3.pole_name
        FROM c3m_charging t1
        LEFT JOIN pole_binding t2 ON t1.mcu_udid = t2.device_code
        AND t2.device_type = 8
        LEFT JOIN pole t3 ON t3.id = t2.pole_id
        <where>
            <if test="keyword != null and keyword != ''">
                AND (t1.c3_name LIKE CONCAT(CONCAT('%', #{keyword}), '%') OR (t3.pole_name LIKE CONCAT(CONCAT('%', #{keyword}), '%')))
            </if>
        </where>
    </select>
</mapper>
dao/src/main/resources/mapper/LightPoleHeelingMapper.xml
@@ -3,17 +3,41 @@
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sandu.ximon.dao.mapper.LightPoleHeelingMapper">
    <resultMap id="BaseResultMap" type="com.sandu.ximon.dao.domain.LightPoleHeeling">
        <id property="id" column="id" jdbcType="BIGINT"/>
        <result property="userId" column="user_id" jdbcType="BIGINT"/>
        <result property="warningNumber" column="warning_number" jdbcType="VARCHAR"/>
        <result property="lightPoleId" column="light_pole_id" jdbcType="BIGINT"/>
        <result property="lightPoleName" column="light_pole_name" jdbcType="VARCHAR"/>
        <result property="warningLevel" column="warning_level" jdbcType="VARCHAR"/>
        <result property="theXAxis" column="the_x_axis" jdbcType="INTEGER"/>
        <result property="theYAxis" column="the_y_axis" jdbcType="INTEGER"/>
        <result property="theZAxis" column="the_z_axis" jdbcType="INTEGER"/>
        <id property="warningNumber" column="warning_number" jdbcType="BIGINT"/>
        <result property="mac" column="mac" jdbcType="VARCHAR"/>
        <result property="warningLevel" column="warning_level" jdbcType="INTEGER"/>
        <result property="theXAxis" column="the_x_axis" jdbcType="DOUBLE"/>
        <result property="theYAxis" column="the_y_axis" jdbcType="DOUBLE"/>
        <result property="theZAxis" column="the_z_axis" jdbcType="DOUBLE"/>
        <result property="processingState" column="processing_state" jdbcType="INTEGER"/>
        <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
    </resultMap>
</mapper>
    <sql id="Base_Column_List">
        warning_number,mac,warning_level,
        the_x_axis,the_y_axis,the_z_axis,
        processing_state,create_time
    </sql>
    <select id="listLightPoleHeeling" resultType="com.sandu.ximon.dao.domain.LightPoleHeeling">
        SELECT t1.*, t3.pole_code,
        t3.pole_name
        FROM light_pole_heeling t1
        LEFT JOIN pole_binding t2 ON t1.mac = t2.device_code
        AND t2.device_type = 8
        LEFT JOIN pole t3 ON t3.id = t2.pole_id
        <where>
            (t1.warning_level = 1 OR t1.warning_level = 2)
            <if test="keyword != null and keyword != ''">
                AND (t1.warning_number LIKE CONCAT(CONCAT('%', #{keyword}), '%') OR (t3.pole_name LIKE
                CONCAT(CONCAT('%', #{keyword}), '%'))OR (t3.pole_code LIKE CONCAT(CONCAT('%', #{keyword}), '%')))
            </if>
            <if test="processingState != null and processingState != 2">
                AND t1.processing_state = #{processingState}
            </if>
        </where>
    </select>
</mapper>
dao/src/main/resources/mapper/LightPoleHeelingProcessingMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -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.sandu.ximon.dao.mapper.LightPoleHeelingProcessingMapper">
    <resultMap id="BaseResultMap" type="com.sandu.ximon.dao.domain.LightPoleHeelingProcessing">
            <id property="processingNumber" column="processing_number" jdbcType="BIGINT"/>
            <result property="warningNumber" column="warning_number" jdbcType="BIGINT"/>
            <result property="processingState" column="processing_state" jdbcType="INTEGER"/>
            <result property="processingOpinion" column="processing_opinion" jdbcType="VARCHAR"/>
            <result property="processingPerson" column="processing_person" jdbcType="VARCHAR"/>
            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
            <result property="theXAxis" column="the_x_axis" jdbcType="DOUBLE"/>
            <result property="theYAxis" column="the_y_axis" jdbcType="DOUBLE"/>
            <result property="theZAxis" column="the_z_axis" jdbcType="DOUBLE"/>
    </resultMap>
    <sql id="Base_Column_List">
        processing_number,warning_number,processing_state,
        processing_opinion,processing_person,create_time,
        the_x_axis,the_y_axis,the_z_axis
    </sql>
</mapper>
dao/src/main/resources/mapper/LightReportDataMapper.xml
@@ -51,15 +51,18 @@
            light_report_data t1
                LEFT JOIN pole t2 USING ( device_code )
        <where>
            1 = 1
            <if test="deviceCode != null and deviceCode != ''">
                AND t1.device_code = #{deviceCode}
            </if>
            <if test="keyword != null and keyword != ''">
                AND (
                t1.device_code LIKE CONCAT('%', #{keyword},'%')
                OR t2.pole_name LIKE CONCAT('%', #{keyword},'%')
                )
            </if>
            <if test="deviceCode != null and keyword != ''">
                AND t1.device_code = #{deviceCode}
            </if>
        </where>
        ORDER BY t1.light_report_data_id DESC
    </select>
dao/src/main/resources/mapper/PoleMapper.xml
@@ -9,6 +9,7 @@
            <result property="poleCode" column="pole_code" jdbcType="BIGINT"/>
            <result property="poleName" column="pole_name" jdbcType="VARCHAR"/>
            <result property="deviceType" column="device_type" jdbcType="INTEGER"/>
            <result property="userId" column="user_id" jdbcType="BIGINT"/>
            <result property="clientId" column="client_id" jdbcType="BIGINT"/>
            <result property="province" column="province" jdbcType="VARCHAR"/>
            <result property="city" column="city" jdbcType="VARCHAR"/>
@@ -25,10 +26,10 @@
    <sql id="Base_Column_List">
        id,pole_code,pole_name,
        device_type,client_id,province,
        city,region,address,
        lon,lat,device_code,
        on_line_state,binding_count,create_time,
        update_time
        device_type,user_id,client_id,
        province,city,region,
        address,lon,lat,
        device_code,on_line_state,binding_count,
        create_time,update_time
    </sql>
</mapper>
dao/src/main/resources/mapper/UsrAlipayConfigMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
<?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.sandu.ximon.dao.mapper.UsrAlipayConfigMapper">
    <resultMap id="BaseResultMap" type="com.sandu.ximon.dao.domain.AliConfigEntity">
            <id property="configId" column="config_id" jdbcType="INTEGER"/>
            <result property="appId" column="app_id" jdbcType="VARCHAR"/>
            <result property="privateKey" column="private_key" jdbcType="VARCHAR"/>
            <result property="publicKey" column="public_key" jdbcType="VARCHAR"/>
            <result property="pid" column="pid" jdbcType="VARCHAR"/>
            <result property="clientId" column="client_id" jdbcType="BIGINT"/>
            <result property="createUserId" column="create_user_id" jdbcType="BIGINT"/>
    </resultMap>
    <sql id="Base_Column_List">
        config_id,app_id,private_key,
        public_key,pid,client_id,
        create_user_id
    </sql>
</mapper>
dao/src/main/resources/mapper/UsrWxPayConfigMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
<?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.sandu.ximon.dao.mapper.UsrWxPayConfigMapper">
    <resultMap id="BaseResultMap" type="com.sandu.ximon.dao.domain.AliConfigEntity">
            <id property="configId" column="config_id" jdbcType="BIGINT"/>
            <result property="appid" column="appid" jdbcType="VARCHAR"/>
            <result property="appappid" column="appappid" jdbcType="VARCHAR"/>
            <result property="mchId" column="mch_id" jdbcType="VARCHAR"/>
            <result property="privateKey" column="private_key" jdbcType="VARCHAR"/>
            <result property="clientId" column="client_id" jdbcType="BIGINT"/>
            <result property="createUserId" column="create_user_id" jdbcType="BIGINT"/>
    </resultMap>
    <sql id="Base_Column_List">
        config_id,appid,appappid,
        mch_id,private_key,client_id,
        create_user_id
    </sql>
</mapper>
pom.xml
@@ -105,6 +105,11 @@
                <artifactId>aliyun-java-sdk-iot</artifactId>
                <version>7.29.0</version>
            </dependency>
            <dependency>
                <groupId>cn.dreampie</groupId>
                <artifactId>jfinal-utils</artifactId>
                <version>0.2</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
sandu-common/src/main/java/com/sandu/common/third/pay/wx/WxFastPayService.java
ÎļþÒÑɾ³ý
ximon-admin/pom.xml
@@ -57,6 +57,11 @@
            <artifactId>alipay-sdk-java</artifactId>
            <version>4.17.9.ALL</version>
        </dependency>
        <dependency>
            <groupId>cn.dreampie</groupId>
            <artifactId>jfinal-utils</artifactId>
            <version>0.2</version>
        </dependency>
        <!--阿里云物联网 -->
    </dependencies>
ximon-admin/src/main/java/com/sandu/ximon/admin/config/AlipayConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,47 @@
package com.sandu.ximon.admin.config;
/* *
 *类名:AlipayConfig
 *功能:基础配置类
 *详细:设置帐户有关信息及返回路径
 *修改日期:2017-04-05
 *说明:
 *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
 */
public class AlipayConfig {
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
    // åº”用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
//    public String app_id = "2019070665741774";
    // å•†æˆ·ç§é’¥ï¼Œæ‚¨çš„PKCS8格式RSA2私钥
//    public String merchant_private_key = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCume3EzEBKw8T2Xs0dBEDwTi8g7AR/c7Gy0sE9XciSVPoKpeHaaqShH7L+ws6pYE7SnXYNKM3diZ6S0vKxt5XhuOpg9yfueWw85BCbTYzOYQwrK/qZIgQC5c6S5b9aar9PowaupqYSFWDFvDOr6zaCr1OhjT/lYJV46D2t5e5/yACUQXGo0evvpbSvC6+zp2ZhUoJiXKvqPxC2F/dKGzyY4e9WnBSzaraLT09GLNwzLzSKItjKXHO/ameLhIiqacbOydKOmsEC1XzsNkeHXYLRFF4EAGZt4KDkuwiKjrz1r8Wz1a0Fr4jrE0F7dj9cIq+lhUjqUSydNYETJtKq5XOHAgMBAAECggEBAJ6W9A/H0jHWpeV98GKFxZJAAbCuj9tQM7yQj7L0p0S66K6ZQ47HRKeRCl06hsnzz0Sgf2SuhmbOJHmKH6Tqcrom4sSWWe/S3ExmfusBQn8GSS5BcQp8ihYztDFbezZeNUzZcC1c8wUD4/VW37wtFkMXiyf3C22GD95VXAjDC6GFfv6GIytCbAKw1HbgmU/JMDjnzSi0IKnmoBu5tVNZtwWRu8qkEC2LiejoQpxi12jRZQptkSa8iokk2eFx3i9BBDljx1qfzlFyAOtwICiy6HnxBTMBfzLAy9nI5//wzcY4X4fK0d/XatDNxDN4f/5Wp/VKFyz7BLFQTfkyQv8fofkCgYEA7HmF8Qk/qRumHX3UYuEENPge4EwYOzWcQ12kJBo93xbIcMlZ5Qrzpm6IRj8RMqpwcCEtrvvIsDtMO4o8+nNnOO8SMBk8KJj7nsZtigrAEor8HVj63IDDHX/zLt51cvs0x1jNXUD3/tZvw4PnDcblXpMYM1qR/bBuvHVGx1VTz6sCgYEAvQSO4YxAKXnMh338Nrh0FaRKmirewYn7TbLk6rPFh6goCHPGJC1fAOu+9xVALMn8VJrDpfrzqTTg0eKifh8i+5Rlqra95W+DdYr+WThB1NWs+59O5aKCT8wYI3dlaiI5xa+wCzkdasNO3YzrXr5y9wtJdepb5b/Re9uF1+KHv5UCgYEA2PNM3SydCSriph/xIJ5MW8Rfn2xwtrGioXNhyfWBWhDu5/ryzF3V15WE1N27i34vFdB6txUss/JTKDTVaPlDdEpxp0sflCd2gd6OVJ00Rk7Yqpwd2vsPBxuCIjfaDRlG/LUOBEY8v8JAW2HCMzOM782H4GVxlwutLJ1zyCESeW0CgYAWNrDsBOWNekj1K3M2oxrRaEt0LtGbATJNgVax1orCVJrP03tXyRU/MHVy6EZwfRRwhPe1S/bSzeoWAIKEO/iKhHgmRe+vRRm3+KvHpHroHmyD7ccB6cVSx3OWx3Nds8QCXZFc4Et6vpVIKEWJDuzH58WsW+yM5awi2Du0kWTOuQKBgCt7QqYDD0k8ahkKL/q2atMkNdJAYlLVWukHTRf8EQ8Uq5xEnLONGtrnYC0gjJCIdbIO4jkP10hOqDufyQqk4DUsk7m1waCmMjGPDTrv8gyVK+48gS6+Jmroi51GDOQTb/T35a3HJt2bflFbaEJzYnHHvkensAUX6DeEMIowE4Qg";
    // æ”¯ä»˜å®å…¬é’¥,查看地址:https://openhome.alipay.com/platform/keyManage.htm å¯¹åº”APPID下的支付宝公钥。
//    public String alipay_public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhnER1VMBe7yuHI5P5NtsM0Nitaq8cHnobB7KwYDw/V9t/DCiBAbJnuBbOHyS4zkffiZ905dsQycIqu9PRk4J9j6nE9YZVLMPIHXIAOn4J6ZAGmznpuQ9es+fblw+nr/v00X9ZQpR0zYpULEEHaU9lXE8JMoKElawNYRpibArwrnWcizOFbFiwmq8Jq3m07Ri/L7/gogOZshE3WE9UuBIR/czputhq0py0F+yddASy08F0jt3/wm4Cgx/qUpMH/4KwIRwxSKp+Kk7rCRrKmnOm3iMt9QmQ1yX2ht9To5ph3gPBtfR5VyhA8Dasnls9XYEUzsrnWOd1v9javYPgE4vdQIDAQAB";
    // æœåŠ¡å™¨å¼‚æ­¥é€šçŸ¥é¡µé¢è·¯å¾„  éœ€http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
//    public static String notify_url = "http://192.168.0.199:8080/machine-fast/serv/c2charging/alipayNotifyReturn";
    public static String notify_url = "http://"+ServerConfig.getServerIP()+":8888/machine-fast/serv/c2charging/alipayNotifyReturn";
    // é¡µé¢è·³è½¬åŒæ­¥é€šçŸ¥é¡µé¢è·¯å¾„ éœ€http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
//    public static String return_url = "http://192.168.0.199:8080/machine-fast/serv/c2charging/alipayReturn";
    public static String return_url = "http://"+ServerConfig.getServerIP()+":8888/machine-fast/serv/c2charging/alipayReturn";
    // è¿”回格式
    public static String format = "json";
    // ç­¾åæ–¹å¼
    public static String sign_type = "RSA2";
    // å­—符编码格式
    public static String charset = "utf-8";
//    public String pid = "2088531531858351";
    public static String target_id = "";
    // æ”¯ä»˜å®ç½‘å…³
    public static String gatewayUrl = "https://openapi.alipay.com/gateway.do";
//    public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
}
ximon-admin/src/main/java/com/sandu/ximon/admin/config/C3mRedisConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.sandu.ximon.admin.config;
/**
 * @Author liuhaonan
 * @Version 1.0
 */
public class C3mRedisConfig {
    //  C3充电桩最长离线时间(s)
    public static Long OUTLINE_TIME = 60 * 3L;
    //  è®¾ç½®C3心跳包时间
    public static Long HEART_BEAT_TIME = 60L;
    //  C3订单超时时间
    public static Long ORDER_MAX_TIME = 60 * 5L;
    //  C3订单扫描间隔时间
    public static Long ORDER_QUERY_TIME = 20L;
    //  C3充电最大时长
    public static Long CHARGING_MAX_TIME = 60 * 60 * 24L * 2;
    //  C3故障码超时时间
    public static Long ERROR_REPORT_MAX_TIME = 60 * 60 * 24 * 7L;
    public static void reFlushTime(int onlineCount) {
        if(onlineCount > 60) {
            HEART_BEAT_TIME = Long.parseLong(onlineCount+"");
            OUTLINE_TIME = 3 * HEART_BEAT_TIME;
        }else if(onlineCount < 60){
            HEART_BEAT_TIME = 60L;
            OUTLINE_TIME = 3 * HEART_BEAT_TIME;
        }
    }
    public static Integer parseInt(Long l){
        return Integer.parseInt(l+"");
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/config/ServerConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,53 @@
package com.sandu.ximon.admin.config;
import com.sandu.ximon.admin.utils.LogUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
public class ServerConfig {
    @Value("${server-conf.ip}")
    public String SIP;
    @Value("${nginx.port}")
    public String nginxPort;
    @Value("${nginx.cameraSaveUrl}")
    public String saveUrl;
//    @Value("${broadcast.file-save-url}")
//    private String fileSaveUrl;
    private static String ServerIP;
    private static String NginxPort;
    private static String CameraSaveUrl;
    private static String BroadcastFileSaveUrl;
    private static boolean O2OServer;
    public static String getNginxCameraSaveUrl() {
        return CameraSaveUrl;
    }
    @PostConstruct
    private void loadIP(){
        ServerIP = SIP;
        NginxPort = nginxPort;
        CameraSaveUrl = saveUrl;
       // BroadcastFileSaveUrl = fileSaveUrl;
        LogUtils.print("Server IP ï¼š" +SIP);
        LogUtils.print("NignX Port ï¼š" +nginxPort);
        LogUtils.print("Camera Save Url ï¼š" +CameraSaveUrl);
        LogUtils.print("Broadcast File Save Url ï¼š" +BroadcastFileSaveUrl);
    }
    public static String getServerIP(){
        return ServerIP;
    }
    public static String getNignxPort(){
        return NginxPort;
    }
    public static String getBroadcastFileSaveUrl(){
        return BroadcastFileSaveUrl;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/AdminController.java
@@ -1,5 +1,6 @@
package com.sandu.ximon.admin.controller;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.map.MapBuilder;
import cn.hutool.core.map.MapUtil;
@@ -17,18 +18,14 @@
import com.sandu.common.security.token.TokenProvider;
import com.sandu.common.util.IpUtil;
import com.sandu.common.util.ResponseUtil;
import com.sandu.ximon.admin.dto.AdminDto;
import com.sandu.ximon.admin.dto.ClientDto;
import com.sandu.ximon.admin.param.AdminLoginParam;
import com.sandu.ximon.admin.param.AdminParam;
import com.sandu.ximon.admin.param.PwdParam;
import com.sandu.ximon.admin.security.SecurityUtils;
import com.sandu.ximon.admin.service.AdminService;
import com.sandu.ximon.admin.service.ClientService;
import com.sandu.ximon.admin.service.MenuService;
import com.sandu.ximon.admin.service.RoleService;
import com.sandu.ximon.dao.domain.Admin;
import com.sandu.ximon.dao.domain.Client;
import com.sandu.ximon.dao.domain.Menu;
import com.sandu.ximon.dao.domain.Role;
import com.sandu.ximon.admin.service.*;
import com.sandu.ximon.dao.domain.*;
import com.sandu.ximon.dao.enums.AdministratorEnums;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -38,10 +35,7 @@
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -62,6 +56,7 @@
    private final ClientService clientService;
    private final RoleService roleService;
    private final TokenProvider tokenProvider;
    private final AdminRoleRelationService adminRoleRelationService;
    @Log("后台用户登录")
    @AnonymousAccess
@@ -145,7 +140,21 @@
                    });
        }
        List<Admin> list = adminService.list(wrapper);
        return ResponseUtil.successPage(list);
        List<AdminDto> adminDtoList = new ArrayList<>();
        for (Admin demo : list) {
            AdminDto adminDto = new AdminDto();
            BeanUtil.copyProperties(demo, adminDto);
            AdminRoleRelation one = adminRoleRelationService.getOne(Wrappers.lambdaQuery(AdminRoleRelation.class)
                    .eq(AdminRoleRelation::getAdminId, demo.getId()));
            if (one != null) {
                adminDto.setRoleId(one.getRoleId());
            }
            adminDtoList.add(adminDto);
        }
        return ResponseUtil.successPage(adminDtoList);
    }
    @PostMapping("/register")
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/C3ChargingController.java
@@ -3,9 +3,11 @@
import com.sandu.common.domain.ResponseVO;
import com.sandu.common.object.BaseConditionVO;
import com.sandu.common.util.ResponseUtil;
import com.sandu.ximon.admin.param.C3ChargingAddParam;
import com.sandu.ximon.admin.param.C3ChargingParam;
import com.sandu.ximon.admin.service.C3ChargingService;
import lombok.AllArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
@@ -21,9 +23,9 @@
    private C3ChargingService c3ChargingService;
    @GetMapping("/C3ChargingList")
    public ResponseVO<Object> C3ChargingList(BaseConditionVO baseConditionVO) {
        return ResponseUtil.successPage(c3ChargingService.getC3ChargingList(baseConditionVO));
    @PostMapping("/C3ChargingList")
    public ResponseVO<Object> C3ChargingList(BaseConditionVO baseConditionVO, @RequestBody(required = false) C3ChargingParam c3ChargingParam) {
        return ResponseUtil.successPage(c3ChargingService.getC3ChargingListByKeyword(baseConditionVO, c3ChargingParam));
    }
    /**
@@ -54,6 +56,139 @@
        }
    }
    /**
     * åŒæ­¥ç»“束
     */
    @PostMapping("/EndOfTheSynchronization")
    public ResponseVO<Object> EndOfTheSynchronization(@RequestBody C3ChargingParam c3ChargingParam) {
        String result = c3ChargingService.EndOfTheSynchronization(c3ChargingParam.getC3Mac());
        if ("操作成功".equals(result)) {
            return ResponseUtil.success(result);
        } else {
            return ResponseUtil.fail(result);
        }
    }
    /**
     * æŸ¥è¯¢ç‰ˆæœ¬
     */
    @PostMapping("/QueryVersion")
    public ResponseVO<Object> QueryVersion(@RequestBody C3ChargingParam c3ChargingParam) {
        String result = c3ChargingService.QueryVersion(c3ChargingParam.getC3Mac());
        return ResponseUtil.success(result);
    }
    /**
     * æŸ¥è¯¢å¿ƒè·³åŒ…间隔时间
     */
    @PostMapping("/QueryIntervalTime")
    public ResponseVO<Object> QueryIntervalTime(@RequestBody C3ChargingParam c3ChargingParam) {
        String result = c3ChargingService.QueryIntervalTime(c3ChargingParam.getC3Mac());
        return ResponseUtil.success(result);
    }
    /**
     * æŸ¥è¯¢ç”µåŽ‹/电流常数
     */
    @PostMapping("/QueryConstant")
    public ResponseVO<Object> QueryConstant(@RequestBody C3ChargingParam c3ChargingParam) {
        String result = c3ChargingService.QueryConstant(c3ChargingParam.getC3Mac());
        return ResponseUtil.success(result);
    }
    /**
     * æŸ¥è¯¢åœ°å€
     */
    @PostMapping("/QueryAddress")
    public ResponseVO<Object> QueryAddress(@RequestBody C3ChargingParam c3ChargingParam) {
        String result = c3ChargingService.QueryAddress(c3ChargingParam.getC3Mac());
        return ResponseUtil.success(result);
    }
    /**
     * æŸ¥è¯¢æ•…障码
     */
    @PostMapping("/QueryFaultCode")
    public ResponseVO<Object> QueryFaultCode(@RequestBody C3ChargingParam c3ChargingParam) {
        String result = c3ChargingService.QueryFaultCode(c3ChargingParam.getC3Mac());
        return ResponseUtil.success(result);
    }
    /**
     * è¯»å¿ƒè·³åŒ…
     */
    @PostMapping("/ReadTheHeartbeatPackage")
    public ResponseVO<Object> ReadTheHeartbeatPackage(@RequestBody C3ChargingParam c3ChargingParam) {
        return ResponseUtil.success(c3ChargingService.ReadTheHeartbeatPackage(c3ChargingParam.getC3Mac()));
    }
    /**
     * è®¾ç½®å¿ƒè·³åŒ…间隔时间(秒)-充电状态时
     */
    @PostMapping("/SetHeartbeatPacketTimeCharging")
    public ResponseVO<Object> SetHeartbeatPacketTimeCharging(@RequestBody @Validated C3ChargingParam c3ChargingParam) {
        return ResponseUtil.success(c3ChargingService.SetHeartbeatPacketTimeCharging(c3ChargingParam.getC3Mac(), c3ChargingParam.getTime(), true));
    }
    /**
     * è®¾ç½®å¿ƒè·³åŒ…间隔时间(秒)-非充电状态时
     */
    @PostMapping("/SetHeartbeatPacketTimeNotCharging")
    public ResponseVO<Object> SetHeartbeatPacketTimeNotCharging(@RequestBody @Validated C3ChargingParam c3ChargingParam) {
        return ResponseUtil.success(c3ChargingService.SetHeartbeatPacketTimeCharging(c3ChargingParam.getC3Mac(), c3ChargingParam.getTime(), false));
    }
    /**
     * è®¾ç½®ç”µåŽ‹/电流常数(各一字节)(默认值0xBC64)
     */
    @PostMapping("/SetConstant")
    public ResponseVO<Object> SetConstant(@RequestBody @Validated C3ChargingParam c3ChargingParam) {
        return ResponseUtil.success(c3ChargingService.SetConstant(c3ChargingParam.getC3Mac(), c3ChargingParam.getConstant()));
    }
    /**
     * è®¾ç½®åœ°å€
     */
    @PostMapping("/SetAddress")
    public ResponseVO<Object> SetAddress(@RequestBody @Validated C3ChargingParam c3ChargingParam) {
        return ResponseUtil.success(c3ChargingService.SetAddress(c3ChargingParam.getC3Mac(), c3ChargingParam.getAddress()));
    }
    /**
     * è®¾ç½®æ—¥åŽ†ï¼ˆåŒå¿ƒè·³åŒ…ä¸­çš„6字节日期时间)
     */
    @PostMapping("/SetCalendar")
    public ResponseVO<Object> SetCalendar(@RequestBody @Validated C3ChargingParam c3ChargingParam) {
        return ResponseUtil.success(c3ChargingService.SetCalendar(c3ChargingParam.getC3Mac()
                , c3ChargingParam.getYear(), c3ChargingParam.getMonth(), c3ChargingParam.getDay(), c3ChargingParam.getHour(), c3ChargingParam.getMin(), c3ChargingParam.getSec()));
    }
    /**
     * æ•…障码上报清除
     */
    @PostMapping("/ClearedFaultCode")
    public ResponseVO<Object> ClearedFaultCode(@RequestBody @Validated C3ChargingParam c3ChargingParam) {
        return ResponseUtil.success(c3ChargingService.ClearedFaultCode(c3ChargingParam.getC3Mac()));
    }
    /**
     * æ¢å¤å‡ºåނ值
     */
    @PostMapping("/RestoreFactoryValue")
    public ResponseVO<Object> RestoreFactoryValue(@RequestBody @Validated C3ChargingParam c3ChargingParam) {
        return ResponseUtil.success(c3ChargingService.RestoreFactoryValue(c3ChargingParam.getC3Mac()));
    }
    /**
     * è½¯é‡å¯
@@ -68,4 +203,35 @@
            return ResponseUtil.fail(result);
        }
    }
    /**
     * æ·»åŠ å……ç”µæ¡©ç¡¬ä»¶è®¾å¤‡
     *
     * @param c3ChargingAddParam
     * @return
     */
    @PostMapping("/addC3Charging")
    public ResponseVO<Object> addC3Charging(@RequestBody C3ChargingAddParam c3ChargingAddParam) {
        boolean flag = c3ChargingService.addC3Charging(c3ChargingAddParam);
        if (flag) {
            return ResponseUtil.success("添加充电桩硬件设备成功!");
        } else {
            return ResponseUtil.fail("添加充电桩硬件设备失败!");
        }
    }
    /**
     * ä¿®æ”¹å……电桩硬件设备名称
     * @param c3ChargingAddParam
     * @return
     */
    @PostMapping("/updateC3ChargingName")
    public ResponseVO<Object> updateC3ChargingName(@RequestBody C3ChargingAddParam c3ChargingAddParam) {
        boolean flag = c3ChargingService.updateC3ChargingName(c3ChargingAddParam);
        if (flag) {
            return ResponseUtil.success("修改充电桩硬件设备名称成功!");
        } else {
            return ResponseUtil.fail("修改充电桩硬件设备名称失败!");
        }
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/C3mChargingChargeController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,73 @@
package com.sandu.ximon.admin.controller;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.sandu.common.domain.ResponseVO;
import com.sandu.common.execption.BusinessException;
import com.sandu.common.util.ResponseUtil;
import com.sandu.ximon.admin.param.C3mChargingChargeParam;
import com.sandu.ximon.admin.service.C3mChargingChargeService;
import com.sandu.ximon.dao.domain.C3mChargingCharge;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * @Author liuhaonan
 * @Date 2022/3/18 15:58
 * @Version 1.0
 * å……电桩费率相关
 */
@RestController
@AllArgsConstructor
@RequestMapping("/v1/c3mChargingCharge")
public class C3mChargingChargeController {
    private final C3mChargingChargeService chargeService;
    /**
     * æ·»åŠ è´¹çŽ‡
     *
     * @param charge
     * @return
     */
    // @PostMapping("/addC3mCharging")
    public ResponseVO<Object> addC3mCharging(@RequestBody C3mChargingChargeParam charge) {
//        chargeService.save(charge);
//        chargeService.initCharge(charge);
        return ResponseUtil.success(chargeService.initCharge(charge));
    }
    @PostMapping("/updateC3mCharging")
    public ResponseVO<Object> updateC3mCharging(@RequestBody List<C3mChargingCharge> chargeEntities) {
        if (chargeEntities.size() > 5) {
            throw new BusinessException("当前最高仅支持4组费率");
        }
        if (chargeEntities.size() == 0) {
            throw new BusinessException("最少需要一条费率");
        }
        return ResponseUtil.success(chargeService.updateCharge(chargeEntities));
    }
    // @PostMapping("/deleteC3mCharging")
    public ResponseVO<Object> deleteC3mCharging(@RequestBody C3mChargingChargeParam charge) {
        boolean remove = chargeService.remove(Wrappers.lambdaQuery(C3mChargingCharge.class).eq(C3mChargingCharge::getC3Id, charge.getC3Id())
                .eq(C3mChargingCharge::getHour, charge.getCharge()).eq(C3mChargingCharge::getHour, charge.getHour())
                .eq(C3mChargingCharge::getCharge, charge.getCharge()).eq(C3mChargingCharge::getCharge, charge.getTimestamp()));
        return ResponseUtil.success(remove);
    }
    @GetMapping("/getChargeByC3Id/{c3mId}")  //未同步文档
    public ResponseVO<Object> getChargeByC3Id(@PathVariable Integer c3mId) {
        return ResponseUtil.success(chargeService.getChargeByC3Id(c3mId));
    }
    @GetMapping("/getChargeByPoleId/{PoleId}") //为未同步文档
    public ResponseVO<Object> getChargeByPoleId(@PathVariable Long PoleId) {
        return ResponseUtil.success(chargeService.getChargeByPoleId(PoleId));
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/C3mOrderController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,221 @@
package com.sandu.ximon.admin.controller;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeWapPayModel;
import com.alipay.api.request.AlipayTradeWapPayRequest;
import com.sandu.common.domain.ResponseVO;
import com.sandu.common.execption.BusinessException;
import com.sandu.common.util.ResponseUtil;
import com.sandu.ximon.admin.config.AlipayConfig;
import com.sandu.ximon.admin.param.PayParam;
import com.sandu.ximon.admin.pay.alipay.UsrAlipayConfigService;
import com.sandu.ximon.admin.pay.wx.WxFastPayService;
import com.sandu.ximon.admin.service.C3ChargingService;
import com.sandu.ximon.admin.service.C3mOrderService;
import com.sandu.ximon.admin.utils.AliPayUtils;
import com.sandu.ximon.admin.utils.ConfigCheckUtils;
import com.sandu.ximon.dao.domain.AliConfigEntity;
import com.sandu.ximon.dao.domain.C3mCharging;
import com.sandu.ximon.dao.domain.C3mOrder;
import com.sandu.ximon.dao.enums.OrderType;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.SortedMap;
/**
 * @Author liuhaonan
 * @Version 1.0
 */
@RestController
@AllArgsConstructor
@RequestMapping("/v1/c3mOrder")
public class C3mOrderController {
    private final C3mOrderService c3mOrderService;
    private final C3ChargingService c3mService;
    private final UsrAlipayConfigService alipayConfigService;
    private final WxFastPayService wxPayService;
    /**
     * é€€æ¬¾
     *
     * @return
     */
    @PostMapping("/refond")
    public ResponseVO<Object> refond(@RequestBody Map params) {
//        c3mOrderService.orderRefund( (String)params.get("outTradeNo"),
//                (Double)params.get("refundAmount"));
        return ResponseUtil.success(c3mOrderService.orderRefund((String) params.get("outTradeNo"),
                (Double) params.get("refundAmount")));
    }
    /**
     * é¢„付款,生成订单(或直接从redis中获取当前未过期的订单)
     *
     * @return
     */
    @PostMapping("/advancePay")
    public ResponseVO<Object> advancePayOrder(@RequestBody PayParam param) {
        if (param.getTotalAmount() == 0d) {
            throw new BusinessException("金额不能为0");
        }
        //  C3充电桩实体
        C3mCharging c3m = c3mService.getC3mByPoleId(param.getPoleId());
        if (null == c3m) {
            throw new BusinessException("未找到当前充电桩");
        }
        C3mOrder c3mOrderEntity = c3mOrderService.advancePayOrder(param.getPoleId(), c3m, param.getOrderType()
                , param.getTotalAmount(), param.getSubscribeChargingCapacity());
        if (null == c3mOrderEntity) {
            throw new BusinessException("该充电桩正被使用!");
        }
//        return R.ok().put("outTradeNo",c3mOrderEntity.getOutTradeNo())
//                .put("totalAmount",totalAmount);
        Map map = new HashMap();
        map.put("outTradeNo", c3mOrderEntity.getOutTradeNo());
        map.put("totalAmount", param.getTotalAmount());
        return ResponseUtil.success(map);
    }
    @PostMapping("/aliPay")
    public ResponseVO<Object> c3AliPay(@RequestBody PayParam param, HttpServletResponse response) {
        // å•†æˆ·è®¢å•号,商户网站订单系统中唯一订单号,必填
        String out_trade_no = param.getOutTradeNo();
        System.out.println("订单号:" + out_trade_no);
        // è®¢å•名称,必填
        String subject = "扫码充电支付(C3充电桩)";
        // ä»˜æ¬¾é‡‘额,必填,单位为元,精确到小数点后两位,取值范围[0.01,100000000]
        String total_amount = param.getTotalAmount().toString();
        // å•†å“æè¿°ï¼Œå¯ç©º
        String body = "请勿付款,测试用";
        // è¶…æ—¶æ—¶é—´ å¯ç©º
        String timeout_express = "5m";
        // é”€å”®äº§å“ç  å¿…å¡«
        String product_code = "QUICK_WAP_WAY";
        /**********************/
        AliConfigEntity alipayConfigEntity = alipayConfigService.getConfigByPoleId(param.getPoleId());
        String checkStr = ConfigCheckUtils.checkAlipayConfig(alipayConfigEntity);
        if (checkStr != null) {
            try {
                response.getWriter().write(checkStr);
                return ResponseUtil.fail("支付完成失败");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //调用RSA签名方式
        AlipayClient client = new DefaultAlipayClient(AlipayConfig.gatewayUrl, alipayConfigEntity.getAppId(), alipayConfigEntity.getPrivateKey(), AlipayConfig.format, AlipayConfig.charset, alipayConfigEntity.getPublicKey(), AlipayConfig.sign_type);
        AlipayTradeWapPayRequest alipay_request = new AlipayTradeWapPayRequest();
        // å°è£…请求支付信息
        AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
        model.setOutTradeNo(out_trade_no);
        model.setSubject(subject);
        model.setTotalAmount(total_amount);
        model.setBody(body);
        model.setTimeoutExpress(timeout_express);
        model.setProductCode(product_code);
        model.setQuitUrl(C3mOrder.REQUEST_URL + param.getPoleId() + "/" + new Date().getTime());
        alipay_request.setBizModel(model);
        // è®¾ç½®å¼‚步通知地址
        alipay_request.setNotifyUrl(C3mOrder.REQUEST_URL + param.getPoleId() + "/" + new Date().getTime());
        // è®¾ç½®åŒæ­¥åœ°å€
        alipay_request.setReturnUrl(C3mOrder.REQUEST_URL + param.getPoleId() + "/" + new Date().getTime());
        // form表单生产
        String form = "";
        try {
            // è°ƒç”¨SDK生成表单
            form = client.pageExecute(alipay_request).getBody();
            response.setContentType("text/html;charset=" + AlipayConfig.charset);
            response.getWriter().write(form);//直接将完整的表单html输出到页面
            response.getWriter().flush();
            response.getWriter().close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ResponseUtil.success("支付完成");
    }
    @RequestMapping("/wxpay")
    public ResponseVO<Object> c3Wxpay(@RequestBody PayParam param) {
        //String result = wxPayService.miniAppPay(outTradeNo, totalAmount, streetlightId);
        SortedMap<Object, Object> result = wxPayService.appPay("扫码充电支付(C3充电桩)", param.getOutTradeNo(), param.getWxPayTotalAmount(), param.getPoleId());
        return ResponseUtil.success(result);
    }
    public ResponseVO<Object> queryPayStates(@RequestBody PayParam param) {
//        //String result = wxPayService.miniAppPay(outTradeNo, totalAmount, streetlightId);
////支付宝交易号
//        String trade_no = WIDtrade_no.Text.Trim();
////支付宝交易号与商户网站订单号不能同时为空
////商户订单号
//        String out_trade_no = WIDout_trade_no.Text.Trim();
////把请求参数打包成数组
//
//        SortedDictionary<string, string> sParaTemp = new SortedDictionary<string, string>();
//        sParaTemp.Add("partner", Config.Partner);
//        sParaTemp.Add("_input_charset", Config.Input_charset.ToLower());
//        sParaTemp.Add("service", "single_trade_query");
//        sParaTemp.Add("trade_no", trade_no);
//        sParaTemp.Add("out_trade_no", out_trade_no);
////建立请求
//        string sHtmlText = Submit.BuildRequest(sParaTemp);
//
////请在这里加上商户的业务逻辑程序代码
//
////——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
//
//        XmlDocument xmlDoc = new XmlDocument();
//        try
//        {
//            xmlDoc.LoadXml(sHtmlText);
//            string strXmlResponse = xmlDoc.SelectSingleNode("/alipay").InnerText;
//            Response.Write(strXmlResponse);
//        }
//        catch (Exception exp)
//        {
//            Response.Write(sHtmlText);
//        }
        return ResponseUtil.success(null);
    }
    @RequestMapping("/queryOrder")
    public ResponseVO<Object> queryOrder(@RequestBody PayParam param) {
        if (param.getOrderId() == null) {
            throw new BusinessException("请输入正确的订单id");
        }
        C3mOrder order = c3mOrderService.getById(param.getOrderId());
        if((OrderType.ALIPAY.getCode()).equals(order.getOrderType())){
            return ResponseUtil.success(AliPayUtils.alipayQuery(order.getOutTradeNo(),param.getPoleId()));
        }else if((OrderType.WXPAY.getCode()).equals(order.getOrderType())){
        }
        return ResponseUtil.success(null);
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/ClientController.java
@@ -1,5 +1,6 @@
package com.sandu.ximon.admin.controller;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.pagehelper.PageHelper;
@@ -12,13 +13,17 @@
import com.sandu.common.security.token.TokenProvider;
import com.sandu.common.util.IpUtil;
import com.sandu.common.util.ResponseUtil;
import com.sandu.ximon.admin.dto.ClientDto;
import com.sandu.ximon.admin.param.AddClientPrarm;
import com.sandu.ximon.admin.param.AdminLoginParam;
import com.sandu.ximon.admin.param.ResetClientPasswordPrarm;
import com.sandu.ximon.admin.param.UpdateClientPrarm;
import com.sandu.ximon.admin.security.SecurityUtils;
import com.sandu.ximon.admin.service.ClientRoleRelationService;
import com.sandu.ximon.admin.service.ClientService;
import com.sandu.ximon.admin.service.RoleService;
import com.sandu.ximon.dao.domain.Client;
import com.sandu.ximon.dao.domain.ClientRoleRelation;
import com.sandu.ximon.dao.enums.AdministratorEnums;
import lombok.AllArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
@@ -27,9 +32,7 @@
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -44,6 +47,7 @@
    private final ClientService clientService;
    private final PasswordEncoder passwordEncoder;
    private final RoleService roleService;
    private final ClientRoleRelationService clientRoleRelationService;
    private final TokenProvider tokenProvider;
    @PostMapping("/add")
@@ -64,6 +68,16 @@
            return ResponseUtil.success("更新成功");
        } else {
            return ResponseUtil.fail("更新失败");
        }
    }
    @PostMapping("/resetClientPassword")
    public ResponseVO<Object> resetClientPassword(@RequestBody @Validated ResetClientPasswordPrarm resetClientPasswordPrarm) {
        boolean b = clientService.resetPassword(resetClientPasswordPrarm);
        if (b) {
            return ResponseUtil.success("修改成功");
        } else {
            return ResponseUtil.fail("修改失败");
        }
    }
@@ -89,7 +103,22 @@
                    .or(clientLambdaQueryWrapper -> clientLambdaQueryWrapper.like(Client::getMobile, keyword))
                    .or(clientLambdaQueryWrapper -> clientLambdaQueryWrapper.like(Client::getLinkMan, keyword));
        }
        return ResponseUtil.successPage(clientService.list(wrapper));
        List<Client> clientList = clientService.list(wrapper);
        List<ClientDto> clientDtoList = new ArrayList<>();
        for (Client demo : clientList) {
            ClientDto clientDto = new ClientDto();
            BeanUtil.copyProperties(demo, clientDto);
            ClientRoleRelation one = clientRoleRelationService.getOne(Wrappers.lambdaQuery(ClientRoleRelation.class)
                    .eq(ClientRoleRelation::getClientId, demo.getId()));
            if (one != null) {
                clientDto.setRoleId(one.getRoleId());
            }
            clientDtoList.add(clientDto);
        }
        return ResponseUtil.successPage(clientDtoList);
    }
    @AnonymousAccess
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/LedSFileController.java
@@ -61,9 +61,9 @@
            fileUploadDto.setScreenShot(fileUploadDto.getFileUrl()+"?x-oss-process=video/snapshot,t_10000,m_fast");
        }
        FileOperationRecord fileOperationRecord = new FileOperationRecord();
        if("mp4".equals(fileUploadDto.getFileType())){
            fileUploadDto.setScreenShot(fileUploadDto.getFileUrl()+"?x-oss-process=video/snapshot,t_10000,m_fast");
        }
//        if("mp4".equals(fileUploadDto.getFileType())){
//            fileUploadDto.setScreenShot(fileUploadDto.getFileUrl()+"?x-oss-process=video/snapshot,t_10000,m_fast");
//        }
        BeanUtils.copyProperties(fileUploadDto, fileOperationRecord);
        fileOperationRecord.setDataType(dateType);
        fileOperationRecordService.save(fileOperationRecord);
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/LightPoleHeelingController.java
@@ -1,19 +1,21 @@
package com.sandu.ximon.admin.controller;
import com.sandu.common.domain.ResponseVO;
import com.sandu.common.object.BaseConditionVO;
import com.sandu.common.util.ResponseUtil;
import com.sandu.ximon.admin.param.C3ChargingParam;
import com.sandu.ximon.admin.param.LightPoleHeelingListParam;
import com.sandu.ximon.admin.param.LightPoleHeelingParam;
import com.sandu.ximon.admin.service.LightPoleHeelingService;
import com.sandu.ximon.dao.domain.LightPoleHeeling;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * ç¯æ†å€¾æ–œ
 * ç¯æ†å€¾æ–œè­¦å‘Šåˆ—表
 */
@RestController
@AllArgsConstructor
@@ -21,20 +23,80 @@
public class LightPoleHeelingController {
    private final LightPoleHeelingService lightPoleHeelingService;
    @GetMapping
    public ResponseVO<Object> listLightPoleHeeling() {
        List<LightPoleHeeling> list = lightPoleHeelingService.listLightPoleHeeling();
        return ResponseUtil.successPage(list);
    }
    /**
     * æ¨¡ç³ŠæŸ¥è¯¢
     *
     * @return
     */
    @GetMapping("/listLightPoleHeelingByKeyword/{keyword}")
    public ResponseVO<Object> listLightPoleHeelingByKeyword(@PathVariable String keyword) {
        List<LightPoleHeeling> list = lightPoleHeelingService.listLightPoleHeelingByKeyword(keyword);
    @PostMapping("/listLightPoleHeelingByKeyword")
    public ResponseVO<Object> listLightPoleHeelingByKeyword(BaseConditionVO baseConditionVO
            , @RequestBody(required = false) LightPoleHeelingListParam lightPoleHeelingListParam) {
        List<LightPoleHeeling> list = lightPoleHeelingService.listLightPoleHeelingByKeyword(baseConditionVO, lightPoleHeelingListParam);
        return ResponseUtil.successPage(list);
    }
    /**
     * ç¯æ†å€¾æ–œå¿ƒè·³åŒ…
     *
     * @return
     */
    @PostMapping("/LightPoleHeelingHeartbeatPackage")
    public ResponseVO<Object> LightPoleHeelingHeartbeatPackage(@RequestBody @Validated LightPoleHeelingParam lightPoleHeelingParam) {
        return ResponseUtil.success(lightPoleHeelingService.LightPoleHeelingHeartbeatPackage(lightPoleHeelingParam.getDeviceName()));
    }
    /**
     * æŸ¥è¯¢å¿ƒè·³åŒ…间隔时间
     *
     * @return
     */
    @PostMapping("/QueryIntervalTime")
    public ResponseVO<Object> QueryIntervalTime(@RequestBody @Validated LightPoleHeelingParam lightPoleHeelingParam) {
        return ResponseUtil.success(lightPoleHeelingService.QueryIntervalTime(lightPoleHeelingParam.getDeviceName()));
    }
    /**
     * ç¯æ†å€¾æ–œè½¯é‡å¯
     *
     * @return
     */
    @PostMapping("/RestartLightPoleHeeling")
    public ResponseVO<Object> RestartLightPoleHeeling(@RequestBody @Validated LightPoleHeelingParam lightPoleHeelingParam) {
        String result = lightPoleHeelingService.RestartLightPoleHeeling(lightPoleHeelingParam.getDeviceName());
        if ("操作成功".equals(result)) {
            return ResponseUtil.success(result);
        } else {
            return ResponseUtil.fail(result);
        }
    }
    /**
     * è®¾ç½®å¿ƒè·³åŒ…间隔时间(秒)
     */
    @PostMapping("/SetHeartbeatPacketTime")
    public ResponseVO<Object> SetHeartbeatPacketTime(@RequestBody @Validated LightPoleHeelingParam lightPoleHeelingParam) {
        String result = lightPoleHeelingService.SetHeartbeatPacketTime(lightPoleHeelingParam.getDeviceName(), lightPoleHeelingParam.getTime());
        if ("操作成功".equals(result)) {
            return ResponseUtil.success(result);
        } else {
            return ResponseUtil.fail(result);
        }
    }
    /**
     * è®¾ç½®ä¼ æ„Ÿå™¨ä¸ºåˆå§‹çŠ¶æ€
     */
    @PostMapping("/SetSensorState")
    public ResponseVO<Object> SetSensorState(@RequestBody @Validated LightPoleHeelingParam lightPoleHeelingParam) {
        String result = lightPoleHeelingService.SetSensorState(lightPoleHeelingParam.getDeviceName());
        if ("操作成功".equals(result)) {
            return ResponseUtil.success(result);
        } else {
            return ResponseUtil.fail(result);
        }
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/LightPoleHeelingProcessingController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
package com.sandu.ximon.admin.controller;
/**
 * @author ZZQ
 * @date 2022/3/25 11:45
 */
import com.sandu.common.domain.ResponseVO;
import com.sandu.common.util.ResponseUtil;
import com.sandu.ximon.admin.param.LightPoleHeelingProcessingParam;
import com.sandu.ximon.admin.service.LightPoleHeelingProcessingServices;
import lombok.AllArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * ç¯æ†å€¾æ–œè­¦å‘Šå¤„理列表
 */
@RestController
@AllArgsConstructor
@RequestMapping("/v1/admin/LightPoleHeelingProcessing")
public class LightPoleHeelingProcessingController {
    private LightPoleHeelingProcessingServices lightPoleHeelingProcessingServices;
    /**
     * ç¯æ†å€¾æ–œè­¦å‘Šå¤„理
     *
     * @return
     */
    @PostMapping("/Processing")
    public ResponseVO<Object> ProcessingLightPoleHeeling(@RequestBody @Validated LightPoleHeelingProcessingParam param) {
        return ResponseUtil.success(lightPoleHeelingProcessingServices.ProcessingLightPoleHeeling(param));
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/MonitorController.java
@@ -97,8 +97,8 @@
     */
    @PostMapping("/addYSYMonitor")
    public ResponseVO<Object> addYSYMonitor(@RequestBody MonitorParam monitorParam) {
//        YSY_MonitorDto addMonitorDto = monitorService.addYSYMonitor(monitorParam.getAccessToken(), monitorParam.getDeviceSerial(), monitorParam.getValidateCode());
        YSY_MonitorDto addMonitorDto = monitorService.addYSYMonitor(monitorParam.getAccessToken(), monitorParam.getDeviceSerial());
        YSY_MonitorDto addMonitorDto = monitorService.addYSYMonitor(monitorParam.getAccessToken(), monitorParam.getDeviceSerial(), monitorParam.getValidateCode());
//        YSY_MonitorDto addMonitorDto = monitorService.addYSYMonitor(monitorParam.getAccessToken(), monitorParam.getDeviceSerial());
        if ("200".equals(addMonitorDto.getCode())) {
            return ResponseUtil.success(addMonitorDto);
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/PoleController.java
@@ -205,4 +205,23 @@
    }
    /**
     * æŸ¥æ‰¾è‡ªå·±æ‹¥æœ‰çš„灯杆
     */
    @PostMapping("/getOwnerPole/{cilentId}")
    public ResponseVO<Object> getOwnerPole(BaseConditionVO baseConditionVO, @RequestParam(value = "keyword", required = false) String keyword
            ,@PathVariable Long cilentId) {
        List<Pole> results = poleService.getOwnerPole(baseConditionVO, keyword, cilentId);
//        CommonPage commonPage = CommonPage.restPage(results);
//        int size = results.size();
//        commonPage.setTotal((long) size);
//        commonPage.setTotalPage(size / baseConditionVO.getPageSize() + 1);
//        if (size % baseConditionVO.getPageSize() == 0) {
//            commonPage.setTotalPage(size / baseConditionVO.getPageSize());
//        }
//        return ResponseUtil.success(commonPage);
        return ResponseUtil.success(results);
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/UsrPayConfigController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,171 @@
package com.sandu.ximon.admin.controller;
import com.github.pagehelper.PageHelper;
import com.sandu.common.domain.ResponseVO;
import com.sandu.common.execption.BusinessException;
import com.sandu.common.object.BaseConditionVO;
import com.sandu.common.util.ResponseUtil;
import com.sandu.ximon.admin.param.AlipayConfigParam;
import com.sandu.ximon.admin.param.WxpayConfigParam;
import com.sandu.ximon.admin.pay.alipay.UsrAlipayConfigService;
import com.sandu.ximon.admin.pay.wxpay.UsrWxPayConfigService;
import com.sandu.ximon.dao.domain.AliConfigEntity;
import com.sandu.ximon.dao.domain.WxConfigEntity;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
/**
 * @Author liuhaonan
 * @Date 2022/3/16 10:32
 * @Version 1.0
 * ç”¨æˆ·æ”¯ä»˜å‚数配置相关
 */
@RestController
@AllArgsConstructor
@RequestMapping("/v1/payconfig")
public class UsrPayConfigController {
    private final UsrAlipayConfigService alipayConfigService;
    private final UsrWxPayConfigService wxPayConfigService;
    /**
     * æ”¯ä»˜å®é…ç½®æ·»åŠ 
     *
     * @param configParam
     * @return
     */
    @PostMapping("/addAliPayConfig")
    public ResponseVO<Object> addAliPayConfig(@RequestBody AlipayConfigParam configParam) {
        return ResponseUtil.success(alipayConfigService.addAliPayConfig(configParam));
    }
    /**
     * æ”¯ä»˜å®é…ç½®æ›´æ”¹
     *
     * @param configId
     * @param configParam
     * @return
     */
    @PostMapping("/updateAliPayConfig/{configId}")
    public ResponseVO<Object> updateAliPayConfig(@PathVariable Integer configId, @RequestBody AlipayConfigParam configParam) {
        return ResponseUtil.success(alipayConfigService.updateAliPayConfig(configId, configParam));
    }
    /**
     * æ”¯ä»˜å®é…ç½®åˆ é™¤
     *
     * @param configId
     * @return
     */
    @PostMapping("/deleteAliPayConfig/{configId}")
    public ResponseVO<Object> deleteAliPayConfig(@PathVariable Integer configId) {
        return ResponseUtil.success(alipayConfigService.deleteAliPayConfig(configId));
    }
    /**
     * @param poleId
     * @return
     */
    @GetMapping("/getAliPayConfigByPoleId/{poleId}")
    public ResponseVO<Object> getAliPayConfigByPoleId(@PathVariable Long poleId) {
        return ResponseUtil.success(alipayConfigService.getConfigByPoleId(poleId));
    }
    /**
     * é…ç½®è¯¦æƒ…
     *
     * @param configId
     * @return
     */
    @GetMapping("/getAliPayConfigById/{configId}")
    public ResponseVO<Object> getAliPayConfigById(@PathVariable Integer configId) {
        if (configId == null) {
            throw new BusinessException("id能为空");
        }
        AliConfigEntity byId = alipayConfigService.getById(configId);
        if (byId == null) {
            throw new BusinessException("配置id错误或配置不存在");
        }
        return ResponseUtil.success(byId);
    }
    @GetMapping("/aliConfigList")
    public ResponseVO<Object> aliConfigList(BaseConditionVO baseConditionVO
            , @RequestParam(value = "keyword", required = false) String keyword) {
        return ResponseUtil.success(alipayConfigService.configList(baseConditionVO, keyword));
    }
    /**
     * wx配置添加
     *
     * @param configParam
     * @return
     */
    @PostMapping("/addWxPayConfig")
    public ResponseVO<Object> addAliPayConfig(@RequestBody WxpayConfigParam configParam) {
        return ResponseUtil.success(wxPayConfigService.addWxPayConfig(configParam));
    }
    /**
     * wx配置更改
     *
     * @param configId
     * @param configParam
     * @return
     */
    @PostMapping("/updateWxPayConfig/{configId}")
    public ResponseVO<Object> updateAliPayConfig(@PathVariable Long configId, @RequestBody WxpayConfigParam configParam) {
        return ResponseUtil.success(wxPayConfigService.updateWxPayConfig(configId, configParam));
    }
    /**
     * wx配置删除
     *
     * @param configId
     * @return
     */
    @PostMapping("/deleteWxPayConfig/{configId}")
    public ResponseVO<Object> deleteWxPayConfig(@PathVariable Long configId) {
        return ResponseUtil.success(wxPayConfigService.deleteWxPayConfig(configId));
    }
    /**
     * @param poleId
     * @return
     */
    @GetMapping("/getWxPayConfigByPoleId/{poleId}")
    public ResponseVO<Object> getWxPayConfigByPoleId(@PathVariable Long poleId) {
        return ResponseUtil.success(wxPayConfigService.getConfigByPoleId(poleId));
    }
    /**
     * é…ç½®è¯¦æƒ…
     *
     * @param configId
     * @return
     */
    @GetMapping("/getWxPayConfigById/{configId}")
    public ResponseVO<Object> getWxPayConfigById(@PathVariable Integer configId) {
        if (configId == null) {
            throw new BusinessException("id能为空");
        }
        WxConfigEntity byId = wxPayConfigService.getById(configId);
        if (byId == null) {
            throw new BusinessException("配置id错误或配置不存在");
        }
        return ResponseUtil.success(byId);
    }
    @GetMapping("/WxConfigList")
    public ResponseVO<Object> WxConfigList(BaseConditionVO baseConditionVO
            , @RequestParam(value = "keyword", required = false) String keyword) {
        PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
        return ResponseUtil.success(wxPayConfigService.configList(baseConditionVO, keyword));
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/VnnoxController.java
@@ -9,11 +9,14 @@
import com.sandu.ximon.admin.param.VnnoxParam;
import com.sandu.ximon.admin.security.SecurityUtils;
import com.sandu.ximon.admin.service.LedPlayerEntityService;
import com.sandu.ximon.admin.service.PoleBindingService;
import com.sandu.ximon.admin.service.PoleService;
import com.sandu.ximon.admin.service.VnnoxService;
import com.sandu.ximon.admin.utils.VnnoxAPIUtil;
import com.sandu.ximon.admin.utils.response.VnnoxResult;
import com.sandu.ximon.dao.domain.LedPlayerEntity;
import com.sandu.ximon.dao.domain.LedV2RegisterResultEntity;
import com.sandu.ximon.dao.domain.PoleBinding;
import com.sandu.ximon.dao.enums.AdministratorEnums;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@@ -40,6 +43,10 @@
    private LedPlayerEntityService ledPlayerEntityService;
    @Autowired
    private VnnoxAPIUtil vnnoxAPIUtil;
    @Autowired
    private PoleBindingService bindingService;
    @Autowired
    private PoleService poleService;
    /**
     * æˆªå±
@@ -129,7 +136,6 @@
    public ResponseVO<Object> list(BaseConditionVO baseConditionVO, @RequestParam(value = "keyword", required = false) String keyword) {
        PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
        LambdaQueryWrapper<LedPlayerEntity> wrapper = Wrappers.lambdaQuery(LedPlayerEntity.class);
        if (AdministratorEnums.CUSTOMER.getCode().equals(SecurityUtils.getAdministratorIdentity())) {
            //wrapper.eq(LedPlayerEntity::get)
            return ResponseUtil.success(""); //  todo
@@ -142,6 +148,16 @@
                    );
            List<LedPlayerEntity> list = ledPlayerEntityService.list(wrapper);
            List<LedPlayerEntity> entities = vnnoxService.setCacheInfo(vnnoxAPIUtil.syncCurrentInfo(list));
            entities.forEach(
                    led->{
                        PoleBinding binding = bindingService.getOne(Wrappers.lambdaQuery(PoleBinding.class)
                                .eq(PoleBinding::getDeviceType, 1).eq(PoleBinding::getDeviceCode, led.getSn()));
                        if(binding!=null){
                            led.setPoleId(poleService.getById(binding.getPoleId()).getId());
                            led.setPoleName(poleService.getById(binding.getPoleId()).getPoleName());
                        }
                    }
            );
            return ResponseUtil.success(entities);
        }
    }
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/XiXunController.java
@@ -144,8 +144,8 @@
     * @param lightemitIds
     * @return
     */
    @GetMapping("/pushToXixun/{pid}")
    public ResponseVO<Object> getByPid(@PathVariable Long pid, @RequestBody List<Long> lightemitIds) {
    @PostMapping("/pushToXixun/{pid}")
    public ResponseVO<Object> pushByPid(@PathVariable Long pid, @RequestBody List<Long> lightemitIds) {
        xiXunPlayerService.videoXixunPlayer(pid, lightemitIds);
        return ResponseUtil.success("推送成功");
    }
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/AdminDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.sandu.ximon.admin.dto;
import com.sandu.ximon.dao.domain.Admin;
import lombok.Data;
/**
 * @author ZZQ
 * @date 2022/3/31 9:48
 */
@Data
public class AdminDto extends Admin {
    /**
     * è§’色ID
     */
    private Long roleId;
}
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/ClientDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.sandu.ximon.admin.dto;
import com.sandu.ximon.dao.domain.Client;
import lombok.Data;
@Data
public class ClientDto extends Client {
    /**
     * è§’色ID
     */
    private Long roleId;
}
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/wxquery/WxOrderDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
package com.sandu.ximon.admin.dto.wxquery;
import lombok.Data;
import java.util.List;
/**
 * @Author liuhaonan
 * @Date 2022/3/29
 * @Version 1.0
 */
@Data
public class WxOrderDto {
    private amount amount;//订单金额
    private String appid;
    private String macid;
    private String out_trade_no;//商户订单号
    private String transaction_id;//微信支付订单号
    private String trade_type;//交易类型
    /**
     * äº¤æ˜“状态,枚举值:
     * SUCCESS:支付成功
     * REFUND:转入退款
     * NOTPAY:未支付
     * CLOSED:已关闭
     * REVOKED:已撤销(仅付款码支付会返回)
     * USERPAYING:用户支付中(仅付款码支付会返回)
     * PAYERROR:支付失败(仅付款码支付会返回)
     * ç¤ºä¾‹å€¼ï¼šSUCCESS
     */
    private String trade_state;//交易状态
    private String trade_state_desc;//交易状态描述
    private String bank_type;//付款银行
    private String attach;//附加数据
    private String success_time;
    private payer payer;//支付者
    private List<promotion_detail> promotion_detail; //+优惠功能
    private scene_info scene_info;//-场景信息
    private goods_detail goods_detail;//单品列表
}
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/wxquery/amount.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.sandu.ximon.admin.dto.wxquery;
import lombok.Data;
/**
 * @Author liuhaonan
 * @Date 2022/3/29
 * @Version 1.0
 */
@Data
public class amount {
    //总金额
    private Integer total;
    //用户支付金额
    private Integer payer_total;
    //货币类型
    private String currency;
    //用户支付币种
    private String payer_currency;
}
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/wxquery/goods_detail.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.sandu.ximon.admin.dto.wxquery;
import lombok.Data;
/**
 * @Author liuhaonan
 * @Date 2022/3/29
 * @Version 1.0
 */
@Data
public class goods_detail {
    private String goods_id;//商品编码
    private Integer quantity;//商品数量
    private Integer unit_price;//商品单价
    private Integer discount_amount;//商品优惠金额
    private String goods_remark;//商品备注
}
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/wxquery/payer.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.sandu.ximon.admin.dto.wxquery;
import lombok.Data;
/**
 * @Author liuhaonan
 * @Date 2022/3/29
 * @Version 1.0
 */
@Data
public class payer {
    private String openid ;//用户标识
}
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/wxquery/promotion_detail.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.sandu.ximon.admin.dto.wxquery;
import lombok.Data;
/**
 * @Author liuhaonan
 * @Date 2022/3/29
 * @Version 1.0
 */
@Data
public class promotion_detail {
    private String coupon_id;//券ID
    private String name;//优惠名称
    private String scope;//优惠范围
    private String type;//优惠类型 CASH:充值  NOCASH:预充值
    private Integer amount; //优惠券面额
    private String stock_id;//活动ID
    private Integer  wechatpay_contribute;//微信出资
    private Integer merchant_contribute;//商户出资
    private Integer other_contribute;//其他出资
    private String     currency;//优惠币种
}
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/wxquery/scene_info.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.sandu.ximon.admin.dto.wxquery;
import lombok.Data;
/**
 * @Author liuhaonan
 * @Date 2022/3/29
 * @Version 1.0
 */
@Data
public class scene_info {
    private String device_id;
}
ximon-admin/src/main/java/com/sandu/ximon/admin/entity/ProgramPro.java
@@ -1,5 +1,6 @@
package com.sandu.ximon.admin.entity;
import com.sandu.ximon.dao.domain.LedSFile;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
@@ -19,4 +20,6 @@
    private boolean isOthers=true;
    private int version;                    //2为简易节目,9为定点节目,其他为高级节目,请赋值其他。
    private List<LedSFile> fileList;
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/AmqpMessageListener.java
@@ -3,13 +3,13 @@
import com.alibaba.fastjson.JSON;
import com.sandu.ximon.admin.manager.iot.amqp.processor.AirDataProcessor;
import com.sandu.ximon.admin.manager.iot.amqp.processor.LightDataProcessor;
import com.sandu.ximon.admin.manager.iot.amqp.processor.PoleMonitorDataProcessor;
import com.sandu.ximon.admin.manager.iot.amqp.processor.c3ChargingProcessor;
import com.sandu.ximon.admin.manager.iot.frame.inner.report.*;
import com.sandu.ximon.admin.manager.iot.rrpc.dto.CommonFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.dto.CommonReportMessage;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.A5C3ReportEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.A5LightReportEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.A5OrderEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.C3ChargingEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.util.FrameUtils;
import lombok.extern.slf4j.Slf4j;
@@ -106,30 +106,36 @@
            // å¤§æ°”数据指令上报
            AirDataProcessor.getInstance().process(productKey, deviceName, frame);
//            atmosphereAnalysis(productKey, deviceName, frame);
        } else if (frame.getOrderType().equals(A5OrderEnum.RESPONSE_POLE_MONITOR_DATA.getCode())) {
            PoleMonitorDataProcessor.getInstance().process(productKey, deviceName, frame);
        }
    }
    private void c3ChargingReportAnalysis(String productKey, String deviceName, CommonFrame frame) {
        String functionCode = frame.getPayload().substring(2, 4);
        if (A5C3ReportEnum.NETWORK_REQUEST.getCode().equals(functionCode)) {
            A5C3CommonReportInnerFrame netRequestFrame = new A5C3CommonReportInnerFrame().transformFrame(frame.getPayload());
            log.info("C3充电桩上报处理_netRequestFrame");
            log.info(netRequestFrame.toString());
        } else if (A5C3ReportEnum.QR_CODE_REQUEST.getCode().equals(functionCode)) {
        if (C3ChargingEnum.NETWORK_REQUEST.getCode().equals(functionCode)) {
//            A5C3CommonReportInnerFrame netRequestFrame = new A5C3CommonReportInnerFrame().transformFrame(frame.getPayload());
//            log.info("C3充电桩上报处理_netRequestFrame");
//            log.info(netRequestFrame.toString());
            //网络请求
            c3ChargingProcessor.c3ChargingProcessorgetInstance().process(productKey, deviceName, frame);
        } else if (C3ChargingEnum.QR_CODE_REQUEST.getCode().equals(functionCode)) {
            A5C3CommonReportInnerFrame codeRequestFrame = new A5C3CommonReportInnerFrame().transformFrame(frame.getPayload());
            log.info("C3充电桩上报处理_codeRequestFrame");
            log.info(codeRequestFrame.toString());
        } else if (A5C3ReportEnum.HEART_BEAT.getCode().equals(functionCode)) {
        } else if (C3ChargingEnum.HEART_BEAT.getCode().equals(functionCode)) {
            //心跳包
            c3ChargingProcessor.c3ChargingProcessorgetInstance().process(productKey, deviceName, frame);
        } else if (A5C3ReportEnum.CHARGE_COMPLETE.getCode().equals(functionCode)) {
        } else if (C3ChargingEnum.CHARGE_COMPLETE.getCode().equals(functionCode)) {
            A5C3CommonReportInnerFrame completeRequestFrame = new A5C3CommonReportInnerFrame().transformFrame(frame.getPayload());
            log.info("C3充电桩上报处理_completeRequestFrame");
            log.info(completeRequestFrame.toString());
        } else if (A5C3ReportEnum.CHARGE_STOP.getCode().equals(functionCode)) {
        } else if (C3ChargingEnum.CHARGE_STOP.getCode().equals(functionCode)) {
            A5C3CommonReportInnerFrame stopRequestFrame = new A5C3CommonReportInnerFrame().transformFrame(frame.getPayload());
            log.info("C3充电桩上报处理_stopRequestFrame");
            log.info(stopRequestFrame.toString());
        } else if (A5C3ReportEnum.ERROR_CODE.getCode().equals(functionCode)) {
        } else if (C3ChargingEnum.ERROR_CODE.getCode().equals(functionCode)) {
            A5C3ErrorCodeReportInnerFrame errorCodeRequestFrame = new A5C3ErrorCodeReportInnerFrame().transformFrame(frame.getPayload());
            log.info("C3充电桩上报处理_errorCodeRequestFrame");
            log.info(errorCodeRequestFrame.toString());
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/processor/AirDataProcessor.java
@@ -19,7 +19,7 @@
    }
    public static AirDataProcessor getInstance() {
        return AirDataProcessor.AirDataProcessorHolder.INSTANCE;
        return AirDataProcessorHolder.INSTANCE;
    }
    private static class AirDataProcessorHolder {
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/processor/PoleMonitorDataProcessor.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package com.sandu.ximon.admin.manager.iot.amqp.processor;
import com.sandu.common.util.SpringContextHolder;
import com.sandu.ximon.admin.manager.iot.frame.inner.report.A5AtmosphereHeartbeatReportInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.report.A5LightPoleHeelingHeartbeatReportInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.dto.CommonFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.A5AtmosphereReportEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.LightPoleHeelingEnum;
import com.sandu.ximon.admin.service.AirDataService;
import com.sandu.ximon.admin.service.LightPoleHeelingService;
import lombok.extern.slf4j.Slf4j;
/**
 * @author ZZQ
 * @date 2022/3/24 9:45
 */
@Slf4j
public class PoleMonitorDataProcessor implements IMessageProcessor {
    public PoleMonitorDataProcessor() {
    }
    public static PoleMonitorDataProcessor getInstance() {
        return PoleMonitorDataProcessorHolder.INSTANCE;
    }
    private static class PoleMonitorDataProcessorHolder {
        private static final PoleMonitorDataProcessor INSTANCE = new PoleMonitorDataProcessor();
    }
    @Override
    public void process(String productKey, String deviceName, CommonFrame frame) {
        String functionCode = frame.getPayload().substring(2, 4);
        if (LightPoleHeelingEnum.TheHeartbeatPackage.getCode().equals(functionCode)) {
            log.info("心跳相应——灯杆倾斜");
            A5LightPoleHeelingHeartbeatReportInnerFrame heartbeatReportInnerFrame = new A5LightPoleHeelingHeartbeatReportInnerFrame().transformFrame(frame.getPayload());
            log.info(heartbeatReportInnerFrame.toString());
            SpringContextHolder.getBean(LightPoleHeelingService.class).saveLightPoleHeelingHeartbeat(deviceName, heartbeatReportInnerFrame.getHeartBeatDataPackage());
//            SpringContextHolder.getBean(LightService.class).saveLight(deviceName,heartbeatReportInnerFrame.getHeartBeatDataPackage());
        }
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/processor/c3ChargingProcessor.java
@@ -1,11 +1,11 @@
package com.sandu.ximon.admin.manager.iot.amqp.processor;
import com.sandu.common.util.SpringContextHolder;
import com.sandu.ximon.admin.manager.iot.frame.inner.report.A5C3CommonReportInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.report.A5C3HeartbeatReportInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.report.A5C3OperationReportInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.dto.CommonFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.C3ChargingEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.C3ChargingReportEnum;
import com.sandu.ximon.admin.service.C3ChargingService;
import lombok.extern.slf4j.Slf4j;
@@ -30,14 +30,17 @@
    @Override
    public void process(String productKey, String deviceName, CommonFrame frame) {
        String functionCode = frame.getPayload().substring(2, 4);
        if (C3ChargingReportEnum.HeartBeat_Data.getCode().equals(functionCode)) {
        if (C3ChargingEnum.HEART_BEAT.getCode().equals(functionCode)) {
            log.info("心跳相应——C3充电桩数据" + productKey + "     -------       " + deviceName);
            A5C3HeartbeatReportInnerFrame heartbeatReportInnerFrame = new A5C3HeartbeatReportInnerFrame().transformFrame(frame.getPayload());
            log.info("C3充电桩上报处理_heartbeatReportInnerFrame");
            log.info(heartbeatReportInnerFrame.toString());
            if (heartbeatReportInnerFrame.isValidate()) {
                SpringContextHolder.getBean(C3ChargingService.class).saveReportData(deviceName, heartbeatReportInnerFrame.getHeartBeatDataPackage());
                SpringContextHolder.getBean(C3ChargingService.class).updateReportState(deviceName
                        , heartbeatReportInnerFrame.getHeartBeatDataPackage().getC3Mac()
                        , heartbeatReportInnerFrame.getHeartBeatDataPackage().getStatusBit()
                        , heartbeatReportInnerFrame.getHeartBeatDataPackage().getDeviceTemperature());
            }
        } else if (C3ChargingEnum.StartCharging.getCode().equals(functionCode)) {
            log.info("心跳响应——C3充电桩开始充电");
@@ -48,6 +51,14 @@
//            if (operationReportInnerFrame.isValidate()) {
//                SpringContextHolder.getBean(C3ChargingService.class).saveReportData(deviceName, operationReportInnerFrame.getHeartBeatDataPackage());
//            }
        } else if (C3ChargingEnum.NETWORK_REQUEST.getCode().equals(functionCode)) {
            A5C3CommonReportInnerFrame netRequestFrame = new A5C3CommonReportInnerFrame().transformFrame(frame.getPayload());
            log.info("C3充电桩上报处理_netRequestFrame");
            log.info(netRequestFrame.toString());
            if (netRequestFrame.isValidate()) {
                SpringContextHolder.getBean(C3ChargingService.class).saveReporEquipment(deviceName, netRequestFrame.getMcuUdid(), netRequestFrame.getDestinationAddress());
            }
        }
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5C3CommonReportInnerFrame.java
@@ -18,6 +18,7 @@
    //  ç›®æ ‡åœ°å€    4
    private String destinationAddress;
    private String mcuUdid;
    @Override
    public A5C3CommonReportInnerFrame transformFrame(String hex) {
@@ -34,6 +35,13 @@
        setDestinationAddress(hex.substring(8, 16));
        /**
         * è®¾ç½®mcu_udid
         */
        if(getFunctionCode().equals("40")){
            setMcuUdid(hex.substring(16, hex.length() - 8));
        }
        setCrc32(hex.substring(hex.length() - 8));
        //  æ ¡éªŒCRC32
        String frame = hex.substring(2, hex.length() - 8);
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5C3HeartbeatReportInnerFrame.java
@@ -1,5 +1,6 @@
package com.sandu.ximon.admin.manager.iot.frame.inner.report;
import cn.hutool.core.util.HexUtil;
import cn.hutool.core.util.StrUtil;
import com.sandu.ximon.admin.manager.iot.frame.inner.BaseResponseInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.IResponseInnerFrame;
@@ -98,25 +99,26 @@
                return null;
            }
            this.c3Mac = hex.substring(0, 8);
            this.year = hex.substring(8, 10);
            this.month = hex.substring(10, 12);
            this.day = hex.substring(12, 14);
            this.hour = hex.substring(14, 16);
            this.min = hex.substring(16, 18);
            this.sec = hex.substring(18, 20);
            this.chargingPort = hex.substring(20, 24);
            this.statusBit = hex.substring(24, 26);
            this.deviceTemperature = (parseVal(hex, 26, 28) + "." + parseVal(hex, 28, 30));
            this.gridVoltage = hex.substring(30, 34);
            this.gridCurrent = hex.substring(34, 38);
            this.frequency = hex.substring(38, 42);
            this.powerFactor = hex.substring(42, 46);
            this.activePower = hex.substring(46, 50);
            this.reactivePower = hex.substring(50, 54);
            this.chargedCapacity = hex.substring(54, 58);
            this.reservedCapacity = hex.substring(58, 62);
            this.remainingAmount = hex.substring(62, 66);
            this.alreadyChargingTime = hex.substring(66, 72);
            this.year = parseVal(hex.substring(8, 10));
            this.month = parseVal(hex.substring(10, 12));
            this.day = parseVal(hex.substring(12, 14));
            this.hour = parseVal(hex.substring(14, 16));
            this.min = parseVal(hex.substring(16, 18));
            this.sec = parseVal(hex.substring(18, 20));
            this.chargingPort = parseVal(hex.substring(20, 24));
            this.statusBit = parseVal(hex.substring(24, 26));
            this.deviceTemperature = temperatureTransition(hex.substring(26, 30)) + "";
            this.gridVoltage = (parseVal(hex, 30, 34) * 0.01) + "";
            this.gridCurrent = (parseVal(hex, 34, 38) * 0.01 + "");
            this.frequency = (parseVal(hex, 38, 42) * 0.01 + "");
            this.powerFactor = (parseVal(hex, 42, 46) * 0.01 + "");
            this.activePower = (parseVal(hex, 46, 50) * 0.01 + "");
            this.reactivePower = (parseVal(hex, 50, 54) * 0.01 + "");
            this.chargedCapacity = (parseVal(hex, 54, 58) * 0.01 + "");
            this.reservedCapacity = (parseVal(hex, 58, 62) * 0.01 + "");
            this.remainingAmount = (parseVal(hex, 62, 66) * 0.01 + "");
            this.alreadyChargingTime = parseVal(hex.substring(66, 72));
            //72-80保留,暂未使用
            return this;
        }
@@ -124,5 +126,50 @@
        private Integer parseVal(String frame, int start, int end) {
            return Integer.parseInt(frame.substring(start, end), 16);
        }
        private String parseVal(String hex) {
            return Integer.parseInt(hex, 16) + "";
        }
        /**
         * å°†16进制转成2进制,进行补码(反码基础上+1),得到正确数值
         * ä¼ å…¥16进制的温度,类型为String
         * å¦‚F500
         */
        public Double temperatureTransition(String temperature) {
            //将传进来的16进制的转为2进制
            String twoBinStr = hexStr2BinStr(temperature);
            if ("1".equals(twoBinStr.substring(0, 1))) {
                //最高位是1,为负数,将16进制的进行补码,返回
                int max = 0b1111111111111111;
                double result = (max - HexUtil.hexToInt(temperature)) * (-0.01);
                return result;
            } else if ("0".equals(twoBinStr.substring(0, 1))) {
                //最高位是0,正数,直接返回
                double result = (HexUtil.hexToInt(temperature)) * (0.01);
                return result;
            }
            //
            return 0.00;
        }
        /**
         * 16进制字符串转为二进制
         */
        public String hexStr2BinStr(String hexStr) {
            if (hexStr == null || hexStr.length() % 2 != 0) {
                return null;
            }
            String bString = "", tmp;
            for (int i = 0; i < hexStr.length(); i++) {
                tmp = "0000" + Integer.toBinaryString(Integer.parseInt(hexStr.substring(i, i + 1), 16));
                bString += tmp.substring(tmp.length() - 4);
            }
            return bString;
        }
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5C3QueryReportInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,115 @@
package com.sandu.ximon.admin.manager.iot.frame.inner.report;
import cn.hutool.core.util.StrUtil;
import com.sandu.common.execption.BusinessException;
import com.sandu.ximon.admin.manager.iot.frame.inner.BaseResponseInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.C3ChargingEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils;
import lombok.Data;
import lombok.ToString;
import java.text.DecimalFormat;
/**
 * @author ZZQ
 * @date 2022/3/18 9:51
 * C3充电桩查询指令响应帧
 */
@Data
@ToString(callSuper = true)
public class A5C3QueryReportInnerFrame extends BaseResponseInnerFrame<A5C3QueryReportInnerFrame> {
    //MAC地址
    private String mac;
    //版本号
    private String version;
    //心跳包间隔时间
    private String IntervalTime;
    //查询电压/电流常数
    private String constant;
    //查询地址(暂时不用到)
    private String address;
    //故障码
    private String faultCode;
    @Override
    public A5C3QueryReportInnerFrame transformFrame(String hex) {
        if (StrUtil.isBlank(hex)) {
            return null;
        }
        // MQTT通信方式(1)
        setConnectType(hex.substring(0, 2));
        //  åŠŸèƒ½ç (1)
        setFunctionCode(hex.substring(2, 4));
        //  è´Ÿè·é•¿åº¦(2)
        setPayloadLength(hex.substring(4, 8));
        //MAC地址
        setMac(hex.substring(8, 16));
        retuenInfomation(functionCode, hex.substring(16, hex.length() - 8));
        setCrc32(hex.substring(hex.length() - 8));
        //  æ ¡éªŒCRC32
        String frame = hex.substring(2, hex.length() - 8);
        this.setValidate(CRC32Utils.validateFrame(frame, getCrc32()));
        return this;
    }
    public void retuenInfomation(String functionCode, String hex) {
        /**
         * æŸ¥è¯¢ç‰ˆæœ¬å·
         */
        if (functionCode.equals(C3ChargingEnum.QueryVersion.getCode())) {
            if (hex.length() != 8) {
                throw new BusinessException("数据错误,请重新请求!");
            }
            DecimalFormat df = new DecimalFormat("00");
            setVersion("硬件版本号:" + df.format(parseVal(hex, 0, 2)) + df.format(parseVal(hex, 2, 4))
                    + "; " + "软件版本号:" + df.format(parseVal(hex, 4, 6)) + df.format(parseVal(hex, 6, 8)));
        }
        /**
         * æŸ¥è¯¢å¿ƒè·³åŒ…间隔时间
         */
        if (functionCode.equals(C3ChargingEnum.QueryIntervalTime.getCode())) {
            if (hex.length() != 4) {
                throw new BusinessException("数据错误,请重新请求!");
            }
            setIntervalTime("心跳包间隔时间(s):" + parseVal(hex, 0, 4));
        }
        /**
         * æŸ¥è¯¢ç”µåŽ‹/电流常数
         */
        if (functionCode.equals(C3ChargingEnum.QueryConstant.getCode())) {
            if (hex.length() != 4) {
                throw new BusinessException("数据错误,请重新请求!");
            }
            setConstant("电压常数:" + parseVal(hex, 0, 2) + " ;电流常数:" + parseVal(hex, 2, 4));
        }
        /**
         * æŸ¥è¯¢åœ°å€(暂时不用到)
         */
        if (functionCode.equals(C3ChargingEnum.QueryAddress.getCode())) {
            if (hex.length() != 4) {
                throw new BusinessException("数据错误,请重新请求!");
            }
            setAddress(hex);
        }
        /**
         * æŸ¥è¯¢åœ°å€(暂时不用到)
         */
        if (functionCode.equals(C3ChargingEnum.QueryFaultCode.getCode())) {
            if (hex.length() != 4) {
                throw new BusinessException("数据错误,请重新请求!");
            }
            setFaultCode(hex);
        }
    }
    private Integer parseVal(String frame, int start, int end) {
        return Integer.parseInt(frame.substring(start, end), 16);
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5LightPoleHeelingHeartbeatReportInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,135 @@
package com.sandu.ximon.admin.manager.iot.frame.inner.report;
import cn.hutool.core.util.HexUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;
import com.sandu.ximon.admin.manager.iot.frame.inner.BaseResponseInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.IResponseInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils;
import lombok.Data;
import lombok.ToString;
/**
 * ç¯æ†å€¾æ–œå¿ƒè·³åŒ…上报
 */
@Data
@ToString(callSuper = true)
public class A5LightPoleHeelingHeartbeatReportInnerFrame extends BaseResponseInnerFrame<A5LightPoleHeelingHeartbeatReportInnerFrame> {
    //  ç›®æ ‡åœ°å€    4
    private String destinationAddress;
    //  å¿ƒè·³åŒ…数据
    private HeartBeatDataPackage heartBeatDataPackage;
    @Override
    public A5LightPoleHeelingHeartbeatReportInnerFrame transformFrame(String hex) {
        //  é•¿åº¦ä¸ä¸€è‡´æ—¶ï¼Œè¿”回null
        if (StrUtil.isBlank(hex)) {
            return null;
        }
        // MQTT通信方式(1)
        setConnectType(hex.substring(0, 2));
        //  åŠŸèƒ½ç (1)
        setFunctionCode(hex.substring(2, 4));
        //  è´Ÿè·é•¿åº¦(2)
        setPayloadLength(hex.substring(4, 8));
        setDestinationAddress(hex.substring(8, 12));
        String heartBeatData = hex.substring(12, hex.length() - 8);
        heartBeatDataPackage = new HeartBeatDataPackage();
        heartBeatDataPackage.transformFrame(heartBeatData);
        setHeartBeatDataPackage(heartBeatDataPackage);
        setCrc32(hex.substring(hex.length() - 8));
        //  æ ¡éªŒCRC32
        String frame = hex.substring(2, hex.length() - 8);
        this.setValidate(CRC32Utils.validateFrame(frame, getCrc32()));
        return this;
    }
    @Data
    public static class HeartBeatDataPackage implements IResponseInnerFrame<HeartBeatDataPackage> {
        //设备型号
        private String equipmentModel;
        //Xè½´
        private double theXAxis;
        //Yè½´
        private double theYAxis;
        //Zè½´
        private double theZAxis;
        //预留
        private String reservedA;
        private String reservedB;
        private String reservedC;
        private String reservedD;
        @Override
        public HeartBeatDataPackage transformFrame(String hex) {
            if (StrUtil.isBlank(hex)) {
                return null;
            }
            this.equipmentModel = "V" + (parseVal(hex, 0, 2)) + "." + String.format("%02d", parseVal(hex, 2, 4));
            this.theXAxis = NumberUtil.round(temperatureTransition(hex.substring(4, 8)) * 0.1, 1).doubleValue();
            this.theYAxis = NumberUtil.round(temperatureTransition(hex.substring(8, 12)) * 0.1, 1).doubleValue();
            this.theZAxis = NumberUtil.round(temperatureTransition(hex.substring(12, 16)) * 0.1, 1).doubleValue();
            this.reservedA = hex.substring(16, 20);
            this.reservedB = hex.substring(20, 24);
            this.reservedC = hex.substring(24, 28);
            this.reservedD = hex.substring(28, 32);
            //72-80保留,暂未使用
            return this;
        }
        private Integer parseVal(String frame, int start, int end) {
            return Integer.parseInt(frame.substring(start, end), 16);
        }
        private String parseVal(String hex) {
            return Integer.parseInt(hex, 16) + "";
        }
        /**
         * å°†16进制转成2进制,进行补码(反码基础上+1),得到正确数值
         * ä¼ å…¥16进制的温度,类型为String
         * å¦‚F500
         */
        public Double temperatureTransition(String temperature) {
            //将传进来的16进制的转为2进制
            String twoBinStr = hexStr2BinStr(temperature);
            if ("1".equals(twoBinStr.substring(0, 1))) {
                //最高位是1,为负数,将16进制的进行补码,返回
                int max = 0b1111111111111111;
                double result = (max - HexUtil.hexToInt(temperature)) * (-0.01);
                return result;
            } else if ("0".equals(twoBinStr.substring(0, 1))) {
                //最高位是0,正数,直接返回
                double result = (HexUtil.hexToInt(temperature)) * (0.01);
                return result;
            }
            //
            return 0.00;
        }
        /**
         * 16进制字符串转为二进制
         */
        public String hexStr2BinStr(String hexStr) {
            if (hexStr == null || hexStr.length() % 2 != 0) {
                return null;
            }
            String bString = "", tmp;
            for (int i = 0; i < hexStr.length(); i++) {
                tmp = "0000" + Integer.toBinaryString(Integer.parseInt(hexStr.substring(i, i + 1), 16));
                bString += tmp.substring(tmp.length() - 4);
            }
            return bString;
        }
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5LightPoleHeelingOperationReportInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
package com.sandu.ximon.admin.manager.iot.frame.inner.report;
import cn.hutool.core.util.StrUtil;
import com.sandu.ximon.admin.manager.iot.frame.inner.BaseResponseInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils;
import lombok.Data;
import lombok.ToString;
/**
 * @author ZZQ
 * @date 2022/3/14 16:36
 */
@Data
@ToString(callSuper = true)
public class A5LightPoleHeelingOperationReportInnerFrame extends BaseResponseInnerFrame<A5LightPoleHeelingOperationReportInnerFrame> {
    //MAC地址
    private String mac;
    //响应状态
    // 0x00    æˆåŠŸ
    // 0x01    æ ¡éªŒç é”™è¯¯
    // 0x02    é•¿åº¦é”™è¯¯
    // 0x03    å†™Flash失败错误
    // 0xFF    å…¶ä»–错误
    private String state;
    @Override
    public A5LightPoleHeelingOperationReportInnerFrame transformFrame(String hex) {        //  é•¿åº¦ä¸ä¸€è‡´æ—¶ï¼Œè¿”回null
        if (StrUtil.isBlank(hex)) {
            return null;
        }
        // MQTT通信方式(1)
        setConnectType(hex.substring(0, 2));
        //  åŠŸèƒ½ç (1)
        setFunctionCode(hex.substring(2, 4));
        //  è´Ÿè·é•¿åº¦(2)
        setPayloadLength(hex.substring(4, 8));
        //MAC地址
        setMac(hex.substring(8, 12));
        //硬件交互响应结果
        setState(returnState(hex.substring(12, 14)));
        setCrc32(hex.substring(hex.length() - 8));
        //  æ ¡éªŒCRC32
        String frame = hex.substring(2, hex.length() - 8);
        this.setValidate(CRC32Utils.validateFrame(frame, getCrc32()));
        return this;
    }
    public String returnState(String stateCode) {
        String State = "";
        switch (stateCode) {
            case "00":
                State = "操作成功";
                break;
            case "01":
                State = "校验码错误";
                break;
            case "02":
                State = "长度错误";
                break;
            case "03":
                State = "写Flash失败错误";
                break;
            case "FF":
                State = "其他错误";
                break;
            default:
        }
        return State;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5LightPoleHeelingQueryReportInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
package com.sandu.ximon.admin.manager.iot.frame.inner.report;
import cn.hutool.core.util.StrUtil;
import com.sandu.common.execption.BusinessException;
import com.sandu.ximon.admin.manager.iot.frame.inner.BaseResponseInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.C3ChargingEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.LightPoleHeelingEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils;
import lombok.Data;
import lombok.ToString;
/**
 * @author ZZQ
 * @date 2022/3/22 16:23
 */
@Data
@ToString(callSuper = true)
public class A5LightPoleHeelingQueryReportInnerFrame extends BaseResponseInnerFrame<A5LightPoleHeelingQueryReportInnerFrame> {
    //目标地址
    private String devicesName;
    //心跳包间隔时间
    private String IntervalTime;
    @Override
    public A5LightPoleHeelingQueryReportInnerFrame transformFrame(String hex) {
        if (StrUtil.isBlank(hex)) {
            return null;
        }
        // MQTT通信方式(1)
        setConnectType(hex.substring(0, 2));
        //  åŠŸèƒ½ç (1)
        setFunctionCode(hex.substring(2, 4));
        //  è´Ÿè·é•¿åº¦(2)
        setPayloadLength(hex.substring(4, 8));
        //MAC地址
        setDevicesName(hex.substring(8, 12));
        retuenInfomation(functionCode, hex.substring(12, hex.length() - 8));
        setCrc32(hex.substring(hex.length() - 8));
        //  æ ¡éªŒCRC32
        String frame = hex.substring(2, hex.length() - 8);
        this.setValidate(CRC32Utils.validateFrame(frame, getCrc32()));
        return this;
    }
    public void retuenInfomation(String functionCode, String hex) {
        /**
         * æŸ¥è¯¢å¿ƒè·³åŒ…间隔时间
         */
        if (functionCode.equals(LightPoleHeelingEnum.QueryIntervalTime.getCode())) {
            if (hex.length() != 4) {
                throw new BusinessException("数据错误,请重新请求!");
            }
            setIntervalTime("心跳包间隔时间(s):" + parseVal(hex, 0, 4));
        }
    }
    private Integer parseVal(String frame, int start, int end) {
        return Integer.parseInt(frame.substring(start, end), 16);
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/C3ClearedFaultCodeReqInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.sandu.ximon.admin.manager.iot.frame.inner.request;
import com.sandu.ximon.admin.manager.iot.frame.inner.IRequestInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.C3ChargingEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.MQTTConnectTypeEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils;
/**
 * @author ZZQ
 * @date 2022/3/3 16:43
 */
public class C3ClearedFaultCodeReqInnerFrame implements IRequestInnerFrame {
    private final String payload;
    public C3ClearedFaultCodeReqInnerFrame(String c3Mac) {
        payload = c3Mac;
    }
    @Override
    public String getEncodeFrame() {
        String functionCode = C3ChargingEnum.ClearedFaultCode.getCode();
        String payloadLength = "0004";
        String frame = functionCode + payloadLength + payload;
        return MQTTConnectTypeEnum.SYNCHRONIZATION.getCode() + frame.toUpperCase() + CRC32Utils.getCRC32(frame.toUpperCase());
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/C3QueryFaultCodeReqInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.sandu.ximon.admin.manager.iot.frame.inner.request;
import com.sandu.ximon.admin.manager.iot.frame.inner.IRequestInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.C3ChargingEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.MQTTConnectTypeEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils;
/**
 * @author ZZQ
 * @date 2022/3/3 16:43
 */
public class C3QueryFaultCodeReqInnerFrame implements IRequestInnerFrame {
    private final String payload;
    public C3QueryFaultCodeReqInnerFrame(String c3Mac) {
        payload = c3Mac ;
    }
    @Override
    public String getEncodeFrame() {
        String functionCode = C3ChargingEnum.QueryFaultCode.getCode();
        String payloadLength = "0004";
        String frame = functionCode + payloadLength + payload;
        return MQTTConnectTypeEnum.SYNCHRONIZATION.getCode() + frame.toUpperCase() + CRC32Utils.getCRC32(frame.toUpperCase());
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/C3ReadTheHeartbeatPackageReqInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.sandu.ximon.admin.manager.iot.frame.inner.request;
import com.sandu.ximon.admin.manager.iot.frame.inner.IRequestInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.C3ChargingEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.MQTTConnectTypeEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils;
/**
 * @author ZZQ
 * @date 2022/3/3 16:43
 */
public class C3ReadTheHeartbeatPackageReqInnerFrame implements IRequestInnerFrame {
    private final String payload;
    public C3ReadTheHeartbeatPackageReqInnerFrame(String c3Mac) {
        payload = c3Mac ;
    }
    @Override
    public String getEncodeFrame() {
        String functionCode = C3ChargingEnum.ReadTheHeartbeatPackage.getCode();
        String payloadLength = "0004";
        String frame = functionCode + payloadLength + payload;
        return MQTTConnectTypeEnum.SYNCHRONIZATION.getCode() + frame.toUpperCase() + CRC32Utils.getCRC32(frame.toUpperCase());
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/C3RestoreFactoryValueReqInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.sandu.ximon.admin.manager.iot.frame.inner.request;
import com.sandu.ximon.admin.manager.iot.frame.inner.IRequestInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.C3ChargingEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.MQTTConnectTypeEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils;
/**
 * @author ZZQ
 * @date 2022/3/3 16:43
 */
public class C3RestoreFactoryValueReqInnerFrame implements IRequestInnerFrame {
    private final String payload;
    public C3RestoreFactoryValueReqInnerFrame(String c3Mac) {
        payload = c3Mac;
    }
    @Override
    public String getEncodeFrame() {
        String functionCode = C3ChargingEnum.RestoreFactoryValue.getCode();
        String payloadLength = "0004";
        String frame = functionCode + payloadLength + payload;
        return MQTTConnectTypeEnum.SYNCHRONIZATION.getCode() + frame.toUpperCase() + CRC32Utils.getCRC32(frame.toUpperCase());
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/C3SetAddressReqInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.sandu.ximon.admin.manager.iot.frame.inner.request;
import com.sandu.ximon.admin.manager.iot.frame.inner.IRequestInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.C3ChargingEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.MQTTConnectTypeEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils;
/**
 * @author ZZQ
 * @date 2022/3/3 16:43
 */
public class C3SetAddressReqInnerFrame implements IRequestInnerFrame {
    private final String payload;
    public C3SetAddressReqInnerFrame(String c3Mac, String address) {
        payload = c3Mac + address;
    }
    @Override
    public String getEncodeFrame() {
        String functionCode = C3ChargingEnum.SetAddress.getCode();
        String payloadLength = "0008";
        String frame = functionCode + payloadLength + payload;
        return MQTTConnectTypeEnum.SYNCHRONIZATION.getCode() + frame.toUpperCase() + CRC32Utils.getCRC32(frame.toUpperCase());
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/C3SetCalendarReqInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.sandu.ximon.admin.manager.iot.frame.inner.request;
import com.sandu.ximon.admin.manager.iot.frame.inner.IRequestInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.C3ChargingEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.MQTTConnectTypeEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils;
/**
 * @author ZZQ
 * @date 2022/3/3 16:43
 */
public class C3SetCalendarReqInnerFrame implements IRequestInnerFrame {
    private final String payload;
    public C3SetCalendarReqInnerFrame(String c3Mac, int year, int month, int day, int hour, int min, int sec) {
        payload = c3Mac + hex10To16(year) + hex10To16(month) + hex10To16(day) + hex10To16(hour) + hex10To16(min) + hex10To16(sec);
    }
    @Override
    public String getEncodeFrame() {
        String functionCode = C3ChargingEnum.SetCalendar.getCode();
        String payloadLength = "000A";
        String frame = functionCode + payloadLength + payload;
        return MQTTConnectTypeEnum.SYNCHRONIZATION.getCode() + frame.toUpperCase() + CRC32Utils.getCRC32(frame.toUpperCase());
    }
    private String hex10To16(int value) {
        return String.format("%02X", value);
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/C3SetConstantReqInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.sandu.ximon.admin.manager.iot.frame.inner.request;
import com.sandu.ximon.admin.manager.iot.frame.inner.IRequestInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.C3ChargingEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.MQTTConnectTypeEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils;
/**
 * @author ZZQ
 * @date 2022/3/3 16:43
 */
public class C3SetConstantReqInnerFrame implements IRequestInnerFrame {
    private final String payload;
    public C3SetConstantReqInnerFrame(String c3Mac, String constant) {
        payload = c3Mac + constant;
    }
    @Override
    public String getEncodeFrame() {
        String functionCode = C3ChargingEnum.SetConstant.getCode();
        String payloadLength = "0006";
        String frame = functionCode + payloadLength + payload;
        return MQTTConnectTypeEnum.SYNCHRONIZATION.getCode() + frame.toUpperCase() + CRC32Utils.getCRC32(frame.toUpperCase());
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/C3SetHeartbeatPacketTimeReqInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,53 @@
package com.sandu.ximon.admin.manager.iot.frame.inner.request;
import com.sandu.ximon.admin.manager.iot.frame.inner.IRequestInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.C3ChargingEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.MQTTConnectTypeEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils;
import java.text.DecimalFormat;
/**
 * @author ZZQ
 * @date 2022/3/3 16:43
 */
public class C3SetHeartbeatPacketTimeReqInnerFrame implements IRequestInnerFrame {
    private final String payload;
    //用于判断是设置 å……电时 å¿ƒè·³åŒ…间隔时间或者设置 éžå……电时 å¿ƒè·³åŒ…间隔时间
    private boolean flag;
    public C3SetHeartbeatPacketTimeReqInnerFrame(String c3Mac, int time, boolean flag) {
        String data = Integer.toHexString(time);
        switch (data.length()) {
            case 1:
                data = "000" + data;
                break;
            case 2:
                data = "00" + data;
                break;
            case 3:
                data = "0" + data;
                break;
            default:
        }
        payload = c3Mac + data;
        this.flag = flag;
    }
    @Override
    public String getEncodeFrame() {
        String functionCode;
        if (flag) {
            //充电时
            functionCode = C3ChargingEnum.SetHeartbeatPacketTimeCharging.getCode();
        } else {
            //非充电时
            functionCode = C3ChargingEnum.SetHeartbeatPacketTimeNotCharging.getCode();
        }
        String payloadLength = "0006";
        String frame = functionCode + payloadLength + payload;
        return MQTTConnectTypeEnum.SYNCHRONIZATION.getCode() + frame.toUpperCase() + CRC32Utils.getCRC32(frame.toUpperCase());
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/LightPoleHeelingHeartbeatPackageReqInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.sandu.ximon.admin.manager.iot.frame.inner.request;
import com.sandu.ximon.admin.manager.iot.frame.inner.IRequestInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.LightPoleHeelingEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.MQTTConnectTypeEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils;
/**
 * @author ZZQ
 * @date 2022/3/22 15:29
 */
public class LightPoleHeelingHeartbeatPackageReqInnerFrame implements IRequestInnerFrame {
    @Override
    public String getEncodeFrame() {
        String functionCode = LightPoleHeelingEnum.TheHeartbeatPackage.getCode();
        String payloadLength = "0002";
        String payload = "FFFF";
        String frame = functionCode + payloadLength + payload;
        return MQTTConnectTypeEnum.SYNCHRONIZATION.getCode() + frame.toUpperCase() + CRC32Utils.getCRC32(frame.toUpperCase());
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/LightPoleHeelingQueryIntervalTimeReqInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.sandu.ximon.admin.manager.iot.frame.inner.request;
import com.sandu.ximon.admin.manager.iot.frame.inner.IRequestInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.LightPoleHeelingEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.MQTTConnectTypeEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils;
/**
 * @author ZZQ
 * @date 2022/3/22 15:29
 */
public class LightPoleHeelingQueryIntervalTimeReqInnerFrame implements IRequestInnerFrame {
    @Override
    public String getEncodeFrame() {
        String functionCode = LightPoleHeelingEnum.QueryIntervalTime.getCode();
        String payloadLength = "0002";
        String payload = "FFFF";
        String frame = functionCode + payloadLength + payload;
        return MQTTConnectTypeEnum.SYNCHRONIZATION.getCode() + frame.toUpperCase() + CRC32Utils.getCRC32(frame.toUpperCase());
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/LightPoleHeelingRestartReqInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.sandu.ximon.admin.manager.iot.frame.inner.request;
import com.sandu.ximon.admin.manager.iot.frame.inner.IRequestInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.LightPoleHeelingEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.MQTTConnectTypeEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils;
/**
 * @author ZZQ
 *
 * @date 2022/3/22 15:29
 */
public class LightPoleHeelingRestartReqInnerFrame implements IRequestInnerFrame {
    @Override
    public String getEncodeFrame() {
        String functionCode = LightPoleHeelingEnum.RestartLightPoleHeeling.getCode();
        String payloadLength = "0002";
        String payload = "FFFF";
        String frame = functionCode + payloadLength + payload;
        return MQTTConnectTypeEnum.SYNCHRONIZATION.getCode() + frame.toUpperCase() + CRC32Utils.getCRC32(frame.toUpperCase());
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/LightPoleHeelingSetHeartbeatPacketTimeReqInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.sandu.ximon.admin.manager.iot.frame.inner.request;
import com.sandu.ximon.admin.manager.iot.frame.inner.IRequestInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.LightPoleHeelingEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.MQTTConnectTypeEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils;
/**
 * @author ZZQ
 * @date 2022/3/22 15:29
 */
public class LightPoleHeelingSetHeartbeatPacketTimeReqInnerFrame implements IRequestInnerFrame {
    private final String payload;
    public LightPoleHeelingSetHeartbeatPacketTimeReqInnerFrame(int time) {
        String data = Integer.toHexString(time);
        switch (data.length()) {
            case 1:
                data = "000" + data;
                break;
            case 2:
                data = "00" + data;
                break;
            case 3:
                data = "0" + data;
                break;
            default:
        }
        payload = "FFFF" + data;
    }
    @Override
    public String getEncodeFrame() {
        String functionCode = LightPoleHeelingEnum.SetHeartbeatPacketTime.getCode();
        String payloadLength = "0004";
        String frame = functionCode + payloadLength + payload;
        return MQTTConnectTypeEnum.SYNCHRONIZATION.getCode() + frame.toUpperCase() + CRC32Utils.getCRC32(frame.toUpperCase());
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/LightPoleHeelingSetSensorStateReqInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.sandu.ximon.admin.manager.iot.frame.inner.request;
import com.sandu.ximon.admin.manager.iot.frame.inner.IRequestInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.LightPoleHeelingEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.MQTTConnectTypeEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils;
/**
 * @author ZZQ
 * @date 2022/3/3 16:43
 */
public class LightPoleHeelingSetSensorStateReqInnerFrame implements IRequestInnerFrame {
    public LightPoleHeelingSetSensorStateReqInnerFrame() {
    }
    @Override
    public String getEncodeFrame() {
        String functionCode = LightPoleHeelingEnum.SetSensorState.getCode();
        String payloadLength = "0002";
        String payload = "FFFF";
        String frame = functionCode + payloadLength + payload;
        return MQTTConnectTypeEnum.SYNCHRONIZATION.getCode() + frame.toUpperCase() + CRC32Utils.getCRC32(frame.toUpperCase());
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/A5C3ReportEnum.java
ÎļþÒÑɾ³ý
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/C3ChargingEnum.java
@@ -43,7 +43,33 @@
    //恢复出厂值
    RestoreFactoryValue("29"),
    //软重启
    RestartCharging("2B");
    RestartCharging("2B"),
    //以下为主动上报
    /**
     * ç½‘络请求
     */
    NETWORK_REQUEST("40"),
    /**
     * äºŒç»´ç è¯·æ±‚
     */
    QR_CODE_REQUEST("41"),
    /**
     * ä¸ŠæŠ¥å¿ƒè·³åŒ…
     */
    HEART_BEAT("42"),
    /**
     * ä¸ŠæŠ¥å……电结束
     */
    CHARGE_COMPLETE("43"),
    /**
     * ä¸ŠæŠ¥å……电中断
     */
    CHARGE_STOP("44"),
    /**
     * ä¸ŠæŠ¥æ•…障码
     */
    ERROR_CODE("45");
    private String code;
@@ -54,4 +80,4 @@
    C3ChargingEnum(String code) {
        this.code = code;
    }
}
    }
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/C3ChargingReportEnum.java
ÎļþÒÑɾ³ý
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/LightPoleHeelingEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.sandu.ximon.admin.manager.iot.rrpc.enums;
/**
 * @author ZZQ
 * @date 2022/3/22 15:31
 */
public enum LightPoleHeelingEnum {
    //查询心跳包数据
    TheHeartbeatPackage("01"),
    //查询心跳包间隔时间
    QueryIntervalTime("02"),
    //软重启灯杆倾斜
    RestartLightPoleHeeling("10"),
    //设置心跳包时间(秒)
    SetHeartbeatPacketTime("11"),
    //设置传感器为初始状态
    SetSensorState("12");
    private String code;
    public String getCode() {
        return code;
    }
    LightPoleHeelingEnum(String code) {
        this.code = code;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/param/AlipayConfigParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.sandu.ximon.admin.param;
import lombok.Data;
/**
 * @Author liuhaonan
 * @Date 2022/3/16 9:46
 * @Version 1.0
 */
@Data
public class AlipayConfigParam {
    private String appId;
    /**
     * å•†æˆ·ç§é’¥/PKCS8格式RSA2私钥
     */
    private String privateKey;
    /**
     *
     */
    private String publicKey;
    /**
     * åˆä½œä¼™ä¼´èº«ä»½ï¼ˆPID)
     */
    private String pid;
}
ximon-admin/src/main/java/com/sandu/ximon/admin/param/C3ChargingAddParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.sandu.ximon.admin.param;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
 * @author ZZQ
 * @date 2022/3/28 15:17
 */
@Data
public class C3ChargingAddParam {
    //ID
    private Long c3Id;
    //物理地址
    private String mcuUdid;
    //充电桩名称
    private String c3Name;
    //C3充电桩地址
    private String c3Mac;
}
ximon-admin/src/main/java/com/sandu/ximon/admin/param/C3ChargingParam.java
@@ -3,6 +3,7 @@
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
/**
 * @author ZZQ
@@ -16,12 +17,33 @@
    private String c3Mac = "";
    //充电量
//    @NotEmpty(message = "充电量不能为空")
    private Integer chargingCapacity;
    //充电金额
//    @NotEmpty(message = "充电金额不能为空")
    private Double chargeAmount;
    //设置心跳包间隔时间(秒)
    private int time;
    //设置电压/电流常数(各一字节)(默认值0xBC64)
    private String constant = "BC64";
    //设置地址
    private String address;
    //å¹´
    private int year;
    //月
    private int month;
    //日
    private int day;
    //时
    private int hour;
    //分
    private int min;
    //秒
    private int sec;
    //C3充电桩表查询关键字
    private String keyword;
}
ximon-admin/src/main/java/com/sandu/ximon/admin/param/C3mChargingChargeParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.sandu.ximon.admin.param;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
/**
 * @Author liuhaonan
 * @Date 2022/3/18 16:35
 * @Version 1.0
 */
@Data
public class C3mChargingChargeParam {
    private Integer c3Id;
    /**
     *
     */
    private Integer hour;
    /**
     *
     */
    private Integer min;
    /**
     * è´¹çއ
     */
    private Double charge;
    private Long timestamp;
}
ximon-admin/src/main/java/com/sandu/ximon/admin/param/IpVolumeMissionParam.java
@@ -53,10 +53,16 @@
    TaskTerminalVO[] terminals;
    private List<Integer> terminalIds;
    private List<Integer> fileIds;
    TaskRunTimeVO[] exec;
    //  ä»»åŠ¡æ‰§è¡Œè§„åˆ™ï¼ˆæ¯å¤©ä¸º 0,每周为 1,手动为 2)
 //   private Integer rule;
/*
    */
ximon-admin/src/main/java/com/sandu/ximon/admin/param/LightPoleHeelingListParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.sandu.ximon.admin.param;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
 * ç¯æ†å€¾æ–œ
 *
 * @author ZZQ
 * @date 2022/3/22 15:18
 */
@Data
public class LightPoleHeelingListParam {
    //灯杆倾斜列表查询关键字
    private String keyword;
    //处理状态
    private Integer processingState;
}
ximon-admin/src/main/java/com/sandu/ximon/admin/param/LightPoleHeelingParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.sandu.ximon.admin.param;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
 * ç¯æ†å€¾æ–œ
 *
 * @author ZZQ
 * @date 2022/3/22 15:18
 */
@Data
public class LightPoleHeelingParam {
    @NotEmpty(message = "灯杆倾斜硬件地址不能为空")
    private String deviceName = "";
    //设置心跳包间隔时间(秒)
    private int time;
}
ximon-admin/src/main/java/com/sandu/ximon/admin/param/LightPoleHeelingProcessingParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
package com.sandu.ximon.admin.param;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
 * ç¯æ†å€¾æ–œè­¦å‘Šå¤„理
 *
 * @author ZZQ
 * @date 2022/3/22 15:18
 */
@Data
public class LightPoleHeelingProcessingParam {
    @NotEmpty(message = "灯杆倾斜硬件地址不能为空")
    private String deviceName = "";
    /**
     * è­¦å‘Šå·
     */
    private Long warningNumber;
    /**
     * å¤„理后状态
     */
    private Integer processingState;
    /**
     * å¤„理意见
     */
    private String processingOpinion;
    /**
     * å¤„理人
     */
    private String processingPerson;
    /**
     * å¤„理后Xè½´
     */
    private Double theXAxis;
    /**
     * å¤„理后Yè½´
     */
    private Double theYAxis;
    /**
     * å¤„理后Zè½´
     */
    private Double theZAxis;
}
ximon-admin/src/main/java/com/sandu/ximon/admin/param/MonitorParam.java
@@ -24,7 +24,7 @@
    //设备序列号,存在英文字母的设备序列号,字母需为大写
    private String deviceSerial;
    //设备验证码,设备机身上的六位大写字母
//    private String validateCode;
    private String validateCode;
    /**
     * ç»“束萤石云摄像头相关参数
     */
ximon-admin/src/main/java/com/sandu/ximon/admin/param/PayParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.sandu.ximon.admin.param;
import lombok.Data;
/**
 * @Author liuhaonan
 * @Date 2022/3/22 16:46
 * @Version 1.0
 */
@Data
public class PayParam {
    private Long poleId;
    private String orderType;
    private Double AliPayTotalAmount;
    private Double totalAmount;
    private Integer WxPayTotalAmount;
    private Integer subscribeChargingCapacity;
    private String outTradeNo;
    private Long orderId;
}
ximon-admin/src/main/java/com/sandu/ximon/admin/param/ResetClientPasswordPrarm.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.sandu.ximon.admin.param;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@Data
public class ResetClientPasswordPrarm {
    @NotNull
    private Long id;
    @NotEmpty
    private String oldPassword;
    @NotEmpty
    private String newPassword;
}
ximon-admin/src/main/java/com/sandu/ximon/admin/param/WxpayConfigParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package com.sandu.ximon.admin.param;
import lombok.Data;
/**
 * @Author liuhaonan
 * @Date 2022/3/16 9:46
 * @Version 1.0
 */
@Data
public class WxpayConfigParam {
    /**
     * appid
     */
    private String appId;
    /**
     * app端appid
     */
    private String appAppId;
    /**
     *
     */
    private String mchId;
    /**
     *
     */
    private String privateKey;
}
ximon-admin/src/main/java/com/sandu/ximon/admin/pay/alipay/UsrAlipayConfigService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,133 @@
package com.sandu.ximon.admin.pay.alipay;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.pagehelper.PageHelper;
import com.sandu.common.execption.BusinessException;
import com.sandu.common.object.BaseConditionVO;
import com.sandu.common.service.impl.BaseServiceImpl;
import com.sandu.ximon.admin.param.AlipayConfigParam;
import com.sandu.ximon.admin.security.SecurityUtils;
import com.sandu.ximon.admin.service.ClientService;
import com.sandu.ximon.admin.service.PoleService;
import com.sandu.ximon.admin.utils.SpringContextUtil;
import com.sandu.ximon.dao.domain.AliConfigEntity;
import com.sandu.ximon.dao.domain.Pole;
import com.sandu.ximon.dao.domain.WxConfigEntity;
import com.sandu.ximon.dao.mapper.UsrAlipayConfigMapper;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * @Author liuhaonan
 * @Date 2022/3/15
 * @Version 1.0
 */
@Service
@AllArgsConstructor
public class UsrAlipayConfigService extends BaseServiceImpl<UsrAlipayConfigMapper, AliConfigEntity> {
    private final UsrAlipayConfigMapper usrAlipayConfigMapper;
    private final ClientService clientService;
    private final PoleService poleService;
    public AliConfigEntity getConfigByPoleId(Long poleId) {
        Pole pole = poleService.getById(poleId);
        if (pole == null) {
            throw new BusinessException("灯杆id错误或灯杆不存在");
        }
        AliConfigEntity config;
        if (pole.getClientId() == null) {
            config = getById(0);
        }
        config = getOne(Wrappers.lambdaQuery(AliConfigEntity.class).eq(AliConfigEntity::getCreateUserId, SecurityUtils.getUserId()));
        if(config==null){
            throw new BusinessException("用户未配置支付配置,请配置后重试");
        }
        return config;
    }
    public static UsrAlipayConfigService getBean(){
        return (UsrAlipayConfigService) SpringContextUtil.getBean("UsrAlipayConfigService");
    }
    public boolean addAliPayConfig(AlipayConfigParam configParam){
        AliConfigEntity config =new AliConfigEntity();
        BeanUtil.copyProperties(configParam,config);
        if(SecurityUtils.getClientId()!=null){
            config.setCreateUserId(SecurityUtils.getUserId());
            if(clientService.findClientId()){
                config.setClientId(clientService.getClientId());
            }
        }
        return save(config);
    }
    public boolean updateAliPayConfig(Integer id,AlipayConfigParam configParam){
        AliConfigEntity byId = getById(id);
        if(byId==null){
            throw new BusinessException("配置id错误或配置不存在");
        }
        AliConfigEntity config =new AliConfigEntity();
        BeanUtil.copyProperties(configParam,config);
        config.setConfigId(id);
        return updateById(config);
    }
    public boolean deleteAliPayConfig(Integer id){
        AliConfigEntity byId = getById(id);
        if(byId==null){
            throw new BusinessException("配置id错误或配置不存在");
        }
        return removeById(id);
    }
    public List<AliConfigEntity> configList(BaseConditionVO baseConditionVO,String keyword){
        LambdaQueryWrapper<AliConfigEntity> wrapper =new LambdaQueryWrapper<>();
        System.out.println("----------------------------"+clientService.findClientId());
        PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
        if(SecurityUtils.getClientId()!=null){//客户
            if(clientService.findClientId()){//二级客户
                PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
                wrapper= Wrappers.lambdaQuery(AliConfigEntity.class).eq(AliConfigEntity::getCreateUserId,SecurityUtils.getUserId());
            }else if(!clientService.findClientId()){//一级客户
                PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
                wrapper= Wrappers.lambdaQuery(AliConfigEntity.class).eq(AliConfigEntity::getClientId,SecurityUtils.getUserId());
            }
        } else {//管理
            PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
            wrapper= Wrappers.lambdaQuery(AliConfigEntity.class);
        }
        if(!keyword.isEmpty()){
            wrapper= wrapper.like(AliConfigEntity::getConfigId,keyword).or(
                    getAppId->{
                        getAppId.like(AliConfigEntity::getAppId,keyword);
                    }
            ).or(
                    getPid->{
                        getPid.like(AliConfigEntity::getPid,keyword);
                    }
            ).or(
                    getPublicKey->{
                        getPublicKey.like(AliConfigEntity::getPublicKey,keyword);
                    }
            ).or(
                    getPrivateKey->{
                        getPrivateKey.like(AliConfigEntity::getPrivateKey,keyword);
                    }
            );
        }
        return list(wrapper);
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/pay/wx/WxFastPayService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,293 @@
package com.sandu.ximon.admin.pay.wx;
import cn.dreampie.encription.EncriptionKit;
import cn.hutool.core.codec.Base64;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyResult;
import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.bean.result.WxPayRefundResult;
import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderResult;
import com.github.binarywang.wxpay.constant.WxPayConstants;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import com.sandu.common.execption.BusinessException;
import com.sandu.common.util.IpUtil;
import com.sandu.ximon.admin.dto.YSY_AccessTokenDto;
import com.sandu.ximon.admin.dto.wxquery.WxOrderDto;
import com.sandu.ximon.admin.pay.wxpay.UsrWxPayConfigService;
import com.sandu.ximon.dao.domain.WxConfigEntity;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * @author chenjiantian
 * @date 2021/8/12 11:26
 */
@Service
@Slf4j
@AllArgsConstructor
public class WxFastPayService {
    private final com.github.binarywang.wxpay.service.WxPayService wxPayService;
    //private final WxPayProperties wxPayProperties;
//    public static final String WECHAT_ORDER_PAY_CALLBACK_URL = "http://49.235.239.118:20012/callback/pay/wechatCallback";
    public static final String WECHAT_ORDER_PAY_CALLBACK_URL = "http://49.235.239.118:20012/callback/pay/wechatCallback";
    //微信订单状态查询
    public static final String WECHAT_ORDER_QUETY_URL = "https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/";
    public static final String WECHAT_ORDER_QUETY = "?mchid=";
    private final UsrWxPayConfigService wxPayConfigService;
    /**
     * app支付
     *
     * @param body     å•†å“æè¿°
     * @param
     * @param totalFee æ”¯ä»˜é‡‘额(分)
     * @return
     */
    public SortedMap<Object, Object> appPay(String body, String orderSn, int totalFee, Long poleId) {
        WxConfigEntity wxConfig = wxPayConfigService.getConfigByPoleId(poleId);
        WxPayUnifiedOrderRequest wxPayUnifiedOrderRequest = new WxPayUnifiedOrderRequest();
        wxPayUnifiedOrderRequest.setBody(body);
        wxPayUnifiedOrderRequest.setOutTradeNo(orderSn);
        wxPayUnifiedOrderRequest.setTotalFee(totalFee);
        //wxPayUnifiedOrderRequest.setSignType(WxPayConstants.SignType.MD5);
        wxPayUnifiedOrderRequest.setSpbillCreateIp(IpUtil.getRealIp());
        wxPayUnifiedOrderRequest.setNotifyUrl(WECHAT_ORDER_PAY_CALLBACK_URL);
        wxPayUnifiedOrderRequest.setTradeType(WxPayConstants.TradeType.APP);
        try {
            WxPayUnifiedOrderResult wxPayUnifiedOrderResult = wxPayService.unifiedOrder(wxPayUnifiedOrderRequest);
            String time = String.valueOf(System.currentTimeMillis() / 1000);
            if (WxPayConstants.ResultCode.SUCCESS.equals(wxPayUnifiedOrderResult.getResultCode())) {
                SortedMap<Object, Object> parameters = new TreeMap<>();
                /*hashMap.put("appId", wxPayUnifiedOrderResult.getAppid());
                hashMap.put("nonceStr", wxPayUnifiedOrderResult.getNonceStr());
                hashMap.put("prepayId", wxPayUnifiedOrderResult.getPrepayId());
                //  hashMap.put("package", "prepay_id=" + wxPayUnifiedOrderResult.getPrepayId());
                hashMap.put("signType", WxPayConstants.SignType.MD5);
                hashMap.put("timeStamp", time);
                hashMap.put("partnerid", wxPayProperties.getMchId());*/
                parameters.put("appid", wxPayUnifiedOrderResult.getAppid());
                parameters.put("noncestr", wxPayUnifiedOrderResult.getNonceStr()); // éšæœºå­—符串
                parameters.put("partnerid", wxConfig.getMchId()); // å•†æˆ·id
                //  parameters.put("out_trade_no", orderId);//商户订单号
                parameters.put("prepayid", wxPayUnifiedOrderResult.getPrepayId());
                parameters.put("package", "Sign=WXPay");
                parameters.put("timestamp", time);
                String sign = createSign(parameters, wxConfig.getPrivateKey());
                //hashMap.put("paySign", wechatSign);
                parameters.put("Sign", sign);
                return parameters;
            } else {
                log.error("微信支付失败,{}", wxPayUnifiedOrderResult.getErrCodeDes());
                throw new BusinessException("微信支付失败," + wxPayUnifiedOrderResult.getErrCodeDes());
            }
        } catch (WxPayException e) {
            log.error("微信支付失败,{}", e.getErrCodeDes());
            throw new BusinessException("微信支付失败," + e.getErrCodeDes());
        }
    }
    /*    private String createSign(SortedMap<Object, Object> parameters) {
            StringBuffer sb = new StringBuffer();
            Set es = parameters.entrySet();// æ‰€æœ‰å‚与传参的参数按照accsii排序(升序)
            for (Object e : es) {
                Map.Entry entry = (Map.Entry) e;
                String k = (String) entry.getKey();
                Object v = entry.getValue();
                if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {
                    sb.append(k + "=" + v + "&");
                }
            }
            sb.append("key=" + wxPayProperties.getMchKey());
            System.out.println("字符串拼接后是:" + sb.toString());
            return SecureUtil.md5(sb.toString()).toUpperCase();
        }*/
    /**
     * å¾®ä¿¡è®¢å•状态查询
     * @param poleId
     * @param outTradeNo
     * @return
     */
    private Object WxOrderQuery(Long poleId,String outTradeNo){
        WxConfigEntity wxConfig = wxPayConfigService.getConfigByPoleId(poleId);
        if(wxConfig==null){
            throw new BusinessException("获取微信支付配置失败");
        }
        String s = HttpUtil.get(WECHAT_ORDER_QUETY_URL + outTradeNo + WECHAT_ORDER_QUETY + wxConfig.getMchId());//WxOrderDto
        WxOrderDto wxOrderDto = JSON.parseObject(s, WxOrderDto.class);
        return  wxOrderDto.getTrade_state();
    }
    /**
     * @param parameters
     * @return
     */
    @SuppressWarnings("rawtypes")
    private String createSign(SortedMap<Object, Object> parameters, String Key) {
        StringBuffer sb = new StringBuffer();
        Set es = parameters.entrySet();// æ‰€æœ‰å‚与传参的参数按照accsii排序(升序)
        Iterator it = es.iterator();
        while (it.hasNext()) {
            Map.Entry entry = (Map.Entry) it.next();
            String k = (String) entry.getKey();
            Object v = entry.getValue();
            if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {
                sb.append(k + "=" + v + "&");
            }
        }
        sb.append("key=" + Key);
        System.out.println("字符串拼接后是:" + sb.toString());
        String sign = EncriptionKit.encrypt(sb.toString()).toUpperCase();
        return sign;
    }
    public WxPayOrderNotifyResult parseOrderNotifyResult(WxPayService wxPayService, String xmlData) {
        try {
            return wxPayService.parseOrderNotifyResult(xmlData);
        } catch (WxPayException e) {
            e.printStackTrace();
            throw new BusinessException("解析回调结果失败," + e.getErrCodeDes());
        }
    }
    public WxPayRefundNotifyResult parseRefundNotifyResult(WxPayService wxPayService, String xmlData) {
        try {
            return wxPayService.parseRefundNotifyResult(xmlData);
        } catch (WxPayException e) {
            e.printStackTrace();
            throw new BusinessException("解析回调结果失败," + e.getErrCodeDes());
        }
    }
    /**
     * è®¢å•退款 åªèƒ½é€€æ¬¾ä¸€æ¬¡
     *
     * @param wxPayService
     * @param orderId
     * @param refundFee
     * @param callbackUrl
     * @return
     */
    public boolean refundOrder(WxPayService wxPayService, String orderId, String refundSn, Integer refundFee, String callbackUrl) {
        WxPayRefundRequest refundRequest = new WxPayRefundRequest();
        refundRequest.setOutTradeNo(orderId);
        refundRequest.setOutRefundNo(refundSn);
        refundRequest.setRefundFee(refundFee);
        refundRequest.setTotalFee(refundFee);
        refundRequest.setNotifyUrl(callbackUrl);
        try {
            WxPayRefundResult wxPayRefundResult = wxPayService.refund(refundRequest);
            if (WxPayConstants.ResultCode.SUCCESS.equals(wxPayRefundResult.getResultCode())) {
                return true;
            } else {
                log.error("微信退款失败,{}", wxPayRefundResult.getErrCodeDes());
                throw new BusinessException("微信退款失败," + wxPayRefundResult.getErrCodeDes());
            }
        } catch (WxPayException e) {
            log.error("微信退款失败,{}", e.getErrCodeDes());
            throw new BusinessException("微信退款失败," + e.getErrCodeDes());
        }
    }
    /**
     * ç”ŸæˆäºŒç»´ç ä»˜æ¬¾
     */
    public String generateQRCodePay(WxPayService wxPayService, String body,
                                    String orderId, int totalFee, String callbackUrl) {
        WxPayUnifiedOrderRequest wxPayUnifiedOrderRequest = new WxPayUnifiedOrderRequest();
        wxPayUnifiedOrderRequest.setBody(body);
        wxPayUnifiedOrderRequest.setOutTradeNo(orderId);
        wxPayUnifiedOrderRequest.setTotalFee(totalFee);
        wxPayUnifiedOrderRequest.setProductId(orderId);
        wxPayUnifiedOrderRequest.setSignType(WxPayConstants.SignType.MD5);
        wxPayUnifiedOrderRequest.setSpbillCreateIp(IpUtil.getRealIp());
        wxPayUnifiedOrderRequest.setNotifyUrl(callbackUrl);
        wxPayUnifiedOrderRequest.setTradeType(WxPayConstants.TradeType.NATIVE);
        try {
            WxPayUnifiedOrderResult wxPayUnifiedOrderResult = wxPayService.unifiedOrder(wxPayUnifiedOrderRequest);
            if (WxPayConstants.ResultCode.SUCCESS.equals(wxPayUnifiedOrderResult.getResultCode())) {
                byte[] scanPayQrcodeMode2 = wxPayService.createScanPayQrcodeMode2(wxPayUnifiedOrderResult.getCodeURL(), null, null);
                String encode = Base64.encode(scanPayQrcodeMode2);
                return encode;
            } else {
                log.error("微信支付失败,{}", wxPayUnifiedOrderResult.getErrCodeDes());
                throw new BusinessException("微信支付失败," + wxPayUnifiedOrderResult.getErrCodeDes());
            }
        } catch (WxPayException e) {
            log.error("微信支付失败,{}", e.getErrCodeDes());
            throw new BusinessException("微信支付失败," + e.getErrCodeDes());
        }
    }
    /**
     * é€€æ¬¾
     *
     * @param totalAmount
     * @param refundAmount
     * @param outTradeNo
     * @param poleId
     * @return
     */
    public boolean refund(Double totalAmount, Double refundAmount, String outTradeNo, Long poleId) {
        WxConfigEntity wxConfig = UsrWxPayConfigService.getBean().getConfigByPoleId(poleId);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String refundNo = sdf.format(new Date());
        WxPayRefundRequest refundRequest = new WxPayRefundRequest();
        refundRequest.setOutTradeNo(outTradeNo);
        refundRequest.setOutRefundNo(refundNo);
        refundRequest.setTotalFee(Integer.valueOf(parseWxAmount((totalAmount + ""))));
        refundRequest.setRefundFee(Integer.valueOf(parseWxAmount((refundAmount + ""))));
        try {
            WxPayRefundResult wxPayRefundResult = wxPayService.refund(refundRequest);
            if (WxPayConstants.ResultCode.SUCCESS.equals(wxPayRefundResult.getResultCode())) {
                return true;
            } else {
                log.error("微信退款失败,{}", wxPayRefundResult.getErrCodeDes());
                throw new BusinessException("微信退款失败," + wxPayRefundResult.getErrCodeDes());
            }
        } catch (WxPayException e) {
            log.error("微信退款失败,{}", e.getErrCodeDes());
            throw new BusinessException("微信退款失败," + e.getErrCodeDes());
        }
    }
    /**
     * è½¬æ¢ä¸ºå¾®ä¿¡é‡‘额(分)
     *
     * @param normalAmount 0.01元
     * @return
     */
    public static String parseWxAmount(String normalAmount) {
        //  ä¿ç•™2位小数
        double totalAmountDouble = Double.parseDouble(new DecimalFormat("#.00").format(
                Double.parseDouble(normalAmount)));
        String amount = (totalAmountDouble * 100) + "";
        amount = amount.substring(0, amount.indexOf("."));
        return amount;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/pay/wx/WxPayConfiguration.java
ÎļþÃû´Ó sandu-common/src/main/java/com/sandu/common/third/pay/wx/WxPayConfiguration.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.sandu.common.third.pay.wx;
package com.sandu.ximon.admin.pay.wx;
import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.service.WxPayService;
ximon-admin/src/main/java/com/sandu/ximon/admin/pay/wx/WxPayProperties.java
ÎļþÃû´Ó sandu-common/src/main/java/com/sandu/common/third/pay/wx/WxPayProperties.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.sandu.common.third.pay.wx;
package com.sandu.ximon.admin.pay.wx;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
ximon-admin/src/main/java/com/sandu/ximon/admin/pay/wxpay/UsrWxPayConfigService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,132 @@
package com.sandu.ximon.admin.pay.wxpay;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.pagehelper.PageHelper;
import com.sandu.common.execption.BusinessException;
import com.sandu.common.object.BaseConditionVO;
import com.sandu.common.service.impl.BaseServiceImpl;
import com.sandu.ximon.admin.param.WxpayConfigParam;
import com.sandu.ximon.admin.security.SecurityUtils;
import com.sandu.ximon.admin.service.ClientService;
import com.sandu.ximon.admin.service.PoleService;
import com.sandu.ximon.admin.utils.SpringContextUtil;
import com.sandu.ximon.dao.domain.Pole;
import com.sandu.ximon.dao.domain.WxConfigEntity;
import com.sandu.ximon.dao.mapper.UsrWxPayConfigMapper;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * @Author liuhaonan
 * @Date 2022/3/18 14:37
 * @Version 1.0
 */
@Service
@AllArgsConstructor
public class UsrWxPayConfigService extends BaseServiceImpl<UsrWxPayConfigMapper, WxConfigEntity> {
    private final UsrWxPayConfigMapper wxPayConfigMapper;
    private final ClientService clientService;
    private final PoleService poleService;
    public WxConfigEntity getConfigByPoleId(Long poleId) {
        Pole pole = poleService.getById(poleId);
        if (pole == null) {
            throw new BusinessException("灯杆id错误或灯杆不存在");
        }
        WxConfigEntity config;
        if (pole.getClientId() == null) {
            config = getById(0);
        }
        config = getOne(Wrappers.lambdaQuery(WxConfigEntity.class).eq(WxConfigEntity::getCreateUserId, SecurityUtils.getUserId()));
        if (config == null) {
            throw new BusinessException("用户未配置支付配置,请配置后重试");
        }
        return config;
    }
    public static UsrWxPayConfigService getBean() {
        return (UsrWxPayConfigService) SpringContextUtil.getBean("UsrWxPayConfigService");
    }
    public boolean addWxPayConfig(WxpayConfigParam configParam) {
        WxConfigEntity config = new WxConfigEntity();
        BeanUtil.copyProperties(configParam, config);
        config.setAppid(configParam.getAppId());
        config.setAppappid(configParam.getAppAppId());
        if(SecurityUtils.getClientId()!=null){
            config.setCreateUserId(SecurityUtils.getUserId());
            if(clientService.findClientId()){
                config.setClientId(clientService.getClientId());
            }
        }
        return save(config);
    }
    public boolean updateWxPayConfig(Long id, WxpayConfigParam configParam) {
        WxConfigEntity byId = getById(id);
        if (byId == null) {
            throw new BusinessException("配置id错误或配置不存在");
        }
        WxConfigEntity config = new WxConfigEntity();
        BeanUtil.copyProperties(configParam, config);
        config.setAppid(configParam.getAppId());
        config.setAppappid(configParam.getAppAppId());
        config.setConfigId(id);
        return updateById(config);
    }
    public boolean deleteWxPayConfig(Long id) {
        WxConfigEntity byId = getById(id);
        if (byId == null) {
            throw new BusinessException("配置id错误或配置不存在");
        }
        return removeById(id);
    }
    public List<WxConfigEntity> configList(BaseConditionVO baseConditionVO,String keyword) {
        LambdaQueryWrapper<WxConfigEntity> wrapper = new LambdaQueryWrapper<>();
        System.out.println("----------------------------" + clientService.findClientId());
        PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
        if (SecurityUtils.getClientId() != null) {//客户
            if (clientService.findClientId()) {//二级客户
                PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
                wrapper = Wrappers.lambdaQuery(WxConfigEntity.class).eq(WxConfigEntity::getCreateUserId, SecurityUtils.getUserId());
            } else if (!clientService.findClientId()) {//一级客户
                PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
                wrapper = Wrappers.lambdaQuery(WxConfigEntity.class).eq(WxConfigEntity::getClientId, SecurityUtils.getUserId());
            }
        } else {//管理
            PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
            wrapper = Wrappers.lambdaQuery(WxConfigEntity.class);
        }
        if(!keyword.isEmpty()){
           wrapper= wrapper.like(WxConfigEntity::getConfigId,keyword).or(
                    appid->{
                        appid.like(WxConfigEntity::getAppid,keyword);
                    }
            ).or(
                    appappid->{
                        appappid.like(WxConfigEntity::getAppappid,keyword);
                    }
            ).or(
                    mchId->{
                        mchId.like(WxConfigEntity::getMchId,keyword);
                    }
            ).or(
                    privateKey->{
                        privateKey.like(WxConfigEntity::getPrivateKey,keyword);
                    }
            );
        }
        return list(wrapper);
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/schedule/WaterQualityDataSchedule.java
@@ -24,7 +24,7 @@
    private WaterQualityEquipmentService waterQualityEquipmentService;
    private WaterQualityDataService waterQualityDataService;
    @Scheduled(cron = "0 0 0/1 * * ?")
   // @Scheduled(cron = "0 0 0/1 * * ?")
    public void UserSubjectRefund() {
        List<WaterQualityEquipmentBo> waterQualityEquipmentList = waterQualityEquipmentService.listWaterQualityEquipment();
        for (WaterQualityEquipment waterQualityEquipment : waterQualityEquipmentList) {
ximon-admin/src/main/java/com/sandu/ximon/admin/security/base64_Img.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
package com.sandu.ximon.admin.security;
import sun.misc.BASE64Decoder;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class base64_Img {
    public static void main(String[] args) {
        //str = GetImageStr();
        String s="1645784824360\",\n" +
                "    \"data\": \"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB\\nAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEB\\nAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCADAAMADASIA\\nAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA\\nAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3\\nODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm\\np6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA\\nAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\\nBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK\\nU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3\\nuLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD+Qb9l\\nj9lnQPGWgw/Ef4k2019pl7LIPDXhoSy29teWsEjRyavqssDJcSwzTK8VlYxSxIY4nubl5o5ooh9r\\nj9nL4EYP/Fr/AAvhRkk2cnAG7JJM3AGDkk9MEkgDJ+ziQPgR8MSSFA8LWhLMQFAElxlmJ4AA5JJw\\nBkk8GvCPij8VdS8WaheaPo93NZ+GLWV7eNLeR4n1oxO6te3royu9tI2WtLPPkiHZLOjzuSuLbu9X\\nvbr/ADTXfy/4dJCWq+7/ANu83/L3fq27npN98MP2T9MlaC+8OfDqCZDteLzFmkQ5IIZLaeZlII5D\\nDIyMjg1R/wCED/ZB/wCgF8Pf+/F3/wDE18uABRhQAPQDA/IUtK77v73/AJhZdl93p5+S/De2v1F/\\n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\\n3WltVv5Ob7+a+/fdh/Wz/X+unmf/2Q==\\n";
        GenerateImage(s);
    }
    // å›¾ç‰‡è½¬åŒ–成base64字符串
//    public static String GetImageStr() {
//        String imgFile = "D:\\tanbing.jpg";// å¾…处理的图片
//        InputStream in = null;
//        byte[] data = null;
//        // è¯»å–图片字节数组
//        try {
//            in = new FileInputStream(imgFile);
//            data = new byte[in.available()];
//            in.read(data);
//            in.close();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        // å¯¹å­—节数组Base64编码
//        BASE64Encoder encoder = new BASE64Encoder();
//        System.out.println(encoder.encode(data));
//        return encoder.encode(data);// è¿”回Base64编码过的字节数组字符串
//    }
    // å¯¹å­—节数组字符串进行Base64解码并生成图片
    public static boolean GenerateImage(String imgStr) {
        if (imgStr == null) {
            // å›¾åƒæ•°æ®ä¸ºç©º
            return false;
        }
        BASE64Decoder decoder = new BASE64Decoder();
        try {
            // Base64解码
            byte[] b = decoder.decodeBuffer(imgStr);
            for (int i = 0; i < b.length; ++i) {
                if (b[i] < 0) {// è°ƒæ•´å¼‚常数据
                    b[i] += 256;
                }
            }
            // ç”Ÿæˆjpeg图片
            String imgFilePath = "D:\\Download\\jieping.jpg";// æ–°ç”Ÿæˆçš„图片
            OutputStream out = new FileOutputStream(imgFilePath);
            out.write(b);
            out.flush();
            out.close();
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/security/ceshi.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.sandu.ximon.admin.security;
import org.apache.commons.lang.StringEscapeUtils;
/**
 * @Author liuhaonan
 * @Date 2022/2/25 17:26
 * @Version 1.0
 */
public class ceshi {
    public static void main(String[] args) {
        String s="{\\\"programId\\\":378,\\\"_id\\\":\\\"2ab6dac6-bf1d-4393-bd2c-22ba9631bc0a\\\",\\\"name\\\":\\\"猫咪\\\",\\\"width\\\":192,\\\"height\\\":192,\\\"layers\\\":[{\\\"id\\\":1,\\\"sources\\\":[{\\\"id\\\":\\\"212\\\",\\\"_id\\\":\\\"23ccc7aa-f571-4d08-95e2-426a9a8cef37\\\",\\\"_type\\\":\\\"Image\\\",\\\"md5\\\":null,\\\"name\\\":\\\"猫咪01.jpg\\\",\\\"left\\\":0,\\\"top\\\":0,\\\"width\\\":192,\\\"height\\\":192,\\\"size\\\":126178,\\\"playTime\\\":0,\\\"timeSpan\\\":6,\\\"fileExt\\\":\\\"\\\",\\\"mime\\\":\\\"image\\/jpeg\\\",\\\"lineHeight\\\":null,\\\"html\\\":null,\\\"center\\\":false,\\\"speed\\\":null,\\\"entryEffect\\\":\\\"None\\\",\\\"exitEffect\\\":\\\"None\\\",\\\"entryEffectTimeSpan\\\":0,\\\"exitEffectTimeSpan\\\":0,\\\"backgroundColor\\\":\\\"\\\",\\\"language\\\":\\\"\\\",\\\"timezone\\\":0,\\\"city\\\":\\\"\\\",\\\"code\\\":0},{\\\"id\\\":\\\"213\\\",\\\"_id\\\":\\\"2fb1e5d4-72dd-458a-bf26-d79b7344fd11\\\",\\\"_type\\\":\\\"Image\\\",\\\"md5\\\":null,\\\"name\\\":\\\"猫咪02.jpg\\\",\\\"left\\\":0,\\\"top\\\":0,\\\"width\\\":192,\\\"height\\\":192,\\\"size\\\":37268,\\\"playTime\\\":6,\\\"timeSpan\\\":6,\\\"fileExt\\\":\\\"\\\",\\\"mime\\\":\\\"image\\/jpeg\\\",\\\"lineHeight\\\":null,\\\"html\\\":null,\\\"center\\\":false,\\\"speed\\\":null,\\\"entryEffect\\\":\\\"None\\\",\\\"exitEffect\\\":\\\"None\\\",\\\"entryEffectTimeSpan\\\":0,\\\"exitEffectTimeSpan\\\":0,\\\"backgroundColor\\\":\\\"\\\",\\\"language\\\":\\\"\\\",\\\"timezone\\\":0,\\\"city\\\":\\\"\\\",\\\"code\\\":0},{\\\"id\\\":\\\"223\\\",\\\"_id\\\":\\\"39fd4620-bfa8-4df8-9637-51e833a71a50\\\",\\\"_type\\\":\\\"Image\\\",\\\"md5\\\":null,\\\"name\\\":\\\"猫咪09.png\\\",\\\"left\\\":0,\\\"top\\\":0,\\\"width\\\":192,\\\"height\\\":192,\\\"size\\\":3170450,\\\"playTime\\\":48,\\\"timeSpan\\\":6,\\\"fileExt\\\":\\\"\\\",\\\"mime\\\":\\\"image\\/jpeg\\\",\\\"lineHeight\\\":null,\\\"html\\\":null,\\\"center\\\":false,\\\"speed\\\":null,\\\"entryEffect\\\":\\\"None\\\",\\\"exitEffect\\\":\\\"None\\\",\\\"entryEffectTimeSpan\\\":0,\\\"exitEffectTimeSpan\\\":0,\\\"backgroundColor\\\":\\\"\\\",\\\"language\\\":\\\"\\\",\\\"timezone\\\":0,\\\"city\\\":\\\"\\\",\\\"code\\\":0},{\\\"id\\\":\\\"214\\\",\\\"_id\\\":\\\"cd46a125-3cd0-4adf-9f21-ba83c6dce786\\\",\\\"_type\\\":\\\"Image\\\",\\\"md5\\\":null,\\\"name\\\":\\\"猫咪03.jpg\\\",\\\"left\\\":0,\\\"top\\\":0,\\\"width\\\":192,\\\"height\\\":192,\\\"size\\\":41160,\\\"playTime\\\":12,\\\"timeSpan\\\":6,\\\"fileExt\\\":\\\"\\\",\\\"mime\\\":\\\"image\\/jpeg\\\",\\\"lineHeight\\\":null,\\\"html\\\":null,\\\"center\\\":false,\\\"speed\\\":null,\\\"entryEffect\\\":\\\"None\\\",\\\"exitEffect\\\":\\\"None\\\",\\\"entryEffectTimeSpan\\\":0,\\\"exitEffectTimeSpan\\\":0,\\\"backgroundColor\\\":\\\"\\\",\\\"language\\\":\\\"\\\",\\\"timezone\\\":0,\\\"city\\\":\\\"\\\",\\\"code\\\":0},{\\\"id\\\":\\\"217\\\",\\\"_id\\\":\\\"c1cbac8f-5af0-4976-8b70-50cf189fd0ca\\\",\\\"_type\\\":\\\"Image\\\",\\\"md5\\\":null,\\\"name\\\":\\\"猫咪04.jpg\\\",\\\"left\\\":0,\\\"top\\\":0,\\\"width\\\":192,\\\"height\\\":192,\\\"size\\\":168335,\\\"playTime\\\":18,\\\"timeSpan\\\":6,\\\"fileExt\\\":\\\"\\\",\\\"mime\\\":\\\"image\\/jpeg\\\",\\\"lineHeight\\\":null,\\\"html\\\":null,\\\"center\\\":false,\\\"speed\\\":null,\\\"entryEffect\\\":\\\"None\\\",\\\"exitEffect\\\":\\\"None\\\",\\\"entryEffectTimeSpan\\\":0,\\\"exitEffectTimeSpan\\\":0,\\\"backgroundColor\\\":\\\"\\\",\\\"language\\\":\\\"\\\",\\\"timezone\\\":0,\\\"city\\\":\\\"\\\",\\\"code\\\":0},{\\\"id\\\":\\\"218\\\",\\\"_id\\\":\\\"bcb0a5a5-b40a-4beb-84fe-00e14afdb046\\\",\\\"_type\\\":\\\"Image\\\",\\\"md5\\\":null,\\\"name\\\":\\\"猫咪05.jpg\\\",\\\"left\\\":0,\\\"top\\\":0,\\\"width\\\":192,\\\"height\\\":192,\\\"size\\\":236649,\\\"playTime\\\":24,\\\"timeSpan\\\":6,\\\"fileExt\\\":\\\"\\\",\\\"mime\\\":\\\"image\\/jpeg\\\",\\\"lineHeight\\\":null,\\\"html\\\":null,\\\"center\\\":false,\\\"speed\\\":null,\\\"entryEffect\\\":\\\"None\\\",\\\"exitEffect\\\":\\\"None\\\",\\\"entryEffectTimeSpan\\\":0,\\\"exitEffectTimeSpan\\\":0,\\\"backgroundColor\\\":\\\"\\\",\\\"language\\\":\\\"\\\",\\\"timezone\\\":0,\\\"city\\\":\\\"\\\",\\\"code\\\":0},{\\\"id\\\":\\\"221\\\",\\\"_id\\\":\\\"4f3aeb15-2d5c-45d1-8bcc-c41ce75ecde1\\\",\\\"_type\\\":\\\"Image\\\",\\\"md5\\\":null,\\\"name\\\":\\\"猫咪06.png\\\",\\\"left\\\":0,\\\"top\\\":0,\\\"width\\\":192,\\\"height\\\":192,\\\"size\\\":766854,\\\"playTime\\\":30,\\\"timeSpan\\\":6,\\\"fileExt\\\":\\\"\\\",\\\"mime\\\":\\\"image\\/jpeg\\\",\\\"lineHeight\\\":null,\\\"html\\\":null,\\\"center\\\":false,\\\"speed\\\":null,\\\"entryEffect\\\":\\\"None\\\",\\\"exitEffect\\\":\\\"None\\\",\\\"entryEffectTimeSpan\\\":0,\\\"exitEffectTimeSpan\\\":0,\\\"backgroundColor\\\":\\\"\\\",\\\"language\\\":\\\"\\\",\\\"timezone\\\":0,\\\"city\\\":\\\"\\\",\\\"code\\\":0},{\\\"id\\\":\\\"222\\\",\\\"_id\\\":\\\"453398cb-8099-4fa9-bc86-d36d92107d7f\\\",\\\"_type\\\":\\\"Image\\\",\\\"md5\\\":null,\\\"name\\\":\\\"猫咪07.png\\\",\\\"left\\\":0,\\\"top\\\":0,\\\"width\\\":192,\\\"height\\\":192,\\\"size\\\":762731,\\\"playTime\\\":36,\\\"timeSpan\\\":6,\\\"fileExt\\\":\\\"\\\",\\\"mime\\\":\\\"image\\/jpeg\\\",\\\"lineHeight\\\":null,\\\"html\\\":null,\\\"center\\\":false,\\\"speed\\\":null,\\\"entryEffect\\\":\\\"None\\\",\\\"exitEffect\\\":\\\"None\\\",\\\"entryEffectTimeSpan\\\":0,\\\"exitEffectTimeSpan\\\":0,\\\"backgroundColor\\\":\\\"\\\",\\\"language\\\":\\\"\\\",\\\"timezone\\\":0,\\\"city\\\":\\\"\\\",\\\"code\\\":0},{\\\"id\\\":\\\"224\\\",\\\"_id\\\":\\\"274ea4a4-d8b5-449e-8972-d027476bb9ca\\\",\\\"_type\\\":\\\"Image\\\",\\\"md5\\\":null,\\\"name\\\":\\\"猫咪08.png\\\",\\\"left\\\":0,\\\"top\\\":0,\\\"width\\\":192,\\\"height\\\":192,\\\"size\\\":3102346,\\\"playTime\\\":42,\\\"timeSpan\\\":6,\\\"fileExt\\\":\\\"\\\",\\\"mime\\\":\\\"image\\/jpeg\\\",\\\"lineHeight\\\":null,\\\"html\\\":null,\\\"center\\\":false,\\\"speed\\\":null,\\\"entryEffect\\\":\\\"None\\\",\\\"exitEffect\\\":\\\"None\\\",\\\"entryEffectTimeSpan\\\":0,\\\"exitEffectTimeSpan\\\":0,\\\"backgroundColor\\\":\\\"\\\",\\\"language\\\":\\\"\\\",\\\"timezone\\\":0,\\\"city\\\":\\\"\\\",\\\"code\\\":0},{\\\"id\\\":\\\"215\\\",\\\"_id\\\":\\\"c59a1450-a48d-437e-a337-fc87bd14bfc2\\\",\\\"_type\\\":\\\"Image\\\",\\\"md5\\\":null,\\\"name\\\":\\\"妙啊.png\\\",\\\"left\\\":0,\\\"top\\\":0,\\\"width\\\":192,\\\"height\\\":192,\\\"size\\\":430804,\\\"playTime\\\":54,\\\"timeSpan\\\":6,\\\"fileExt\\\":\\\"\\\",\\\"mime\\\":\\\"image\\/jpeg\\\",\\\"lineHeight\\\":null,\\\"html\\\":null,\\\"center\\\":false,\\\"speed\\\":null,\\\"entryEffect\\\":\\\"None\\\",\\\"exitEffect\\\":\\\"None\\\",\\\"entryEffectTimeSpan\\\":0,\\\"exitEffectTimeSpan\\\":0,\\\"backgroundColor\\\":\\\"\\\",\\\"language\\\":\\\"\\\",\\\"timezone\\\":0,\\\"city\\\":\\\"\\\",\\\"code\\\":0}],\\\"repeat\\\":true}],\\\"totalSize\\\":8842775,\\\"version\\\":0,\\\"others\\\":true}";
        String tmp = StringEscapeUtils.unescapeJavaScript(s);
        System.out.println("tmp:" + tmp);
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/security/order/C3mOrderQueryEvent.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.sandu.ximon.admin.security.order;
import com.sandu.ximon.dao.domain.C3mOrder;
import org.springframework.context.ApplicationEvent;
/**
 * @Author liuhaonan
 * @Version 1.0
 */
public class C3mOrderQueryEvent extends ApplicationEvent {
    private C3mOrder c3mOrderEntity;
    private Long startTime;
    public C3mOrderQueryEvent(Object source, C3mOrder c3mOrderEntity, Long startTime) {
        super(source);
        this.c3mOrderEntity = c3mOrderEntity;
        this.startTime = startTime;
    }
    public C3mOrder getC3mOrderEntity() {
        return c3mOrderEntity;
    }
    public Long getStartTime() {
        return startTime;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/security/order/OrderQueryListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
package com.sandu.ximon.admin.security.order;
import com.sandu.ximon.admin.utils.SpringContextUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@Component("OrderQueryListener")
public class OrderQueryListener {
    @Autowired
    public ApplicationEventPublisher publisher;
    private static final ExecutorService orderEventPool = Executors.newFixedThreadPool(5);
    public static OrderQueryListener getBean(){
        return (OrderQueryListener) SpringContextUtil.getBean("OrderQueryListener");
    }
    /**
     * å¯åŠ¨è®¢å•æ‰«æ
     * @param type  0:C3充电桩扫描启动
     */
    public void startScan (Integer type) {
        //  è½½å…¥è®¢å•扫描
        orderEventPool.submit(new OrderQueryTask(type));
    }
//    @Scheduled(cron = "0/10 * *  * * ? ")
//    public void orderScan () {
//        if(isQuery) {
//            /**
//             * èŽ·å–æ‰€æœ‰è®¢å•ï¼Œæ ¹æ®è®¢å•ç±»åž‹ä¸åŒè¿›è¡Œä¸åŒçš„Query
//             */
//            //  C3充电桩部分
//            Set<String> keys = redisUtils.keys(C3mRedisConstant.C3_NO_PAY_ORDER.getCode() + "*");
//            for (String key : keys) {
//                C3mOrderEntity c3mOrderEntity = JSON.parseObject(redisUtils.get(key), C3mOrderEntity.class);
//                LogUtils.error("查询订单:" + JSON.toJSONString(c3mOrderEntity));
//                publisher.publishEvent(new C3mOrderQueryEvent(this, c3mOrderEntity));
//            }
//        }
//    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/security/order/OrderQueryTask.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,107 @@
package com.sandu.ximon.admin.security.order;
import com.alibaba.fastjson.JSON;
import com.sandu.ximon.admin.config.C3mRedisConfig;
import com.sandu.ximon.admin.utils.LogUtils;
import com.sandu.ximon.admin.utils.RedisUtils;
import com.sandu.ximon.dao.domain.C3mOrder;
import com.sandu.ximon.dao.enums.C3mRedisConstant;
import lombok.Data;
import java.util.Date;
import java.util.Queue;
import java.util.Set;
import java.util.concurrent.ConcurrentLinkedQueue;
@Data
public class OrderQueryTask implements Runnable{
    private static Queue<OrderQueryTask> taskList = new ConcurrentLinkedQueue<>();
    //  ä»»åŠ¡ç±»åž‹:C3订单扫描(0)、
    private Integer type;
    //  æ˜¯å¦ç»§ç»­æ‰«æ
    private boolean isScanning = true;
    public void stopTask(){
        this.isScanning = false;
    }
    public OrderQueryTask(Integer type) {
        this.type = type;
    }
    @Override
    public void run() {
        /**
         * å¯åŠ¨åŽï¼Œç»ˆæ­¢æ‰€æœ‰ç›¸åŒç±»åž‹çš„æ‰«æä»»åŠ¡
         */
        stopAndAddTask(type, this);
        for(OrderQueryTask task :taskList) {
            if(task.getType().equals(0)){
                //  å¯åЍC3订单扫描
                c3mOrderTaskScan();
            }
        }
    }
    private void c3mOrderTaskScan() {
        LogUtils.error("启动C3m订单扫描任务");
        Long totalTime = 0L;
        //  ç»§ç»­æ‰«ææ—¶ï¼Œè¿›è¡Œå¾ªçŽ¯æ‰«æ
        while(isScanning) {
            totalTime = totalTime + C3mRedisConfig.ORDER_QUERY_TIME;
            //  åˆ¤æ–­æ‰«ææ—¶é•¿æ˜¯å¦å·²è¶…出订单超时时间
            if(totalTime > C3mRedisConfig.ORDER_MAX_TIME) {
                return;
            }
            //  ç­‰å¾…扫描间隔
            try {
                Thread.sleep(C3mRedisConfig.ORDER_QUERY_TIME * 1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //  åˆ¤æ–­æ˜¯å¦ç»§ç»­æ‰«æ
            if(isScanning) {
                /**
                 * èŽ·å–æ‰€æœ‰è®¢å•ï¼Œæ ¹æ®è®¢å•ç±»åž‹ä¸åŒè¿›è¡Œä¸åŒçš„Query
                 */
                //  C3充电桩部分
                RedisUtils redisUtils = RedisUtils.getBean();
                Set<String> keys = redisUtils.keys(C3mRedisConstant.C3_NO_PAY_ORDER.getCode() + "*");
                for (String key : keys) {
                    C3mOrder c3mOrderEntity = JSON.parseObject(redisUtils.get(key), C3mOrder.class);
                    LogUtils.error("当前订单总数:"+keys.size()+",推送查询订单("+c3mOrderEntity.getOutTradeNo()+")到事件处理:" + JSON.toJSONString(c3mOrderEntity));
                    OrderQueryListener.getBean().publisher.publishEvent(new C3mOrderQueryEvent(this, c3mOrderEntity, new Date().getTime()));
                }
            }else {
                return;
            }
        }
    }
    public void stopAndAddTask (Integer type, OrderQueryTask newTask) {
        synchronized (OrderQueryTask.class) {
            LogUtils.error("重置并清空订单扫描队列");
            boolean clear = true;
            Queue<OrderQueryTask> newTaskList = new ConcurrentLinkedQueue<>();
            newTaskList.offer(newTask);
            while (clear) {
                OrderQueryTask task = taskList.poll();
                if (null == task) {
                    clear = false;
                } else {
                    if (task.getType().equals(type)) {
                        task.stopTask();
                    } else {
                        newTaskList.offer(task);
                    }
                }
            }
            taskList = newTaskList;
        }
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/security/order/OrderScanType.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.sandu.ximon.admin.security.order;
public enum OrderScanType {
    C3M(0)
    ;
    private Integer type;
    OrderScanType(Integer type) {
        this.type = type;
    }
    public Integer getType() {
        return type;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3ChargingService.java
@@ -5,17 +5,18 @@
import com.sandu.common.execption.BusinessException;
import com.sandu.common.object.BaseConditionVO;
import com.sandu.common.service.impl.BaseServiceImpl;
import com.sandu.ximon.admin.manager.iot.amqp.processor.c3ChargingProcessor;
import com.sandu.ximon.dao.bo.C3ChargingBo;
import com.sandu.ximon.admin.manager.iot.frame.A5Frame;
import com.sandu.ximon.admin.manager.iot.frame.inner.report.A5C3HeartbeatReportInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.report.A5C3OperationReportInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.report.A5C3QueryReportInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.request.*;
import com.sandu.ximon.admin.manager.iot.rrpc.dto.CommonFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.A5OrderEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.C3ChargingEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.mainboard.MainBoardInvokeSyncService;
import com.sandu.ximon.admin.utils.RedisUtils;
import com.sandu.ximon.dao.domain.C3mCharging;
import com.sandu.ximon.admin.param.C3ChargingAddParam;
import com.sandu.ximon.admin.param.C3ChargingParam;
import com.sandu.ximon.dao.domain.*;
import com.sandu.ximon.dao.mapper.C3mChargingMapper;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -32,27 +33,69 @@
@Slf4j
@AllArgsConstructor
public class C3ChargingService extends BaseServiceImpl<C3mChargingMapper, C3mCharging> {
    private C3mChargingMapper c3mChargingMapper;
    private final C3mChargingChargeService c3mChargingChargeService;
    private final PoleBindingService bindingService;
    private final PoleService poleService;
    /**
     * ä¿å­˜ä¸ŠæŠ¥C3充电设备心跳数据
     *
     * @return æ˜¯å¦æˆåŠŸ
     */
    public boolean saveReportData(String deviceName, A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage heartBeatDataPackage) {
        C3mCharging one = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getMcuUdid, deviceName));
    public boolean updateReportState(String deviceName, String c3Mac, String statusBit, String deviceTemperature) {
        C3mCharging one = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getPoleDevicesCode, deviceName));
        if (one != null) {
            one.setStatusBit(Integer.valueOf(statusBit));
            one.setDeviceTemperature(deviceTemperature);
            one.setPoleDevicesCode(deviceName);
            one.setC3Mac(c3Mac);
//            List<C3mChargingCharge> list = c3mChargingChargeService.list(Wrappers.lambdaQuery(C3mChargingCharge.class).eq(C3mChargingCharge::getC3Id, one.getC3Id()));
//            if (list.size() == 0) {//费率表中没有此充电桩数据时  æ·»åŠ é»˜è®¤è´¹çŽ‡
//                c3mChargingChargeService.initCharge((one.getC3Id()).intValue());
//            }
            return updateById(one);
        } else {
            return false;
        }
    }
    /**
     * ä¿å­˜ä¸ŠæŠ¥C3充电设备心跳数据
     *
     * @return æ˜¯å¦æˆåŠŸ
     */
    public boolean saveReporEquipment(String deviceName, String mcuUdid, String c3Mac) {
        C3mCharging one = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getMcuUdid, mcuUdid));
        if (one == null) {
            //将设备信息添加到充电桩设备表
            C3mCharging c3mCharging = new C3mCharging();
            c3mCharging.setMcuUdid(deviceName);
            c3mCharging.setC3Mac(heartBeatDataPackage.getC3Mac());
            c3mCharging.setStatusBit(Integer.valueOf(heartBeatDataPackage.getStatusBit()));
            c3mCharging.setDeviceTemperature(heartBeatDataPackage.getDeviceTemperature());
            return save(c3mCharging);
            c3mCharging.setMcuUdid(mcuUdid);
            c3mCharging.setPoleDevicesCode(deviceName);
            c3mCharging.setC3Mac(c3Mac);
            boolean flag = save(c3mCharging);
            //设置费率
            C3mCharging c3mCharging1 = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getMcuUdid, mcuUdid));
            List<C3mChargingCharge> list = c3mChargingChargeService.list(Wrappers.lambdaQuery(C3mChargingCharge.class).eq(C3mChargingCharge::getC3Id, c3mCharging1.getC3Id()));
            if (list.size() == 0) {//费率表中没有此充电桩数据时  æ·»åŠ é»˜è®¤è´¹çŽ‡
                c3mChargingChargeService.initCharge((c3mCharging1.getC3Id()).intValue());
            }
            return flag;
        } else {
            one.setStatusBit(Integer.valueOf(heartBeatDataPackage.getStatusBit()));
            one.setDeviceTemperature(heartBeatDataPackage.getDeviceTemperature());
            return updateById(one);
            //将设备信息添加到充电桩设备表
            one.setPoleDevicesCode(deviceName);
            one.setC3Mac(c3Mac);
            boolean flag = updateById(one);
            //设置费率
            C3mCharging c3mCharging1 = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getMcuUdid, mcuUdid));
            List<C3mChargingCharge> list = c3mChargingChargeService.list(Wrappers.lambdaQuery(C3mChargingCharge.class).eq(C3mChargingCharge::getC3Id, c3mCharging1.getC3Id()));
            if (list.size() == 0) {//费率表中没有此充电桩数据时  æ·»åŠ é»˜è®¤è´¹çŽ‡
                c3mChargingChargeService.initCharge((c3mCharging1.getC3Id()).intValue());
            }
            return flag;
        }
    }
@@ -61,9 +104,20 @@
     *
     * @return
     */
    public List<C3mCharging> getC3ChargingList(BaseConditionVO baseConditionVO) {
    public List<C3ChargingBo> getC3ChargingListByKeyword(BaseConditionVO baseConditionVO, C3ChargingParam c3ChargingParam) {
        PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
        return list();
        if(c3ChargingParam == null){
            c3ChargingParam = new C3ChargingParam();
        }
        //关键字去除空格
        if (c3ChargingParam.getKeyword() != null) {
            c3ChargingParam.setKeyword(c3ChargingParam.getKeyword().trim());
        }
        List<C3ChargingBo> c3ChargingBoList
                = c3mChargingMapper.listC3mChargingDto(c3ChargingParam.getKeyword());
        return c3ChargingBoList;
    }
    /**
@@ -80,7 +134,11 @@
        A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_C3_DATA.getCode(), c3StartChargingReqInnerFrame);
        System.out.println(a5Frame + "            -----a5Frame");
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC("32313243305008ff0a04ffff", a5Frame);
        C3mCharging c3mCharging = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getC3Mac, c3Mac));
        if (c3mCharging == null) {
            throw new BusinessException("C3充电桩硬件mcu_udid不存在");
        }
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame);
        System.out.println(commonFrame + "            -----commonFrame");
@@ -109,7 +167,12 @@
        A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_C3_DATA.getCode(), c3FinishChargingReqInnerFrame);
        System.out.println(a5Frame + "            -----a5Frame");
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC("32313243305008ff0a04ffff", a5Frame);
        C3mCharging c3mCharging = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getC3Mac, c3Mac));
        if (c3mCharging == null) {
            throw new BusinessException("C3充电桩硬件mcu_udid不存在");
        }
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame);
        System.out.println(commonFrame + "            -----commonFrame");
        A5C3OperationReportInnerFrame operationReportInnerFrame = new A5C3OperationReportInnerFrame().transformFrame(commonFrame.getPayload());
@@ -134,7 +197,12 @@
        A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_C3_DATA.getCode(), c3EndOfTheSynchronizationReqInnerFrame);
        System.out.println(a5Frame + "            -----a5Frame");
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC("32313243305008ff0a04ffff", a5Frame);
        C3mCharging c3mCharging = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getC3Mac, c3Mac));
        if (c3mCharging == null) {
            throw new BusinessException("C3充电桩硬件mcu_udid不存在");
        }
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame);
        System.out.println(commonFrame + "            -----commonFrame");
        A5C3OperationReportInnerFrame operationReportInnerFrame = new A5C3OperationReportInnerFrame().transformFrame(commonFrame.getPayload());
@@ -158,13 +226,18 @@
        A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_C3_DATA.getCode(), c3QueryVersionReqInnerFrame);
        System.out.println(a5Frame + "            -----a5Frame");
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC("32313243305008ff0a04ffff", a5Frame);
        C3mCharging c3mCharging = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getC3Mac, c3Mac));
        if (c3mCharging == null) {
            throw new BusinessException("C3充电桩硬件mcu_udid不存在");
        }
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame);
        System.out.println(commonFrame + "            -----commonFrame");
        A5C3OperationReportInnerFrame operationReportInnerFrame = new A5C3OperationReportInnerFrame().transformFrame(commonFrame.getPayload());
        A5C3QueryReportInnerFrame a5C3QueryReportInnerFrame = new A5C3QueryReportInnerFrame().transformFrame(commonFrame.getPayload());
        if (operationReportInnerFrame.isValidate()) {
            return operationReportInnerFrame.getState();
        if (a5C3QueryReportInnerFrame.isValidate()) {
            return a5C3QueryReportInnerFrame.getVersion();
        } else {
            throw new BusinessException("数据校验错误,请重新请求");
        }
@@ -182,13 +255,18 @@
        A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_C3_DATA.getCode(), c3QueryIntervalTimeReqInnerFrame);
        System.out.println(a5Frame + "            -----a5Frame");
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC("32313243305008ff0a04ffff", a5Frame);
        C3mCharging c3mCharging = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getC3Mac, c3Mac));
        if (c3mCharging == null) {
            throw new BusinessException("C3充电桩硬件mcu_udid不存在");
        }
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame);
        System.out.println(commonFrame + "            -----commonFrame");
        A5C3OperationReportInnerFrame operationReportInnerFrame = new A5C3OperationReportInnerFrame().transformFrame(commonFrame.getPayload());
        A5C3QueryReportInnerFrame queryReportInnerFrame = new A5C3QueryReportInnerFrame().transformFrame(commonFrame.getPayload());
        if (operationReportInnerFrame.isValidate()) {
            return operationReportInnerFrame.getState();
        if (queryReportInnerFrame.isValidate()) {
            return queryReportInnerFrame.getIntervalTime();
        } else {
            throw new BusinessException("数据校验错误,请重新请求");
        }
@@ -206,13 +284,18 @@
        A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_C3_DATA.getCode(), c3QueryConstantReqInnerFrame);
        System.out.println(a5Frame + "            -----a5Frame");
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC("32313243305008ff0a04ffff", a5Frame);
        C3mCharging c3mCharging = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getC3Mac, c3Mac));
        if (c3mCharging == null) {
            throw new BusinessException("C3充电桩硬件mcu_udid不存在");
        }
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame);
        System.out.println(commonFrame + "            -----commonFrame");
        A5C3OperationReportInnerFrame operationReportInnerFrame = new A5C3OperationReportInnerFrame().transformFrame(commonFrame.getPayload());
        A5C3QueryReportInnerFrame queryReportInnerFrame = new A5C3QueryReportInnerFrame().transformFrame(commonFrame.getPayload());
        if (operationReportInnerFrame.isValidate()) {
            return operationReportInnerFrame.getState();
        if (queryReportInnerFrame.isValidate()) {
            return queryReportInnerFrame.getConstant();
        } else {
            throw new BusinessException("数据校验错误,请重新请求");
        }
@@ -230,11 +313,276 @@
        A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_C3_DATA.getCode(), c3QueryAddressReqInnerFrame);
        System.out.println(a5Frame + "            -----a5Frame");
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC("32313243305008ff0a04ffff", a5Frame);
        C3mCharging c3mCharging = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getC3Mac, c3Mac));
        if (c3mCharging == null) {
            throw new BusinessException("C3充电桩硬件mcu_udid不存在");
        }
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame);
        System.out.println(commonFrame + "            -----commonFrame");
        A5C3QueryReportInnerFrame queryReportInnerFrame = new A5C3QueryReportInnerFrame().transformFrame(commonFrame.getPayload());
        if (queryReportInnerFrame.isValidate()) {
            return queryReportInnerFrame.getAddress();
        } else {
            throw new BusinessException("数据校验错误,请重新请求");
        }
    }
    /**
     * æŸ¥è¯¢æ•…障码
     *
     * @param c3Mac
     */
    public String QueryFaultCode(String c3Mac) {
        C3QueryFaultCodeReqInnerFrame c3QueryFaultCodeReqInnerFrame =
                new C3QueryFaultCodeReqInnerFrame(c3Mac);
        A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_C3_DATA.getCode(), c3QueryFaultCodeReqInnerFrame);
        System.out.println(a5Frame + "            -----a5Frame");
        C3mCharging c3mCharging = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getC3Mac, c3Mac));
        if (c3mCharging == null) {
            throw new BusinessException("C3充电桩硬件mcu_udid不存在");
        }
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame);
        System.out.println(commonFrame + "            -----commonFrame");
        A5C3QueryReportInnerFrame queryReportInnerFrame = new A5C3QueryReportInnerFrame().transformFrame(commonFrame.getPayload());
        if (queryReportInnerFrame.isValidate()) {
            return queryReportInnerFrame.getFaultCode();
        } else {
            throw new BusinessException("数据校验错误,请重新请求");
        }
    }
    /**
     * è¯»å¿ƒè·³åŒ…
     *
     * @param c3Mac
     */
    public A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage ReadTheHeartbeatPackage(String c3Mac) {
        C3ReadTheHeartbeatPackageReqInnerFrame readTheHeartbeatPackageReqInnerFrame =
                new C3ReadTheHeartbeatPackageReqInnerFrame(c3Mac);
        A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_C3_DATA.getCode(), readTheHeartbeatPackageReqInnerFrame);
        System.out.println(a5Frame + "            -----a5Frame");
        C3mCharging c3mCharging = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getC3Mac, c3Mac));
        if (c3mCharging == null) {
            throw new BusinessException("C3充电桩硬件mcu_udid不存在");
        }
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame);
        System.out.println(commonFrame + "            -----commonFrame");
        A5C3HeartbeatReportInnerFrame heartbeatReportInnerFrame = new A5C3HeartbeatReportInnerFrame().transformFrame(commonFrame.getPayload());
        if (heartbeatReportInnerFrame.isValidate()) {
            return heartbeatReportInnerFrame.getHeartBeatDataPackage();
        } else {
            throw new BusinessException("数据校验错误,请重新请求");
        }
    }
    /**
     * è®¾ç½®å¿ƒè·³åŒ…间隔时间(秒)-充电状态时/非充电状态时
     *
     * @param c3Mac
     * @param setTime
     * @return
     */
    public String SetHeartbeatPacketTimeCharging(String c3Mac, int setTime, boolean flag) {
        if (setTime <= 0) {
            throw new BusinessException("设置的心跳包间隔时间错误!");
        }
        C3SetHeartbeatPacketTimeReqInnerFrame setHeartbeatPacketTimeChargingReqInnerFrame =
                new C3SetHeartbeatPacketTimeReqInnerFrame(c3Mac, setTime, flag);
        A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_C3_DATA.getCode(), setHeartbeatPacketTimeChargingReqInnerFrame);
        System.out.println(a5Frame + "            -----a5Frame");
        C3mCharging c3mCharging = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getC3Mac, c3Mac));
        if (c3mCharging == null) {
            throw new BusinessException("C3充电桩硬件mcu_udid不存在");
        }
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame);
        System.out.println(commonFrame + "            -----commonFrame");
        A5C3OperationReportInnerFrame operationReportInnerFrame = new A5C3OperationReportInnerFrame().transformFrame(commonFrame.getPayload());
        if (operationReportInnerFrame.isValidate()) {
            return operationReportInnerFrame.getState();
        } else {
            throw new BusinessException("数据校验错误,请重新请求");
        }
    }
    /**
     * è®¾ç½®ç”µåŽ‹/电流常数(各一字节)(默认值0xBC64)
     *
     * @param c3Mac
     * @param constant
     * @return
     */
    public String SetConstant(String c3Mac, String constant) {
        C3SetConstantReqInnerFrame setConstantReqInnerFrame =
                new C3SetConstantReqInnerFrame(c3Mac, constant);
        A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_C3_DATA.getCode(), setConstantReqInnerFrame);
        System.out.println(a5Frame + "            -----a5Frame");
        C3mCharging c3mCharging = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getC3Mac, c3Mac));
        if (c3mCharging == null) {
            throw new BusinessException("C3充电桩硬件mcu_udid不存在");
        }
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame);
        System.out.println(commonFrame + "            -----commonFrame");
        A5C3OperationReportInnerFrame operationReportInnerFrame = new A5C3OperationReportInnerFrame().transformFrame(commonFrame.getPayload());
        if (operationReportInnerFrame.isValidate()) {
            return operationReportInnerFrame.getState();
        } else {
            throw new BusinessException("数据校验错误,请重新请求");
        }
    }
    /**
     * è®¾ç½®åœ°å€
     *
     * @param c3Mac
     * @param address
     * @return
     */
    public String SetAddress(String c3Mac, String address) {
        if (address == null || address.length() != 8) {
            throw new BusinessException("地址信息错误!");
        }
        C3mCharging c3mCharging = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getC3Mac, c3Mac));
        if (c3mCharging == null) {
            throw new BusinessException("C3MAC地址不存在");
        }
        if (getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getC3Mac, address)) != null) {
            throw new BusinessException("新的地址信息已存在!");
        }
        C3SetAddressReqInnerFrame setAddressReqInnerFrame =
                new C3SetAddressReqInnerFrame(c3Mac, address);
        A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_C3_DATA.getCode(), setAddressReqInnerFrame);
        System.out.println(a5Frame + "            -----a5Frame");
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame);
        System.out.println(commonFrame + "            -----commonFrame");
        A5C3OperationReportInnerFrame operationReportInnerFrame = new A5C3OperationReportInnerFrame().transformFrame(commonFrame.getPayload());
        if (operationReportInnerFrame.isValidate()) {
            if ("操作成功".equals(operationReportInnerFrame.getState())) {
                //修改成功需要更改数据库数据
                C3mCharging one = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getC3Mac, c3Mac));
                one.setC3Mac(address);
                updateById(one);
            }
            return operationReportInnerFrame.getState();
        } else {
            throw new BusinessException("数据校验错误,请重新请求");
        }
    }
    /**
     * è®¾ç½®æ—¥åŽ†ï¼ˆåŒå¿ƒè·³åŒ…ä¸­çš„6字节日期时间)
     *
     * @param c3Mac
     * @return
     */
    public String SetCalendar(String c3Mac, int year, int month, int day, int hour, int min, int sec) {
        C3SetCalendarReqInnerFrame setCalendarReqInnerFrame =
                new C3SetCalendarReqInnerFrame(c3Mac, year, month, day, hour, min, sec);
        A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_C3_DATA.getCode(), setCalendarReqInnerFrame);
        System.out.println(a5Frame + "            -----a5Frame");
        C3mCharging c3mCharging = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getC3Mac, c3Mac));
        if (c3mCharging == null) {
            throw new BusinessException("C3充电桩硬件mcu_udid不存在");
        }
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame);
        System.out.println(commonFrame + "            -----commonFrame");
        A5C3OperationReportInnerFrame operationReportInnerFrame = new A5C3OperationReportInnerFrame().transformFrame(commonFrame.getPayload());
        if (operationReportInnerFrame.isValidate()) {
            return operationReportInnerFrame.getState();
        } else {
            throw new BusinessException("数据校验错误,请重新请求");
        }
    }
    /**
     * æ•…障码上报清除
     *
     * @param c3Mac
     * @return
     */
    public String ClearedFaultCode(String c3Mac) {
        C3ClearedFaultCodeReqInnerFrame clearedFaultCodeReqInnerFrame =
                new C3ClearedFaultCodeReqInnerFrame(c3Mac);
        A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_C3_DATA.getCode(), clearedFaultCodeReqInnerFrame);
        System.out.println(a5Frame + "            -----a5Frame");
        C3mCharging c3mCharging = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getC3Mac, c3Mac));
        if (c3mCharging == null) {
            throw new BusinessException("C3充电桩硬件mcu_udid不存在");
        }
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame);
        System.out.println(commonFrame + "            -----commonFrame");
        A5C3OperationReportInnerFrame operationReportInnerFrame = new A5C3OperationReportInnerFrame().transformFrame(commonFrame.getPayload());
        if (operationReportInnerFrame.isValidate()) {
            return operationReportInnerFrame.getState();
        } else {
            throw new BusinessException("数据校验错误,请重新请求");
        }
    }
    /**
     * æ¢å¤å‡ºåނ值
     *
     * @param c3Mac
     * @return
     */
    public String RestoreFactoryValue(String c3Mac) {
        C3RestoreFactoryValueReqInnerFrame restoreFactoryValueReqInnerFrame =
                new C3RestoreFactoryValueReqInnerFrame(c3Mac);
        A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_C3_DATA.getCode(), restoreFactoryValueReqInnerFrame);
        System.out.println(a5Frame + "            -----a5Frame");
        C3mCharging c3mCharging = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getC3Mac, c3Mac));
        if (c3mCharging == null) {
            throw new BusinessException("C3充电桩硬件mcu_udid不存在");
        }
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame);
        System.out.println(commonFrame + "            -----commonFrame");
        A5C3OperationReportInnerFrame operationReportInnerFrame = new A5C3OperationReportInnerFrame().transformFrame(commonFrame.getPayload());
        if (operationReportInnerFrame.isValidate()) {
            return operationReportInnerFrame.getState();
        } else {
@@ -254,7 +602,13 @@
        A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_C3_DATA.getCode(), c3RestartChargingReqInnerFrame);
        System.out.println(a5Frame + "            -----a5Frame");
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC("32313243305008ff0a04ffff", a5Frame);
        C3mCharging c3mCharging = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getC3Mac, c3Mac));
        if (c3mCharging == null) {
            throw new BusinessException("C3充电桩硬件mcu_udid不存在");
        }
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(c3mCharging.getPoleDevicesCode(), a5Frame);
//        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC("32313243305008ff1a06ffff", a5Frame);
        System.out.println(commonFrame + "            -----commonFrame");
        A5C3OperationReportInnerFrame operationReportInnerFrame = new A5C3OperationReportInnerFrame().transformFrame(commonFrame.getPayload());
@@ -265,4 +619,45 @@
            throw new BusinessException("数据校验错误,请重新请求");
        }
    }
    public boolean addC3Charging(C3ChargingAddParam c3ChargingAddParam) {
        C3mCharging one = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getMcuUdid, c3ChargingAddParam.getMcuUdid()));
        if (one != null) {
            throw new BusinessException("硬件设备已存在!");
        }
        if (c3ChargingAddParam.getC3Name() == null || c3ChargingAddParam.getMcuUdid() == null) {
            throw new BusinessException("添加C3充电桩设备出错!");
        }
        C3mCharging c3mCharging = new C3mCharging();
        c3mCharging.setMcuUdid(c3ChargingAddParam.getMcuUdid());
        if (c3ChargingAddParam.getC3Name() != null) {
            c3mCharging.setC3Name(c3ChargingAddParam.getC3Name());
        }
        c3mCharging.setC3Mac(c3ChargingAddParam.getC3Mac());
        return save(c3mCharging);
    }
    public boolean updateC3ChargingName(C3ChargingAddParam c3ChargingAddParam) {
        C3mCharging one = getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getC3Id, c3ChargingAddParam.getC3Id()));
        if (one == null) {
            throw new BusinessException("硬件设备不存在!");
        }
        if (c3ChargingAddParam.getC3Id() == null || c3ChargingAddParam.getC3Name() == null) {
            throw new BusinessException("添加C3充电桩设备出错!");
        }
        C3mCharging c3mCharging = new C3mCharging();
        c3mCharging.setC3Id(c3ChargingAddParam.getC3Id());
        c3mCharging.setC3Name(c3ChargingAddParam.getC3Name());
        return updateById(c3mCharging);
    }
    public C3mCharging getC3mByPoleId(Long poleId) {
        PoleBinding one = bindingService.getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getDeviceType, 2).eq(PoleBinding::getPoleId, poleId));
        if (one == null) {
            throw new BusinessException("未找到绑定关系");
        }
        return getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getC3Mac, one.getDeviceCode()));
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3mChargingChargeService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,159 @@
package com.sandu.ximon.admin.service;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.sandu.common.execption.BusinessException;
import com.sandu.common.service.impl.BaseServiceImpl;
import com.sandu.ximon.admin.param.C3mChargingChargeParam;
import com.sandu.ximon.dao.domain.C3mChargingCharge;
import com.sandu.ximon.dao.domain.PoleBinding;
import com.sandu.ximon.dao.mapper.C3mChargingChargeMapper;
import com.sandu.ximon.dao.mapper.C3mChargingMapper;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
/**
 * @Author liuhaonan
 * @Date 2022/3/10 13:58
 * @Version 1.0
 * c3充电桩费率相关
 */
@Service
@AllArgsConstructor
public class C3mChargingChargeService extends BaseServiceImpl<C3mChargingChargeMapper, C3mChargingCharge> {
    private final C3mChargingChargeMapper c3mChargingChargeMapper;
    private final PoleBindingService bindingService;
    private final C3mChargingMapper chargingMapper;
    /**
     * ä¿®æ”¹è´¹çއ
     *
     * @param chargeEntities
     * @param
     * @return
     */
    public boolean updateCharge(List<C3mChargingCharge> chargeEntities) {
        //  åˆ é™¤åŽŸæœ¬å­˜åœ¨çš„è´¹çŽ‡
        c3mChargingChargeMapper.deleteCharge(chargeEntities.get(0).getC3Id());
        Long timestamp = new Date().getTime();
        //  å°†è´¹çŽ‡æ·»åŠ è‡³æ•°æ®åº“
        for (C3mChargingCharge c3m : chargeEntities) {
            c3m.setTimestamp(timestamp);
            save(c3m);
        }
//        LogService.getBean().log(userId,username,"修改C3m费率",null,
//                "{ "+ JSON.toJSONString(chargeEntities)+" }");
        return true;
    }
    /**
     * æ’入费率
     *
     * @param c3
     * @return
     */
    public boolean initCharge(C3mChargingChargeParam c3) {
        C3mChargingCharge charge = new C3mChargingCharge();
        BeanUtil.copyProperties(c3, charge);
        charge.setTimestamp(new Date().getTime());
//        c3mChargingChargeMapper.insertCharge(charge);
        return save(charge);
    }
    /**
     * è‡ªåŠ¨æ’å…¥é»˜è®¤è´¹çŽ‡
     *
     * @param c3Id
     */
    public void initCharge(Integer c3Id) {
        List<C3mChargingCharge> chargeList = getChargeByC3Id(c3Id);
        if (chargeList.size() == 0) {
            //  ä¸å­˜åœ¨è´¹çŽ‡æ—¶ï¼Œç”Ÿæˆå•ä¸ªè´¹çŽ‡å¹¶æ’å…¥æ•°æ®åº“
            C3mChargingCharge c3mChargeEntity = new C3mChargingCharge();/*C3mChargingCharge.getInitInstance(c3Id);*/
            c3mChargeEntity.setC3Id(c3Id);
            c3mChargeEntity.setHour(0);
            c3mChargeEntity.setMin(0);
            c3mChargeEntity.setCharge(8.8);
            c3mChargeEntity.setTimestamp(new Date().getTime());
            c3mChargingChargeMapper.insertCharge(c3mChargeEntity);
        }
    }
    public List<C3mChargingCharge> getChargeByC3Id(Integer c3Id) {
        //  æŸ¥æ‰¾æ•°æ®åº“所有费率
        List<C3mChargingCharge> list = c3mChargingChargeMapper.getChargeByC3Id(c3Id);
        //  åˆ¤æ–­list为单条直接返回
        if (list.size() < 2) {
            return list;
        }
        //  å°†æ—¶åˆ†è¿›è¡ŒæŽ’序
        Collections.sort(list, new Comparator<C3mChargingCharge>() {
            @Override
            public int compare(C3mChargingCharge o1, C3mChargingCharge o2) {
                int i = o2.getHour().compareTo(o1.getHour());
                if (i == 0) {
                    return o2.getMin().compareTo(o1.getMin());
                }
                return i;
            }
            @Override
            public boolean equals(Object obj) {
                return false;
            }
        });
        //  list翻转
        Collections.reverse(list);
        //  æ—¶é—´æ®µå­—符拼接
        for (int i = 1; i < list.size(); i++) {
            C3mChargingCharge pre = list.get(i - 1);
            C3mChargingCharge now = list.get(i);
            pre.setStrTime(
                    pre.getHour() + "点" + pre.getMin() + "分 åˆ° " +
                            now.getHour() + "点" + now.getMin() + "分"
            );
            if (i == list.size() - 1) {
                pre = now;
                now = list.get(0);
                if (now.getHour() < pre.getHour()) {
                    pre.setStrTime(
                            pre.getHour() + "点" + pre.getMin() + "分 åˆ° " +
                                    "隔日" + now.getHour() + "点" + now.getMin() + "分"
                    );
                } else {
                    pre.setStrTime(
                            pre.getHour() + "点" + pre.getMin() + "分 åˆ° " +
                                    now.getHour() + "点" + now.getMin() + "分"
                    );
                }
            }
        }
        return list;
    }
    /**
     * æ ¹æ®ç¯æ†id查找费率
     *
     * @param poleId
     * @return
     */
    public List<C3mChargingCharge> getChargeByPoleId(Long poleId) {
        PoleBinding one = bindingService.getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getDeviceType, 2).eq(PoleBinding::getPoleId, poleId));
        if (one == null) {
            throw new BusinessException("未找到绑定关系");
        }
        Long c3Id = chargingMapper.getAllByC3Mac(one.getDeviceCode()).getC3Id();
        return getChargeByC3Id(c3Id.intValue());
    }
    public boolean deleteC3mCharging(Integer c3mId) {
        return c3mChargingChargeMapper.deleteCharge(c3mId);
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3mOrderService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,140 @@
package com.sandu.ximon.admin.service;
import com.alibaba.fastjson.JSON;
import com.sandu.common.execption.BusinessException;
import com.sandu.common.service.impl.BaseServiceImpl;
import com.sandu.ximon.admin.config.C3mRedisConfig;
import com.sandu.ximon.admin.pay.wx.WxFastPayService;
import com.sandu.ximon.admin.security.SecurityUtils;
import com.sandu.ximon.admin.security.order.OrderQueryListener;
import com.sandu.ximon.admin.security.order.OrderScanType;
import com.sandu.ximon.admin.utils.AliPayUtils;
import com.sandu.ximon.admin.utils.RedisUtils;
import com.sandu.ximon.admin.vo.C3mOrderVO;
import com.sandu.ximon.dao.domain.C3mCharging;
import com.sandu.ximon.dao.domain.C3mOrder;
import com.sandu.ximon.dao.domain.Pole;
import com.sandu.ximon.dao.enums.C3mRedisConstant;
import com.sandu.ximon.dao.enums.OrderStatus;
import com.sandu.ximon.dao.enums.OrderType;
import com.sandu.ximon.dao.mapper.C3mOrderMapper;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.Date;
/**
 * @Author liuhaonan
 * @Date 2022/3/10 14:24
 * @Version 1.0
 */
@Service
@AllArgsConstructor
public class C3mOrderService extends BaseServiceImpl<C3mOrderMapper, C3mOrder> {
    private final RedisUtils redisUtils;
    private final PoleService poleService;
    private final C3mOrderMapper c3mOrderMapper;
    private final WxFastPayService fastPayService;
    private final OrderQueryListener orderQueryListener;
    public boolean orderRefund(String outTradeNo, Double refundAmount/*, Long userId, String username*/) {
        Long userId = SecurityUtils.getUserId();
        String username = SecurityUtils.getUsername();
        C3mOrder orderByOutTradeNo = c3mOrderMapper.getOrderByOutTradeNo(outTradeNo);
        if (orderByOutTradeNo.getTotalAmount() < refundAmount) {
            throw new BusinessException("退款金额错误,不能大于付款金额");
        }
        if (null == orderByOutTradeNo) {
            return false;
        } else {
            orderByOutTradeNo.setRefundAmount(refundAmount);
            return c3mOrderRefund(orderByOutTradeNo, "页面API退款", userId, username);
        }
    }
    private boolean c3mOrderRefund(C3mOrder C3mOrder, String msg, Long userId, String username) {
        //  è¿›è¡Œé€€æ¬¾ï¼Œè®¾ç½®è®¢å•状态为已退款
        boolean b = false;
        if (C3mOrder.getOrderType().equals(OrderType.ALIPAY.getCode())) {
            b = AliPayUtils.alipayrefund(
                    C3mOrder.getPoleId(),
                    C3mOrder.getOutTradeNo(),
                    C3mOrder.getRefundAmount());
        } else if (C3mOrder.getOrderType().equals(OrderType.WXPAY.getCode())) {
            //  è¿›è¡Œå¾®ä¿¡é€€æ¬¾
            b = fastPayService.refund(
                    C3mOrder.getTotalAmount(),
                    C3mOrder.getRefundAmount(),
                    C3mOrder.getOutTradeNo(),
                    C3mOrder.getPoleId()
            );
        }
        C3mOrder.setRefundTimestamp(new Date().getTime());
        C3mOrder.setRefundMsg(msg);
        if (b) {
            C3mOrder.setOrderStatus(OrderStatus.REFUND.getStatus());
            c3mOrderMapper.updateRefundOrder(C3mOrder);
           /* logService.log(
                    userId,
                    ServerTask.SERVER_TASK,
                    "C3m订单处理",
                    null,
                    "{ æ“ä½œè€…("+username+")" +
                            "订单退款: "+C3mOrder.getOutTradeNo()
                            +",订单总金额:"+C3mOrder.getTotalAmount()
                            +",退款金额: "+C3mOrder.getTotalAmount()+"}");*/
            return true;
        } else {
            C3mOrder.setOrderStatus(OrderStatus.REFUND_FAILED.getStatus());
            c3mOrderMapper.updateRefundOrder(C3mOrder);
           /* logService.log(
                    userId,
                    ServerTask.SERVER_TASK,
                    "C3m订单处理",
                    null,
                    "{ æ“ä½œè€…("+username+")" +
                            "订单退款(失败): "+C3mOrder.getOutTradeNo()
                            +",订单总金额:"+C3mOrder.getTotalAmount()
                            +",退款金额: "+C3mOrder.getTotalAmount()+"}");*/
            return false;
        }
    }
    public C3mOrder advancePayOrder(Long streetlightId, C3mCharging c3m, String orderType, Double totalAmount,
                                    Integer subscribeChargingCapacity) {
        //  åˆ¤æ–­è¯¥å……电桩是否存在正在进行中的订单
        String chargingJson = redisUtils.get(C3mRedisConstant.C3_CHARGING_ORDER.getCode() + c3m.getC3Mac());
        if (null != chargingJson) {
            return null;
        }
        Pole pole = poleService.getById(streetlightId);
        if (null == pole) {
            return null;
        }
        //  ç”Ÿæˆè®¢å•,并加载到redis缓存,设置超时时间为5分钟
        C3mOrder c3mOrderEntity = new C3mOrderVO().generateOrder(
                streetlightId,
                pole.getDeviceCode(),
                c3m.getC3Mac(),
                OrderType.getOrderType(orderType),
                totalAmount,
                subscribeChargingCapacity
        );
        //  åŠ è½½åˆ°redis缓存中, æŸ¥è¯¢æ¨¡å—自动查询状态并处理
        boolean b = redisUtils.set(
                C3mRedisConstant.C3_NO_PAY_ORDER.getCode() + c3m.getC3Mac() + c3mOrderEntity.getOutTradeNo(),
                JSON.toJSONString(c3mOrderEntity),
                C3mRedisConfig.ORDER_MAX_TIME
        );
        //  æŽ¨é€åˆ°è‡ªåŠ¨æŸ¥è¯¢æ¨¡å—ï¼Œè¿›è¡Œæ‰«æå¯åŠ¨
        orderQueryListener.startScan(OrderScanType.C3M.getType());
        return b ? c3mOrderEntity : null;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/ClientService.java
@@ -7,6 +7,7 @@
import com.sandu.common.object.BaseConditionVO;
import com.sandu.common.service.impl.BaseServiceImpl;
import com.sandu.ximon.admin.param.AddClientPrarm;
import com.sandu.ximon.admin.param.ResetClientPasswordPrarm;
import com.sandu.ximon.admin.param.UpdateClientPrarm;
import com.sandu.ximon.admin.security.SecurityUtils;
import com.sandu.ximon.dao.domain.Client;
@@ -14,6 +15,7 @@
import com.sandu.ximon.dao.domain.Role;
import com.sandu.ximon.dao.mapper.ClientMapper;
import lombok.AllArgsConstructor;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
@@ -39,7 +41,11 @@
        if (addClientPrarm.getClientSuperior() != null && !"".equals(addClientPrarm.getClientSuperior())) {
            Client one = getOne(Wrappers.lambdaQuery(Client.class).eq(Client::getClientName, addClientPrarm.getClientSuperior()));
            if (one != null) {
                client.setSuperiorId(one.getId());
                if (one.getSuperiorId() == null) {
                    client.setSuperiorId(one.getId());
                } else {
                    throw new BusinessException("上级客户不能为二级用户");
                }
            } else {
                throw new BusinessException("上级客户不存在");
            }
@@ -108,6 +114,25 @@
        return updateById(client);
    }
    public boolean resetPassword(ResetClientPasswordPrarm resetClientPasswordPrarm) {
        Client client = getOne(Wrappers.lambdaQuery(Client.class).eq(Client::getId, resetClientPasswordPrarm.getId()));
        if (client == null) {
            throw new BusinessException("该用户不存在!");
        }
        PasswordEncoder pw = new BCryptPasswordEncoder();
        //判断旧密码与数据库是否一致
        if (pw.matches(resetClientPasswordPrarm.getOldPassword(), client.getPassword())) {
            //加密新密码
            String encode = pw.encode(resetClientPasswordPrarm.getNewPassword());
            client.setPassword(encode);
            return updateById(client);
        } else {
            throw new BusinessException("旧密码不正确,请重新确认密码!");
        }
    }
    public boolean deleteClient(Long id) {
        //判断删除用户是否存在
        Client one = getById(id);
@@ -152,6 +177,23 @@
    }
    /**
     * \
     * å…¶ä»–类用来查找客户id使用  å¦‚果没有上级客户 è¿™è¿”回用户ID
     *
     * @param
     * @return
     */
    public Long getClientId(Long userId) {
        Client one = getOne(Wrappers.lambdaQuery(Client.class).eq(Client::getId, userId));
        if (one != null && one.getSuperiorId() != null) {
            return one.getSuperiorId();
        } else {
            return userId;
        }
    }
    /**
     * ä¸€çº§å®¢æˆ·è¿”回false  äºŒçº§å®¢æˆ·è¿”回true
     *
     * @return
@@ -166,4 +208,18 @@
        }
    }
    /**
     * ä¸€çº§å®¢æˆ·è¿”回false  äºŒçº§å®¢æˆ·è¿”回true
     *
     * @return
     */
    public boolean findClientId(Long userId) {
        Client one = getOne(Wrappers.lambdaQuery(Client.class).eq(Client::getId, userId));
        if (one != null && one.getSuperiorId() != null) {
            return true;
        } else {
            return false;
        }
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/IpVolumeMissionService.java
@@ -25,7 +25,6 @@
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
@@ -39,6 +38,7 @@
public class IpVolumeMissionService extends BaseServiceImpl<IpVolumeMissionMapper, IpVolumeMission> {
    private final IpVolumeMissionMapper ipVolumeMissionMapper;
    private final ClientService clientService;
    private final IpVolumeService ipVolumeService;
    private final IpVolumeFileService ipVolumeFileService;
    private final BroadcastV2TaskFileService broadcastV2TaskFileService;
    private final BroadcastV2TaskTerminalService broadcastV2TaskTerminalService;
@@ -92,8 +92,8 @@
            taskFileEntity.setFileId(fileId);
            IpVolumeFile fileEntity = ipVolumeFileService.getById(fileId);
            if(fileEntity==null){
                throw new BusinessException("fileId为"+fileId+"的文件不存在");
            if (fileEntity == null) {
                throw new BusinessException("fileId为" + fileId + "的文件不存在");
            }
//            String absolutePath = MinIoConstant.getAbsolutePath(
//                    MinIoConstant.BROADCAST_FILE.getBucketName() + fileEntity.getUserId(),
@@ -355,7 +355,7 @@
        //return new ArrayList<>();
    }
    public IpVolumeMission getByTaskId(Integer taskId) {
    public TaskVO getByTaskId(Integer taskId) {
        TaskVO task = TaskAPIUtils.getTask(taskId);
        if (task == null) {
            throw new BusinessException("服务器未找到该任务");
@@ -365,10 +365,57 @@
        if (byId == null) {
            throw new BusinessException("本地未找到该任务");
        }
        if (SecurityUtils.getClientId() != null) {
            if (clientService.findClientId()) {
                if (byId.getUserId() != SecurityUtils.getUserId()) {
                    throw new BusinessException("任务归属错误");
                }
        byId.setWeeks("0" + Integer.toBinaryString(byId.getWeek()));
            } else {
                if (byId.getClientId() != SecurityUtils.getUserId()) {
                    throw new BusinessException("任务归属错误");
                }
            }
        return byId;
        }
        task.setWeeks("0" + Integer.toBinaryString(byId.getWeek()));
//        byId.setWeeks("0" + Integer.toBinaryString(byId.getWeek()));
        task.setBdate(byId.getOnDate());
        task.setEdate(byId.getOffDate());
        List<BroadcastV2TaskFile> taskFiles = broadcastV2TaskFileService.list(Wrappers.lambdaQuery(BroadcastV2TaskFile.class)
                .eq(BroadcastV2TaskFile::getTaskId, taskId));
        List<BroadcastV2TaskTerminal> taskTerminals = broadcastV2TaskTerminalService.list(Wrappers.lambdaQuery(BroadcastV2TaskTerminal.class)
                .eq(BroadcastV2TaskTerminal::getTaskId, taskId));
        if (!taskFiles.isEmpty()) {
            taskFiles.forEach(
                    fileId -> {
//                           IpVolumeFile volumeFile = ipVolumeFileService.getById(fileId.getFileId());
//                           if(volumeFile==null){
//                               throw new BusinessException("任务文件不存在");
//                           }
                        task.getFileIds().add(fileId.getFileId());
//                           byId.getFileIds().add(fileId.getFileId());
                    }
            );
        }
        if (!taskTerminals.isEmpty()) {
            taskTerminals.forEach(
                    terminalId -> {
//                        BroadcastTerminalV2Entity v2Entity = ipVolumeService.getById(terminalId.getTerminalId());
//                        if(v2Entity==null){
//                            throw new BusinessException("该任务暂无设备使用");
//                        }
                        task.getTerminalIds().add(terminalId.getTerminalId());
//                        byId.getTerminalIds().add(terminalId.getTerminalId());
                    }
            );
        }
        return task;
    }
ximon-admin/src/main/java/com/sandu/ximon/admin/service/LEDProgramFileService.java
@@ -17,6 +17,7 @@
public class LEDProgramFileService extends BaseServiceImpl<LEDProgramFileMapper, LEDProgramFile> {
    private final LEDProgramFileMapper ledProgramFileMapper;
    private final ClientService clientService;
    public boolean addProgramFile(LEDProgramFileParam param) {
        LEDProgramFile file = new LEDProgramFile();
@@ -25,6 +26,9 @@
        if (SecurityUtils.getClientId() != null) {
            file.setUserName(SecurityUtils.getUsername());
        }
//        if("mp4".equals(fileUploadDto.getFileType())){
//            fileUploadDto.setScreenShot(fileUploadDto.getFileUrl()+"?x-oss-process=video/snapshot,t_10000,m_fast");
//        }
        return save(file);
    }
ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightPoleHeelingProcessingServices.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.sandu.ximon.admin.service;
import com.sandu.common.service.impl.BaseServiceImpl;
import com.sandu.ximon.admin.param.LightPoleHeelingProcessingParam;
import com.sandu.ximon.dao.domain.LightPoleHeelingProcessing;
import com.sandu.ximon.dao.mapper.LightPoleHeelingProcessingMapper;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
/**
 * @author ZZQ
 * @date 2022/3/25 11:41
 */
@Service
@AllArgsConstructor
public class LightPoleHeelingProcessingServices extends BaseServiceImpl<LightPoleHeelingProcessingMapper, LightPoleHeelingProcessing> {
    /**
     * ç¯æ†å€¾æ–œè­¦å‘Šå¤„理
     */
    public boolean ProcessingLightPoleHeeling(LightPoleHeelingProcessingParam param) {
        LightPoleHeelingProcessing lightPoleHeelingProcessing = new LightPoleHeelingProcessing();
        lightPoleHeelingProcessing.setProcessingPerson(param.getProcessingPerson());
        lightPoleHeelingProcessing.setProcessingState(param.getProcessingState());
        lightPoleHeelingProcessing.setTheXAxis(param.getTheXAxis());
        lightPoleHeelingProcessing.setTheYAxis(param.getTheYAxis());
        lightPoleHeelingProcessing.setTheZAxis(param.getTheZAxis());
        return save(lightPoleHeelingProcessing);
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightPoleHeelingService.java
@@ -2,10 +2,20 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.pagehelper.PageHelper;
import com.sandu.common.execption.BusinessException;
import com.sandu.common.object.BaseConditionVO;
import com.sandu.common.service.impl.BaseServiceImpl;
import com.sandu.ximon.dao.domain.AirData;
import com.sandu.ximon.dao.domain.ForHelp;
import com.sandu.ximon.admin.manager.iot.frame.A5Frame;
import com.sandu.ximon.admin.manager.iot.frame.inner.report.*;
import com.sandu.ximon.admin.manager.iot.frame.inner.request.*;
import com.sandu.ximon.admin.manager.iot.rrpc.dto.CommonFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.A5OrderEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.mainboard.MainBoardInvokeSyncService;
import com.sandu.ximon.admin.param.LightPoleHeelingListParam;
import com.sandu.ximon.dao.domain.Light;
import com.sandu.ximon.dao.domain.LightPoleHeeling;
import com.sandu.ximon.dao.domain.PoleBinding;
import com.sandu.ximon.dao.mapper.LightPoleHeelingMapper;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
@@ -15,34 +25,182 @@
@Service
@AllArgsConstructor
public class LightPoleHeelingService extends BaseServiceImpl<LightPoleHeelingMapper, LightPoleHeeling> {
    /**
     * æŸ¥è¯¢å…¨éƒ¨ç¯æ†å€¾ä¾§å‘Šè­¦
     */
    public List<LightPoleHeeling> listLightPoleHeeling() {
        LambdaQueryWrapper<LightPoleHeeling> wrapper = Wrappers.lambdaQuery(LightPoleHeeling.class);
        List<LightPoleHeeling> list = list(wrapper);
        return list;
    }
    private LightPoleHeelingMapper lightPoleHeelingMapper;
    /**
     * æ¨¡ç³ŠæŸ¥è¯¢
     */
    public List<LightPoleHeeling> listLightPoleHeelingByKeyword(String keyword) {
        LambdaQueryWrapper<LightPoleHeeling> wrapper = Wrappers.lambdaQuery(LightPoleHeeling.class);
        if (keyword != null) {
            wrapper.like(LightPoleHeeling::getLightPoleName, keyword).or(
                    lambdaQueryWrapper -> {
                        lambdaQueryWrapper.like(LightPoleHeeling::getLightPoleId, keyword);
                    }
            ).or(
                    lambdaQueryWrapper -> {
                        lambdaQueryWrapper.like(LightPoleHeeling::getWarningNumber, keyword);
                    }
            );
    public List<LightPoleHeeling> listLightPoleHeelingByKeyword(BaseConditionVO baseConditionVO, LightPoleHeelingListParam lightPoleHeelingListParam) {
        PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
        if (lightPoleHeelingListParam == null) {
            lightPoleHeelingListParam = new LightPoleHeelingListParam();
        }
        List<LightPoleHeeling> forHelpList = list(wrapper);
        return forHelpList;
        //关键字去除空格
        if (lightPoleHeelingListParam.getKeyword() != null) {
            lightPoleHeelingListParam.setKeyword(lightPoleHeelingListParam.getKeyword().trim());
        }
        List<LightPoleHeeling> lightPoleHeelings
                = lightPoleHeelingMapper.listLightPoleHeeling(lightPoleHeelingListParam.getKeyword(), lightPoleHeelingListParam.getProcessingState());
        return lightPoleHeelings;
    }
    /**
     * ç¯æ†å€¾æ–œå¿ƒè·³åŒ…
     *
     * @param deviceName
     */
    public A5LightPoleHeelingHeartbeatReportInnerFrame.HeartBeatDataPackage LightPoleHeelingHeartbeatPackage(String deviceName) {
        LightPoleHeelingHeartbeatPackageReqInnerFrame lightPoleHeelingHeartbeatPackageReqInnerFrame = new LightPoleHeelingHeartbeatPackageReqInnerFrame();
        A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_POLE_MONITOR_DATA.getCode(), lightPoleHeelingHeartbeatPackageReqInnerFrame);
        System.out.println(a5Frame + "            -----a5Frame");
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(deviceName, a5Frame);
        System.out.println(commonFrame + "            -----commonFrame");
        A5LightPoleHeelingHeartbeatReportInnerFrame heartbeatReportInnerFrame
                = new A5LightPoleHeelingHeartbeatReportInnerFrame().transformFrame(commonFrame.getPayload());
        if (heartbeatReportInnerFrame.isValidate()) {
            //灯杆倾斜心跳包保存数据库
            saveLightPoleHeelingHeartbeat(deviceName, heartbeatReportInnerFrame.getHeartBeatDataPackage());
            return heartbeatReportInnerFrame.getHeartBeatDataPackage();
        } else {
            throw new BusinessException("数据校验错误,请重新请求");
        }
    }
    /**
     * æŸ¥è¯¢å¿ƒè·³åŒ…间隔时间
     *
     * @param deviceName
     */
    public String QueryIntervalTime(String deviceName) {
        LightPoleHeelingQueryIntervalTimeReqInnerFrame queryIntervalTimeReqInnerFrame
                = new LightPoleHeelingQueryIntervalTimeReqInnerFrame();
        A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_POLE_MONITOR_DATA.getCode(), queryIntervalTimeReqInnerFrame);
        System.out.println(a5Frame + "            -----a5Frame");
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(deviceName, a5Frame);
        System.out.println(commonFrame + "            -----commonFrame");
        A5LightPoleHeelingQueryReportInnerFrame queryReportInnerFrame = new A5LightPoleHeelingQueryReportInnerFrame().transformFrame(commonFrame.getPayload());
        if (queryReportInnerFrame.isValidate()) {
            return queryReportInnerFrame.getIntervalTime();
        } else {
            throw new BusinessException("数据校验错误,请重新请求");
        }
    }
    /**
     * è½¯é‡å¯
     *
     * @param deviceName
     */
    public String RestartLightPoleHeeling(String deviceName) {
        LightPoleHeelingRestartReqInnerFrame restartReqInnerFrame
                = new LightPoleHeelingRestartReqInnerFrame();
        A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_POLE_MONITOR_DATA.getCode(), restartReqInnerFrame);
        System.out.println(a5Frame + "            -----a5Frame");
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(deviceName, a5Frame);
        System.out.println(commonFrame + "            -----commonFrame");
        A5LightPoleHeelingOperationReportInnerFrame operationReportInnerFrame
                = new A5LightPoleHeelingOperationReportInnerFrame().transformFrame(commonFrame.getPayload());
        if (operationReportInnerFrame.isValidate()) {
            return operationReportInnerFrame.getState();
        } else {
            throw new BusinessException("数据校验错误,请重新请求");
        }
    }
    /**
     * è®¾ç½®å¿ƒè·³åŒ…间隔时间(秒)
     *
     * @param devicesName
     * @param setTime
     * @return
     */
    public String SetHeartbeatPacketTime(String devicesName, int setTime) {
        if (setTime <= 0) {
            throw new BusinessException("设置的心跳包间隔时间错误!");
        }
        LightPoleHeelingSetHeartbeatPacketTimeReqInnerFrame setHeartbeatPacketTimeReqInnerFrame =
                new LightPoleHeelingSetHeartbeatPacketTimeReqInnerFrame(setTime);
        A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_POLE_MONITOR_DATA.getCode(), setHeartbeatPacketTimeReqInnerFrame);
        System.out.println(a5Frame + "            -----a5Frame");
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(devicesName, a5Frame);
        System.out.println(commonFrame + "            -----commonFrame");
        A5LightPoleHeelingOperationReportInnerFrame operationReportInnerFrame
                = new A5LightPoleHeelingOperationReportInnerFrame().transformFrame(commonFrame.getPayload());
        if (operationReportInnerFrame.isValidate()) {
            return operationReportInnerFrame.getState();
        } else {
            throw new BusinessException("数据校验错误,请重新请求");
        }
    }
    /**
     * è®¾ç½®ä¼ æ„Ÿå™¨ä¸ºåˆå§‹çŠ¶æ€
     *
     * @return
     */
    public String SetSensorState(String devicesName) {
        LightPoleHeelingSetSensorStateReqInnerFrame setSensorStateReqInnerFrame =
                new LightPoleHeelingSetSensorStateReqInnerFrame();
        A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_POLE_MONITOR_DATA.getCode(), setSensorStateReqInnerFrame);
        System.out.println(a5Frame + "            -----a5Frame");
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(devicesName, a5Frame);
        System.out.println(commonFrame + "            -----commonFrame");
        A5LightPoleHeelingOperationReportInnerFrame operationReportInnerFrame
                = new A5LightPoleHeelingOperationReportInnerFrame().transformFrame(commonFrame.getPayload());
        if (operationReportInnerFrame.isValidate()) {
            return operationReportInnerFrame.getState();
        } else {
            throw new BusinessException("数据校验错误,请重新请求");
        }
    }
    /**
     * ä¿å­˜å¿ƒè·³åŒ…数据
     *
     * @param deviceName
     * @param heartBeatDataPackage
     * @return
     */
    public boolean saveLightPoleHeelingHeartbeat(String deviceName, A5LightPoleHeelingHeartbeatReportInnerFrame.HeartBeatDataPackage heartBeatDataPackage) {
        LightPoleHeeling lightPoleHeeling = new LightPoleHeeling();
        lightPoleHeeling.setMac(deviceName);
        lightPoleHeeling.setTheXAxis(heartBeatDataPackage.getTheXAxis());
        lightPoleHeeling.setTheYAxis(heartBeatDataPackage.getTheYAxis());
        lightPoleHeeling.setTheZAxis(heartBeatDataPackage.getTheZAxis());
        if (Math.abs(heartBeatDataPackage.getTheXAxis()) >= 10 || Math.abs(heartBeatDataPackage.getTheYAxis()) >= 10) {
            lightPoleHeeling.setWarningLevel(1);//一级警告
        } else if ((Math.abs(heartBeatDataPackage.getTheXAxis()) >= 5 && Math.abs(heartBeatDataPackage.getTheXAxis()) < 10)
                || (Math.abs(heartBeatDataPackage.getTheYAxis()) >= 5 && Math.abs(heartBeatDataPackage.getTheYAxis()) < 10)) {
            lightPoleHeeling.setWarningLevel(2);//二级警告
        } else {
            lightPoleHeeling.setWarningLevel(0);//正常
        }
        return save(lightPoleHeeling);
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightTaskService.java
@@ -222,10 +222,17 @@
            throw new BusinessException("删除任务失败");
        }
        boolean del;
        // åˆ é™¤ç»‘定灯杆
        if (!lightTaskPoleRelationService.remove(Wrappers.lambdaQuery(LightTaskPoleRelation.class).in(LightTaskPoleRelation::getTaskId, taskIdList))) {
            throw new BusinessException("删除绑定灯杆失败");
        }
//        if (!lightTaskPoleRelationService.remove(Wrappers.lambdaQuery(LightTaskPoleRelation.class).notIn(LightTaskPoleRelation::getTaskId, taskIdList))) {
//            throw new BusinessException("未找到任务/灯杆绑定关系");
//        }
//        lightTaskPoleRelationService.remove(Wrappers.lambdaQuery(LightTaskPoleRelation.class).in(LightTaskPoleRelation::getTaskId, taskIdList));
        taskIdList.forEach(
                taskId->{
                    lightTaskPoleRelationService.remove(Wrappers.lambdaQuery(LightTaskPoleRelation.class).eq(LightTaskPoleRelation::getTaskId,taskId));
                }
        );
        return true;
    }
ximon-admin/src/main/java/com/sandu/ximon/admin/service/MenuService.java
@@ -2,6 +2,7 @@
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.sandu.common.enums.RoleLevelStatus;
import com.sandu.common.execption.BusinessException;
@@ -100,7 +101,8 @@
    }
    public List<MenuNode> treeList() {
        List<Menu> list = list();
        LambdaQueryWrapper<Menu> menuLambdaQueryWrapper = Wrappers.lambdaQuery(Menu.class).orderByAsc(Menu::getSeq);
        List<Menu> list = list(menuLambdaQueryWrapper);
        return list.stream()
                .filter(menu -> menu.getPid().equals(0L))
                .map(menu -> covertMenuNode(menu, list)).collect(Collectors.toList());
ximon-admin/src/main/java/com/sandu/ximon/admin/service/MonitorService.java
@@ -109,13 +109,15 @@
     * @param deviceSerial è®¾å¤‡åºåˆ—号,存在英文字母的设备序列号,字母需为大写
     *                     //     * @param validateCode è®¾å¤‡éªŒè¯ç ï¼Œè®¾å¤‡æœºèº«ä¸Šçš„六位大写字母
     */
//    public YSY_MonitorDto addYSYMonitor(String accessToken, String deviceSerial, String validateCode) {
    public YSY_MonitorDto addYSYMonitor(String accessToken, String deviceSerial) {
    public YSY_MonitorDto addYSYMonitor(String accessToken, String deviceSerial, String validateCode) {
//    public YSY_MonitorDto addYSYMonitor(String accessToken, String deviceSerial) {
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("accessToken", accessToken);
        paramMap.put("deviceSerial", deviceSerial);
//        paramMap.put("validateCode", validateCode);
        if(validateCode != null ){
            paramMap.put("validateCode", validateCode);
        }
        String s = HttpUtil.post(YSY_URL + ADD_DEVICE_URL, paramMap);
        System.out.println(s);
        YSY_MonitorDto monitorDto = JSON.parseObject(s, YSY_MonitorDto.class);
ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleService.java
@@ -8,6 +8,7 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.pagehelper.PageHelper;
import com.sandu.common.execption.BusinessException;
import com.sandu.common.object.BaseConditionVO;
import com.sandu.common.redis.RedisService;
import com.sandu.common.service.impl.BaseServiceImpl;
import com.sandu.ximon.admin.dto.DeviceStatus;
@@ -60,6 +61,7 @@
    private final RedisService redisService;
    private final PoleBindingService poleBindingService;
    private final PoleGroupRelationService groupRelationService;
    private final ClientService clientService;
    public boolean addPole(PoleParam param) {
        Pole pole = new Pole();
@@ -567,16 +569,29 @@
        }
        Pole pole = new Pole();
        String strh = uniqueMac.substring(uniqueMac.length() - 2, uniqueMac.length());
        pole.setDeviceCode(strh);
        pole.setPoleName(strh);
        String strm = uniqueMac.substring(0, uniqueMac.length() - 2);
        int i = Integer.parseInt(strm);
        pole.setPoleCode(generatePoleCode());
        pole.setDeviceType(i);
        setMac = save(pole);
      /*  String type = uniqueMac.substring(uniqueMac.length() - 2, uniqueMac.length());
        String Code = uniqueMac.substring(0, uniqueMac.length() - 2);*/
        pole.setDeviceCode(uniqueMac);
        pole.setPoleName(uniqueMac);
      /*  int i = Integer.parseInt(strm);*/
        if("00".equals(a1DeviceMacRespInnerFrame.getType())){
            pole.setDeviceType(0);
        }else if("01".equals(a1DeviceMacRespInnerFrame.getType())){
            pole.setDeviceType(1);
        }
        return setMac;
        pole.setPoleCode(generatePoleCode());
        Pole one = getOne(Wrappers.lambdaQuery(Pole.class).eq(Pole::getDeviceCode, uniqueMac));
//        setMac = save(pole);
        if(one==null){
            return save(pole);
        }else {
            pole.setId(one.getId());
            return updateById(pole);
        }
    }
    public List<String> listDeviceCodeByIds(List<Long> poleIdList) {
@@ -626,7 +641,10 @@
            if (pole == null) {
                throw new BusinessException("灯杆不存在");
            }
            pole.setClientId(clientId);
            pole.setUserId(clientId);
            if(!clientService.findClientId(clientId)){
                pole.setClientId(clientService.getClientId(clientId));
            }
            r = updateById(pole);
            if (!r) {
@@ -636,4 +654,44 @@
        }
        return r;
    }
    public List<Pole> getOwnerPole(BaseConditionVO baseConditionVO, String keyword,Long cilentId) {
        LambdaQueryWrapper<Pole> eq;
//        if(SecurityUtils.getClientId()!=null){
            PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
            if(clientService.findClientId(cilentId)){
                eq = Wrappers.lambdaQuery(Pole.class).eq(Pole::getUserId, cilentId);
            }else{
                PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
                eq = Wrappers.lambdaQuery(Pole.class).eq(Pole::getClientId, cilentId)
                        .or(
                                pole->{
                                    pole.eq(Pole::getUserId, cilentId);
                                }
                        );
            }
//        }else {
//            PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
//            eq = Wrappers.lambdaQuery(Pole.class);
//        }
        PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
        if (!keyword.isEmpty()){
            eq.like(Pole::getPoleName,keyword).or(
                    code->{
                        code.like(Pole::getPoleCode,keyword);
                    }
            ).or(
                    deviceCode->{
                        deviceCode.like(Pole::getDeviceCode,keyword);
                    }
            );
        }
        List<Pole> list ;
        list =list(eq);
        setCount(list);
        setOnline(list);
        return list;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/XiXunPlayerService.java
@@ -13,6 +13,7 @@
import com.sandu.ximon.admin.utils.JsonUtil;
import com.sandu.ximon.admin.utils.LightemitUtils;
import com.sandu.ximon.admin.utils.LogUtils;
import com.sandu.ximon.dao.domain.LedSFile;
import com.sandu.ximon.dao.domain.PoleLightemitEntity;
import com.sandu.ximon.dao.domain.PoleXixunPlayerEntity;
import com.sandu.ximon.dao.mapper.PoleXixunPlayerEntityMapper;
@@ -34,6 +35,7 @@
    private final RealtimeServerBean realtimeServerBean;
    private final PoleLightemitService poleLightemitService;
    private final ClientService clientService;
    private final LedSFileService xiXunFileService;
    public boolean insert(ProgramPro programPro) {
@@ -44,6 +46,7 @@
        poleXixunPlayer.setHeight(programPro.getHeight());
        poleXixunPlayer.setWidth(programPro.getWidth());
        poleXixunPlayer.setTotalSize((float) programPro.getTotalSize() / 1000000 + "MB");
//        poleXixunPlayer.setTotalSize( Long.parseLong(programPro.getTotalSize()) / 1000000 + "MB");
//        programPro.setProgramId(poleXixunPlayer.getProgramId());
//        System.out.println(poleXixunPlayer.getProgramId());
        poleXixunPlayer.setRequestBody(json);
@@ -68,6 +71,8 @@
    public Object getByPid(Long pid) {
        PoleXixunPlayerEntity byId = getById(pid);
        List<Long> fileIds=new ArrayList<>();
        List<LedSFile> file=new ArrayList<>();
        if (byId == null) {
            throw new BusinessException("未找到该节目");
        }
@@ -77,6 +82,17 @@
            programPro = JsonUtil.convertJsonStringToObject(json, ProgramPro.class);
            programPro.setProgramId(pid);
            programPro.setScreenShot(byId.getScreenShot());
            programPro.getLayers().forEach(
                    layerPro -> {
                        layerPro.getSources().forEach(
                              sourcePro -> {
                                  long fileId = Long.parseLong(sourcePro.getId());
                                  file.add(xiXunFileService.getById(fileId));
                              }
                        );
                    }
            );
            programPro.setFileList(file);
        } catch (Exception e) {
            e.printStackTrace();
        }
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/AliPayUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,124 @@
package com.sandu.ximon.admin.utils;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeRefundModel;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.response.AlipayTradeRefundResponse;
import com.google.gson.Gson;
import com.sandu.ximon.admin.config.AlipayConfig;
import com.sandu.ximon.admin.pay.alipay.UsrAlipayConfigService;
import com.sandu.ximon.dao.domain.AliConfigEntity;
import com.sandu.ximon.dao.domain.WxConfigEntity;
import lombok.AllArgsConstructor;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
@AllArgsConstructor
public class AliPayUtils {
    public static boolean alipayQuery(String out_trade_no, Long streetlightId) {
        AliConfigEntity aliConfigEntity = UsrAlipayConfigService.getBean().getConfigByPoleId(streetlightId);// èŽ·å–å®¢æˆ·çš„æ”¯ä»˜å®é…ç½®
        String checkStr = ConfigCheckUtils.checkAlipayConfig(aliConfigEntity);
        if (checkStr != null) {
            LogUtils.error("查询失败");
            return false;
        }
        //获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl,
                aliConfigEntity.getAppId(), aliConfigEntity.getPrivateKey(),
                AlipayConfig.format, AlipayConfig.charset, aliConfigEntity.
                getPublicKey(), AlipayConfig.sign_type);
        //设置请求参数
        AlipayTradeQueryRequest alipayRequest = new AlipayTradeQueryRequest();
        //商户订单号,商户网站订单系统中唯一订单号
        alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\"}");
        //请求
        String result = null;
        try {
            result = alipayClient.execute(alipayRequest).getBody();
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        Map map = (Map) new Gson().fromJson(result, Map.class).get("alipay_trade_query_response");
        if (map.get("sub_msg") != null) {
            if ("交易不存在".equals(map.get("sub_msg"))) {
                return false;
            }
        }
        if (map.get("trade_status") == null) {
            return false;
        }
        if ("TRADE_SUCCESS".equals(map.get("trade_status"))) {
//            String payTime = (String) map.get("send_pay_date");
            return true;
        } else if ("TRADE_CLOSED".equals(map.get("trade_status"))) {
            LogUtils.error("交易已关闭(支付宝)");
            return false;
        }
        return false;
    }
    /**
     * æ”¯ä»˜å®é€€æ¬¾æŽ¥å£
     *
     * @return
     */
    public static boolean alipayrefund(Long streetlightId,
                                       String out_trade_no,
                                       Double refundAmount) {
        //LogService.getBean().log((long)0, ServerTask.SERVER_TASK,"退款操作",null,"{ è¿›è¡Œæ”¯ä»˜å®é€€æ¬¾:"+out_trade_no+" }");
        //退款金额,不能大于订单总金额
        String refund_amount = refundAmount + "";
        //退款的原因说明
        String refund_reason = "充电桩退款";
        //标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传。
        String out_request_no = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
        AliConfigEntity AliConfigEntity = UsrAlipayConfigService.getBean().getConfigByPoleId(streetlightId);   //找到是哪个客户的充电桩  å°±é€€æ¬¾ç»™è°
        String checkStr = ConfigCheckUtils.checkAlipayConfig(AliConfigEntity);
        if (checkStr != null) {
            return false;
        }
        // SDK å…¬å…±è¯·æ±‚类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签
        AlipayClient client = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AliConfigEntity.getAppId(),
                AliConfigEntity.getPrivateKey(), AlipayConfig.format,
                AlipayConfig.charset, AliConfigEntity.getPublicKey(), AlipayConfig.sign_type);
        AlipayTradeRefundRequest alipay_request = new AlipayTradeRefundRequest();
        AlipayTradeRefundModel model = new AlipayTradeRefundModel();
        model.setOutTradeNo(out_trade_no);
//        model.setTradeNo(out_trade_no);
        model.setRefundAmount(refund_amount);
        model.setRefundReason(refund_reason);
        model.setOutRequestNo(out_request_no);
        alipay_request.setBizModel(model);
        AlipayTradeRefundResponse alipay_response = null;
        try {
            alipay_response = client.execute(alipay_request);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
//        System.out.println(alipay_response.getBody());
        if ("10000".equals(alipay_response.getCode())) {
            //  é€€æ¬¾æˆåŠŸ
            //   LogService.getBean().log((long)0, ServerTask.SERVER_TASK,"退款操作",null,"{ è¿›è¡Œæ”¯ä»˜å®é€€æ¬¾(成功):"+out_trade_no+",退款金额:"+refundAmount+" }");
            return true;
        }
        //保存退款金额和退款单号,将订单状态置为完成(RFERROR),保存到数据库
        //  LogService.getBean().log((long)0, ServerTask.SERVER_TASK,"退款操作",null,"{ è¿›è¡Œæ”¯ä»˜å®é€€æ¬¾(失败):"+out_trade_no+",退款金额:"+refundAmount+",reason: "+ JSON.toJSONString(alipay_response)+" }");
        return false;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/ConfigCheckUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.sandu.ximon.admin.utils;
import com.sandu.ximon.dao.domain.AliConfigEntity;
import org.springframework.stereotype.Component;
@Component
public class ConfigCheckUtils {
    public static String checkAlipayConfig(AliConfigEntity WxConfigEntity) {
        if(WxConfigEntity == null) {
            return "下单失败!请联系管理员处理!错误码:100";
        } else if (WxConfigEntity.getAppId() == null || WxConfigEntity.getPrivateKey() == null || WxConfigEntity.getPublicKey() == null) {
            return "下单失败!请联系管理员处理!错误码:101";
        }
        return null;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/DateUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,260 @@
package com.sandu.ximon.admin.utils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import javax.validation.constraints.NotNull;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
 * æ—¥æœŸå¤„理
 *
 * @author Mark sunlightcs@gmail.com
 */
public class DateUtils {
    /**
     * æ—¶é—´æ ¼å¼(yyyy-MM-dd)
     */
    public final static String DATE_PATTERN = "yyyy-MM-dd";
    /**
     * æ—¶é—´æ ¼å¼(yyyy-MM-dd HH:mm:ss)
     */
    public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
    public final static String ORDER_DATE = "yyyyMMddHHmmss";
    public final static String DATE_TIME_SEC_PATTERN = "yyyy-MM-dd HH:mm:ss.SSS";
    public static Date timestamp2DateTimePattern(Long timestamp) {
        return stringToDate(timestamp + "", DATE_TIME_SEC_PATTERN);
    }
    /**
     * æ—¥æœŸæ ¼å¼åŒ– æ—¥æœŸæ ¼å¼ä¸ºï¼šyyyy-MM-dd
     *
     * @param date æ—¥æœŸ
     * @return è¿”回yyyy-MM-dd格式日期
     */
    public static String format(Date date) {
        return format(date, DATE_PATTERN);
    }
    public static String orderFormat(Date date) {
        return format(date, ORDER_DATE);
    }
    public static String dateFormat(Date date) {
        return format(date, DATE_TIME_PATTERN);
    }
    public static String dateFormatSec(Date date) {
        return format(date, DATE_TIME_SEC_PATTERN);
    }
    /**
     * æ—¥æœŸæ ¼å¼åŒ– æ—¥æœŸæ ¼å¼ä¸ºï¼šyyyy-MM-dd
     *
     * @param date    æ—¥æœŸ
     * @param pattern æ ¼å¼ï¼Œå¦‚:DateUtils.DATE_TIME_PATTERN
     * @return è¿”回yyyy-MM-dd格式日期
     */
    public static String format(Date date, String pattern) {
        if (date != null) {
            SimpleDateFormat df = new SimpleDateFormat(pattern);
            return df.format(date);
        }
        return null;
    }
    /**
     * å­—符串转换成日期
     *
     * @param strDate æ—¥æœŸå­—符串
     * @param pattern æ—¥æœŸçš„æ ¼å¼ï¼Œå¦‚:DateUtils.DATE_TIME_PATTERN
     */
    public static Date stringToDate(String strDate, String pattern) {
        if (StringUtils.isBlank(strDate)) {
            return null;
        }
        DateTimeFormatter fmt = DateTimeFormat.forPattern(pattern);
        return fmt.parseLocalDateTime(strDate).toDate();
    }
    /**
     * æ ¹æ®å‘¨æ•°ï¼ŒèŽ·å–å¼€å§‹æ—¥æœŸã€ç»“æŸæ—¥æœŸ
     *
     * @param week å‘¨æœŸ  0本周,-1上周,-2上上周,1下周,2下下周
     * @return è¿”回date[0]开始日期、date[1]结束日期
     */
    public static Date[] getWeekStartAndEnd(int week) {
        DateTime dateTime = new DateTime();
        LocalDate date = new LocalDate(dateTime.plusWeeks(week));
        date = date.dayOfWeek().withMinimumValue();
        Date beginDate = date.toDate();
        Date endDate = date.plusDays(6).toDate();
        return new Date[]{beginDate, endDate};
    }
    /**
     * å¯¹æ—¥æœŸçš„【秒】进行加/减
     *
     * @param date    æ—¥æœŸ
     * @param seconds ç§’数,负数为减
     * @return åŠ /减几秒后的日期
     */
    public static Date addDateSeconds(Date date, int seconds) {
        DateTime dateTime = new DateTime(date);
        return dateTime.plusSeconds(seconds).toDate();
    }
    /**
     * å¯¹æ—¥æœŸçš„【分钟】进行加/减
     *
     * @param date    æ—¥æœŸ
     * @param minutes åˆ†é’Ÿæ•°ï¼Œè´Ÿæ•°ä¸ºå‡
     * @return åŠ /减几分钟后的日期
     */
    public static Date addDateMinutes(Date date, int minutes) {
        DateTime dateTime = new DateTime(date);
        return dateTime.plusMinutes(minutes).toDate();
    }
    /**
     * å¯¹æ—¥æœŸçš„【小时】进行加/减
     *
     * @param date  æ—¥æœŸ
     * @param hours å°æ—¶æ•°ï¼Œè´Ÿæ•°ä¸ºå‡
     * @return åŠ /减几小时后的日期
     */
    public static Date addDateHours(Date date, int hours) {
        DateTime dateTime = new DateTime(date);
        return dateTime.plusHours(hours).toDate();
    }
    /**
     * å¯¹æ—¥æœŸçš„【天】进行加/减
     *
     * @param date æ—¥æœŸ
     * @param days å¤©æ•°ï¼Œè´Ÿæ•°ä¸ºå‡
     * @return åŠ /减几天后的日期
     */
    public static Date addDateDays(Date date, int days) {
        DateTime dateTime = new DateTime(date);
        return dateTime.plusDays(days).toDate();
    }
    /**
     * å¯¹æ—¥æœŸçš„【周】进行加/减
     *
     * @param date  æ—¥æœŸ
     * @param weeks å‘¨æ•°ï¼Œè´Ÿæ•°ä¸ºå‡
     * @return åŠ /减几周后的日期
     */
    public static Date addDateWeeks(Date date, int weeks) {
        DateTime dateTime = new DateTime(date);
        return dateTime.plusWeeks(weeks).toDate();
    }
    /**
     * å¯¹æ—¥æœŸçš„【月】进行加/减
     *
     * @param date   æ—¥æœŸ
     * @param months æœˆæ•°ï¼Œè´Ÿæ•°ä¸ºå‡
     * @return åŠ /减几月后的日期
     */
    public static Date addDateMonths(Date date, int months) {
        DateTime dateTime = new DateTime(date);
        return dateTime.plusMonths(months).toDate();
    }
    /**
     * å¯¹æ—¥æœŸçš„【年】进行加/减
     *
     * @param date  æ—¥æœŸ
     * @param years å¹´æ•°ï¼Œè´Ÿæ•°ä¸ºå‡
     * @return åŠ /减几年后的日期
     */
    public static Date addDateYears(Date date, int years) {
        DateTime dateTime = new DateTime(date);
        return dateTime.plusYears(years).toDate();
    }
    /**
     * èŽ·å–ä¸¤ä¸ªæ—¶é—´å¤©æ•°å·®
     *
     * @param oDate
     * @param nDate
     * @return
     */
    public static Long betweenDateDay(@NotNull Date oDate, @NotNull Date nDate) {
        return Long.valueOf((nDate.getTime() - nDate.getTime())) / (1000 * 60 * 60 * 24);
    }
    /**
     * èŽ·å–ä¸¤ä¸ªæ—¶é—´å°æ—¶å·®
     *
     * @param oDate
     * @param nDate
     * @return
     */
    public static Long betweenDateHours(@NotNull Date oDate, @NotNull Date nDate) {
        return Long.valueOf((nDate.getTime() - oDate.getTime())) / (1000 * 60 * 60);
    }
    /**
     * èŽ·å–æœ¬æœˆç¬¬ä¸€å¤©
     *
     * @return
     */
    public static Date getMonthFirstDay() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_MONTH,
                calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
        return calendar.getTime();
    }
    /**
     * èŽ·å–æœ¬æœˆæœ€åŽä¸€å¤©
     *
     * @return
     */
    public static Date getMonthLastDay() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_MONTH,
                calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        return calendar.getTime();
    }
    public static String toChineseDateStr(long ms) {
        StringBuffer sb = new StringBuffer();
        //  èŽ·å–æ€»ç§’æ•°
        Long sec = ms / 1000;
        ms = ms % 1000;
        String msStr = "";//SuppDataUtils.SuppData(ms+"",3);
        //  ç§’数大于60时
        if (sec > 60) {
            long min = sec / 60;
            sec = sec % 60;
            if (min > 60) {
                long hour = min / 60;
                min = min % 60;
                sb.append(hour + "时" + min + "分" + sec + "." + msStr + "秒");
            } else {
                sb.append(min + "分" + sec + "." + msStr + "秒");
            }
        } else {
            sb.append(sec + "." + msStr + "秒");
        }
        return sb.toString();
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/OrderUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.sandu.ximon.admin.utils;
import java.util.Date;
import java.util.UUID;
public class OrderUtils {
    public static String generateOutTradeNo () {
        String outTradeNo = DateUtils.orderFormat(new Date());
        String uuid = UUID.randomUUID().toString().substring(0, 2);
        outTradeNo = outTradeNo + uuid;
        return outTradeNo;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/vo/C3mOrderVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,161 @@
package com.sandu.ximon.admin.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.sandu.ximon.admin.utils.OrderUtils;
import com.sandu.ximon.dao.domain.C3mOrder;
import com.sandu.ximon.dao.enums.OrderStatus;
import com.sandu.ximon.dao.enums.OrderType;
import lombok.Data;
import java.util.Date;
/**
 * @Author liuhaonan
 * @Date 2022/3/10 11:48
 * @Version 1.0
 */
@Data
public class C3mOrderVO extends C3mOrder{
    public static String REQUEST_URL = "http://www.ximonsmart.com/charge/#/charge/";
    /**
     * è®¢å•ID
     */
    @TableId
    private Long orderId;
    /**
     * ç¯æ†ID
     */
    private Long poleId;
    /**
     * å……电桩MAC
     */
    private String c3Mac;
    /**
     * å¯¹åº”的灯杆设备mac
     */
    private String poleMac;
    /**
     * è®¢å•商户号
     */
    private String outTradeNo;
    /**
     * è®¢å•类型(C3mOrderType)
     */
    private String orderType;
    /**
     * è®¢å•总金额
     */
    private Double totalAmount;
    /**
     * å®žæ”¶é‡‘额
     */
    private Double receiptAmount;
    /**
     * é€€æ¬¾
     */
    private Double refundAmount;
    /**
     * ä¹°å®¶å¸å·(支付宝)
     */
    private String aliBuyerLogonId;
    /**
     * é¢„约电量
     */
    private Integer subscribeChargingCapacity;
    /**
     * å®žå……电量
     */
    private Double actualChargingCapacity;
    /**
     * è®¢å•创建时间戳
     */
    private Long createTimestamp;
    /**
     * è®¢å•支付时间戳
     */
    private Long payTimestamp;
    /**
     * è®¢å•退款时间戳
     */
    private Long refundTimestamp;
    /**
     * è®¢å•退款说明
     */
    private String refundMsg;
    /**
     * å¼€å§‹å……电时间戳
     */
    private Long startChargingTimestamp;
    /**
     * ç»“束充电时间戳
     */
    private Long stopChargingTimestamp;
    /**
     * è®¢å•状态:// æœªæ”¯ä»˜(0),已支付(1),已退款(2),退款中(3),退款失败(4),订单完成(5)
     */
    private Integer orderStatus;
    /**
     * å……电桩名称
     */
    private String c3Name;
    /**
     * ç¯æ†åç§°
     */
    private String poleName;
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
    /**
     * ç”Ÿæˆæ–°è®¢å•
     * @param c3Mac C3物理地址
     * @param orderType è®¢å•类型
     * @param totalAmount   æ€»é‡‘额
     * @param subscribeChargingCapacity é¢„充电量
     */
    public C3mOrder generateOrder(Long poleId, String poleMac, String c3Mac, OrderType orderType, Double totalAmount,
                                  Integer subscribeChargingCapacity) {
        this.poleId = poleId;
        this.poleMac = poleMac;
        this.orderId = -1L;
        this.c3Mac = c3Mac;
        this.outTradeNo = OrderUtils.generateOutTradeNo();
        this.orderType = orderType.getCode();
        this.totalAmount = totalAmount;
        this.receiptAmount = 0d;
        this.refundAmount = 0d;
        this.aliBuyerLogonId = "";
        this.subscribeChargingCapacity = subscribeChargingCapacity;
        this.actualChargingCapacity = 0d;
        this.createTimestamp = new Date().getTime();
        this.payTimestamp = 0L;
        this.startChargingTimestamp = 0L;
        this.stopChargingTimestamp = 0L;
        this.refundTimestamp = 0L;
        this.refundMsg = "";
        this.orderStatus = OrderStatus.NO_PAY.getStatus();
        return this;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/vo/TaskVO.java
@@ -1,11 +1,15 @@
package com.sandu.ximon.admin.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.sandu.ximon.admin.dto.BroadcastTaskType;
import com.sandu.ximon.admin.param.IPTaskParam;
import com.sandu.ximon.admin.param.IpVolumeMissionParam;
import lombok.Data;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
@Data
public class TaskVO {
@@ -76,6 +80,7 @@
    //  ç³»ç»Ÿä¿ç•™
    private BigInteger btime;
    //  ä»»åŠ¡æ‰§è¡Œè§„åˆ™ï¼ˆæ¯å¤©ä¸º 0,每周为 1,手动为 2)
    @JsonIgnore
    private Integer rule;
    //  ä»»åŠ¡å¼€å§‹æ—¥æœŸï¼Œä¸€èˆ¬ä¸ºä»»åŠ¡åˆ›å»ºæ—¥æœŸ
    private BigInteger bdate;
@@ -110,10 +115,18 @@
    //  ä»»åŠ¡æ‰§è¡Œæ—¶é—´åˆ—è¡¨
    private TaskRunTimeVO[] exec;
    //  éŸ³é¢‘文件列表
    @JsonIgnore
    private TaskMediaFileVO[] files;
    //  æ’­æ”¾ç»ˆç«¯ ID åˆ—表
    @JsonIgnore
    private TaskTerminalVO[] terminals;
    @JsonIgnore
    private String userName;
    private String weeks;
    private List<Integer> fileIds=new ArrayList<>();
    private List<Integer> TerminalIds=new ArrayList<>();
}