luodangjia
2024-09-05 cfc72c5a140e6f3dd750b28b9566c64c713806bc
Merge remote-tracking branch 'origin/master'

# Conflicts:
# ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
# ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
1个文件已删除
38个文件已添加
85个文件已修改
3923 ■■■■■ 已修改文件
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppCouponFallbackFactory.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserFallbackFactory.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/InviteUserFallbackFactory.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppCouponClient.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/InviteUserClient.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppCoupon.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/GetInviteUser.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/CheckChargingStrategyDTO.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/AccountingStrategyDetailFallbackFactory.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/AccountingStrategyFallbackFactory.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/AccountingStrategyClient.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/AccountingStrategyDetailClient.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TFaultMessage.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TParkingLot.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TRepair.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/IntegrationFallbackFactory.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/PlatformStopChargingReplyFallbackFactory.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/SendMessageFallbackFactory.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/IntegrationClient.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/PlatformStopChargingReplyClient.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/SendMessageClient.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/vo/GetPlatformStopChargingReply.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/AccountingStrategyDetailOrderFallbackFactory.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/AccountingStrategyDetailOrderClient.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/AccountingStrategyDetailOrder.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/AccountingStrategyOrder.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrder.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrderAccountingStrategy.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoice.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoiceDetail.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/TOrderInvoiceQuery.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingBillVO.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderVO.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TOrderInvoiceVO.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserRoleFallbackFactory.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserRoleClient.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/SysUserRoleVo.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserRoleController.java 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TInviteUserController.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyDetailController.java 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TFaultMessageController.java 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TRepairController.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TFaultMessageMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TRepairMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TAccountingStrategyDetailService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TFaultMessageService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TRepairService.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyDetailServiceImpl.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyServiceImpl.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TFaultMessageServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TRepairServiceImpl.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TAccountingStrategyDetailMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TAccountingStrategyMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TFaultMessageMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TRepairMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/pom.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/controller/PlatformStopChargingReplyController.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/constant/SendTagConstant.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/controller/SendMessageController.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/enums/ServiceIdMenu.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/CP56Time2aConverter.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/MessageUtil.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/StrategyUtil.java 271 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/PlatformStopChargingReplyService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/UploadRealTimeMonitoringDataService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/PlatformStopChargingReplyServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/UploadRealTimeMonitoringDataServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/AcquisitionBillingModeMessageListener.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/BillingModeVerifyMessageListener.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/BmsAbortMessageListener.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/EndChargeMessageListener.java 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/MotorAbortMessageListener.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TimingSettingMessageListener.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TimingSettingReplyMessageListener.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TransactionRecordMessageListener.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/UploadRealTimeMonitoringDataMessageListener.java 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/EndChargeMessage.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/TimingSettingMessage.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/EnhanceProduce.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/pom.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/AccountingStrategyDetailOrderController.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChargingBillController.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderAppealController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderInvoiceController.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/ChargingBillQuery.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/ChargingListQuery.java 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PayOrderDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PayOrderQueryDto.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/OrderInvoiceExport.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/AccountingStrategyDetailOrderMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/AccountingStrategyOrderMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TOrderInvoiceMapper.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/AccountingStrategyDetailOrderService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/AccountingStrategyOrderService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TOrderInvoiceService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/AccountingStrategyDetailOrderServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/AccountingStrategyOrderServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java 544 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/ChargingOrderListInfoVO.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/bootstrap.yml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/AccountingStrategyDetailOrderMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/AccountingStrategyOrderMapper.xml 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml 128 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceDetailMapper.xml 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceMapper.xml 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppCouponFallbackFactory.java
@@ -3,6 +3,7 @@
import com.ruoyi.account.api.dto.GrantCouponDto;
import com.ruoyi.account.api.feignClient.AppCouponClient;
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.account.api.model.TAppCoupon;
import com.ruoyi.account.api.query.ExchangeRecordGoodsQuery;
import com.ruoyi.account.api.vo.ExchangeRecordVO;
import com.ruoyi.common.core.domain.R;
@@ -53,6 +54,11 @@
            public R refund(String id) {
                return R.fail("后台退款 退回优惠券失败:"+throwable.getMessage());
            }
            @Override
            public R<TAppCoupon> getAppCouponById(Long id) {
                return R.fail("根据id获取优惠券领取记录失败:" + throwable.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserFallbackFactory.java
@@ -64,6 +64,11 @@
            }
            @Override
            public R<List<TAppUser>> selectByPhoneLike(String phone) {
                return R.fail("通过手机号模糊查询用户失败:"+throwable.getMessage());
            }
            @Override
            public R refundPoints(String param) {
                return R.fail("后台兑换订单退款回退用户积分失败:"+throwable.getMessage());
            }
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/InviteUserFallbackFactory.java
New file
@@ -0,0 +1,43 @@
package com.ruoyi.account.api.factory;
import com.ruoyi.account.api.feignClient.InviteUserClient;
import com.ruoyi.account.api.model.TInviteUser;
import com.ruoyi.account.api.vo.GetInviteUser;
import com.ruoyi.common.core.domain.R;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
 *
 * @author ruoyi
 */
@Component
public class InviteUserFallbackFactory implements org.springframework.cloud.openfeign.FallbackFactory<InviteUserClient>
{
    private static final Logger log = LoggerFactory.getLogger(InviteUserFallbackFactory.class);
    @Override
    public InviteUserClient create(Throwable throwable) {
        log.error("邀请用户调用失败:{}", throwable.getMessage());
        return new InviteUserClient() {
            @Override
            public R<TInviteUser> getInviteUser(GetInviteUser query) {
                return R.fail("获取用户邀请数据失败:" + throwable.getMessage());
            }
            @Override
            public void updateInviteUser(TInviteUser query) {
                R.fail("修改用户邀请数据失败:" + throwable.getMessage());
            }
            @Override
            public void saveInviteUser(TInviteUser query) {
                R.fail("添加用户邀请数据失败:" + throwable.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppCouponClient.java
@@ -3,6 +3,7 @@
import com.ruoyi.account.api.dto.GrantCouponDto;
import com.ruoyi.account.api.factory.AppCouponFallbackFactory;
import com.ruoyi.account.api.factory.AppUserFallbackFactory;
import com.ruoyi.account.api.model.TAppCoupon;
import com.ruoyi.account.api.query.ExchangeRecordGoodsQuery;
import com.ruoyi.account.api.vo.ExchangeRecordVO;
import com.ruoyi.common.core.constant.ServiceNameConstants;
@@ -12,6 +13,7 @@
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
@@ -46,7 +48,18 @@
     * 后台远程调用 给用户发放优惠券
     */
    @PostMapping("/t-app-coupon/grantCoupon")
    R  grantCoupon(@RequestBody GrantCouponDto dto);
    R grantCoupon(@RequestBody GrantCouponDto dto);
    @PostMapping(value = "/t-app-coupon/refund/{id}")
     R refund(@PathVariable("id") String id);
    R refund(@PathVariable("id") String id);
    /**
     * 根据id获取优惠券领取记录
     * @param id
     * @return
     */
    @PostMapping(value = "/t-app-coupon/getAppCouponById")
    R<TAppCoupon> getAppCouponById(@RequestParam("id") Long id);
}
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java
@@ -69,6 +69,13 @@
    @GetMapping("/t-app-user/user/selectByPhone")
    R<TAppUser> selectByPhone(@RequestParam("phone") String phone);
    /**
     * 通过手机号模糊查询用户
     * @param phone
     * @return
     */
    @GetMapping("/t-app-user/user/selectByPhoneLike")
    R<List<TAppUser>> selectByPhoneLike(@RequestParam("phone") String phone);
    /**
     * 远程调用 积分兑换订单 退款回退积分
     * @return
     */
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/InviteUserClient.java
New file
@@ -0,0 +1,48 @@
package com.ruoyi.account.api.feignClient;
import com.ruoyi.account.api.factory.InviteUserFallbackFactory;
import com.ruoyi.account.api.model.TInviteUser;
import com.ruoyi.account.api.vo.GetInviteUser;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
/**
 * @author zhibing.pu
 * @Date 2024/9/4 17:54
 */
@FeignClient(contextId = "InviteUserClient", value = ServiceNameConstants.ACCOUNT_SERVICE, fallbackFactory = InviteUserFallbackFactory.class)
public interface InviteUserClient {
    /**
     * 获取用户邀请数据
     * @param query
     * @return
     */
    @PostMapping("/t-invite-user/getInviteUser")
    R<TInviteUser> getInviteUser(@RequestBody GetInviteUser query);
    /**
     * 修改用户邀请数据
     * @param query
     * @return
     */
    @PostMapping("/t-invite-user/updateInviteUser")
    void updateInviteUser(@RequestBody TInviteUser query);
    /**
     * 添加用户邀请数据
     * @param query
     * @return
     */
    @PostMapping("/t-invite-user/saveInviteUser")
    void saveInviteUser(@RequestBody TInviteUser query);
}
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppCoupon.java
@@ -76,9 +76,6 @@
    @ApiModelProperty(value = "状态(1=未使用,2=已使用)")
    @TableField("status")
    private Integer status;
    @ApiModelProperty(value = "订单id 后台发放的优惠券没有订单id")
    @TableField("orderId")
    private Long orderId;
    @ApiModelProperty(value = "当前领取优惠卷的json记录")
    @TableField("coupon_json")
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/GetInviteUser.java
New file
@@ -0,0 +1,19 @@
package com.ruoyi.account.api.vo;
import lombok.Data;
/**
 * @author zhibing.pu
 * @Date 2024/9/4 17:58
 */
@Data
public class GetInviteUser {
    /**
     * 用户id
     */
    private Long appUserId;
    /**
     * 被邀请用户id
     */
    private Long beInvitedAppUserId;
}
ruoyi-api/ruoyi-api-account/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -3,4 +3,5 @@
com.ruoyi.account.api.factory.AppUserCarFallbackFactory
com.ruoyi.account.api.factory.AppUserIntegralChangeFallbackFactory
com.ruoyi.account.api.factory.AppUserAddressFallbackFactory
com.ruoyi.account.api.factory.AppUserVipDetailFallbackFactory
com.ruoyi.account.api.factory.AppUserVipDetailFallbackFactory
com.ruoyi.account.api.factory.InviteUserFallbackFactory
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/CheckChargingStrategyDTO.java
New file
@@ -0,0 +1,19 @@
package com.ruoyi.chargingPile.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel(value = "校验计费模版是否准确DTO")
public class CheckChargingStrategyDTO implements Serializable {
    @ApiModelProperty(value = "桩编号code")
    private String code;
    @ApiModelProperty(value = "计费模型编号  id")
    private Integer strategyDetailId;
}
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/AccountingStrategyDetailFallbackFactory.java
@@ -1,5 +1,6 @@
package com.ruoyi.chargingPile.api.factory;
import com.ruoyi.chargingPile.api.dto.CheckChargingStrategyDTO;
import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyDetailClient;
import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
import com.ruoyi.common.core.domain.R;
@@ -7,6 +8,8 @@
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
import java.util.List;
/**
 * @author zhibing.pu
@@ -21,10 +24,30 @@
    public AccountingStrategyDetailClient create(Throwable throwable) {
        log.error("计费策略调用失败:{}", throwable.getMessage());
        return new AccountingStrategyDetailClient(){
            @Override
            public R<TAccountingStrategyDetail> getDetailBySiteId(Integer siteId) {
                return R.fail("通过站点id查询当前时段使用的策略明细失败:" + throwable.getMessage());
            }
            @Override
            public R<TAccountingStrategyDetail> getDetailByCode(String code) {
                return R.fail("通过桩编号查询当前时段使用的策略明细失败:" + throwable.getMessage());
            }
            @Override
            public R<Boolean> checkChargingStrategy(CheckChargingStrategyDTO dto) {
                return R.fail("校验充电桩计费模版是否准确失败:" + throwable.getMessage());
            }
            
            @Override
            public R<TAccountingStrategyDetail> getNowData(Integer accountingStrategyId) {
                return R.fail("获取当前有效的计费策略明细失败:" + throwable.getMessage());
            public R<List<TAccountingStrategyDetail>> getListByAccountingStrategyId(Integer id) {
                throw new RuntimeException("根据计费策略主表id策略明细失败:" + throwable.getMessage());
            }
            @Override
            public R<List<TAccountingStrategyDetail>> getDetailListByCode(String code) {
                return R.fail("通过桩编号查询当前使用的策略明细列表失败:" + throwable.getMessage());
            }
        };
    }
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/AccountingStrategyFallbackFactory.java
New file
@@ -0,0 +1,32 @@
package com.ruoyi.chargingPile.api.factory;
import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyClient;
import com.ruoyi.chargingPile.api.model.TAccountingStrategy;
import com.ruoyi.common.core.domain.R;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
/**
 * @author zhibing.pu
 * @Date 2024/8/28 18:33
 */
@Component
public class AccountingStrategyFallbackFactory implements FallbackFactory<AccountingStrategyClient> {
    private static final Logger log = LoggerFactory.getLogger(AccountingStrategyFallbackFactory.class);
    @Override
    public AccountingStrategyClient create(Throwable throwable) {
        log.error("计费策略调用失败:{}", throwable.getMessage());
        return new AccountingStrategyClient(){
            @Override
            public R<TAccountingStrategy> getAccountingStrategyById(Integer id) {
                throw new RuntimeException("根据id查询计费策略失败:" + throwable.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/AccountingStrategyClient.java
New file
@@ -0,0 +1,25 @@
package com.ruoyi.chargingPile.api.feignClient;
import com.ruoyi.chargingPile.api.factory.AccountingStrategyFallbackFactory;
import com.ruoyi.chargingPile.api.model.TAccountingStrategy;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
 * @author zhibing.pu
 * @Date 2024/9/4 15:51
 */
@FeignClient(contextId = "AccountingStrategyClient", value = ServiceNameConstants.CHARGINGPILE_SERVICE, fallbackFactory = AccountingStrategyFallbackFactory.class)
public interface AccountingStrategyClient {
    /**
     * 根据id查询计费策略
     * @param id
     * @return
     */
    @PostMapping("/t-accounting-strategy/getAccountingStrategyById")
    R<TAccountingStrategy> getAccountingStrategyById(@RequestParam("id") Integer id);
}
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/AccountingStrategyDetailClient.java
@@ -1,12 +1,16 @@
package com.ruoyi.chargingPile.api.feignClient;
import com.ruoyi.chargingPile.api.dto.CheckChargingStrategyDTO;
import com.ruoyi.chargingPile.api.factory.AccountingStrategyDetailFallbackFactory;
import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
/**
 * @author zhibing.pu
@@ -16,11 +20,42 @@
public interface AccountingStrategyDetailClient {
    
    
    /**
     * 获取当前有效的计费策略明细
     * @param accountingStrategyId
     * 通过站点id查询当前时段使用的策略明细
     * @param siteId
     * @return
     */
    @PostMapping("/t-accounting-strategy-detail/getNowData")
    R<TAccountingStrategyDetail> getNowData(@RequestParam("accountingStrategyId") Integer accountingStrategyId);
    @PostMapping("/t-accounting-strategy-detail/getDetailBySiteId")
    R<TAccountingStrategyDetail> getDetailBySiteId(@RequestParam("siteId") Integer siteId);
    /**
     * 通过桩编号查询当前时段使用的策略明细
     * @param code
     * @return
     */
    @PostMapping("/t-accounting-strategy-detail/getDetailByCode")
    R<TAccountingStrategyDetail> getDetailByCode(@RequestParam("code") String code);
    /**
     * 校验充电桩计费模版是否准确
     * @param
     * @return
     */
    @PostMapping("/t-accounting-strategy-detail/checkChargingStrategy")
    R<Boolean> checkChargingStrategy(@RequestBody CheckChargingStrategyDTO dto);
    /**
     * 根据计费策略主表id策略明细
     * @param id
     * @return
     */
    @PostMapping("/t-accounting-strategy-detail/getListByAccountingStrategyId")
    R<List<TAccountingStrategyDetail>> getListByAccountingStrategyId(@RequestParam("id") Integer id);
    /**
     * 通过桩编号查询当前使用的策略明细列表
     * @param code
     * @return
     */
    @PostMapping("/t-accounting-strategy-detail/getDetailListByCode")
    R<List<TAccountingStrategyDetail>> getDetailListByCode(@RequestParam("code") String code);
}
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TFaultMessage.java
@@ -38,10 +38,16 @@
    @ApiModelProperty(value = "站点id")
    @TableField("site_id")
    private Integer siteId;
    @TableField(exist = false)
    private String siteName;
    @ApiModelProperty(value = "充电桩id")
    @TableField("charging_pile_id")
    private Integer chargingPileId;
    @TableField(exist = false)
    private String chargingPileName;
    @ApiModelProperty(value = "状态(1=离线,2=故障)")
    @TableField("status")
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TParkingLot.java
@@ -33,6 +33,10 @@
    @ApiModelProperty(value = "主键")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "类型(1=自营,2=合作)")
    @TableField("type")
    private Integer type;
    @ApiModelProperty(value = "车场名称")
    @TableField("name")
@@ -41,6 +45,14 @@
    @ApiModelProperty(value = "第三方停车场编号")
    @TableField("code")
    private String code;
    @ApiModelProperty(value = "停车场标识")
    @TableField("app_Key")
    private String appKey;
    @ApiModelProperty(value = "停车场秘钥")
    @TableField("secret_Key")
    private String secretKey;
    @ApiModelProperty(value = "站点id")
    @TableField("site_id")
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TRepair.java
@@ -37,10 +37,16 @@
    @ApiModelProperty(value = "站点id")
    @TableField("site_id")
    private Integer siteId;
    @TableField(exist = false)
    private String siteName;
    @ApiModelProperty(value = "充电桩id")
    @TableField("charging_pile_id")
    private Integer chargingPileId;
    @TableField(exist = false)
    private String chargingPileName;
    @ApiModelProperty(value = "报修内容")
    @TableField("content")
ruoyi-api/ruoyi-api-chargingPile/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -2,4 +2,5 @@
com.ruoyi.chargingPile.api.factory.SiteFallbackFactory
com.ruoyi.chargingPile.api.factory.ParkingLotFallbackFactory
com.ruoyi.chargingPile.api.factory.ChargingGunFallbackFactory
com.ruoyi.chargingPile.api.factory.AccountingStrategyDetailFallbackFactory
com.ruoyi.chargingPile.api.factory.AccountingStrategyDetailFallbackFactory
com.ruoyi.chargingPile.api.factory.AccountingStrategyFallbackFactory
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/IntegrationFallbackFactory.java
@@ -48,10 +48,10 @@
                return R.fail("读取实时监测数据调用失败:" + throwable.getMessage());
            }
            @Override
            public R<String> endCharge(EndCharge endCharge) {
                return R.fail("充电结束调用失败:" + throwable.getMessage());
            }
//            @Override
//            public R<String> endCharge(EndCharge endCharge) {
//                return R.fail("充电结束调用失败:" + throwable.getMessage());
//            }
            @Override
            public R<String> platformConfirmationCharging(PlatformConfirmationCharging platformConfirmationCharging) {
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/PlatformStopChargingReplyFallbackFactory.java
New file
@@ -0,0 +1,35 @@
package com.ruoyi.integration.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.integration.api.feignClient.PlatformStopChargingReplyClient;
import com.ruoyi.integration.api.feignClient.SendMessageClient;
import com.ruoyi.integration.api.model.PlatformStartCharging;
import com.ruoyi.integration.api.model.PlatformStopCharging;
import com.ruoyi.integration.api.model.PlatformStopChargingReply;
import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
 * 充电桩服务降级处理
 *
 * @author ruoyi
 */
@Component
public class PlatformStopChargingReplyFallbackFactory implements org.springframework.cloud.openfeign.FallbackFactory<PlatformStopChargingReplyClient> {
    private static final Logger log = LoggerFactory.getLogger(PlatformStopChargingReplyFallbackFactory.class);
    @Override
    public PlatformStopChargingReplyClient create(Throwable throwable) {
        log.error("远程停机命令应答失败:{}", throwable.getMessage());
        return new PlatformStopChargingReplyClient() {
            @Override
            public R<PlatformStopChargingReply> getPlatformStopChargingReply(GetPlatformStopChargingReply query) {
                return R.fail("获取远程停机命令应答失败:" + throwable.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/SendMessageFallbackFactory.java
@@ -5,6 +5,7 @@
import com.ruoyi.integration.api.feignClient.SendMessageClient;
import com.ruoyi.integration.api.model.ChargingHandshake;
import com.ruoyi.integration.api.model.PlatformStartCharging;
import com.ruoyi.integration.api.model.PlatformStopCharging;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
@@ -27,9 +28,14 @@
    
    
            @Override
            public void platformStartCharging(PlatformStartCharging platformStartCharging) {
            public String platformStartCharging(PlatformStartCharging platformStartCharging) {
                throw new RuntimeException("远程启机失败" + throwable.getMessage());
            }
            @Override
            public String platformStopCharging(PlatformStopCharging platformStopCharging) {
                throw new RuntimeException("远程停机失败" + throwable.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/IntegrationClient.java
@@ -61,8 +61,8 @@
     * @param endCharge 实体对象
     * @return
     */
    @PostMapping("/sendMessage/sendMessageendCharge")
    public R<String> endCharge(@RequestBody EndCharge endCharge);
//    @PostMapping("/sendMessage/sendMessageendCharge")
//    public R<String> endCharge(@RequestBody EndCharge endCharge);
    /**
     * 运营平台确认启动充电
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/PlatformStopChargingReplyClient.java
New file
@@ -0,0 +1,27 @@
package com.ruoyi.integration.api.feignClient;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.integration.api.factory.PlatformStopChargingReplyFallbackFactory;
import com.ruoyi.integration.api.model.PlatformStopChargingReply;
import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
/**
 * @author zhibing.pu
 * @Date 2024/9/2 17:05
 */
@FeignClient(contextId = "PlatformStopChargingReplyClient", value = ServiceNameConstants.INTEGRATION_SERVICE, fallbackFactory = PlatformStopChargingReplyFallbackFactory.class)
public interface PlatformStopChargingReplyClient {
    /**
     * 获取远程停机命令应答
     * @param query
     * @return
     */
    @PostMapping("/platformStopChargingReply/getPlatformStopChargingReply")
    R<PlatformStopChargingReply> getPlatformStopChargingReply(@RequestBody GetPlatformStopChargingReply query);
}
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/SendMessageClient.java
@@ -3,6 +3,7 @@
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.integration.api.factory.SendMessageFallbackFactory;
import com.ruoyi.integration.api.model.PlatformStartCharging;
import com.ruoyi.integration.api.model.PlatformStopCharging;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@@ -21,5 +22,14 @@
     * @return
     */
    @PostMapping("/sendMessage/platformStartCharging")
    void platformStartCharging(@RequestBody PlatformStartCharging platformStartCharging);
    String platformStartCharging(@RequestBody PlatformStartCharging platformStartCharging);
    /**
     * 远程控制停机
     * @param platformStopCharging
     * @return
     */
    @PostMapping("/sendMessage/platformStopCharging")
    String platformStopCharging(@RequestBody PlatformStopCharging platformStopCharging);
}
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/vo/GetPlatformStopChargingReply.java
New file
@@ -0,0 +1,19 @@
package com.ruoyi.integration.api.vo;
import lombok.Data;
/**
 * @author zhibing.pu
 * @Date 2024/9/2 17:00
 */
@Data
public class GetPlatformStopChargingReply {
    /**
     * 充电桩编号
     */
    private String charging_pile_code;
    /**
     * 充电枪编号
     */
    private String charging_gun_code;
}
ruoyi-api/ruoyi-api-integration/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -2,4 +2,5 @@
com.ruoyi.integration.api.factory.UploadRealTimeMonitoringDataFallbackFactory
com.ruoyi.integration.api.factory.ChargingHandshakeFallbackFactory
com.ruoyi.integration.api.factory.SendMessageFallbackFactory
com.ruoyi.integration.api.factory.PlatformStartChargingReplyFallbackFactory
com.ruoyi.integration.api.factory.PlatformStartChargingReplyFallbackFactory
com.ruoyi.integration.api.factory.PlatformStopChargingReplyFallbackFactory
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/AccountingStrategyDetailOrderFallbackFactory.java
New file
@@ -0,0 +1,37 @@
package com.ruoyi.order.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.order.api.feignClient.AccountingStrategyDetailOrderClient;
import com.ruoyi.order.api.feignClient.ChargingOrderAccountingStrategyClient;
import com.ruoyi.order.api.model.AccountingStrategyDetailOrder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
 * 充电订单服务降级处理
 *
 * @author ruoyi
 */
@Component
public class AccountingStrategyDetailOrderFallbackFactory implements org.springframework.cloud.openfeign.FallbackFactory<AccountingStrategyDetailOrderClient>
{
    private static final Logger log = LoggerFactory.getLogger(AccountingStrategyDetailOrderFallbackFactory.class);
    @Override
    public AccountingStrategyDetailOrderClient create(Throwable throwable) {
        log.error("计费策略调用失败:{}", throwable.getMessage());
        return new AccountingStrategyDetailOrderClient() {
            @Override
            public R<AccountingStrategyDetailOrder> getNowAccountingStrategyDetailOrder(Long orderId) {
                return R.fail("根据订单id获取当前有效的策略失败:" + throwable.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java
@@ -68,6 +68,21 @@
            @Override
            public void chargeMonitoring(UploadRealTimeMonitoringDataQuery query) {
            }
            @Override
            public R<TChargingOrder> getOrderByCode(String code) {
                return R.fail("通过流水号查询订单调用失败:" + throwable.getMessage());
            }
            @Override
            public void endCharge(String code) {
            }
            @Override
            public void excelEndCharge(String code) {
            }
        };
    }
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/AccountingStrategyDetailOrderClient.java
New file
@@ -0,0 +1,26 @@
package com.ruoyi.order.api.feignClient;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.order.api.factory.AccountingStrategyDetailOrderFallbackFactory;
import com.ruoyi.order.api.model.AccountingStrategyDetailOrder;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
 * @author zhibing.pu
 * @Date 2024/9/4 16:11
 */
@FeignClient(contextId = "AccountingStrategyDetailOrderClient", value = ServiceNameConstants.ORDER_SERVICE, fallbackFactory = AccountingStrategyDetailOrderFallbackFactory.class)
public interface AccountingStrategyDetailOrderClient {
    /**
     * 根据订单id获取当前有效的策略
     * @param orderId
     * @return
     */
    @PostMapping("/accountingStrategyDetailOrder/getNowAccountingStrategyDetailOrder")
    R<AccountingStrategyDetailOrder> getNowAccountingStrategyDetailOrder(@RequestParam("orderId") Long orderId);
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java
@@ -9,10 +9,7 @@
import com.ruoyi.order.api.query.TChargingCountQuery;
import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@@ -70,4 +67,28 @@
     */
    @PostMapping(value = "/t-charging-order/chargeMonitoring")
    void chargeMonitoring(@RequestBody UploadRealTimeMonitoringDataQuery query);
    /**
     * 通过流水号查询订单
     * @param code
     * @return
     */
    @PostMapping(value = "/t-charging-order/getOrderByCode/{code}")
    R<TChargingOrder> getOrderByCode(@PathVariable("code") String code);
    /**
     * 充电解释后处理逻辑
     * @param code
     */
    @PostMapping("/t-charging-order/endCharge")
    void endCharge(@RequestParam("code") String code);
    /**
     * 硬件异常结束充电后的处理逻辑
     * @param code
     */
    @PostMapping("/t-charging-order/excelEndCharge")
    void excelEndCharge(@RequestParam("code") String code);
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/AccountingStrategyDetailOrder.java
New file
@@ -0,0 +1,53 @@
package com.ruoyi.order.api.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
 * @author zhibing.pu
 * @Date 2024/9/3 14:00
 */
@Data
@TableName("t_accounting_strategy_detail_order")
public class AccountingStrategyDetailOrder {
    /**
     * 主键
     */
    @TableField(value = "id")
    private Integer id;
    @ApiModelProperty(value = "策略id")
    @TableField("accounting_strategy_id")
    private Integer accountingStrategyId;
    @ApiModelProperty(value = "阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段)")
    @TableField("type")
    private Integer type;
    @ApiModelProperty(value = "开始时间")
    @TableField("start_time")
    private String startTime;
    @ApiModelProperty(value = "结束时间")
    @TableField("end_time")
    private String endTime;
    @ApiModelProperty(value = "电价")
    @TableField("electrovalence")
    private BigDecimal electrovalence;
    @ApiModelProperty(value = "服务费")
    @TableField("service_charge")
    private BigDecimal serviceCharge;
    @ApiModelProperty(value = "原价服务费")
    @TableField("cost_service_charge")
    private BigDecimal costServiceCharge;
    @ApiModelProperty(value = "充电订单id")
    @TableField("charging_order_id")
    private Long chargingOrderId;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/AccountingStrategyOrder.java
New file
@@ -0,0 +1,81 @@
package com.ruoyi.order.api.model;
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 com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.web.domain.BasePojo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * @author zhibing.pu
 * @Date 2024/9/3 14:13
 */
@Data
@TableName("t_accounting_strategy_order")
public class AccountingStrategyOrder extends BasePojo {
    @ApiModelProperty(value = "主键")
    @TableField(value = "id")
    private Integer id;
    @ApiModelProperty(value = "站点id")
    @TableField("site_id")
    private Integer siteId;
    @ApiModelProperty(value = "申请人id")
    @TableField("user_id")
    private Long userId;
    @ApiModelProperty(value = "策略名称")
    @TableField("name")
    private String name;
    @ApiModelProperty(value = "策略说明")
    @TableField("description")
    private String description;
    @ApiModelProperty(value = "会员折扣")
    @TableField("discount")
    private BigDecimal discount;
    @ApiModelProperty(value = "一级审核用户id")
    @TableField("first_user_id")
    private Long firstUserId;
    @ApiModelProperty(value = "二级审核用户id")
    @TableField("two_user_id")
    private Long twoUserId;
    @ApiModelProperty(value = "一级审核备注")
    @TableField("first_remark")
    private String firstRemark;
    @ApiModelProperty(value = "二级审核备注")
    @TableField("two_remark")
    private String twoRemark;
    @ApiModelProperty(value = "审核状态(1=待审核一级,2=待审核二级,3=审核通过,4=驳回)")
    @TableField("audit_status")
    private Integer auditStatus;
    @ApiModelProperty(value = "一级审核时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @TableField("first_audit_time")
    private LocalDateTime firstAuditTime;
    @ApiModelProperty(value = "二级审核时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @TableField("two_audit_time")
    private LocalDateTime twoAuditTime;
    @ApiModelProperty(value = "充电订单id")
    @TableField("charging_order_id")
    private Long chargingOrderId;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrder.java
@@ -122,7 +122,11 @@
    @ApiModelProperty(value = "充值支付第三方流水号")
    @TableField("recharge_serial_number")
    private String rechargeSerialNumber;
    @ApiModelProperty(value = "充电金额(传给硬件方的金额)")
    @TableField("charge_amount")
    private BigDecimal chargeAmount;
    @ApiModelProperty(value = "剩余金额(用于前端展示)")
    @TableField("residual_amount")
    private BigDecimal residualAmount;
@@ -185,4 +189,5 @@
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @TableField("pay_time")
    private LocalDateTime payTime;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrderAccountingStrategy.java
@@ -11,6 +11,7 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * <p>
@@ -35,6 +36,10 @@
    @ApiModelProperty(value = "充电订单id")
    @TableField("charging_order_id")
    private Long chargingOrderId;
    @ApiModelProperty(value = "计费策略明细id")
    @TableField("accounting_strategy_detail_id")
    private Integer accountingStrategyDetailId;
    @ApiModelProperty(value = "阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段)")
    @TableField("type")
@@ -71,6 +76,14 @@
    @ApiModelProperty(value = "时段服务费")
    @TableField("period_service_price")
    private BigDecimal periodServicePrice;
    @ApiModelProperty(value = "时段原服务费(不含折扣)")
    @TableField("period_original_service_price")
    private BigDecimal periodOriginalServicePrice;
    @ApiModelProperty(value = "首次添加时间")
    @TableField("create_time")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "会员抵扣")
    @TableField(exist = false)
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoice.java
@@ -4,6 +4,7 @@
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -114,6 +115,7 @@
    private LocalDateTime createTime;
    
    @ApiModelProperty(value = "开票时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @TableField("billing_time")
    private LocalDateTime billingTime;
    
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoiceDetail.java
@@ -59,6 +59,14 @@
    @ApiModelProperty(value = "增值服务费税率")
    @TableField("added_service_tariff")
    private BigDecimal addedServiceTariff;
    @ApiModelProperty(value = "'电费'")
    @TableField("electrovalence")
    private BigDecimal electrovalence;
    @ApiModelProperty(value = "'服务费'")
    @TableField("service_charge")
    private BigDecimal serviceCharge;
    @ApiModelProperty(value = "'增值服务费'")
    @TableField("added_service")
    private BigDecimal addedService;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/TOrderInvoiceQuery.java
New file
@@ -0,0 +1,41 @@
package com.ruoyi.order.api.query;
import com.ruoyi.common.core.query.TimeRangePageQuery;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel(value = "发票管理Query")
public class TOrderInvoiceQuery extends TimeRangePageQuery {
    @ApiModelProperty(value = "开票公司")
    private String invoicingCompany;
    @ApiModelProperty(value = "发票类型")
    private String invoiceType;
    @ApiModelProperty(value = "抬头类型(1=个人,2=企业)")
    private Integer invoicingObjectType;
    @ApiModelProperty(value = "发票种类(1=纸质发票,2=电子发票)")
    private Integer invoiceMaterial;
    @ApiModelProperty(value = "开票方式(1=人工,2=自动)")
    private Integer invoicingMethod;
    @ApiModelProperty(value = "申请人电话")
    private String userPhone;
    @ApiModelProperty(value = "申请人姓名")
    private String nickName;
    @ApiModelProperty(value = "公司名称")
    private String name;
    @ApiModelProperty(value = "用户id 前端忽略")
    private List<Long> userIds;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingBillVO.java
New file
@@ -0,0 +1,33 @@
package com.ruoyi.order.api.vo;
import com.ruoyi.common.core.web.page.PageInfo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
@ApiModel(value = "ChargingBillVO对象",description = "充电算帐单")
public class ChargingBillVO {
    @ApiModelProperty(value = "充电总度数")
    private BigDecimal chargingCapacity;
    @ApiModelProperty(value = "实收金额")
    private BigDecimal paymentAmount;
    @ApiModelProperty(value = "订单总金额")
    private BigDecimal orderAmount;
    @ApiModelProperty(value = "累计电费")
    private BigDecimal electrovalence;
    @ApiModelProperty(value = "累计服务费")
    private BigDecimal serviceCharge;
    @ApiModelProperty(value = "订单数量")
    private Integer orderCount;
    @ApiModelProperty(value = "平台手续费")
    private String commissionAmount;
    @ApiModelProperty(value = "三方平台分佣")
    private String sharingAmount;
    @ApiModelProperty(value = "优惠抵扣")
    private String discount;
    @ApiModelProperty(value = "列表数据")
    private PageInfo<ChargingOrderListVO> list;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderVO.java
@@ -30,10 +30,7 @@
    @ApiModelProperty(value = "手机号")
    private String phone;
    @ApiModelProperty(value = "累计电费")
    private BigDecimal electrovalence;
    @ApiModelProperty(value = "累计服务费")
    private BigDecimal serviceCharge;
    @ApiModelProperty(value = "时段数")
    private Integer count;
    @ApiModelProperty(value = "1明星充电 2快电 3新电途")
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TOrderInvoiceVO.java
New file
@@ -0,0 +1,31 @@
package com.ruoyi.order.api.vo;
import com.ruoyi.order.api.model.TOrderInvoice;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
@ApiModel(value = "发票管理VO")
public class TOrderInvoiceVO extends TOrderInvoice {
    @ApiModelProperty(value = "电费税率")
    private BigDecimal electricityTariff;
    @ApiModelProperty(value = "服务费税率")
    private BigDecimal serviceTariff;
    @ApiModelProperty(value = "增值服务费税率")
    private BigDecimal addedServiceTariff;
    @ApiModelProperty(value = "电费")
    private BigDecimal electrovalence;
    @ApiModelProperty(value = "服务费")
    private BigDecimal serviceCharge;
    @ApiModelProperty(value = "增值服务费")
    private BigDecimal addedService;
    @ApiModelProperty(value = "用户电话")
    private String userPhone;
}
ruoyi-api/ruoyi-api-order/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -1,4 +1,5 @@
com.ruoyi.order.api.factory.ChargingOrderFallbackFactory
com.ruoyi.order.api.factory.OrderFallbackFactory
com.ruoyi.order.api.factory.ExchangeOrderFallbackFactory
com.ruoyi.order.api.factory.ChargingOrderAccountingStrategyFallbackFactory
com.ruoyi.order.api.factory.ChargingOrderAccountingStrategyFallbackFactory
com.ruoyi.order.api.factory.AccountingStrategyDetailOrderFallbackFactory
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserRoleFallbackFactory.java
New file
@@ -0,0 +1,26 @@
package com.ruoyi.system.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.domain.SysRole;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.feignClient.SysUserClient;
import com.ruoyi.system.api.feignClient.SysUserRoleClient;
import com.ruoyi.system.api.model.*;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class SysUserRoleFallbackFactory implements org.springframework.cloud.openfeign.FallbackFactory<SysUserRoleClient> {
    @Override
    public SysUserRoleClient create(Throwable cause) {
        return new SysUserRoleClient(){
            @Override
            public R<List<SysUserRoleVo>> getRoleByUserId(Long userId) {
                return R.fail("根据用户id获取角色失败:" + cause.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserRoleClient.java
New file
@@ -0,0 +1,28 @@
package com.ruoyi.system.api.feignClient;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.factory.SysUserRoleFallbackFactory;
import com.ruoyi.system.api.model.SysUserRoleVo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
/**
 * @author zhibing.pu
 * @date 2024/9/4 9:49
 */
@FeignClient(contextId = "SysUserRoleClient", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = SysUserRoleFallbackFactory.class)
public interface SysUserRoleClient {
    /**
     * 根据用户id获取角色
     * @param userId
     * @return
     */
    @PostMapping("/userRole/getRoleByUserId")
    R<List<SysUserRoleVo>> getRoleByUserId(@RequestParam("userId") Long userId);
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/SysUserRoleVo.java
New file
@@ -0,0 +1,49 @@
package com.ruoyi.system.api.model;
import com.baomidou.mybatisplus.annotation.TableField;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
 * 用户和角色关联 sys_user_role
 *
 * @author ruoyi
 */
public class SysUserRoleVo
{
    /** 用户ID */
    @TableField("user_id")
    private Long userId;
    /** 角色ID */
    @TableField("role_id")
    private Long roleId;
    public Long getUserId()
    {
        return userId;
    }
    public void setUserId(Long userId)
    {
        this.userId = userId;
    }
    public Long getRoleId()
    {
        return roleId;
    }
    public void setRoleId(Long roleId)
    {
        this.roleId = roleId;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
            .append("userId", getUserId())
            .append("roleId", getRoleId())
            .toString();
    }
}
ruoyi-api/ruoyi-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -4,3 +4,4 @@
com.ruoyi.system.api.factory.SysUserFallbackFactory
com.ruoyi.system.api.factory.SysRoleFallbackFactory
com.ruoyi.system.api.factory.SysLoginLogFallbackFactory
com.ruoyi.system.api.factory.SysUserRoleFallbackFactory
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java
@@ -372,5 +372,16 @@
        return LocalTime.parse(time, formatter);
    }
    /**
     * localdatetime转为字符串
     *
     * @param time localdatetime
     * @return 字符串
     */
    public static String localDateTimeToString(LocalDateTime time) {
        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        return df.format(time);
    }
}
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserRoleController.java
@@ -1,20 +1,19 @@
package com.ruoyi.system.controller;
import java.util.ArrayList;
import java.util.List;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.model.SysUserRoleVo;
import com.ruoyi.system.domain.SysUserRole;
import com.ruoyi.system.service.ISysUserRoleService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import com.ruoyi.common.log.annotation.Log;
import com.ruoyi.common.log.enums.BusinessType;
import com.ruoyi.common.security.annotation.RequiresPermissions;
@@ -96,4 +95,22 @@
    public AjaxResult remove(@PathVariable Long[] userIds) {
        return toAjax(sysUserRoleService.deleteSysUserRoleByUserIds(userIds));
    }
    /**
     * 根据用户id获取角色
     * @param userId
     * @return
     */
    @PostMapping("/getRoleByUserId")
    public R<List<SysUserRoleVo>> getRoleByUserId(@RequestParam("userId") Long userId){
        List<SysUserRole> list = sysUserRoleService.list(new LambdaQueryWrapper<SysUserRole>().eq(SysUserRole::getUserId, userId));
        List<SysUserRoleVo> data = new ArrayList<>();
        for (SysUserRole sysUserRole : list) {
            SysUserRoleVo vo = new SysUserRoleVo();
            BeanUtils.copyProperties(sysUserRole, vo);
            data.add(vo);
        }
        return R.ok(data);
    }
}
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java
@@ -65,13 +65,18 @@
    private TAppUserCarService appUserCarService;
    @Autowired
    private TokenService tokenService;
    @Autowired
    @Resource
    private ChargingPileClient chargingPileClient;
    @Autowired
    @Resource
    private ChargingOrderClient chargingOrderClient;
    @Resource
    private ChargingGunClient chargingGunClient;
    @Autowired
    private TAppUserTagService appUserTagService;
    @Autowired
    private TAppUserService appUserService;
    /**
     * 后台退款 回退优惠券使用状态
@@ -208,10 +213,7 @@
        return R.ok(tAppCouponService.lambdaQuery().le(TAppCoupon::getStartTime, now).ge(TAppCoupon::getEndTime, now).eq(TAppCoupon::getStatus, 1).count());
    }
    @Autowired
    private TAppUserTagService appUserTagService;
    @Autowired
    private TAppUserService appUserService;
    /**
     * 后台远程调用 给用户发放优惠券
@@ -275,5 +277,17 @@
        return R.ok();
    }
    /**
     * 根据id获取优惠券领取记录
     * @param id
     * @return
     */
    @PostMapping("/getAppCouponById")
    public R<TAppCoupon> getAppCouponById(@RequestParam("id") Long id){
        TAppCoupon appCoupon = tAppCouponService.getById(id);
        return R.ok(appCoupon);
    }
}
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
@@ -725,6 +725,16 @@
                .eq(TAppUser::getPhone,phone)
                .last("LIMIT 1")));
    }
    /**
     * 通过手机号模糊查询用户
     * @param phone
     * @return
     */
    @GetMapping("/user/selectByPhoneLike")
    public R<List<TAppUser>> selectByPhoneLike(@RequestParam("phone") String phone){
        return R.ok(appUserService.list(Wrappers.lambdaQuery(TAppUser.class)
                .eq(TAppUser::getPhone,phone)));
    }
    @ApiOperation(value = "签到", tags = {"小程序-个人中心-签到"})
    @GetMapping(value = "/user/sign")
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TInviteUserController.java
@@ -1,8 +1,17 @@
package com.ruoyi.account.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.account.api.model.TInviteUser;
import com.ruoyi.account.api.vo.GetInviteUser;
import com.ruoyi.account.service.TInviteUserService;
import com.ruoyi.common.core.domain.R;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
 * <p>
@@ -15,6 +24,43 @@
@RestController
@RequestMapping("/t-invite-user")
public class TInviteUserController {
    @Resource
    private TInviteUserService inviteUserService;
    /**
     * 获取用户邀请数据
     * @param query
     * @return
     */
    @PostMapping("/getInviteUser")
    public R<TInviteUser> getInviteUser(@RequestBody GetInviteUser query){
        TInviteUser one = inviteUserService.getOne(new LambdaQueryWrapper<TInviteUser>().eq(TInviteUser::getAppUserId, query.getBeInvitedAppUserId())
                .eq(TInviteUser::getBeInvitedAppUserId, query.getBeInvitedAppUserId()));
        return R.ok(one);
    }
    /**
     * 修改邀请数据
     * @param query
     */
    @PostMapping("/updateInviteUser")
    public void updateInviteUser(@RequestBody TInviteUser query){
        inviteUserService.updateById(query);
    }
    /**
     * 添加邀请数据
     * @param query
     */
    @PostMapping("/saveInviteUser")
    public void saveInviteUser(@RequestBody TInviteUser query){
        inviteUserService.save(query);
    }
}
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java
@@ -92,7 +92,7 @@
    public AjaxResult<List<TAccountingStrategyDetailVO>> queryAccountingStrategyDetailByStrategyId(@RequestParam("strategyId") Integer strategyId) {
        List<TAccountingStrategyDetailVO> list = accountingStrategyDetailService.queryAccountingStrategyDetailByStrategyId(strategyId);
        list.forEach(detail -> {
            detail.setTotalPrice(detail.getElectrovalence().add(detail.getElectrovalence()));
            detail.setTotalPrice(detail.getElectrovalence().add(detail.getServiceCharge()));
        });
        return AjaxResult.ok(list);
    }
@@ -110,6 +110,11 @@
        Boolean flag = accountingStrategyDetailService.isStrategy24Hour(dto.getAccountingStrategyDetails());
        if(flag){
            return AjaxResult.error("计费模板时间设置有误差");
        }
        // 判断同阶段是否价格不一致
        Boolean flag1 = accountingStrategyDetailService.isStrategyPriceConsistent(dto.getAccountingStrategyDetails());
        if(!flag1){
            return AjaxResult.error("同阶段费率值需一致");
        }
        Long userId = SecurityUtils.getLoginUser().getUserid();
        dto.setUserId(userId);
@@ -130,6 +135,11 @@
        Boolean flag = accountingStrategyDetailService.isStrategy24Hour(dto.getAccountingStrategyDetails());
        if(flag){
            return AjaxResult.error("计费模板时间设置有误差");
        }
        // 判断同阶段是否价格不一致
        Boolean flag1 = accountingStrategyDetailService.isStrategyPriceConsistent(dto.getAccountingStrategyDetails());
        if(!flag1){
            return AjaxResult.error("同阶段费率值需一致");
        }
        // 判断修改的计费策略是否为已通过
        if(dto.getAuditStatus() == 3 || dto.getAuditStatus() == 4){
@@ -411,5 +421,18 @@
        return R.ok(res);
    }
    /**
     * 根据id查询数据
     * @param id
     * @return
     */
    @PostMapping(value = "/getAccountingStrategyById")
    public R<TAccountingStrategy> getAccountingStrategyById(@RequestParam("id") Integer id) {
        TAccountingStrategy accountingStrategy = accountingStrategyService.getById(id);
        return R.ok(accountingStrategy);
    }
}
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyDetailController.java
@@ -3,14 +3,17 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.chargingPile.api.dto.CheckChargingStrategyDTO;
import com.ruoyi.chargingPile.api.model.Site;
import com.ruoyi.chargingPile.api.model.TAccountingStrategy;
import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
import com.ruoyi.chargingPile.api.model.TChargingPile;
import com.ruoyi.chargingPile.api.vo.StrategyPriceVO;
import com.ruoyi.chargingPile.api.vo.TAccountingStrategyDetailVO;
import com.ruoyi.chargingPile.service.ISiteService;
import com.ruoyi.chargingPile.service.TAccountingStrategyDetailService;
import com.ruoyi.chargingPile.service.TAccountingStrategyService;
import com.ruoyi.chargingPile.service.TChargingPileService;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.web.domain.AjaxResult;
@@ -36,12 +39,14 @@
public class TAccountingStrategyDetailController {
    private final ISiteService siteService;
    private final TChargingPileService chargingPileService;
    private final TAccountingStrategyService accountingStrategyService;
    private final TAccountingStrategyDetailService accountingStrategyDetailService;
    @Autowired
    public TAccountingStrategyDetailController(ISiteService siteService, TAccountingStrategyService accountingStrategyService, TAccountingStrategyDetailService accountingStrategyDetailService) {
    public TAccountingStrategyDetailController(ISiteService siteService, TChargingPileService chargingPileService, TAccountingStrategyService accountingStrategyService, TAccountingStrategyDetailService accountingStrategyDetailService) {
        this.siteService = siteService;
        this.chargingPileService = chargingPileService;
        this.accountingStrategyService = accountingStrategyService;
        this.accountingStrategyDetailService = accountingStrategyDetailService;
    }
@@ -79,17 +84,96 @@
    }
    
    
    /**
     * 获取当前有效的计费模板
     * @param accountingStrategyId
     * 通过站点id查询当前时段使用的策略明细
     * @param siteId
     * @return
     */
    @PostMapping("/getNowData")
    public R<TAccountingStrategyDetail> getNowData(@RequestParam("accountingStrategyId") Integer accountingStrategyId){
        TAccountingStrategyDetail one = accountingStrategyDetailService.getOne(new LambdaQueryWrapper<TAccountingStrategyDetail>()
                .eq(TAccountingStrategyDetail::getAccountingStrategyId, accountingStrategyId)
    @PostMapping("/getDetailBySiteId")
    public R<TAccountingStrategyDetail> getDetailBySiteId(@RequestParam("siteId") Integer siteId){
        Site site = siteService.getById(siteId);
        TAccountingStrategy accountingStrategy = accountingStrategyService.getById(site.getAccountingStrategyId());
        TAccountingStrategyDetail one = accountingStrategyDetailService.getOne(Wrappers.<TAccountingStrategyDetail>lambdaQuery()
                .eq(TAccountingStrategyDetail::getAccountingStrategyId, accountingStrategy.getId())
                .last(" and DATE_FORMAT(now(), '%H:%i') between start_time and end_time"));
        return R.ok(one);
    }
    /**
     * 通过桩id查询当前时段使用的策略明细
     * @param code 设备编号
     * @return
     */
    @PostMapping("/getDetailByCode")
    public R<TAccountingStrategyDetail> getDetailByPileId(@RequestParam("code") String code){
        // 查询桩
        TChargingPile chargingPile = chargingPileService.getOne(Wrappers.lambdaQuery(TChargingPile.class)
                .eq(TChargingPile::getCode,code)
                .last("LIMIT 1"));
        if(Objects.isNull(chargingPile)){
            return R.fail("未查询到该桩设备");
        }
        Site site = siteService.getById(chargingPile.getSiteId());
        TAccountingStrategy accountingStrategy = accountingStrategyService.getById(site.getAccountingStrategyId());
        TAccountingStrategyDetail one = accountingStrategyDetailService.getOne(Wrappers.<TAccountingStrategyDetail>lambdaQuery()
                .eq(TAccountingStrategyDetail::getAccountingStrategyId, accountingStrategy.getId())
                .last(" and DATE_FORMAT(now(), '%H:%i') between start_time and end_time"));
        return R.ok(one);
    }
    /**
     * 校验充电桩计费模版是否准确
     * @param
     * @return
     */
    @PostMapping("/checkChargingStrategy")
    public R<Boolean> checkChargingStrategy(@RequestBody CheckChargingStrategyDTO dto){
        // 查询桩
        TChargingPile chargingPile = chargingPileService.getOne(Wrappers.lambdaQuery(TChargingPile.class)
                .eq(TChargingPile::getCode,dto.getCode())
                .last("LIMIT 1"));
        if(Objects.isNull(chargingPile)){
            return R.ok(false);
        }
        Site site = siteService.getById(chargingPile.getSiteId());
        TAccountingStrategy accountingStrategy = accountingStrategyService.getById(site.getAccountingStrategyId());
        TAccountingStrategyDetail one = accountingStrategyDetailService.getOne(Wrappers.<TAccountingStrategyDetail>lambdaQuery()
                .eq(TAccountingStrategyDetail::getAccountingStrategyId, accountingStrategy.getId())
                .last(" and DATE_FORMAT(now(), '%H:%i') between start_time and end_time"));
        return R.ok(dto.getStrategyDetailId().equals(one.getId()));
    }
    /**
     * 根据计费策略主表id策略明细
     * @param id
     * @return
     */
    @PostMapping("/getListByAccountingStrategyId")
    public R<List<TAccountingStrategyDetail>> getListByAccountingStrategyId(@RequestParam("id") Integer id){
        List<TAccountingStrategyDetail> list = accountingStrategyDetailService.list(new LambdaQueryWrapper<TAccountingStrategyDetail>().eq(TAccountingStrategyDetail::getAccountingStrategyId, id));
        return R.ok(list);
    }
    /**
     * 通过桩编号查询当前使用的策略明细列表
     * @param code
     * @return
     */
    @PostMapping("/t-accounting-strategy-detail/getDetailListByCode")
    public R<List<TAccountingStrategyDetail>> getDetailListByCode(@RequestParam("code") String code){
        // 查询桩
        TChargingPile chargingPile = chargingPileService.getOne(Wrappers.lambdaQuery(TChargingPile.class)
                .eq(TChargingPile::getCode,code)
                .last("LIMIT 1"));
        if(Objects.isNull(chargingPile)){
            return R.fail("未查询到该桩设备");
        }
        Site site = siteService.getById(chargingPile.getSiteId());
        TAccountingStrategy accountingStrategy = accountingStrategyService.getById(site.getAccountingStrategyId());
        List<TAccountingStrategyDetail> accountingStrategyDetails = accountingStrategyDetailService.list(Wrappers.<TAccountingStrategyDetail>lambdaQuery()
                .eq(TAccountingStrategyDetail::getAccountingStrategyId, accountingStrategy.getId()));
        return R.ok(accountingStrategyDetails);
    }
}
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java
@@ -21,6 +21,8 @@
import com.ruoyi.common.log.annotation.Log;
import com.ruoyi.common.log.enums.BusinessType;
import com.ruoyi.common.log.enums.OperatorType;
import com.ruoyi.integration.api.feignClient.IntegrationClient;
import com.ruoyi.integration.api.model.EndCharge;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
@@ -51,18 +53,16 @@
@RequestMapping("/t-charging-gun")
public class TChargingGunController {
    private final TChargingGunService chargingGunService;
    @Autowired
    private TChargingGunService chargingGunService;
    @Autowired
    private IntegrationClient integrationClient;
    @Resource
    private TChargingPileService chargingPileService;
    @Resource
    private ISiteService siteService;
    @Autowired
    public TChargingGunController(TChargingGunService chargingGunService) {
        this.chargingGunService = chargingGunService;
    }
    /**
     * 查询充电枪列表
     */
@@ -132,6 +132,8 @@
    @PutMapping(value = "/stopCharging")
    public AjaxResult<String> stopCharging(@RequestParam("id") Integer id) {
        // TODO 硬件 结束充电
//        EndCharge endCharge = new EndCharge();
//        integrationClient.endCharge(endCharge);
        return AjaxResult.success();
    }
    
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TFaultMessageController.java
@@ -6,16 +6,17 @@
import com.ruoyi.chargingPile.service.TChargingPileService;
import com.ruoyi.chargingPile.service.TFaultMessageService;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.BasePage;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.log.annotation.Log;
import com.ruoyi.common.log.enums.BusinessType;
import com.ruoyi.common.log.enums.OperatorType;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
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;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * <p>
@@ -46,7 +47,40 @@
        faultMessageService.add(dto);
        return AjaxResult.success();
    }
    /**
     * 获取故障信息列表
     * @param siteId
     * @param basePage
     * @return
     */
    @ResponseBody
    @GetMapping("/getFaultMessageList")
    @ApiOperation(value = "获取故障信息列表数据", tags = {"管理后台-设备监控"})
    public AjaxResult<PageInfo<TFaultMessage>> getFaultMessageList(Integer siteId, BasePage basePage){
        PageInfo<TFaultMessage> pageInfo = new PageInfo<>(basePage.getPageCurr(), basePage.getPageSize());
        List<TFaultMessage> faultMessageList = faultMessageService.getFaultMessageList(pageInfo, siteId);
        pageInfo.setRecords(faultMessageList);
        return AjaxResult.success(pageInfo);
    }
    @ResponseBody
    @PostMapping("/addFaultMessage")
    @ApiOperation(value = "添加故障信息", tags = {"管理后台-设备监控"})
    public AjaxResult addFaultMessage(@RequestBody TFaultMessage faultMessage){
        faultMessageService.save(faultMessage);
        return AjaxResult.success();
    }
    @ResponseBody
    @DeleteMapping("/delFaultMessage/{id}")
    @ApiOperation(value = "删除故障信息", tags = {"管理后台-设备监控"})
    public AjaxResult delFaultMessage(@PathVariable Integer id){
        faultMessageService.removeById(id);
        return AjaxResult.success();
    }
}
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TRepairController.java
@@ -1,8 +1,17 @@
package com.ruoyi.chargingPile.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.chargingPile.api.model.TFaultMessage;
import com.ruoyi.chargingPile.api.model.TRepair;
import com.ruoyi.chargingPile.service.TRepairService;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.BasePage;
import com.ruoyi.common.core.web.page.PageInfo;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
 * <p>
@@ -16,5 +25,37 @@
@RequestMapping("/t-repair")
public class TRepairController {
    @Resource
    private TRepairService repairService;
    @ResponseBody
    @GetMapping("/getRepairList")
    @ApiOperation(value = "获取报修记录列表数据", tags = {"管理后台-设备监控"})
    public AjaxResult<PageInfo<TRepair>> getRepairList(String name, String siteId, BasePage basePage){
        PageInfo<TRepair> pageInfo = new PageInfo<>(basePage.getPageCurr(), basePage.getPageSize());
        List<TRepair> repairList = repairService.getRepairList(pageInfo, name, siteId);
        return AjaxResult.success(repairList);
    }
    @ResponseBody
    @PostMapping("/addRepair")
    @ApiOperation(value = "添加报修记录", tags = {"管理后台-设备监控"})
    public AjaxResult addRepair(@RequestBody TRepair repair){
        repairService.save(repair);
        return AjaxResult.success();
    }
    @ResponseBody
    @DeleteMapping("/delRepair/{id}")
    @ApiOperation(value = "删除报修记录", tags = {"管理后台-设备监控"})
    public AjaxResult delRepair(@PathVariable Integer id){
        repairService.removeById(id);
        return AjaxResult.success();
    }
}
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TFaultMessageMapper.java
@@ -2,6 +2,10 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.chargingPile.api.model.TFaultMessage;
import com.ruoyi.common.core.web.page.PageInfo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * <p>
@@ -12,5 +16,12 @@
 * @since 2024-08-08
 */
public interface TFaultMessageMapper extends BaseMapper<TFaultMessage> {
    /**
     * 获取故障信息列表
     * @param pageInfo
     * @param siteId
     * @return
     */
    List<TFaultMessage> getFaultMessageList(PageInfo<TFaultMessage> pageInfo, @Param("siteId") Integer siteId);
}
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TRepairMapper.java
@@ -2,6 +2,9 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.chargingPile.api.model.TRepair;
import com.ruoyi.common.core.web.page.PageInfo;
import java.util.List;
/**
 * <p>
@@ -12,5 +15,15 @@
 * @since 2024-08-08
 */
public interface TRepairMapper extends BaseMapper<TRepair> {
    /**
     * 获取列表数据
     * @param pageInfo
     * @param name
     * @param siteId
     * @return
     */
    List<TRepair> getRepairList(PageInfo<TRepair> pageInfo, String name, String siteId);
}
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TAccountingStrategyDetailService.java
@@ -44,4 +44,12 @@
     * @return
     */
    Boolean isStrategy24Hour(List<TAccountingStrategyDetail> accountingStrategyDetails);
    /**
     * 判断同阶段是否价格不一致
     * @param accountingStrategyDetails
     * @return
     */
    Boolean isStrategyPriceConsistent(List<TAccountingStrategyDetail> accountingStrategyDetails);
}
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TFaultMessageService.java
@@ -2,6 +2,9 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.chargingPile.api.model.TFaultMessage;
import com.ruoyi.common.core.web.page.PageInfo;
import java.util.List;
/**
 * <p>
@@ -19,4 +22,13 @@
     * @return
     */
    void add(TFaultMessage dto);
    /**
     * 获取故障信息列表
     * @param pageInfo
     * @param siteId
     * @return
     */
    List<TFaultMessage> getFaultMessageList(PageInfo<TFaultMessage> pageInfo, Integer siteId);
}
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TRepairService.java
@@ -2,6 +2,10 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.chargingPile.api.model.TRepair;
import com.ruoyi.common.core.web.page.BasePage;
import com.ruoyi.common.core.web.page.PageInfo;
import java.util.List;
/**
 * <p>
@@ -12,5 +16,12 @@
 * @since 2024-08-08
 */
public interface TRepairService extends IService<TRepair> {
    /**
     * 获取报修记录列表
     * @param name
     * @param siteId
     * @return
     */
    List<TRepair> getRepairList(PageInfo<TRepair> pageInfo, String name, String siteId);
}
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java
@@ -31,6 +31,8 @@
import com.ruoyi.other.api.feignClient.VipClient;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.feignClient.SysUserClient;
import com.ruoyi.system.api.feignClient.SysUserRoleClient;
import com.ruoyi.system.api.model.SysUserRoleVo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@@ -68,6 +70,8 @@
    private AppUserClient appUserClient;
    @Resource
    private VipClient vipClient;
    @Resource
    private SysUserRoleClient sysUserRoleClient;
    
    
@@ -90,8 +94,11 @@
            //非管理员需要根据角色和用户配置查询允许的站点数据
            if(!SecurityUtils.isAdmin(SecurityUtils.getUserId())){
                List<Integer> data = userSiteClient.getSiteIds(sysUser.getUserId()).getData();
                List<Integer> data1 = roleSiteClient.getSiteIds(sysUser.getRoleId()).getData();
                data.addAll(data1);
                List<SysUserRoleVo> data2 = sysUserRoleClient.getRoleByUserId(sysUser.getUserId()).getData();
                if(data2.size() > 0){
                    List<Integer> data1 = roleSiteClient.getSiteIds(data2.get(0).getRoleId()).getData();
                    data.addAll(data1);
                }
                ids = new HashSet<>(data);
            }
        }
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyDetailServiceImpl.java
@@ -24,10 +24,7 @@
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -146,4 +143,23 @@
        return isFirstElementValid || !isTimeContinuous;
    }
    @Override
    public Boolean isStrategyPriceConsistent(List<TAccountingStrategyDetail> accountingStrategyDetails) {
        Map<Integer, BigDecimal> phaseToServiceFee = new HashMap<>();
        for (TAccountingStrategyDetail detail : accountingStrategyDetails) {
            Integer type = detail.getType();
            BigDecimal serviceFee = detail.getServiceCharge();
            if (phaseToServiceFee.containsKey(type)) {
                BigDecimal existingFee = phaseToServiceFee.get(type);
                if (!existingFee.equals(serviceFee)) {
                    return false; // 发现不一致的服务费
                }
            } else {
                phaseToServiceFee.put(type, serviceFee);
            }
        }
        return true; // 所有相同阶段的服务费一致
    }
}
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyServiceImpl.java
@@ -1,5 +1,6 @@
package com.ruoyi.chargingPile.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.chargingPile.api.model.TAccountingStrategy;
import com.ruoyi.chargingPile.api.query.TAccountingStrategyQuery;
@@ -12,9 +13,13 @@
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.feignClient.SysUserClient;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
/**
 * <p>
@@ -33,6 +38,10 @@
    public PageInfo<TAccountingStrategyVO> pageList(TAccountingStrategyQuery query) {
        PageInfo<TAccountingStrategyVO> pageInfo = new PageInfo<>(query.getPageCurr(),query.getPageSize());
        List<TAccountingStrategyVO> list = this.baseMapper.pageList(query,pageInfo);
        List<Integer> parentIds = list.stream().map(TAccountingStrategyVO::getId).collect(Collectors.toList());
        List<TAccountingStrategy> list1 = this.list(Wrappers.lambdaQuery(TAccountingStrategy.class)
                .in(TAccountingStrategy::getParentId, parentIds)
                .in(TAccountingStrategy::getAuditStatus, Arrays.asList(1,2)));
        for (TAccountingStrategyVO tAccountingStrategyVO : list) {
            SysUser data = sysUserClient.getSysUser(tAccountingStrategyVO.getUserId()).getData();
            tAccountingStrategyVO.setUserName(data.getNickName());
@@ -44,6 +53,13 @@
                SysUser two = sysUserClient.getSysUser(tAccountingStrategyVO.getUserId()).getData();
                tAccountingStrategyVO.setTwoUserName(two==null?null:two.getNickName());
            }
            // 匹配编辑后的未审核的
            List<TAccountingStrategy> accountingStrategies = list1.stream().filter(e -> e.getParentId().equals(tAccountingStrategyVO.getId()))
                    .sorted(Comparator.comparing(TAccountingStrategy::getCreateTime).reversed()).collect(Collectors.toList());
            if(!CollectionUtils.isEmpty(accountingStrategies)){
                TAccountingStrategy tAccountingStrategy = accountingStrategies.get(0);
                tAccountingStrategyVO.setAuditStatus(tAccountingStrategy.getAuditStatus());
            }
        }
        pageInfo.setRecords(list);
        return pageInfo;
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TFaultMessageServiceImpl.java
@@ -11,9 +11,12 @@
import com.ruoyi.chargingPile.service.TChargingPileService;
import com.ruoyi.chargingPile.service.TFaultMessageService;
import com.ruoyi.common.core.utils.MsgUtil;
import com.ruoyi.common.core.web.page.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * <p>
@@ -48,4 +51,16 @@
        chargingPileNotificationService.saveData(4,dto.getSiteId(),dto.getChargingPileId(),site.getPhone(),"检测到"+siteName+"..."+chargingPile.getNumber()+"号桩设备离线,请及时查看处理!");
        this.save(dto);
    }
    /**
     * 获取故障信息列表
     * @param pageInfo
     * @param siteId
     * @return
     */
    @Override
    public List<TFaultMessage> getFaultMessageList(PageInfo<TFaultMessage> pageInfo, Integer siteId) {
        return this.baseMapper.getFaultMessageList(pageInfo, siteId);
    }
}
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TRepairServiceImpl.java
@@ -1,10 +1,18 @@
package com.ruoyi.chargingPile.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.chargingPile.api.feignClient.SiteClient;
import com.ruoyi.chargingPile.api.model.Site;
import com.ruoyi.chargingPile.api.model.TRepair;
import com.ruoyi.chargingPile.mapper.TRepairMapper;
import com.ruoyi.chargingPile.service.TRepairService;
import com.ruoyi.common.core.web.page.BasePage;
import com.ruoyi.common.core.web.page.PageInfo;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;
/**
 * <p>
@@ -16,5 +24,16 @@
 */
@Service
public class TRepairServiceImpl extends ServiceImpl<TRepairMapper, TRepair> implements TRepairService {
    /**
     * 获取报修记录列表
     * @param name
     * @param siteId
     * @return
     */
    @Override
    public List<TRepair> getRepairList(PageInfo<TRepair> pageInfo, String name, String siteId) {
        return this.baseMapper.getRepairList(pageInfo, name, siteId);
    }
}
ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TAccountingStrategyDetailMapper.xml
@@ -20,8 +20,8 @@
    </sql>
    <select id="queryAccountingStrategyDetailByStrategyId" resultType="com.ruoyi.chargingPile.api.vo.TAccountingStrategyDetailVO">
        SELECT
            tasd.id, tasd.accounting_strategy_id, tasd.`type`, tasd.start_time, tasd.end_time, tasd.electrovalence, tasd.service_charge,
            tasd.cost_service_charge,tas.discount
            tasd.id, tasd.accounting_strategy_id, tasd.`type`, tasd.start_time, tasd.end_time, ROUND(tasd.electrovalence,4) AS electrovalence,
            ROUND(tasd.service_charge,4) AS serviceCharge,ROUND(tasd.cost_service_charge,4) AS costServiceCharge,tas.discount
        FROM t_accounting_strategy_detail tasd
        LEFT JOIN t_accounting_strategy tas ON tas.id = tasd.accounting_strategy_id
        <where>
ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TAccountingStrategyMapper.xml
@@ -37,6 +37,7 @@
                AND audit_status = #{query.auditStatus}
            </if>
            AND site_id IS NULL
            AND (parent_id IS NULL OR audit_status = 3 OR audit_status = 4)
            AND del_flag = ${@com.ruoyi.common.core.enums.DelFlagEnum@NO.getCode()}
        </where>
        ORDER BY create_time DESC
ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TFaultMessageMapper.xml
@@ -19,4 +19,20 @@
        id, app_user_id, site_id, charging_pile_id, status, down_time, create_time, del_flag
    </sql>
    <select id="getFaultMessageList" resultType="com.ruoyi.chargingPile.api.model.TFaultMessage">
        select
        a.*,
        b.name as chargingPileName,
        c.name as siteName
        from t_fault_message a
        left join t_charging_pile b on (a.charging_pile_id = b.id)
        left join t_site c on (a.site_id = c.id)
        where a.del_flag = 0
        <if test="null != siteId">
            and a.site_id = #{siteId}
        </if>
        order by a.create_time desc
    </select>
</mapper>
ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TRepairMapper.xml
@@ -19,4 +19,23 @@
        id, repairman, site_id, charging_pile_id, content, repair_time, create_time, del_flag
    </sql>
    <select id="getRepairList" resultType="com.ruoyi.chargingPile.api.model.TRepair">
        select
        a.*,
        b.name as chargingPileName,
        c.name as siteName
        from t_repair a
        left join t_charging_pile b on (a.charging_pile_id = b.id)
        left join t_site c on (a.site_id = c.id)
        where a.del_flag = 0
        <if test="null != name and '' != name">
            and a.repairman like CONCAT('%', #{name}, '%')
        </if>
        <if test="null != siteId">
            and a.site_id = #{siteId}
        </if>
        order by a.create_time desc
    </select>
</mapper>
ruoyi-service/ruoyi-integration/pom.xml
@@ -169,6 +169,10 @@
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-api-order</artifactId>
        </dependency>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-api-chargingPile</artifactId>
        </dependency>
    </dependencies>
    <build>
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/controller/PlatformStopChargingReplyController.java
New file
@@ -0,0 +1,34 @@
package com.ruoyi.integration.controller;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.integration.api.model.PlatformStopChargingReply;
import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply;
import com.ruoyi.integration.mongodb.service.PlatformStopChargingReplyService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
 * @author zhibing.pu
 * @Date 2024/9/2 16:52
 */
@RestController
@RequestMapping("/platformStopChargingReply")
public class PlatformStopChargingReplyController {
    @Resource
    private PlatformStopChargingReplyService platformStopChargingReplyService;
    /**
     * 获取远程停机命令应答
     * @param query
     * @return
     */
    @PostMapping("/getPlatformStopChargingReply")
    public R<PlatformStopChargingReply> getPlatformStopChargingReply(@RequestBody GetPlatformStopChargingReply query){
        PlatformStopChargingReply platformStopChargingReply = platformStopChargingReplyService.getPlatformStopChargingReply(query);
        return R.ok(platformStopChargingReply);
    }
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/constant/SendTagConstant.java
@@ -15,6 +15,10 @@
     */
    public static final String PING ="ping";
    /**
     * 充电结束
     */
    public static final String END_CHARGE = "end_charge";
    /**
     * 计费模型验证请求
     */
    public static final String BILLING_MODE_VERIFY ="billing_mode_verify";
@@ -85,7 +89,7 @@
    /**
     * 对时设置应答
     */
    public static final String TIMING_SETTING_REPLY ="timing_setting_reply";
    public static final String TIMING_SETTING ="timing_setting";
    /**
     * 计费模型应答
     */
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/controller/SendMessageController.java
@@ -76,10 +76,10 @@
     * @param endCharge 实体对象
     * @return
     */
    @PostMapping("/endCharge")
    public String endCharge(@RequestBody EndCharge endCharge){
        return  iotMessageProduce.sendMessage(endCharge.getCharging_pile_code(), ServiceIdMenu.END_CHARGE.getKey(),messageUtil.endCharge(endCharge));
    }
//    @PostMapping("/endCharge")
//    public String endCharge(@RequestBody EndCharge endCharge){
//        return  iotMessageProduce.sendMessage(endCharge.getCharging_pile_code(), ServiceIdMenu.END_CHARGE.getKey(),messageUtil.endCharge(endCharge));
//    }
    /**
     * 运营平台确认启动充电
@@ -172,13 +172,13 @@
    }
    /**
     * 对时设置
     * @param timingSetting 实体对象
     * 对时设置应答
     * @param timingSettingReply 实体对象
     * @return
     */
    @PostMapping("/timingSetting")
    public String timingSetting(@RequestBody TimingSetting timingSetting){
        return  iotMessageProduce.sendMessage(timingSetting.getCharging_pile_code(), ServiceIdMenu.TIMING_SETTING.getKey(),messageUtil.timingSetting(timingSetting));
    @PostMapping("/timingSettingReply")
    public String timingSettingReply(@RequestBody TimingSettingReply timingSettingReply){
        return  iotMessageProduce.sendMessage(timingSettingReply.getCharging_pile_code(), ServiceIdMenu.TIMING_SETTING_REPLY.getKey(),messageUtil.timingSettingReply(timingSettingReply));
    }
    /**
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/enums/ServiceIdMenu.java
@@ -26,10 +26,10 @@
     * 读取实时监测数据
     */
     READ_REAL_TIME_MONITORING_DATA ("读取实时监测数据","read_real_time_monitoring_data"),
    /**
     * 充电结束
     */
     END_CHARGE ("充电结束","end_charge"),
//    /**
//     * 充电结束
//     */
//     END_CHARGE ("充电结束","end_charge"),
    /**
     * 运营平台确认启动充电
     */
@@ -67,9 +67,9 @@
     */
     WORKING_PARAMETER_SETTING ("充电桩工作参数设置","working_parameter_setting"),
    /**
     * 对时设置
     * 对时设置应答
     */
     TIMING_SETTING ("对时设置","timing_setting"),
     TIMING_SETTING_REPLY ("对时设置应答","timing_setting_reply"),
    /**
     * 计费模型设置
     */
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java
@@ -44,6 +44,9 @@
            case SendTagConstant.PING:
                sendResult = enhanceProduce.pingMessage(content);
                break;
            case SendTagConstant.END_CHARGE:
                sendResult = enhanceProduce.endChargeMessage(content);
                break;
            case SendTagConstant.BILLING_MODE_VERIFY:
                sendResult = enhanceProduce.billingModeVerifyMessage(content);
                break;
@@ -92,8 +95,8 @@
            case SendTagConstant.WORKING_PARAMETER_SETTING_REPLY:
                sendResult = enhanceProduce.workingParameterSettingReplyMessage(content);
                break;
            case SendTagConstant.TIMING_SETTING_REPLY:
                sendResult = enhanceProduce.timingSettingReplyMessage(content);
            case SendTagConstant.TIMING_SETTING:
                sendResult = enhanceProduce.timingSettingMessage(content);
                break;
            case SendTagConstant.SETUP_BILLING_MODEL_REPLY:
                sendResult = enhanceProduce.setupBillingModelReplyMessage(content);
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/CP56Time2aConverter.java
New file
@@ -0,0 +1,39 @@
package com.ruoyi.integration.iotda.utils.tools;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;
public class CP56Time2aConverter {
    public static String convertToCP56Time2a(Date date) {
        try {
            DatatypeFactory datatypeFactory = DatatypeFactory.newInstance();
            GregorianCalendar calendar = new GregorianCalendar();
            calendar.setTime(date);
            TimeZone timeZone = calendar.getTimeZone();
            XMLGregorianCalendar xmlGregorianCalendar = datatypeFactory.newXMLGregorianCalendar(
                    calendar.get(Calendar.YEAR),
                    calendar.get(Calendar.MONTH)+1,
                    calendar.get(Calendar.DAY_OF_MONTH),
                    calendar.get(Calendar.HOUR_OF_DAY),
                    calendar.get(Calendar.MINUTE),
                    calendar.get(Calendar.SECOND),
                    calendar.get(Calendar.MILLISECOND),
                    (timeZone.getRawOffset() / (60 * 1000)));
            return xmlGregorianCalendar.toXMLFormat();
        } catch (DatatypeConfigurationException e) {
            throw new RuntimeException("Error creating DatatypeFactory", e);
        }
    }
    public static void main(String[] args) {
        Date now = new Date();
        String cp56Time2a = convertToCP56Time2a(now);
        System.out.println("CP56Time2a: " + cp56Time2a);
    }
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/MessageUtil.java
@@ -44,7 +44,7 @@
    @Autowired
    private WorkingParameterSettingService workingParameterSettingService;
    @Autowired
    private TimingSettingService timingSettingService;
    private TimingSettingReplyService timingSettingReplyService;
    @Autowired
    private SetupBillingModelService setupBillingModelService;
    @Autowired
@@ -109,10 +109,10 @@
     * @param endCharge 实体对象
     * @return
     */
    public String endCharge(EndCharge endCharge){
        endChargeService.create(endCharge);
        return  getMessageJsonString(endCharge, ServiceIdMenu.END_CHARGE.getValue());
    }
//    public String endCharge(EndCharge endCharge){
//        endChargeService.create(endCharge);
//        return  getMessageJsonString(endCharge, ServiceIdMenu.END_CHARGE.getValue());
//    }
    /**
     * 运营平台确认启动充电
@@ -205,13 +205,13 @@
    }
    /**
     * 对时设置
     * @param timingSetting 实体对象
     * 对时设置应答
     * @param timingSettingReply 实体对象
     * @return
     */
    public String timingSetting(TimingSetting timingSetting){
        timingSettingService.create(timingSetting);
        return  getMessageJsonString(timingSetting, ServiceIdMenu.TIMING_SETTING.getValue());
    public String timingSettingReply(TimingSettingReply timingSettingReply){
        timingSettingReplyService.create(timingSettingReply);
        return  getMessageJsonString(timingSettingReply, ServiceIdMenu.TIMING_SETTING_REPLY.getValue());
    }
    /**
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/StrategyUtil.java
New file
@@ -0,0 +1,271 @@
package com.ruoyi.integration.iotda.utils.tools;
import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.integration.api.model.AcquisitionBillingModeReply;
import lombok.extern.slf4j.Slf4j;
import java.io.Serializable;
import java.time.LocalTime;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
public class StrategyUtil implements Serializable {
    /**
     * 获取计费模版的价格
     * @return
     */
    public static Map<Integer, TAccountingStrategyDetail> getStrategyPrice(List<TAccountingStrategyDetail> accountingStrategyDetails) {
        Map<Integer, TAccountingStrategyDetail> phaseToServiceFee = new HashMap<>();
        for (TAccountingStrategyDetail detail : accountingStrategyDetails) {
            Integer type = detail.getType();
            if (!phaseToServiceFee.containsKey(type)) {
                phaseToServiceFee.put(type, detail);
            }
        }
        return phaseToServiceFee;
    }
    /**
     * 计费模版的价格设置
     * @return
     */
    public static void setStrategyPrice(Map<Integer, TAccountingStrategyDetail> accountingStrategyDetails,AcquisitionBillingModeReply acquisitionBillingModeReply) {
        accountingStrategyDetails.forEach((k,v)->{
            switch (k){
                case 1:
                    acquisitionBillingModeReply.setSharp_peak_electricity_rate(v.getElectrovalence());
//                    acquisitionBillingModeReply.setSharp_peak_service_rate(v.getServiceCharge());
                    break;
                case 2:
                    acquisitionBillingModeReply.setPeak_electricity_rate(v.getElectrovalence());
//                    acquisitionBillingModeReply.setPeak_service_rate(v.getServiceCharge());
                    break;
                case 3:
                    acquisitionBillingModeReply.setFlat_peak_electricity_rate(v.getElectrovalence());
//                    acquisitionBillingModeReply.setFlat_peak_service_rate(v.getServiceCharge());
                    break;
                default:
                    acquisitionBillingModeReply.setLow_peak_electricity_rate(v.getElectrovalence());
//                    acquisitionBillingModeReply.setLow_peak_service_rate(v.getServiceCharge());
                    break;
            }
        });
    }
    /**
     * 计费模版的时段设置
     * @return
     */
    public static void setTime(List<TAccountingStrategyDetail> accountingStrategyDetails,AcquisitionBillingModeReply acquisitionBillingModeReply) {
        LocalTime time = LocalTime.of(0, 15, 0);
        for (int i = 1; i <= 48; i++) {
            if(i != 1){
                time = time.plusMinutes(30);
            }
            accountingStrategyDetails = accountingStrategyDetails.stream().sorted(Comparator.comparing(TAccountingStrategyDetail::getStartTime)).collect(Collectors.toList());
            for (TAccountingStrategyDetail accountingStrategyDetail : accountingStrategyDetails) {
                if(DateUtils.string2LocalTime(accountingStrategyDetail.getStartTime()).isBefore(time)
                        && DateUtils.string2LocalTime(accountingStrategyDetail.getEndTime()).isAfter(time)){
                    switch (i){
                        case 1:
                            acquisitionBillingModeReply.setTime1(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 2:
                            acquisitionBillingModeReply.setTime2(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 3:
                            acquisitionBillingModeReply.setTime3(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 4:
                            acquisitionBillingModeReply.setTime4(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 5:
                            acquisitionBillingModeReply.setTime5(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 6:
                            acquisitionBillingModeReply.setTime6(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 7:
                            acquisitionBillingModeReply.setTime7(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 8:
                            acquisitionBillingModeReply.setTime8(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 9:
                            acquisitionBillingModeReply.setTime9(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 10:
                            acquisitionBillingModeReply.setTime10(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 11:
                            acquisitionBillingModeReply.setTime11(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 12:
                            acquisitionBillingModeReply.setTime12(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 13:
                            acquisitionBillingModeReply.setTime13(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 14:
                            acquisitionBillingModeReply.setTime14(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 15:
                            acquisitionBillingModeReply.setTime15(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 16:
                            acquisitionBillingModeReply.setTime16(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 17:
                            acquisitionBillingModeReply.setTime17(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 18:
                            acquisitionBillingModeReply.setTime18(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 19:
                            acquisitionBillingModeReply.setTime19(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 20:
                            acquisitionBillingModeReply.setTime20(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 21:
                            acquisitionBillingModeReply.setTime21(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 22:
                            acquisitionBillingModeReply.setTime22(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 23:
                            acquisitionBillingModeReply.setTime23(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 24:
                            acquisitionBillingModeReply.setTime24(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 25:
                            acquisitionBillingModeReply.setTime25(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 26:
                            acquisitionBillingModeReply.setTime26(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 27:
                            acquisitionBillingModeReply.setTime27(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 28:
                            acquisitionBillingModeReply.setTime28(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 29:
                            acquisitionBillingModeReply.setTime29(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 30:
                            acquisitionBillingModeReply.setTime30(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 31:
                            acquisitionBillingModeReply.setTime31(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 32:
                            acquisitionBillingModeReply.setTime32(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 33:
                            acquisitionBillingModeReply.setTime33(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 34:
                            acquisitionBillingModeReply.setTime34(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 35:
                            acquisitionBillingModeReply.setTime35(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 36:
                            acquisitionBillingModeReply.setTime36(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 37:
                            acquisitionBillingModeReply.setTime37(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 38:
                            acquisitionBillingModeReply.setTime38(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 39:
                            acquisitionBillingModeReply.setTime39(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 40:
                            acquisitionBillingModeReply.setTime40(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 41:
                            acquisitionBillingModeReply.setTime41(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 42:
                            acquisitionBillingModeReply.setTime42(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 43:
                            acquisitionBillingModeReply.setTime43(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 44:
                            acquisitionBillingModeReply.setTime44(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 45:
                            acquisitionBillingModeReply.setTime45(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 46:
                            acquisitionBillingModeReply.setTime46(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 47:
                            acquisitionBillingModeReply.setTime47(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                        case 48:
                            acquisitionBillingModeReply.setTime48(accountingStrategyDetail.getType().equals(1)?0
                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
                            break;
                    }
                }
            }
        }
    }
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/PlatformStopChargingReplyService.java
@@ -1,7 +1,15 @@
package com.ruoyi.integration.mongodb.service;
import com.ruoyi.integration.api.model.PlatformStopChargingReply;
import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply;
import com.ruoyi.integration.mongodb.base.BaseService;
public interface PlatformStopChargingReplyService extends BaseService<PlatformStopChargingReply> {
    /**
     * 根据枪编号获取停机应答
     * @return
     */
    PlatformStopChargingReply getPlatformStopChargingReply(GetPlatformStopChargingReply query);
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/UploadRealTimeMonitoringDataService.java
@@ -17,4 +17,11 @@
    List<UploadRealTimeMonitoringData> getDataByOrderCode(String code);
    List<UploadRealTimeMonitoringData> getDataAll(Set<String> values, Integer page, Integer size);
    /**
     * 查询订单最新一条数据
     * @param transaction_serial_number
     * @return
     */
    UploadRealTimeMonitoringData getLastDataById(String transaction_serial_number);
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/PlatformStopChargingReplyServiceImpl.java
@@ -1,10 +1,13 @@
package com.ruoyi.integration.mongodb.service.impl;
import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply;
import com.ruoyi.integration.iotda.constant.IotConstant;
import com.ruoyi.integration.api.model.PlatformStopChargingReply;
import com.ruoyi.integration.mongodb.service.PlatformStopChargingReplyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.List;
@@ -28,4 +31,16 @@
    public List<PlatformStopChargingReply> findAll() {
        return mongoTemplate.findAll(PlatformStopChargingReply.class);
    }
    /**
     * 根据枪编号获取
     * @return
     */
    @Override
    public PlatformStopChargingReply getPlatformStopChargingReply(GetPlatformStopChargingReply query) {
        List<PlatformStopChargingReply> platformStopChargingReplies = mongoTemplate.find(new Query().addCriteria(Criteria.where("charging_pile_code").is(query.getCharging_pile_code())
                .and("charging_gun_code").is(query.getCharging_gun_code())), PlatformStopChargingReply.class);
        return platformStopChargingReplies.size() > 0 ? platformStopChargingReplies.get(0) : null;
    }
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/UploadRealTimeMonitoringDataServiceImpl.java
@@ -73,4 +73,17 @@
        return uploadRealTimeMonitoringData;
    }
    @Override
    public UploadRealTimeMonitoringData getLastDataById(String transaction_serial_number) {
        Query query = new Query();
        if (StringUtils.isNotEmpty(transaction_serial_number)){
            query.addCriteria(Criteria.where("transaction_serial_number").is(transaction_serial_number));
        }
        // 按照 createdAt 字段降序排序
        query.with(Sort.by(Sort.Direction.DESC, "create_time"));
        // 限制结果只返回一条记录
        query.limit(1);
        return mongoTemplate.findOne(query, UploadRealTimeMonitoringData.class);
    }
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/AcquisitionBillingModeMessageListener.java
@@ -1,7 +1,14 @@
package com.ruoyi.integration.rocket.listener;
import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyDetailClient;
import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
import com.ruoyi.integration.api.model.AcquisitionBillingMode;
import com.ruoyi.integration.api.model.AcquisitionBillingModeReply;
import com.ruoyi.integration.api.model.Online;
import com.ruoyi.integration.iotda.enums.ServiceIdMenu;
import com.ruoyi.integration.iotda.utils.produce.IotMessageProduce;
import com.ruoyi.integration.iotda.utils.tools.MessageUtil;
import com.ruoyi.integration.iotda.utils.tools.StrategyUtil;
import com.ruoyi.integration.mongodb.service.AcquisitionBillingModeService;
import com.ruoyi.integration.rocket.model.AcquisitionBillingModeMessage;
import com.ruoyi.integration.rocket.util.EnhanceMessageHandler;
@@ -11,6 +18,10 @@
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@Slf4j
@Component
@@ -24,7 +35,12 @@
    @Autowired
    private AcquisitionBillingModeService acquisitionBillingModeService;
    @Autowired
    private AccountingStrategyDetailClient accountingStrategyDetailClient;
    @Autowired
    private IotMessageProduce iotMessageProduce;
    @Autowired
    private MessageUtil messageUtil;
    @Override
    protected void handleMessage(AcquisitionBillingModeMessage message) throws Exception {
        // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试
@@ -33,7 +49,15 @@
        AcquisitionBillingMode acquisitionBillingMode = new AcquisitionBillingMode();
        BeanUtils.copyProperties(message,acquisitionBillingMode);
        acquisitionBillingModeService.create(acquisitionBillingMode);
        // 业务处理
        // 业务处理  计费模型请求应答  1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段
        List<TAccountingStrategyDetail> accountingStrategyDetails = accountingStrategyDetailClient.getDetailListByCode(message.getCharging_pile_code()).getData();
        Map<Integer, TAccountingStrategyDetail> strategyPrice = StrategyUtil.getStrategyPrice(accountingStrategyDetails);
        // 价格设置
        AcquisitionBillingModeReply acquisitionBillingModeReply = new AcquisitionBillingModeReply();
        StrategyUtil.setStrategyPrice(strategyPrice,acquisitionBillingModeReply);
        // 时段设置
        StrategyUtil.setTime(accountingStrategyDetails,acquisitionBillingModeReply);
        iotMessageProduce.sendMessage(acquisitionBillingModeReply.getCharging_pile_code(), ServiceIdMenu.ACQUISITION_BILLING_MODE_REPLY.getKey(),messageUtil.acquisitionBillingModeReply(acquisitionBillingModeReply));
    }
    @Override
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/BillingModeVerifyMessageListener.java
@@ -1,7 +1,15 @@
package com.ruoyi.integration.rocket.listener;
import com.ruoyi.chargingPile.api.dto.CheckChargingStrategyDTO;
import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyDetailClient;
import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
import com.ruoyi.integration.api.model.AcquisitionBillingMode;
import com.ruoyi.integration.api.model.BillingModeVerify;
import com.ruoyi.integration.api.model.BillingModeVerifyReply;
import com.ruoyi.integration.iotda.enums.ServiceIdMenu;
import com.ruoyi.integration.iotda.utils.produce.IotMessageProduce;
import com.ruoyi.integration.iotda.utils.tools.MessageUtil;
import com.ruoyi.integration.mongodb.service.BillingModeVerifyReplyService;
import com.ruoyi.integration.mongodb.service.BillingModeVerifyService;
import com.ruoyi.integration.rocket.model.BillingModeVerifyMessage;
import com.ruoyi.integration.rocket.util.EnhanceMessageHandler;
@@ -24,6 +32,12 @@
    @Autowired
    private BillingModeVerifyService billingModeVerifyService;
    @Autowired
    private IotMessageProduce iotMessageProduce;
    @Autowired
    private MessageUtil messageUtil;
    @Autowired
    private AccountingStrategyDetailClient accountingStrategyDetailClient;
    @Override
    protected void handleMessage(BillingModeVerifyMessage message) throws Exception {
@@ -34,6 +48,28 @@
        BeanUtils.copyProperties(message,billingModeVerify);
        billingModeVerifyService.create(billingModeVerify);
        // 业务处理
        BillingModeVerifyReply billingModeVerifyReply = new BillingModeVerifyReply();
        if(message.getBilling_model_code().equals("0")){
            // 首次
            billingModeVerifyReply.setCharging_pile_code(billingModeVerify.getCharging_pile_code());
            billingModeVerifyReply.setBilling_model_code("0");
            billingModeVerifyReply.setBilling_model_result(1);
        }else {
            // 查询桩使用的模版
            CheckChargingStrategyDTO dto = new CheckChargingStrategyDTO();
            dto.setCode(message.getBilling_model_code());
            dto.setStrategyDetailId(Integer.valueOf(message.getBilling_model_code()));
            Boolean check = accountingStrategyDetailClient.checkChargingStrategy(dto).getData();
            // 校验计费模版是否准确
            billingModeVerifyReply.setCharging_pile_code(billingModeVerify.getCharging_pile_code());
            billingModeVerifyReply.setBilling_model_code(message.getBilling_model_code());
            if(check){
                billingModeVerifyReply.setBilling_model_result(0);
            }else {
                billingModeVerifyReply.setBilling_model_result(1);
            }
        }
        iotMessageProduce.sendMessage(billingModeVerifyReply.getCharging_pile_code(), ServiceIdMenu.BILLING_MODE_VERIFY_REPLY.getKey(),messageUtil.billingModeVerifyReply(billingModeVerifyReply));
    }
    @Override
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/BmsAbortMessageListener.java
@@ -5,12 +5,15 @@
import com.ruoyi.integration.mongodb.service.BmsAbortService;
import com.ruoyi.integration.rocket.model.BmsAbortMessage;
import com.ruoyi.integration.rocket.util.EnhanceMessageHandler;
import com.ruoyi.order.api.feignClient.ChargingOrderClient;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Slf4j
@Component
@@ -24,6 +27,12 @@
    @Autowired
    private BmsAbortService bmsAbortService;
    @Resource
    private ChargingOrderClient chargingOrderClient;
    @Override
    protected void handleMessage(BmsAbortMessage message) throws Exception {
        // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试
@@ -33,6 +42,7 @@
        BeanUtils.copyProperties(message,bmsAbort);
        bmsAbortService.create(bmsAbort);
        // 业务处理
        chargingOrderClient.excelEndCharge(bmsAbort.getTransaction_serial_number());
    }
    @Override
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/EndChargeMessageListener.java
New file
@@ -0,0 +1,98 @@
package com.ruoyi.integration.rocket.listener;
import com.ruoyi.integration.api.model.EndCharge;
import com.ruoyi.integration.api.model.Ping;
import com.ruoyi.integration.api.model.Pong;
import com.ruoyi.integration.iotda.enums.ServiceIdMenu;
import com.ruoyi.integration.iotda.utils.produce.IotMessageProduce;
import com.ruoyi.integration.iotda.utils.tools.MessageUtil;
import com.ruoyi.integration.mongodb.service.EndChargeService;
import com.ruoyi.integration.mongodb.service.PingService;
import com.ruoyi.integration.rocket.model.EndChargeMessage;
import com.ruoyi.integration.rocket.model.PingMessage;
import com.ruoyi.integration.rocket.util.EnhanceMessageHandler;
import com.ruoyi.order.api.feignClient.ChargingOrderClient;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Slf4j
@Component
@RocketMQMessageListener(
        consumerGroup = "enhance_consumer_group",
        topic = "rocket_enhance",
        selectorExpression = "*",
        consumeThreadMax = 5 //默认是64个线程并发消息,配置 consumeThreadMax 参数指定并发消费线程数,避免太大导致资源不够
)
public class EndChargeMessageListener extends EnhanceMessageHandler<EndChargeMessage> implements RocketMQListener<EndChargeMessage> {
    @Autowired
    private EndChargeService endChargeService;
    @Autowired
    private MessageUtil messageUtil;
    @Autowired
    private IotMessageProduce iotMessageProduce;
    @Resource
    private ChargingOrderClient chargingOrderClient;
    @Override
    protected void handleMessage(EndChargeMessage message) throws Exception {
        // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试
        log.info("充电结束-业务消息处理:{}",message);
        // 持久化消息
        EndCharge endCharge = new EndCharge();
        BeanUtils.copyProperties(message,endCharge);
        endChargeService.create(endCharge);
        // 业务处理
        chargingOrderClient.endCharge(endCharge.getTransaction_serial_number());
    }
    @Override
    protected void handleMaxRetriesExceeded(EndChargeMessage message) {
        // 当超过指定重试次数消息时此处方法会被调用
        // 生产中可以进行回退或其他业务操作
        log.error("消息消费失败,请执行后续处理");
    }
    /**
     * 是否执行重试机制
     */
    @Override
    protected boolean isRetry() {
        return true;
    }
    @Override
    protected boolean throwException() {
        // 是否抛出异常,false搭配retry自行处理异常
        return false;
    }
    /**
     * 若需要处理消息过滤,在父级中进行统一处理,或者在此处实现之后,自行处理
     * @param message 待处理消息
     * @return true: 本次消息被过滤,false:不过滤
     */
    @Override
    protected boolean filter(EndChargeMessage message) {
        // 此处可做消息过滤
        return false;
    }
    /**
     * 监听消费消息,不需要执行业务处理,委派给父类做基础操作,父类做完基础操作后会调用子类的实际处理类型
     */
    @Override
    public void onMessage(EndChargeMessage message) {
        super.dispatchMessage(message);
    }
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/MotorAbortMessageListener.java
@@ -5,12 +5,15 @@
import com.ruoyi.integration.mongodb.service.MotorAbortService;
import com.ruoyi.integration.rocket.model.MotorAbortMessage;
import com.ruoyi.integration.rocket.util.EnhanceMessageHandler;
import com.ruoyi.order.api.feignClient.ChargingOrderClient;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Slf4j
@Component
@@ -24,6 +27,13 @@
    @Autowired
    private MotorAbortService motorAbortService;
    @Resource
    private ChargingOrderClient chargingOrderClient;
    @Override
    protected void handleMessage(MotorAbortMessage message) throws Exception {
        // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试
@@ -33,6 +43,7 @@
        BeanUtils.copyProperties(message,motorAbort);
        motorAbortService.create(motorAbort);
        // 业务处理
        chargingOrderClient.excelEndCharge(motorAbort.getTransaction_serial_number());
    }
    @Override
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TimingSettingMessageListener.java
New file
@@ -0,0 +1,93 @@
package com.ruoyi.integration.rocket.listener;
import com.ruoyi.integration.api.model.TimingSetting;
import com.ruoyi.integration.api.model.TimingSettingReply;
import com.ruoyi.integration.iotda.enums.ServiceIdMenu;
import com.ruoyi.integration.iotda.utils.produce.IotMessageProduce;
import com.ruoyi.integration.iotda.utils.tools.CP56Time2aConverter;
import com.ruoyi.integration.iotda.utils.tools.MessageUtil;
import com.ruoyi.integration.mongodb.service.TimingSettingReplyService;
import com.ruoyi.integration.mongodb.service.TimingSettingService;
import com.ruoyi.integration.rocket.model.TimingSettingMessage;
import com.ruoyi.integration.rocket.util.EnhanceMessageHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
@Slf4j
@Component
@RocketMQMessageListener(
        consumerGroup = "enhance_consumer_group",
        topic = "rocket_enhance",
        selectorExpression = "*",
        consumeThreadMax = 5 //默认是64个线程并发消息,配置 consumeThreadMax 参数指定并发消费线程数,避免太大导致资源不够
)
public class TimingSettingMessageListener extends EnhanceMessageHandler<TimingSettingMessage> implements RocketMQListener<TimingSettingMessage> {
    @Autowired
    private TimingSettingService timingSettingService;
    @Autowired
    private IotMessageProduce iotMessageProduce;
    @Autowired
    private MessageUtil messageUtil;
    @Override
    protected void handleMessage(TimingSettingMessage message) throws Exception {
        // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试
        log.info("对时设置-业务消息处理:{}",message);
        // 持久化消息
        TimingSetting timingSetting = new TimingSetting();
        BeanUtils.copyProperties(message,timingSetting);
        timingSettingService.create(timingSetting);
        // 业务处理  对时设置应答
        TimingSettingReply timingSettingReply = new TimingSettingReply();
        timingSettingReply.setCharging_pile_code(message.getCharging_pile_code());
        timingSettingReply.setCurrent_time(CP56Time2aConverter.convertToCP56Time2a(new Date()));
        iotMessageProduce.sendMessage(timingSettingReply.getCharging_pile_code(), ServiceIdMenu.TIMING_SETTING_REPLY.getKey(),messageUtil.timingSettingReply(timingSettingReply));
    }
    @Override
    protected void handleMaxRetriesExceeded(TimingSettingMessage message) {
        // 当超过指定重试次数消息时此处方法会被调用
        // 生产中可以进行回退或其他业务操作
        log.error("消息消费失败,请执行后续处理");
    }
    /**
     * 是否执行重试机制
     */
    @Override
    protected boolean isRetry() {
        return true;
    }
    @Override
    protected boolean throwException() {
        // 是否抛出异常,false搭配retry自行处理异常
        return false;
    }
    /**
     * 若需要处理消息过滤,在父级中进行统一处理,或者在此处实现之后,自行处理
     * @param message 待处理消息
     * @return true: 本次消息被过滤,false:不过滤
     */
    @Override
    protected boolean filter(TimingSettingMessage message) {
        // 此处可做消息过滤
        return false;
    }
    /**
     * 监听消费消息,不需要执行业务处理,委派给父类做基础操作,父类做完基础操作后会调用子类的实际处理类型
     */
    @Override
    public void onMessage(TimingSettingMessage message) {
        super.dispatchMessage(message);
    }
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TimingSettingReplyMessageListener.java
File was deleted
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TransactionRecordMessageListener.java
@@ -1,7 +1,11 @@
package com.ruoyi.integration.rocket.listener;
import com.ruoyi.integration.api.model.ConfirmTransactionRecord;
import com.ruoyi.integration.api.model.Online;
import com.ruoyi.integration.api.model.TransactionRecord;
import com.ruoyi.integration.iotda.enums.ServiceIdMenu;
import com.ruoyi.integration.iotda.utils.produce.IotMessageProduce;
import com.ruoyi.integration.iotda.utils.tools.MessageUtil;
import com.ruoyi.integration.mongodb.service.TransactionRecordService;
import com.ruoyi.integration.rocket.model.TransactionRecordMessage;
import com.ruoyi.integration.rocket.util.EnhanceMessageHandler;
@@ -24,6 +28,10 @@
    @Autowired
    private TransactionRecordService transactionRecordService;
    @Autowired
    private IotMessageProduce iotMessageProduce;
    @Autowired
    private MessageUtil messageUtil;
    @Override
    protected void handleMessage(TransactionRecordMessage message) throws Exception {
        // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试
@@ -33,6 +41,10 @@
        BeanUtils.copyProperties(message,transactionRecord);
        transactionRecordService.create(transactionRecord);
        // 业务处理
        ConfirmTransactionRecord confirmTransactionRecord = new ConfirmTransactionRecord();
        confirmTransactionRecord.setTransaction_serial_number(message.getTransaction_serial_number());
        confirmTransactionRecord.setConfirm_result(0);
        iotMessageProduce.sendMessage(confirmTransactionRecord.getTransaction_serial_number(), ServiceIdMenu.CONFIRM_TRANSACTION_RECORD.getKey(),messageUtil.confirmTransactionRecord(confirmTransactionRecord));
    }
    @Override
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/UploadRealTimeMonitoringDataMessageListener.java
@@ -1,11 +1,14 @@
package com.ruoyi.integration.rocket.listener;
import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyDetailClient;
import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
import com.ruoyi.integration.api.model.Online;
import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData;
import com.ruoyi.integration.mongodb.service.UploadRealTimeMonitoringDataService;
import com.ruoyi.integration.rocket.model.UploadRealTimeMonitoringDataMessage;
import com.ruoyi.integration.rocket.util.EnhanceMessageHandler;
import com.ruoyi.order.api.feignClient.ChargingOrderClient;
import com.ruoyi.order.api.model.TChargingOrder;
import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
@@ -15,6 +18,9 @@
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Objects;
@Slf4j
@Component
@@ -31,12 +37,10 @@
    
    @Resource
    private ChargingOrderClient chargingOrderClient;
    @Resource
    private AccountingStrategyDetailClient accountingStrategyDetailClient;
    @Override
    protected void handleMessage(UploadRealTimeMonitoringDataMessage message) throws Exception {
        // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试
@@ -44,11 +48,31 @@
        // 持久化消息
        UploadRealTimeMonitoringData uploadRealTimeMonitoringData = new UploadRealTimeMonitoringData();
        BeanUtils.copyProperties(message,uploadRealTimeMonitoringData);
        // 查询mogondb上一条数据
        UploadRealTimeMonitoringData data = uploadRealTimeMonitoringDataService.getLastDataById(message.getTransaction_serial_number());
        // 查询订单
        TChargingOrder chargingOrder = chargingOrderClient.getOrderByCode(message.getTransaction_serial_number()).getData();
        // 查询当前时间段的计费策略
        TAccountingStrategyDetail accountingStrategyDetail = accountingStrategyDetailClient.getDetailBySiteId(chargingOrder.getSiteId()).getData();
        uploadRealTimeMonitoringData.setElectrovalence_all(accountingStrategyDetail.getElectrovalence());
        uploadRealTimeMonitoringData.setService_charge(accountingStrategyDetail.getServiceCharge());
        if (Objects.nonNull(data)) {
            uploadRealTimeMonitoringData.setLast_time(data.getLast_time());
            uploadRealTimeMonitoringData.setPeriod_electric_price(message.getPaid_amount().divide(data.getPaid_amount()));
            uploadRealTimeMonitoringData.setPeriod_charging_degree(message.getCharging_degree().divide(data.getCharging_degree()));
            uploadRealTimeMonitoringData.setPeriod_service_price(message.getCharging_degree().multiply(accountingStrategyDetail.getServiceCharge()).setScale(4, RoundingMode.HALF_UP));
        }else {
            log.info("首次上传实时监测数据");
            uploadRealTimeMonitoringData.setPeriod_electric_price(message.getPaid_amount());
            uploadRealTimeMonitoringData.setPeriod_charging_degree(message.getCharging_degree());
            uploadRealTimeMonitoringData.setPeriod_service_price(message.getCharging_degree().multiply(accountingStrategyDetail.getServiceCharge()).setScale(4, RoundingMode.HALF_UP));
        }
        uploadRealTimeMonitoringDataService.create(uploadRealTimeMonitoringData);
        // 业务处理
        UploadRealTimeMonitoringDataQuery query = new UploadRealTimeMonitoringDataQuery();
        BeanUtils.copyProperties(uploadRealTimeMonitoringData, query);
        chargingOrderClient.chargeMonitoring(query);
    }
    @Override
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/EndChargeMessage.java
New file
@@ -0,0 +1,29 @@
package com.ruoyi.integration.rocket.model;
import com.ruoyi.integration.rocket.base.BaseMessage;
import lombok.Data;
import java.math.BigDecimal;
/**
 * 充电结束
 **/
@Data
public class EndChargeMessage extends BaseMessage {
    private String transaction_serial_number; // 交易流水号
    private String charging_pile_code; // 桩编码
    private String charging_gun_code; // 抢号
    private BigDecimal bms_battery_charging_status; // BMS 中止荷电状态 SOC
    private BigDecimal bms_minimum_battery_voltage; // BMS 动力蓄电池单体最低电压
    private BigDecimal bms_maximum_battery_voltage; // BMS 动力蓄电池单体最高电压
    private Integer bms_minimum_battery_temperature; // BMS 动力蓄电池最低温度
    private Integer bms_maximum_battery_temperature; // BMS 动力蓄电池最高温度
    private BigDecimal cumulative_charging_time; // 电桩累计充电时间
    private BigDecimal output_energy; // 电桩输出能量
    private String charger_code; // 电桩充电机编号
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/TimingSettingMessage.java
New file
@@ -0,0 +1,17 @@
package com.ruoyi.integration.rocket.model;
import com.ruoyi.integration.rocket.base.BaseMessage;
import lombok.Data;
/**
 * 对时设置
 **/
@Data
public class TimingSettingMessage extends BaseMessage {
    private String charging_pile_code; //桩编码
    private String current_time; //当前时间
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/EnhanceProduce.java
@@ -48,6 +48,17 @@
        message.setSource(SendTagConstant.PING);
        return rocketMQEnhanceTemplate.send(TOPIC, SendTagConstant.PING, message);
    }
    /**
     * 充电结束
     */
    public SendResult endChargeMessage(JSONObject jsonObject) {
        PingMessage message = JSON.parseObject(jsonObject.toJSONString(),PingMessage.class);
        // 设置业务key
        message.setKey(UUID.randomUUID().toString());
        // 设置消息来源,便于查询
        message.setSource(SendTagConstant.END_CHARGE);
        return rocketMQEnhanceTemplate.send(TOPIC, SendTagConstant.END_CHARGE, message);
    }
    /**
     * 计费模型验证请求
@@ -242,15 +253,15 @@
    }
    /**
     * 对时设置应答
     * 对时设置
     */
    public SendResult timingSettingReplyMessage(JSONObject jsonObject) {
        TimingSettingReplyMessage message = JSON.parseObject(jsonObject.toJSONString(),TimingSettingReplyMessage.class);
    public SendResult timingSettingMessage(JSONObject jsonObject) {
        TimingSettingMessage message = JSON.parseObject(jsonObject.toJSONString(),TimingSettingMessage.class);
        // 设置业务key
        message.setKey(UUID.randomUUID().toString());
        // 设置消息来源,便于查询
        message.setSource(SendTagConstant.TIMING_SETTING_REPLY);
        return rocketMQEnhanceTemplate.send(TOPIC, SendTagConstant.TIMING_SETTING_REPLY, message);
        message.setSource(SendTagConstant.TIMING_SETTING);
        return rocketMQEnhanceTemplate.send(TOPIC, SendTagConstant.TIMING_SETTING, message);
    }
    /**
ruoyi-service/ruoyi-order/pom.xml
@@ -140,6 +140,18 @@
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-spring-boot-starter</artifactId>
            <version>4.0.0</version>
            <exclusions>
                <exclusion>
                    <artifactId>guava</artifactId>
                    <groupId>com.google.guava</groupId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
    <build>
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/AccountingStrategyDetailOrderController.java
New file
@@ -0,0 +1,39 @@
package com.ruoyi.order.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.order.api.model.AccountingStrategyDetailOrder;
import com.ruoyi.order.service.AccountingStrategyDetailOrderService;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
 * @author zhibing.pu
 * @Date 2024/9/4 16:17
 */
@RestController
@RequestMapping("/accountingStrategyDetailOrder")
public class AccountingStrategyDetailOrderController {
    @Resource
    private AccountingStrategyDetailOrderService accountingStrategyDetailOrderService;
    /**
     * 根据订单id获取当前有效的策略
     * @param orderId
     * @return
     */
    @PostMapping("/getNowAccountingStrategyDetailOrder")
    public R<AccountingStrategyDetailOrder> getNowAccountingStrategyDetailOrder(@RequestParam("orderId") Long orderId){
        AccountingStrategyDetailOrder one = accountingStrategyDetailOrderService.getOne(new LambdaQueryWrapper<AccountingStrategyDetailOrder>()
                .eq(AccountingStrategyDetailOrder::getChargingOrderId, orderId)
                .last(" and DATE_FORMAT(now(), '%H:%i') between start_time and end_time"));
        return R.ok(one);
    }
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChargingBillController.java
New file
@@ -0,0 +1,91 @@
package com.ruoyi.order.controller;
import com.ruoyi.account.api.feignClient.AppUserCarClient;
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient;
import com.ruoyi.chargingPile.api.feignClient.ChargingPileClient;
import com.ruoyi.chargingPile.api.feignClient.ParkingLotClient;
import com.ruoyi.chargingPile.api.feignClient.SiteClient;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.order.api.vo.ChargingBillVO;
import com.ruoyi.order.api.vo.ChargingOrderTimeVO;
import com.ruoyi.order.dto.ChargingBillQuery;
import com.ruoyi.order.dto.ChargingListQuery;
import com.ruoyi.order.service.*;
import com.ruoyi.order.vo.ChargingOrderListInfoVO;
import com.ruoyi.payment.api.feignClient.AliPaymentClient;
import com.ruoyi.payment.api.feignClient.WxPaymentClient;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author xiaochen
 * @since 2024-08-07
 */
@Api(tags = "充电算帐单")
@RestController
@RequestMapping("/chargingBill")
public class ChargingBillController {
    @Resource
    private TChargingOrderService chargingOrderService;
    @Autowired
    private TokenService tokenService;
    @Autowired
    private TOrderEvaluateService orderEvaluateService;
    @Resource
    private WxPaymentClient wxPaymentClient;
    @Resource
    private RedisService redisService;
    @Resource
    private AliPaymentClient aliPaymentClient;
    @Resource
    private TShoppingOrderService shoppingOrderService;
    @Resource
    private AppUserClient appUserClient;
    @Resource
    private TVipOrderService vipOrderService;
    @Resource
    private ParkingLotClient parkingLotClient;
    @Resource
    private TChargingOrderRefundService chargingOrderRefundService;
    @Resource
    private TShoppingOrderRefundService shoppingOrderRefundService;
    @Resource
    private TVipOrderRefundService vipOrderRefundService;
    @Resource
    private SiteClient siteClient;
    @Resource
    private ChargingPileClient chargingPileClient;
    @Resource
    private ChargingGunClient chargingGunClient;
    @Resource
    private AppUserCarClient appUserCarClient;
    @Resource
    private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService;
    @ResponseBody
    @PostMapping(value = "/chargingList")
    @ApiOperation(value = "充电算帐单列表查询", tags = {"管理后台-充电算账单"})
    public AjaxResult<ChargingBillVO> chargingList(@RequestBody ChargingListQuery dto) {
        return AjaxResult.success(null);
    }
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -1,4 +1,5 @@
package com.ruoyi.order.controller;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.google.common.collect.Lists;
import java.math.BigDecimal;
@@ -457,7 +458,24 @@
    }
    
    
    /**
     * 远程启动失败后退款回调
     * @param request
     */
    @ResponseBody
    @PostMapping(value = "/chargingOrderStartupFailureWxRefund")
    public void chargingOrderStartupFailureWxRefund(HttpServletRequest request){
        WxRefundNotifyResp data = wxPaymentClient.refundNotify(request).getData();
        if(null != data){
            String out_refund_no = data.getOut_refund_no();
            String refund_id = data.getRefund_id();
            String tradeState = data.getTradeState();
            String success_time = data.getSuccess_time();
            chargingOrderService.chargingOrderStartupFailureWxRefund(out_refund_no, refund_id, tradeState, success_time);
        }
    }
    
@@ -627,7 +645,17 @@
    public void chargeMonitoring(@RequestBody UploadRealTimeMonitoringDataQuery query){
        chargingOrderService.chargeMonitoring(query);
    }
    /**
     * 通过流水号查询订单
     * @param code
     * @return
     */
    @PostMapping(value = "/getOrderByCode/{code}")
    public R<TChargingOrder> getOrderByCode(@PathVariable("code") String code){
        return R.ok(chargingOrderService.getOne(Wrappers.lambdaQuery(TChargingOrder.class)
                .eq(TChargingOrder::getCode,code)));
    }
@@ -760,4 +788,22 @@
        return resultList;
    }
    /**
     * 硬件充电结束后的处理逻辑
     * @param code
     */
    @PostMapping("/endCharge")
    public void endCharge(@RequestParam("code") String code){
        chargingOrderService.endCharge(code, 2);
    }
    /**
     * 硬件异常结束充电后的处理逻辑
     * @param code
     */
    @PostMapping("/excelEndCharge")
    public void excelEndCharge(@RequestParam("code") String code){
        chargingOrderService.excelEndCharge(code);
    }
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderAppealController.java
@@ -84,6 +84,7 @@
    public R manageFeedback(@RequestBody ManageFeedbackDto manageFeedbackDto) {
        TOrderAppeal byId = orderAppealService.getById(manageFeedbackDto.getId());
        byId.setFeedback(manageFeedbackDto.getFeedback());
        byId.setStatus(2);
        orderAppealService.updateById(byId);
        return R.ok();
    }
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderInvoiceController.java
@@ -1,18 +1,37 @@
package com.ruoyi.order.controller;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.common.core.utils.WebUtils;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.log.annotation.Log;
import com.ruoyi.common.log.enums.BusinessType;
import com.ruoyi.order.api.model.TOrderInvoice;
import com.ruoyi.order.api.query.TOrderInvoiceQuery;
import com.ruoyi.order.api.vo.TOrderInvoiceVO;
import com.ruoyi.order.dto.AddOrderInvoice;
import com.ruoyi.order.dto.GetOrderInvoiceList;
import com.ruoyi.order.dto.MyOrderInvoiceInfo;
import com.ruoyi.order.dto.OrderInvoiceList;
import com.ruoyi.order.export.OrderInvoiceExport;
import com.ruoyi.order.service.TOrderInvoiceService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
 * <p>
@@ -39,8 +58,68 @@
    public AjaxResult addOrderInvoice(@RequestBody AddOrderInvoice addOrderInvoice){
        return orderInvoiceService.addOrderInvoice(addOrderInvoice);
    }
    @PostMapping("/pageList")
    @ApiOperation(value = "查询开票分页列表", tags = {"管理后台-发票管理"})
    public AjaxResult<PageInfo<TOrderInvoiceVO>> pageList(@RequestBody TOrderInvoiceQuery query){
        return AjaxResult.success(orderInvoiceService.pageList(query));
    }
    @GetMapping("/uploadPdf")
    @ApiOperation(value = "上传发票", tags = {"管理后台-发票管理"})
    public AjaxResult<String> uploadPdf(@RequestParam("id") Long id,
                                        @RequestParam("invoiceUrl") String invoiceUrl){
        TOrderInvoice orderInvoice = orderInvoiceService.getById(id);
        orderInvoice.setInvoiceUrl(invoiceUrl);
        orderInvoiceService.updateById(orderInvoice);
        return AjaxResult.success();
    }
    @PostMapping("/statusCount")
    @ApiOperation(value = "查询开票状态数量", tags = {"管理后台-发票管理"})
    public AjaxResult<Map<String,Integer>> statusCount(@RequestBody TOrderInvoiceQuery query){
        return AjaxResult.success(orderInvoiceService.statusCount(query));
    }
    /**
     * 发票管理导出
     */
    @ApiOperation(value = "发票管理导出")
    @Log(title = "发票管理导出", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(@RequestBody TOrderInvoiceQuery query)
    {
        List<TOrderInvoiceVO> list = orderInvoiceService.export(query);
        List<OrderInvoiceExport> orderInvoiceExports = new ArrayList<>();
        for (TOrderInvoiceVO orderInvoiceVO : list) {
            OrderInvoiceExport orderInvoiceExport = new OrderInvoiceExport();
            BeanUtils.copyProperties(orderInvoiceVO,orderInvoiceExport);
            orderInvoiceExport.setBillingTime(DateUtils.localDateTimeToString(orderInvoiceVO.getBillingTime()));
            orderInvoiceExports.add(orderInvoiceExport);
        }
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), OrderInvoiceExport.class, orderInvoiceExports);
        HttpServletResponse response = WebUtils.response();
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        ServletOutputStream outputStream = null;
        try {
            String fileName = URLEncoder.encode("发票导出.xls", "utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            outputStream = response.getOutputStream();
            workbook.write(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    @ResponseBody
    @GetMapping("/getMyOrderInvoiceList")
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/ChargingBillQuery.java
New file
@@ -0,0 +1,37 @@
package com.ruoyi.order.dto;
import com.ruoyi.common.core.web.page.BasePage;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
public class ChargingBillQuery extends BasePage {
    @ApiModelProperty("订单编号")
    private String code;
    @ApiModelProperty("电站id")
    private Integer siteId;
    @ApiModelProperty("状态(0=未知,1=等待中,2=启动中,3=充电中,4=停止中,5=已结束)")
    private Integer status;
    @ApiModelProperty("手机号")
    private String phone;
    @ApiModelProperty("车牌号")
    private String licensePlate;
    @ApiModelProperty("订单类型(1=充电订单(小程序),2=充电订单(刷卡))")
    private Integer orderType;
    @ApiModelProperty("开始时间 2020-01-01 12:00:00 - 2020-01-01 23:00:00")
    private String startTime;
    @ApiModelProperty("结束时间 2020-01-01 12:00:00 - 2020-01-01 23:00:00")
    private String endTime;
    @ApiModelProperty("用户ids 前端忽略")
    private List<Long> userIds;
    @ApiModelProperty("车辆ids 前端忽略")
    private List<Long> carIds;
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/ChargingListQuery.java
@@ -1,6 +1,7 @@
package com.ruoyi.order.dto;
import com.ruoyi.common.core.web.page.BasePage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -8,31 +9,12 @@
import java.util.List;
@Data
@ApiModel(value = "充电账单列表查询参数")
public class ChargingListQuery extends BasePage {
    @ApiModelProperty("订单编号")
    private String code;
    @ApiModelProperty("电站id")
    private Integer siteId;
    @ApiModelProperty("状态(0=未知,1=等待中,2=启动中,3=充电中,4=停止中,5=已结束)")
    private Integer status;
    @ApiModelProperty("手机号")
    private String phone;
    @ApiModelProperty("车牌号")
    private String licensePlate;
    @ApiModelProperty("订单类型(1=充电订单(小程序),2=充电订单(刷卡))")
    private Integer orderType;
    @ApiModelProperty("开始时间 2020-01-01 12:00:00 - 2020-01-01 23:00:00")
    @ApiModelProperty("订单分类 1全站 2各个站点")
    private String category;
    @ApiModelProperty("账单周期2020-01-01 - 2020-01-01")
    private String startTime;
    @ApiModelProperty("结束时间 2020-01-01 12:00:00 - 2020-01-01 23:00:00")
    private String endTime;
    @ApiModelProperty("用户ids 前端忽略")
    private List<Long> userIds;
    @ApiModelProperty("车辆ids 前端忽略")
    private List<Long> carIds;
    @ApiModelProperty("1已出账 2未出账")
    private Integer state;
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PayOrderDto.java
@@ -1,11 +1,13 @@
package com.ruoyi.order.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@ApiModel("支付订单返回Dto")
public class PayOrderDto {
    private String id;
    @ApiModelProperty("1充电订单2购物订单3vip订单4停车订单")
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PayOrderQueryDto.java
@@ -1,12 +1,15 @@
package com.ruoyi.order.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.web.page.BasePage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@ApiModel("支付订单查询dto")
public class PayOrderQueryDto extends BasePage {
    @ApiModelProperty("订单编号")
    private String code;
@@ -18,8 +21,10 @@
    private Integer isRefund;
    @ApiModelProperty("下单时间1")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime1;
    @ApiModelProperty("下单时间2")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime2;
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/OrderInvoiceExport.java
New file
@@ -0,0 +1,79 @@
package com.ruoyi.order.export;
import cn.afterturn.easypoi.excel.annotation.Excel;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
@ApiModel(value = "导出发票")
public class OrderInvoiceExport implements Serializable {
    @Excel(name = "申请单编号",width = 30)
    private String code;
    @Excel(name  = "申请日期",width = 30)
    private String billingTime;
    @Excel(name  = "开票公司",width = 30)
    private String invoicingCompany;
    @Excel(name  = "发票类型",width = 30)
    private String invoiceType;
    @Excel(name  = "发票种类",replace = {"纸质发票_1","电子发票_2"},width = 30)
    private Integer invoiceMaterial;
    @Excel(name  = "开票方式",replace = {"人工_1","自动_2"},width = 30)
    private Integer invoicingMethod;
    @Excel(name  = "开票总金额",width = 30)
    private BigDecimal totalAmount;
    @Excel(name  = "服务费",width = 30)
    private BigDecimal serviceCharge;
    @Excel(name  = "服务费税率",width = 30)
    private BigDecimal serviceTariff;
    @Excel(name  = "增值服务费",width = 30)
    private BigDecimal addedService;
    @Excel(name  = "增值服务费税率",width = 30)
    private BigDecimal addedServiceTariff;
//    @Excel(name  = "开票订单类型",replace = {"充电订单_1","购物订单_2","兑换订单_3","会员订单_4"},width = 30)
//    private Integer orderType;
    @Excel(name  = "抬头类型",replace = {"个人_1","企业_2"},width = 30)
    private Integer invoicingObjectType;
    @Excel(name  = "发票抬头",width = 30)
    private String name;
    @Excel(name  = "开户银行",width = 30)
    private String depositBank;
    @Excel(name  = "银行账户",width = 30)
    private String bankAccount;
    @Excel(name  = "公司电话",width = 30)
    private String companyPhone;
    @Excel(name  = "纳税识别号",width = 30)
    private String taxIdentificationNumber;
    @Excel(name  = "公司地址",width = 30)
    private String companyAddress;
    @Excel(name  = "邮箱",width = 30)
    private String mailbox;
    @Excel(name  = "状态",replace = {"待开票_1","开票中_2","已开票_3"},width = 30)
    private Integer status;
    @Excel(name  = "用户电话",width = 30)
    private String userPhone;
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/AccountingStrategyDetailOrderMapper.java
New file
@@ -0,0 +1,11 @@
package com.ruoyi.order.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.order.api.model.AccountingStrategyDetailOrder;
/**
 * @author zhibing.pu
 * @Date 2024/9/4 15:42
 */
public interface AccountingStrategyDetailOrderMapper extends BaseMapper<AccountingStrategyDetailOrder> {
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/AccountingStrategyOrderMapper.java
New file
@@ -0,0 +1,11 @@
package com.ruoyi.order.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.order.api.model.AccountingStrategyOrder;
/**
 * @author zhibing.pu
 * @Date 2024/9/4 15:37
 */
public interface AccountingStrategyOrderMapper extends BaseMapper<AccountingStrategyOrder> {
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TOrderInvoiceMapper.java
@@ -1,8 +1,15 @@
package com.ruoyi.order.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.order.api.model.TOrderInvoice;
import com.ruoyi.order.api.query.TOrderInvoiceQuery;
import com.ruoyi.order.api.vo.TOrderInvoiceVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
 * <p>
@@ -15,4 +22,26 @@
@Mapper
public interface TOrderInvoiceMapper extends BaseMapper<TOrderInvoice> {
    /**
     * 发票分页查询
     * @param query
     * @param pageInfo
     * @return
     */
    List<TOrderInvoiceVO> pageList(@Param("query") TOrderInvoiceQuery query, @Param("pageInfo")PageInfo<TOrderInvoiceVO> pageInfo);
    /**
     * 查询开票状态数量
     * @param query
     * @return
     */
    Map<String, Integer> statusCount(@Param("query")TOrderInvoiceQuery query);
    /**
     * 导出
     * @param query
     * @return
     */
    List<TOrderInvoiceVO> export(@Param("query")TOrderInvoiceQuery query);
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/AccountingStrategyDetailOrderService.java
New file
@@ -0,0 +1,11 @@
package com.ruoyi.order.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.order.api.model.AccountingStrategyDetailOrder;
/**
 * @author zhibing.pu
 * @Date 2024/9/4 15:41
 */
public interface AccountingStrategyDetailOrderService extends IService<AccountingStrategyDetailOrder> {
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/AccountingStrategyOrderService.java
New file
@@ -0,0 +1,11 @@
package com.ruoyi.order.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.order.api.model.AccountingStrategyOrder;
/**
 * @author zhibing.pu
 * @Date 2024/9/4 15:36
 */
public interface AccountingStrategyOrderService extends IService<AccountingStrategyOrder> {
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java
@@ -17,6 +17,7 @@
import com.ruoyi.order.dto.*;
import com.ruoyi.order.vo.ChargingOrderListInfoVO;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.math.BigDecimal;
import java.time.LocalDate;
@@ -140,4 +141,18 @@
     * @param query
     */
    void chargeMonitoring(UploadRealTimeMonitoringDataQuery query);
    /**
     * 自动结束充电后的处理逻辑
     * @param code
     */
    void endCharge(String code, Integer endMode);
    /**
     * 异常结束充电处理逻辑
     * @param orderCode
     */
    void excelEndCharge(String orderCode);
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TOrderInvoiceService.java
@@ -2,13 +2,17 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.order.api.model.TOrderInvoice;
import com.ruoyi.order.api.query.TOrderInvoiceQuery;
import com.ruoyi.order.api.vo.TOrderInvoiceVO;
import com.ruoyi.order.dto.AddOrderInvoice;
import com.ruoyi.order.dto.GetOrderInvoiceList;
import com.ruoyi.order.dto.MyOrderInvoiceInfo;
import com.ruoyi.order.dto.OrderInvoiceList;
import java.util.List;
import java.util.Map;
/**
 * <p>
@@ -43,4 +47,26 @@
     * @return
     */
    MyOrderInvoiceInfo getMyOrderInvoiceInfo(String id);
    /**
     * 查询开票分页列表
     * @param query
     * @return
     */
    PageInfo<TOrderInvoiceVO> pageList(TOrderInvoiceQuery query);
    /**
     * 查询开票状态数量
     * @param query
     * @return
     */
    Map<String,Integer> statusCount(TOrderInvoiceQuery query);
    /**
     * 发票管理导出
     * @param query
     * @return
     */
    List<TOrderInvoiceVO> export(TOrderInvoiceQuery query);
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/AccountingStrategyDetailOrderServiceImpl.java
New file
@@ -0,0 +1,15 @@
package com.ruoyi.order.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.order.api.model.AccountingStrategyDetailOrder;
import com.ruoyi.order.mapper.AccountingStrategyDetailOrderMapper;
import com.ruoyi.order.service.AccountingStrategyDetailOrderService;
import org.springframework.stereotype.Service;
/**
 * @author zhibing.pu
 * @Date 2024/9/4 15:42
 */
@Service
public class AccountingStrategyDetailOrderServiceImpl extends ServiceImpl<AccountingStrategyDetailOrderMapper, AccountingStrategyDetailOrder> implements AccountingStrategyDetailOrderService {
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/AccountingStrategyOrderServiceImpl.java
New file
@@ -0,0 +1,15 @@
package com.ruoyi.order.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.order.api.model.AccountingStrategyOrder;
import com.ruoyi.order.mapper.AccountingStrategyOrderMapper;
import com.ruoyi.order.service.AccountingStrategyOrderService;
import org.springframework.stereotype.Service;
/**
 * @author zhibing.pu
 * @Date 2024/9/4 15:36
 */
@Service
public class AccountingStrategyOrderServiceImpl extends ServiceImpl<AccountingStrategyOrderMapper, AccountingStrategyOrder> implements AccountingStrategyOrderService {
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -1,24 +1,17 @@
package com.ruoyi.order.service.impl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.account.api.feignClient.AppUserCarClient;
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.account.api.feignClient.AppUserVipDetailClient;
import com.ruoyi.account.api.model.TAppUser;
import com.ruoyi.account.api.model.TAppUserCar;
import com.ruoyi.account.api.model.TAppUserVipDetail;
import com.ruoyi.account.api.feignClient.*;
import com.ruoyi.account.api.model.*;
import com.ruoyi.account.api.vo.GetAppUserVipDetail;
import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyDetailClient;
import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient;
import com.ruoyi.chargingPile.api.feignClient.ChargingPileClient;
import com.ruoyi.chargingPile.api.feignClient.SiteClient;
import com.ruoyi.chargingPile.api.model.Site;
import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
import com.ruoyi.chargingPile.api.model.TChargingGun;
import com.ruoyi.chargingPile.api.model.TChargingPile;
import com.ruoyi.account.api.vo.GetInviteUser;
import com.ruoyi.chargingPile.api.feignClient.*;
import com.ruoyi.chargingPile.api.model.*;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.dto.ChargingOrderGroup;
import com.ruoyi.common.core.dto.ChargingPercentProvinceDto;
@@ -27,6 +20,7 @@
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.integration.api.feignClient.ChargingHandshakeClient;
import com.ruoyi.integration.api.feignClient.PlatformStartChargingReplyClient;
import com.ruoyi.integration.api.feignClient.SendMessageClient;
@@ -35,6 +29,11 @@
import com.ruoyi.integration.api.model.PlatformStartCharging;
import com.ruoyi.integration.api.model.PlatformStartChargingReply;
import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData;
import com.ruoyi.integration.api.feignClient.*;
import com.ruoyi.integration.api.model.*;
import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply;
import com.ruoyi.order.api.feignClient.AccountingStrategyDetailOrderClient;
import com.ruoyi.order.api.feignClient.ChargingOrderAccountingStrategyClient;
import com.ruoyi.order.api.model.*;
import com.ruoyi.order.api.query.ChargingOrderQuery;
import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery;
@@ -44,27 +43,35 @@
import com.ruoyi.order.api.vo.TCharingOrderVO;
import com.ruoyi.order.dto.*;
import com.ruoyi.order.mapper.TChargingOrderMapper;
import com.ruoyi.order.service.TChargingOrderAccountingStrategyService;
import com.ruoyi.order.service.TChargingOrderRefundService;
import com.ruoyi.order.service.TChargingOrderService;
import com.ruoyi.order.service.TOrderEvaluateService;
import com.ruoyi.order.service.*;
import com.ruoyi.other.api.domain.TCoupon;
import com.ruoyi.other.api.domain.TGoods;
import com.ruoyi.order.vo.ChargingOrderListInfoVO;
import com.ruoyi.other.api.domain.TIntegralRule;
import com.ruoyi.other.api.feignClient.IntegralRuleClient;
import com.ruoyi.other.api.feignClient.RoleSiteClient;
import com.ruoyi.other.api.feignClient.UserSiteClient;
import com.ruoyi.payment.api.feignClient.AliPaymentClient;
import com.ruoyi.payment.api.feignClient.WxPaymentClient;
import com.ruoyi.payment.api.model.RefundReq;
import com.ruoyi.payment.api.model.RefundResp;
import com.ruoyi.payment.api.model.WxPaymentRefundModel;
import com.ruoyi.payment.api.vo.*;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.feignClient.SysUserClient;
import io.seata.spring.annotation.GlobalTransactional;
import io.swagger.annotations.ApiModelProperty;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
@@ -86,6 +93,8 @@
@Service
public class TChargingOrderServiceImpl extends ServiceImpl<TChargingOrderMapper, TChargingOrder> implements TChargingOrderService {
    
    private Logger log = LoggerFactory.getLogger(TChargingOrderServiceImpl.class);
    @Resource
    private ChargingGunClient chargingGunClient;
    
@@ -114,7 +123,8 @@
    private AliPaymentClient aliPaymentClient;
    
    @Resource
    private AppCouponClient appCouponClient;
    @Resource
    private AppUserVipDetailClient appUserVipDetailClient;
@@ -139,10 +149,34 @@
    private AccountingStrategyDetailClient accountingStrategyDetailClient;
    @Resource
    private AccountingStrategyDetailOrderClient accountingStrategyDetailOrderClient;
    @Resource
    private AccountingStrategyClient accountingStrategyClient;
    @Resource
    private PlatformStartChargingReplyClient platformStartChargingReplyClient;
    @Resource
    private TChargingOrderRefundService chargingOrderRefundService;
    @Resource
    private PlatformStopChargingReplyClient platformStopChargingReplyClient;
    @Resource
    private AccountingStrategyOrderService accountingStrategyOrderService;
    @Resource
    private AccountingStrategyDetailOrderService accountingStrategyDetailOrderService;
    @Resource
    private InviteUserClient inviteUserClient;
    @Resource
    private AppUserIntegralChangeClient appUserIntegralChangeClient;
    @Resource
    private IntegralRuleClient integralRuleClient;
    //计数器
    private Map<String, Integer> counter_map = new HashMap<>();
@@ -410,6 +444,23 @@
            
        }
        this.save(chargingOrder);
        //添加订单的计费策略
        TAccountingStrategy accountingStrategy = accountingStrategyClient.getAccountingStrategyById(tChargingGun.getAccountingStrategyId()).getData();
        List<TAccountingStrategyDetail> strategyDetailList = accountingStrategyDetailClient.getListByAccountingStrategyId(tChargingGun.getAccountingStrategyId()).getData();
        AccountingStrategyOrder accountingStrategyOrder = new AccountingStrategyOrder();
        BeanUtils.copyProperties(accountingStrategy, accountingStrategyOrder);
        accountingStrategyOrder.setChargingOrderId(chargingOrder.getId());
        accountingStrategyOrderService.save(accountingStrategyOrder);
        List<AccountingStrategyDetailOrder> list1 = new ArrayList<>();
        for (TAccountingStrategyDetail tAccountingStrategyDetail : strategyDetailList) {
            AccountingStrategyDetailOrder accountingStrategyDetailOrder = new AccountingStrategyDetailOrder();
            BeanUtils.copyProperties(tAccountingStrategyDetail, accountingStrategyDetailOrder);
            accountingStrategyDetailOrder.setChargingOrderId(chargingOrder.getId());
            list1.add(accountingStrategyDetailOrder);
        }
        accountingStrategyDetailOrderService.saveBatch(list1);
        //会员优惠折扣将其计入增加充电时长(增加总充电金额)
        //如果充电总金额未使用完,则需要退回费用=(原金额/总金额)*(总金额-实际充电金额)
        if(1 == addChargingOrder.getPaymentType()){
@@ -457,7 +508,6 @@
        chargingOrder.setRechargePaymentStatus(2);
        chargingOrder.setRechargeSerialNumber(transaction_id);
        chargingOrder.setStatus(2);
        this.updateById(chargingOrder);
        //添加安全检测数据到缓存中,每步安全检测完成后需要更新缓存数据
        PreChargeCheck preChargeCheck = new PreChargeCheck();
@@ -472,7 +522,7 @@
        BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
        //计算充电金额,会员需要将折扣金额加入到充电总金额中
        TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
        TAccountingStrategyDetail strategyDetail = accountingStrategyDetailClient.getNowData(chargingGun.getAccountingStrategyId()).getData();
        AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderClient.getNowAccountingStrategyDetailOrder(chargingOrder.getId()).getData();
        //总单价
        BigDecimal totalUnitPrice = strategyDetail.getServiceCharge().add(strategyDetail.getElectrovalence());
        //计算能充电的度数
@@ -496,6 +546,8 @@
            }
        }
        electrovalence = electrovalence.add(discount);
        chargingOrder.setChargeAmount(electrovalence);
        this.updateById(chargingOrder);
        TChargingPile chargingPile = chargingPileClient.getChargingPileById(chargingGun.getChargingPileId()).getData();
@@ -693,6 +745,7 @@
     * @return
     */
    @Override
    @GlobalTransactional(rollbackFor = Exception.class)
    public AjaxResult stopCharging(String id) {
        TChargingOrder chargingOrder = this.getById(id);
        Integer status = chargingOrder.getStatus();
@@ -702,14 +755,229 @@
        chargingOrder.setStatus(4);
        chargingOrder.setEndMode(1);
        this.updateById(chargingOrder);
        //调用硬件停止充电,停止成功后开始计算费用退款
        // todo 待完善
        //异步线程处理停机
        ExecutorService cachedThreadPool = Executors.newFixedThreadPool(1);
        cachedThreadPool.execute(()->{
            //调用硬件停止充电,停止成功后开始计算费用退款
            TChargingPile chargingPile = chargingPileClient.getChargingPileById(chargingOrder.getChargingPileId()).getData();
            TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
            PlatformStopCharging platformStopCharging = new PlatformStopCharging();
            platformStopCharging.setCharging_pile_code(chargingPile.getCode());
            platformStopCharging.setCharging_gun_code(chargingGun.getCode());
            sendMessageClient.platformStopCharging(platformStopCharging);
            //开始查询停机应答,成功后开始计费费用
            for (int i = 0; i < 60; i++) {
                GetPlatformStopChargingReply query = new GetPlatformStopChargingReply();
                query.setCharging_gun_code(chargingGun.getCode());
                query.setCharging_pile_code(chargingPile.getCode());
                PlatformStopChargingReply reply = platformStopChargingReplyClient.getPlatformStopChargingReply(query).getData();
                if(null == reply){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    continue;
                }
                if(0 == reply.getStop_result()){
                    String failure_cause = "";
                    switch (reply.getFailure_cause()){
                        case 0:
                            failure_cause = "无";
                            break;
                        case 1:
                            failure_cause = "设备编号不匹配";
                            break;
                        case 2:
                            failure_cause = "枪未处于充电状态";
                            break;
                        case 3:
                            failure_cause = "其他";
                            break;
                    }
                    log.error("停机失败:订单号:{},失败原因:{}", chargingOrder.getCode(), failure_cause);
                    throw new RuntimeException(failure_cause);
                }
                //计算费用,处理退款
                endCharge(chargingOrder);
                break;
            }
        });
        //处理推荐奖励(被推荐首单奖励)
        TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
        long count = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId())
                .eq(TChargingOrder::getStatus, 5).isNull(TChargingOrder::getEndMode).eq(TChargingOrder::getDelFlag, 0));
        if(null != appUser.getInviteUserId() && 1 == count){
            TIntegralRule integralRule = integralRuleClient.getSet().getData();
            String inviteUsersToEarnPoints = integralRule.getInviteUsersToEarnPoints();
            JSONObject jsonObject = JSON.parseObject(inviteUsersToEarnPoints);
            Integer num1 = jsonObject.getInteger("num1");
            GetInviteUser query = new GetInviteUser();
            query.setAppUserId(appUser.getInviteUserId());
            query.setBeInvitedAppUserId(chargingOrder.getAppUserId());
            TInviteUser inviteUser = inviteUserClient.getInviteUser(query).getData();
            if(null == inviteUser){
                inviteUser = new TInviteUser();
                inviteUser.setAppUserId(appUser.getInviteUserId());
                inviteUser.setBeInvitedAppUserId(chargingOrder.getAppUserId());
                inviteUser.setAward(num1);
                inviteUser.setCreateTime(LocalDateTime.now());
                inviteUserClient.saveInviteUser(inviteUser);
            }else{
                inviteUser.setAward(num1);
                inviteUserClient.updateInviteUser(inviteUser);
            }
            TAppUser appUser1 = appUserClient.getUserById(appUser.getInviteUserId()).getData();
            TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange();
            String code = Math.random() * 1000 + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
            appUserIntegralChange.setCode(code);
            appUserIntegralChange.setAppUserId(appUser.getInviteUserId());
            appUserIntegralChange.setChangeType(5);
            appUserIntegralChange.setHistoricalIntegral(appUser1.getPoints());
            appUserIntegralChange.setCurrentIntegral(appUser1.getPoints() + num1);
            appUserIntegralChange.setCreateTime(LocalDateTime.now());
            appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange);
            appUser1.setPoints(appUser1.getPoints() + num1);
            appUserClient.updateAppUser(appUser1);
        }
        return AjaxResult.success();
    }
    /**
     * 手动结束后的费用计算和退款逻辑
     */
    @GlobalTransactional(rollbackFor = Exception.class)
    public void endCharge(TChargingOrder chargingOrder){
        //如果使用优惠券需要判断优惠券是否满足使用条件
        //根据实际的充电金额计算退款金额   退回费用=(原金额/总金额)*(总金额-实际充电金额)
        //退款金额=优惠券金额+剩余充电金额
        List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()));
        BigDecimal total = BigDecimal.ZERO;
        for (TChargingOrderAccountingStrategy chargingOrderAccountingStrategy : list) {
            BigDecimal periodElectricPrice = chargingOrderAccountingStrategy.getPeriodElectricPrice();
            BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodOriginalServicePrice();
            total = total.add(periodElectricPrice).add(periodServicePrice);
        }
        BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
        BigDecimal vipDiscountAmount = chargingOrder.getVipDiscountAmount();
        BigDecimal decimal = rechargeAmount.add(vipDiscountAmount);
        //退款金额(已经计算了折扣优惠部分)
        BigDecimal refundAmount = rechargeAmount.divide(decimal, new MathContext(4, RoundingMode.HALF_EVEN)).multiply(decimal.subtract(total));
        BigDecimal payAmount = BigDecimal.valueOf(total.doubleValue());
        BigDecimal orderAmount = BigDecimal.valueOf(total.doubleValue());
        if(null != chargingOrder.getVipDiscount()){
            orderAmount = orderAmount.divide(chargingOrder.getVipDiscount().divide(new BigDecimal(10)));
            chargingOrder.setOrderAmount(total);
        }
    public void endCharge(){
        if(chargingOrder.getEndMode() == 2){
            chargingOrder.setEndMode(refundAmount.compareTo(BigDecimal.ZERO) > 0 ? 2 : 3);
        }
        chargingOrder.setStatus(5);
        chargingOrder.setPaymentAmount(payAmount);
        this.updateById(chargingOrder);
        //计算优惠券
        if(null != chargingOrder.getAppCouponId()){
            //判断实际充电金额是否满足优惠券使用条件,如果不满足则不适用优惠券。
            TAppCoupon appCoupon = appCouponClient.getAppCouponById(chargingOrder.getAppCouponId()).getData();
            String couponJson = appCoupon.getCouponJson();
            TCoupon tCoupon = JSON.parseObject(couponJson, TCoupon.class);
            Integer preferentialMode = tCoupon.getPreferentialMode();
            if(1 == preferentialMode){
                //满减
                if(total.compareTo(tCoupon.getMeetTheConditions()) >= 0){
                    refundAmount = refundAmount.add(tCoupon.getDiscountAmount());
                    chargingOrder.setCouponDiscountAmount(tCoupon.getDiscountAmount());
                    payAmount = payAmount.subtract(tCoupon.getDiscountAmount());
                }else{
                    chargingOrder.setAppCouponId(null);
                    chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO);
                    appCouponClient.refund(chargingOrder.getAppCouponId().toString());
                }
            }
            if(2 == preferentialMode){
                //抵扣
                if(total.compareTo(tCoupon.getMeetTheConditions()) >= 0){
                    //折扣金额
                    BigDecimal divide = total.multiply(new BigDecimal(10).subtract(tCoupon.getDiscount())).divide(new BigDecimal(10));
                    divide = divide.compareTo(tCoupon.getMaximumDiscountAmount()) > 0 ? tCoupon.getMaximumDiscountAmount() : divide;
                    refundAmount = refundAmount.add(divide);
                    chargingOrder.setCouponDiscountAmount(divide);
                    payAmount = payAmount.subtract(divide);
                }else{
                    chargingOrder.setAppCouponId(null);
                    chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO);
                    appCouponClient.refund(chargingOrder.getAppCouponId().toString());
                }
            }
        }
        if(null != chargingOrder.getVipDiscount()){
            BigDecimal subtract = orderAmount.subtract(total);
            chargingOrder.setVipDiscountAmount(subtract);
            payAmount = payAmount.subtract(subtract);
        }
        //开始构建退款费用
        if(refundAmount.compareTo(BigDecimal.ZERO) > 0){
            Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
            //构建退款明细
            TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
            chargingOrderRefund.setChargingOrderId(chargingOrder.getId());
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
            chargingOrderRefund.setRefundCode("CDF" + sdf.format(new Date()) + (Math.random() * 1000));
            chargingOrderRefund.setRefundAmount(refundAmount);
            chargingOrderRefund.setRefundStatus(1);
            chargingOrderRefund.setPayType(rechargePaymentType);
            chargingOrderRefund.setRefundStatus(1);
            chargingOrderRefund.setCode(chargingOrder.getCode());
            chargingOrderRefund.setRefundTitle("充电完成退款");
            chargingOrderRefund.setRefundContent("充电完成退款");
            chargingOrderRefund.setRefundReason("充电完成退款");
            chargingOrderRefund.setRefundRemark("充电完成退款");
            chargingOrderRefund.setRefundTotalAmount(refundAmount);
            chargingOrderRefund.setPayAmount(rechargeAmount);
            if(1 == rechargePaymentType){
                WxPaymentRefundModel model = new WxPaymentRefundModel();
                model.setOut_trade_no(chargingOrder.getCode());
                model.setOut_refund_no(chargingOrderRefund.getRefundCode());
                model.setReason("充电完成退款");
                model.setNotify_url("http://127.0.0.1:9000/order/t-charging-order/chargingOrderStartupFailureWxRefund");
                WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
                amount.setRefund(refundAmount.multiply(new BigDecimal(100)).intValue());
                amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue());
                amount.setCurrency("CNY");
                model.setAmount(amount);
                R<String> orderR = wxPaymentClient.refundOrderR(model);
                if(200 == orderR.getCode()){
                    chargingOrderRefundService.save(chargingOrderRefund);
                }
            }
            if(2 == rechargePaymentType){
                RefundReq dto = new RefundReq();
                dto.setOutTradeNo(chargingOrder.getCode());
                dto.setOutRequestNo(chargingOrderRefund.getCode());
                dto.setRefundAmount(rechargeAmount.toString());
                dto.setRefundReason("充电完成退款");
                RefundResp resp = aliPaymentClient.refund(dto).getData();
                if(null != resp){
                    SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE");
                    AjaxResult success = chargingOrderStartupFailureWxRefund(resp.getOutTradeNo(), resp.getTradeNo(), "SUCCESS", sdf1.format(new Date()));
                    if(success.isSuccess()){
                        chargingOrderRefundService.save(chargingOrderRefund);
                    }
                }
            }
        }
    }
@@ -881,7 +1149,13 @@
    public List<Map<String, BigDecimal>> getYearData(List<Long> chargingOrderIds) {
        return this.baseMapper.getYearData(chargingOrderIds);
    }
    @Resource
    private SysUserClient sysUserClient;
    @Resource
    private UserSiteClient userSiteClient;
    @Resource
    private RoleSiteClient roleSiteClient;
    @Override
    public ChargingOrderTimeVO chargingList(ChargingListQuery dto) {
        String startTime1 = null;
@@ -894,13 +1168,7 @@
            startTime1 = split[0];
            startTime2 = split[1];
        }
        if (StringUtils.hasLength(dto.getEndTime())){
            String[] split = dto.getEndTime().split(" - ");
            endTime1 = split[0];
            endTime2 = split[1];
        }
        ChargingOrderTimeVO chargingOrderTimeVO = new ChargingOrderTimeVO();
        PageInfo<ChargingOrderListVO> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize());
        List<ChargingOrderListVO> list = this.baseMapper.chargingList(pageInfo,dto,startTime1,startTime2,endTime1,endTime2);
@@ -1060,6 +1328,11 @@
    }
    @Override
    public R payRefund(PayOrderRefundDto payOrderQueryDto) {
        return null;
    }
    @Override
    public ChargingOrderListInfoVO chargingInfo(String uid) {
        TChargingOrder chargingOrder= this.getById(uid);
@@ -1079,29 +1352,35 @@
        }
        chargingOrderListInfoVO.setEndMode(chargingOrder.getEndMode());
        // todo 周一完善
//        chargingOrderListInfoVO.setStartSoc();
//        chargingOrderListInfoVO.setEndSoc();
//        chargingOrderListInfoVO.setChargingCapacity();
//        chargingOrderListInfoVO.setSiteId();
//        chargingOrderListInfoVO.setChargingPileId();
//        chargingOrderListInfoVO.setAppUserId();
//        chargingOrderListInfoVO.setAppUserCarId();
//        chargingOrderListInfoVO.setChargingGunId();
//        chargingOrderListInfoVO.setOrderType();
//        chargingOrderListInfoVO.setChargingSecond();
//        chargingOrderListInfoVO.setLicensePlate();
//        chargingOrderListInfoVO.setPhone();
//        chargingOrderListInfoVO.setPaymentAmount();
//        chargingOrderListInfoVO.setElectrovalence();
//        chargingOrderListInfoVO.setServiceCharge();
//        chargingOrderListInfoVO.setStartTime();
//        chargingOrderListInfoVO.setEndTime();
//        chargingOrderListInfoVO.setId();
//        chargingOrderListInfoVO.setUid();
//        chargingOrderListInfoVO.setList();
        // 获取开始SOC 结束soc
        List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataClient.getDataByOrderCode(chargingOrder.getCode()).getData();
        if (!data6.isEmpty()){
            // 第一条数据soc为开始 最后一条数据soc为结束soc
            chargingOrderListInfoVO.setStartSoc(data6.get(0).getSoc().toString());
            chargingOrderListInfoVO.setEndSoc(data6.get(data6.size()-1).getSoc().toString());
            chargingOrderListInfoVO.setChargingCapacity(data6.get(data6.size()-1).getCharging_degree());
            chargingOrderListInfoVO.setChargingSecond(data6.get(data6.size()-1).getCumulative_charging_time()*60+"");
        return null;
        }
        if (chargingOrder.getAppUserCarId()!=null){
            List<TAppUserCar> data3 = appUserCarClient.getCarByIds(Collections.singletonList(chargingOrder.getAppUserCarId())).getData();
            if (!data3.isEmpty())chargingOrderListInfoVO.setLicensePlate(data3.get(0).getLicensePlate());
        }
        chargingOrderListInfoVO.setStartTime(chargingOrder.getStartTime());
        chargingOrderListInfoVO.setEndTime(chargingOrder.getEndTime());
        chargingOrderListInfoVO.setId(chargingOrder.getId());
        chargingOrderListInfoVO.setUid(chargingOrder.getId().toString());
        chargingOrderListInfoVO.setList(data6);
        chargingOrderListInfoVO.setCouponDiscountAmount(chargingOrder.getCouponDiscountAmount());
        chargingOrderListInfoVO.setVipDiscountAmount(chargingOrder.getVipDiscountAmount());
        chargingOrderListInfoVO.setSharingAmount(chargingOrder.getSharingAmount());
        chargingOrderListInfoVO.setCommissionAmount(chargingOrder.getCommissionAmount());
        // 查询费用明细列表
        List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.lambdaQuery()
                .eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId())
                .list();
        chargingOrderListInfoVO.setList1(list);
        return chargingOrderListInfoVO;
    }
@@ -1111,7 +1390,166 @@
     */
    @Override
    public void chargeMonitoring(UploadRealTimeMonitoringDataQuery query) {
        // todo 需完善
        if(com.ruoyi.common.core.utils.StringUtils.isNotEmpty(query.getCharging_gun_code())){
            //获取当前的计费策略
            TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, query.getCharging_gun_code()));
            AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderClient.getNowAccountingStrategyDetailOrder(chargingOrder.getId()).getData();
            TChargingOrderAccountingStrategy chargingOrderAccountingStrategy = chargingOrderAccountingStrategyService.getOne(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>()
                    .eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()).orderByDesc(TChargingOrderAccountingStrategy::getCreateTime).last(" limit 0, 1"));
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
            if(null == chargingOrderAccountingStrategy){
                chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy();
                chargingOrderAccountingStrategy.setChargingOrderId(chargingOrder.getId());
                chargingOrderAccountingStrategy.setAccountingStrategyDetailId(strategyDetail.getId());
                chargingOrderAccountingStrategy.setType(strategyDetail.getType());
                chargingOrderAccountingStrategy.setStartTime(sdf.format(chargingOrder.getStartTime()));
                chargingOrderAccountingStrategy.setEndTime(sdf.format(new Date()));
                chargingOrderAccountingStrategy.setElectrovalence(strategyDetail.getElectrovalence());
                chargingOrderAccountingStrategy.setServiceCharge(strategyDetail.getServiceCharge());
                chargingOrderAccountingStrategy.setCostServiceCharge(strategyDetail.getCostServiceCharge());
                BigDecimal charging_degree = query.getCharging_degree();
                BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(charging_degree);
                BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(charging_degree);
                BigDecimal serviceCharge = originalServicePrice;
                //计算优惠金额
                if(null != chargingOrder.getVipDiscount()){
                    serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount().divide(new BigDecimal(10)));
                }
                chargingOrderAccountingStrategy.setChargingCapacity(charging_degree);
                chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc);
                chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge);
                chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice);
                chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now());
                chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy);
            }else{
                if(chargingOrderAccountingStrategy.getAccountingStrategyDetailId().equals(strategyDetail.getId())){
                    BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodServicePrice();
                    BigDecimal periodElectricPrice = chargingOrderAccountingStrategy.getPeriodElectricPrice();
                    BigDecimal periodOriginalServicePrice = chargingOrderAccountingStrategy.getPeriodOriginalServicePrice();
                    BigDecimal charging_degree = query.getCharging_degree();
                    BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(charging_degree);
                    BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(charging_degree);
                    BigDecimal serviceCharge = originalServicePrice;
                    //计算优惠金额
                    if(null != chargingOrder.getVipDiscount()){
                        serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount().divide(new BigDecimal(10)));
                    }
                    periodServicePrice = periodServicePrice.add(serviceCharge);
                    periodOriginalServicePrice = periodOriginalServicePrice.add(originalServicePrice);
                    periodElectricPrice = periodElectricPrice.add(electrovalenc);
                    chargingOrderAccountingStrategy.setPeriodServicePrice(periodServicePrice);
                    chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(periodOriginalServicePrice);
                    chargingOrderAccountingStrategy.setPeriodElectricPrice(periodElectricPrice);
                    chargingOrderAccountingStrategy.setEndTime(sdf.format(new Date()));
                    chargingOrderAccountingStrategyService.updateById(chargingOrderAccountingStrategy);
                }else{
                    TChargingOrderAccountingStrategy chargingOrderAccountingStrategy1 = new TChargingOrderAccountingStrategy();
                    chargingOrderAccountingStrategy1.setChargingOrderId(chargingOrder.getId());
                    chargingOrderAccountingStrategy1.setAccountingStrategyDetailId(strategyDetail.getId());
                    chargingOrderAccountingStrategy1.setType(strategyDetail.getType());
                    chargingOrderAccountingStrategy1.setStartTime(sdf.format(chargingOrderAccountingStrategy.getEndTime()));
                    chargingOrderAccountingStrategy1.setEndTime(sdf.format(new Date()));
                    chargingOrderAccountingStrategy1.setElectrovalence(strategyDetail.getElectrovalence());
                    chargingOrderAccountingStrategy1.setServiceCharge(strategyDetail.getServiceCharge());
                    chargingOrderAccountingStrategy1.setCostServiceCharge(strategyDetail.getCostServiceCharge());
                    BigDecimal charging_degree = query.getCharging_degree();
                    BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(charging_degree);
                    BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(charging_degree);
                    BigDecimal serviceCharge = originalServicePrice;
                    //计算优惠金额
                    if(null != chargingOrder.getVipDiscount()){
                        serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount().divide(new BigDecimal(10)));
                    }
                    chargingOrderAccountingStrategy1.setChargingCapacity(charging_degree);
                    chargingOrderAccountingStrategy1.setPeriodElectricPrice(electrovalenc);
                    chargingOrderAccountingStrategy1.setPeriodOriginalServicePrice(originalServicePrice);
                    chargingOrderAccountingStrategy1.setPeriodServicePrice(serviceCharge);
                    chargingOrderAccountingStrategy1.setCreateTime(LocalDateTime.now());
                    chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy1);
                }
            }
            List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>()
                    .eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()));
            BigDecimal t = BigDecimal.ZERO;
            for (TChargingOrderAccountingStrategy coas : list) {
                t = t.add(coas.getPeriodServicePrice()).add(coas.getPeriodElectricPrice());
            }
            BigDecimal residualAmount = chargingOrder.getRechargeAmount().subtract(t).setScale(2, RoundingMode.HALF_EVEN);
            chargingOrder.setResidualAmount(residualAmount);
            BigDecimal divide = query.getOutput_current().multiply(query.getOutput_voltage()).divide(new BigDecimal(1000));
            chargingOrder.setChargingPower(divide);
            this.updateById(chargingOrder);
        }
    }
    /**
     * 自动结束充电后的处理逻辑
     * @param orderCode
     */
    @Override
    @GlobalTransactional(rollbackFor = Exception.class)
    public void endCharge(String orderCode, Integer endMode) {
        TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, orderCode));
        Integer status = chargingOrder.getStatus();
        if(status == 4 || status == 5){
            return;
        }
        chargingOrder.setStatus(5);
        chargingOrder.setEndMode(endMode);
        this.updateById(chargingOrder);
        //计算费用,处理退款
        endCharge(chargingOrder);
        //处理推荐奖励(被推荐首单奖励)
        TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
        long count = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId())
                .eq(TChargingOrder::getStatus, 5).isNull(TChargingOrder::getEndMode).eq(TChargingOrder::getDelFlag, 0));
        if(null != appUser.getInviteUserId() && 1 == count){
            TIntegralRule integralRule = integralRuleClient.getSet().getData();
            String inviteUsersToEarnPoints = integralRule.getInviteUsersToEarnPoints();
            JSONObject jsonObject = JSON.parseObject(inviteUsersToEarnPoints);
            Integer num1 = jsonObject.getInteger("num1");
            GetInviteUser query = new GetInviteUser();
            query.setAppUserId(appUser.getInviteUserId());
            query.setBeInvitedAppUserId(chargingOrder.getAppUserId());
            TInviteUser inviteUser = inviteUserClient.getInviteUser(query).getData();
            if(null == inviteUser){
                inviteUser = new TInviteUser();
                inviteUser.setAppUserId(appUser.getInviteUserId());
                inviteUser.setBeInvitedAppUserId(chargingOrder.getAppUserId());
                inviteUser.setAward(num1);
                inviteUser.setCreateTime(LocalDateTime.now());
                inviteUserClient.saveInviteUser(inviteUser);
            }else{
                inviteUser.setAward(num1);
                inviteUserClient.updateInviteUser(inviteUser);
            }
            TAppUser appUser1 = appUserClient.getUserById(appUser.getInviteUserId()).getData();
            TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange();
            String code = Math.random() * 1000 + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
            appUserIntegralChange.setCode(code);
            appUserIntegralChange.setAppUserId(appUser.getInviteUserId());
            appUserIntegralChange.setChangeType(5);
            appUserIntegralChange.setHistoricalIntegral(appUser1.getPoints());
            appUserIntegralChange.setCurrentIntegral(appUser1.getPoints() + num1);
            appUserIntegralChange.setCreateTime(LocalDateTime.now());
            appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange);
            appUser1.setPoints(appUser1.getPoints() + num1);
            appUserClient.updateAppUser(appUser1);
        }
    }
    /**
     * 异常结束充电处理逻辑
     * @param orderCode
     */
    @Override
    public void excelEndCharge(String orderCode) {
        endCharge(orderCode, 0);
    }
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java
@@ -4,23 +4,25 @@
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.account.api.model.TAppUser;
import com.ruoyi.account.api.model.TAppUserCar;
import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient;
import com.ruoyi.chargingPile.api.feignClient.SiteClient;
import com.ruoyi.chargingPile.api.model.Site;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.order.api.model.TChargingOrder;
import com.ruoyi.order.api.model.TOrderInvoice;
import com.ruoyi.order.api.model.TOrderInvoiceDetail;
import com.ruoyi.order.api.model.TShoppingOrder;
import com.ruoyi.order.api.model.*;
import com.ruoyi.order.api.query.TOrderInvoiceQuery;
import com.ruoyi.order.api.vo.TOrderEvaluateVO;
import com.ruoyi.order.api.vo.TOrderInvoiceVO;
import com.ruoyi.order.dto.*;
import com.ruoyi.order.mapper.TOrderInvoiceMapper;
import com.ruoyi.order.service.TChargingOrderService;
import com.ruoyi.order.service.TOrderInvoiceDetailService;
import com.ruoyi.order.service.TOrderInvoiceService;
import com.ruoyi.order.service.TShoppingOrderService;
import com.ruoyi.order.service.*;
import com.ruoyi.other.api.domain.TCoupon;
import com.ruoyi.other.api.domain.TGoods;
import com.ruoyi.other.api.domain.TInvoiceType;
@@ -30,6 +32,7 @@
import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
@@ -75,7 +78,12 @@
    
    @Resource
    private CouponClient couponClient;
    @Resource
    private AppUserClient appUserClient;
    
    @Resource
    private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService;
    
    
    
@@ -117,6 +125,11 @@
        //获取开票类型
        TInvoiceType invoiceType = invoiceTypeClient.getInvoiceType(addOrderInvoice.getInvoiceTypeId()).getData();
        for (Long orderId : orderIds) {
            List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>()
                    .eq(TChargingOrderAccountingStrategy::getChargingOrderId, orderId));
            BigDecimal electrovalence = list.stream().map(TChargingOrderAccountingStrategy::getElectrovalence).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal serviceCharge = list.stream().map(TChargingOrderAccountingStrategy::getServiceCharge).reduce(BigDecimal.ZERO, BigDecimal::add);
            TOrderInvoiceDetail orderInvoiceDetail = new TOrderInvoiceDetail();
            orderInvoiceDetail.setOrderInvoiceId(addOrderInvoice.getId());
            orderInvoiceDetail.setInvoiceAmount(map.get(orderId));
@@ -125,6 +138,9 @@
            orderInvoiceDetail.setElectricityTariff(invoiceType.getElectricityTariff());
            orderInvoiceDetail.setServiceTariff(invoiceType.getServiceTariff());
            orderInvoiceDetail.setAddedServiceTariff(invoiceType.getAddedServiceTariff());
            orderInvoiceDetail.setElectrovalence(electrovalence);
            orderInvoiceDetail.setServiceCharge(serviceCharge);
            orderInvoiceDetail.setAddedService(serviceCharge.multiply(invoiceType.getAddedServiceTariff().divide(new BigDecimal(100))));
            orderInvoiceDetailService.save(orderInvoiceDetail);
        }
        return AjaxResult.success();
@@ -228,4 +244,74 @@
        }
        return myOrderInvoiceInfo;
    }
    @Override
    public PageInfo<TOrderInvoiceVO> pageList(TOrderInvoiceQuery query) {
        // 查询申请用户
        List<TAppUser> userList = appUserClient.selectByPhoneLike(query.getUserPhone()).getData();
        if(CollectionUtils.isEmpty(userList)){
            return new PageInfo<>();
        }
        query.setUserIds(userList.stream().map(TAppUser::getId).collect(Collectors.toList()));
        PageInfo<TOrderInvoiceVO> pageInfo = new PageInfo<>(query.getPageCurr(),query.getPageSize());
        List<TOrderInvoiceVO> list = this.baseMapper.pageList(query,pageInfo);
        List<Long> ids = list.stream().map(TOrderInvoiceVO::getId).collect(Collectors.toList());
        List<TOrderInvoiceDetail> orderInvoiceDetailList = orderInvoiceDetailService.list(new LambdaQueryWrapper<TOrderInvoiceDetail>()
                .in(TOrderInvoiceDetail::getOrderInvoiceId, ids));
        list.forEach(e->{
            e.setServiceTariff(orderInvoiceDetailList.get(0).getServiceTariff());
            e.setElectricityTariff(orderInvoiceDetailList.get(0).getElectricityTariff());
            e.setAddedServiceTariff(orderInvoiceDetailList.get(0).getAddedServiceTariff());
            e.setAddedService(orderInvoiceDetailList.stream().map(TOrderInvoiceDetail::getAddedService).reduce(BigDecimal::add).get());
            e.setElectrovalence(orderInvoiceDetailList.stream().map(TOrderInvoiceDetail::getElectrovalence).reduce(BigDecimal::add).get());
            e.setServiceCharge(orderInvoiceDetailList.stream().map(TOrderInvoiceDetail::getServiceCharge).reduce(BigDecimal::add).get());
            e.setUserPhone(userList.stream().filter(m->m.getId().equals(Long.parseLong(e.getBillingUserId().toString()))).findFirst().get().getPhone());
        });
        pageInfo.setRecords(list);
        return pageInfo;
    }
    @Override
    public Map<String, Integer> statusCount(TOrderInvoiceQuery query) {
        Map<String, Integer> map = new HashMap<>();
        List<TAppUser> userList = appUserClient.selectByPhoneLike(query.getUserPhone()).getData();
        if(CollectionUtils.isEmpty(userList)){
            map.put("notAccepted",0);
            map.put("processing",0);
            map.put("finished",0);
            return map;
        }
        query.setUserIds(userList.stream().map(TAppUser::getId).collect(Collectors.toList()));
        map = this.baseMapper.statusCount(query);
        return map;
    }
    @Override
    public List<TOrderInvoiceVO> export(TOrderInvoiceQuery query) {
        // 查询申请用户
        List<TAppUser> userList = appUserClient.selectByPhoneLike(query.getUserPhone()).getData();
        if(CollectionUtils.isEmpty(userList)){
            return new ArrayList<>();
        }
        query.setUserIds(userList.stream().map(TAppUser::getId).collect(Collectors.toList()));
        PageInfo<TOrderInvoiceVO> pageInfo = new PageInfo<>(query.getPageCurr(),query.getPageSize());
        List<TOrderInvoiceVO> list = this.baseMapper.export(query);
        List<Long> ids = list.stream().map(TOrderInvoiceVO::getId).collect(Collectors.toList());
        List<TOrderInvoiceDetail> orderInvoiceDetailList = orderInvoiceDetailService.list(new LambdaQueryWrapper<TOrderInvoiceDetail>()
                .in(TOrderInvoiceDetail::getOrderInvoiceId, ids));
        list.forEach(e->{
            e.setServiceTariff(orderInvoiceDetailList.get(0).getServiceTariff());
            e.setElectricityTariff(orderInvoiceDetailList.get(0).getElectricityTariff());
            e.setAddedServiceTariff(orderInvoiceDetailList.get(0).getAddedServiceTariff());
            e.setAddedService(orderInvoiceDetailList.stream().map(TOrderInvoiceDetail::getAddedService).reduce(BigDecimal::add).get());
            e.setElectrovalence(orderInvoiceDetailList.stream().map(TOrderInvoiceDetail::getElectrovalence).reduce(BigDecimal::add).get());
            e.setServiceCharge(orderInvoiceDetailList.stream().map(TOrderInvoiceDetail::getServiceCharge).reduce(BigDecimal::add).get());
            e.setUserPhone(userList.stream().filter(m->m.getId().equals(Long.parseLong(e.getBillingUserId().toString()))).findFirst().get().getPhone());
        });
        return list;
    }
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/ChargingOrderListInfoVO.java
@@ -2,6 +2,7 @@
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData;
import com.ruoyi.order.api.model.TChargingOrderAccountingStrategy;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -44,7 +45,7 @@
    @ApiModelProperty(value = "订单类型(1=充电订单(小程序),2=充电订单(刷卡))")
    private String orderType;
    @ApiModelProperty(value = "充电时间 秒")
    private Long chargingSecond;
    private String chargingSecond;
    @ApiModelProperty(value = "车牌号")
    private String licensePlate;
    @ApiModelProperty(value = "客户手机号")
@@ -65,6 +66,16 @@
    private Long id;
    @ApiModelProperty(value = "订单uid")
    private String uid;
    @ApiModelProperty(value = "费用明细-优惠券优惠金额")
    private BigDecimal couponDiscountAmount;
    @ApiModelProperty(value = "费用明细-会员优惠金额")
    private BigDecimal vipDiscountAmount;
    @ApiModelProperty(value = "费用明细-平台分佣")
    private BigDecimal sharingAmount;
    @ApiModelProperty(value = "费用明细-手续费")
    private BigDecimal commissionAmount;
    @ApiModelProperty(value = "充电信息")
    List<UploadRealTimeMonitoringData> list;
    @ApiModelProperty(value = "费用明细-费用列表")
    List<TChargingOrderAccountingStrategy> list1;
}
ruoyi-service/ruoyi-order/src/main/resources/bootstrap.yml
@@ -24,6 +24,7 @@
        namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb
        username: nacos
        password: nacos
        ip: 192.168.110.85
      config:
        # 配置中心地址
        server-addr: 192.168.110.169:8848
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/AccountingStrategyDetailOrderMapper.xml
New file
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.order.mapper.AccountingStrategyDetailOrderMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.order.api.model.AccountingStrategyDetailOrder">
        <id column="id" property="id" />
        <result column="accounting_strategy_id" property="accountingStrategyId" />
        <result column="`type`" property="type" />
        <result column="start_time" property="startTime" />
        <result column="end_time" property="endTime" />
        <result column="electrovalence" property="electrovalence" />
        <result column="service_charge" property="serviceCharge" />
        <result column="cost_service_charge" property="costServiceCharge" />
    </resultMap>
</mapper>
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/AccountingStrategyOrderMapper.xml
New file
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.order.mapper.AccountingStrategyOrderMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.order.api.model.AccountingStrategyOrder">
        <id column="id" property="id" />
        <result column="site_id" property="siteId" />
        <result column="`name`" property="name" />
        <result column="description" property="description" />
        <result column="discount" property="discount" />
        <result column="first_user_id" property="firstUserId" />
        <result column="two_user_id" property="twoUserId" />
        <result column="first_remark" property="firstRemark" />
        <result column="two_remark" property="twoRemark" />
        <result column="audit_status" property="auditStatus" />
        <result column="first_audit_time" property="firstAuditTime" />
        <result column="two_audit_time" property="twoAuditTime" />
        <result column="create_time" property="createTime" />
        <result column="del_flag" property="delFlag" />
    </resultMap>
</mapper>
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
@@ -105,62 +105,75 @@
    </select>
    <select id="payOrderQuery" resultType="com.ruoyi.order.dto.PayOrderDto">
        SELECT * FROM (SELECT
                           id,
                           `code`,
                           1 as type,
                           title,
                           phone,
                           `status`,
                           order_amount,
                           payment_amount ,
                           create_time,
                           end_time,
                           pay_time
                       FROM
                           charging_pile_order.t_charging_order UNION ALL
                       SELECT
                           id,
                           `code`,
                           2 as type,
                           title,
                           phone,
                           `status`,
                           order_amount,
                           payment_amount ,
                           create_time,
                           receiving_time as end_time,
                           pay_time
                       FROM
                           charging_pile_order.t_shopping_order UNION ALL
                       SELECT
                           id,
                           `code`,
                           3 as type,
                           title,
                           phone,
                           payment_status AS `status`,
                           order_amount,
                           payment_amount ,
                           create_time,
                           create_time as end_time,
                           pay_time
                       FROM
                           charging_pile_order.t_vip_order UNION ALL
                       SELECT
                           id,
                           `code`,
                           4 as type,
                           title,
                           phone,
                           `status`,
                           order_amount ,
                           order_amount as payment_amount,
                           create_time,
                           out_parking_time as end_time,
                           out_parking_time as pay_time
                       FROM
                           charging_pile_service.t_parking_record ) o
        id,
        `code`,
        1 as type,
        title,
        phone,
        `status`,
        order_amount,
        payment_amount ,
        create_time,
        end_time,
        pay_time,
        refund_status,
        (payment_amount-refund_amount) as final_amount,
        del_flag
        FROM
        charging_pile_order.t_charging_order UNION ALL
        SELECT
        id,
        `code`,
        2 as type,
        title,
        phone,
        `status`,
        order_amount,
        payment_amount ,
        create_time,
        receiving_time as end_time,
        pay_time,
        refund_status,
        (payment_amount-refund_amount) as final_amount,
        del_flag
        FROM
        charging_pile_order.t_shopping_order UNION ALL
        SELECT
        id,
        `code`,
        3 as type,
        title,
        phone,
        payment_status AS `status`,
        order_amount,
        payment_amount ,
        create_time,
        create_time as end_time,
        pay_time,
        refund_status,
        (payment_amount-refund_amount) as final_amount,
        del_flag
        FROM
        charging_pile_order.t_vip_order UNION ALL
        SELECT
        id,
        `code`,
        4 as type,
        title,
        phone,
        `status`,
        order_amount ,
        order_amount as payment_amount,
        create_time,
        out_parking_time as end_time,
        out_parking_time as pay_time,
        null as refund_status,
        0 as final_amount,
        0 as del_flag
        FROM
        charging_pile_service.t_parking_record ) o
                <where>
                    o.del_flag = 0
                    <if test="data.code != null and data.code != ''">
                        AND o.code LIKE CONCAT('%',#{data.code},'%')
                    </if>
@@ -170,9 +183,6 @@
                    <if test="data.type != null">
                        AND o.type = #{data.type}
                    </if>
                    <if test="data.status != null">
                        AND o.status = #{data.status}
                    </if>
                    <if test="data.createTime1 != null">
                        AND o.create_time &gt;= #{data.createTime1}
                    </if>
@@ -180,7 +190,7 @@
                        AND o.create_time &lt;= #{data.createTime2}
                    </if>
                </where>
        ORDER BY o.create_time desc
    </select>
    <select id="getRefundList" resultType="com.ruoyi.order.api.model.TChargingOrderRefund">
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceDetailMapper.xml
@@ -12,11 +12,14 @@
        <result column="electricity_tariff" property="electricityTariff" />
        <result column="service_tariff" property="serviceTariff" />
        <result column="added_service_tariff" property="addedServiceTariff" />
        <result column="electrovalence" property="electrovalence" />
        <result column="service_charge" property="serviceCharge" />
        <result column="added_service" property="addedService" />
    </resultMap>
    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        id, order_invoice_id, order_type, order_id, invoice_amount, electricity_tariff, service_tariff, added_service_tariff
        id, order_invoice_id, order_type, order_id, invoice_amount, electricity_tariff, service_tariff, added_service_tariff,electrovalence,service_charge,added_service
    </sql>
</mapper>
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceMapper.xml
@@ -33,5 +33,115 @@
    <sql id="Base_Column_List">
        id, code, app_user_id, order_type, invoicing_company, invoice_type_id, invoice_type, invoice_material, invoicing_method, invoicing_object_type, name, tax_identification_number, company_address, company_phone, deposit_bank, bank_account, total_amount, invoice_url, mailbox, status, create_time, billing_time, billing_user_id
    </sql>
    <select id="pageList" resultType="com.ruoyi.order.api.vo.TOrderInvoiceVO">
        select toi.id, toi.code, toi.app_user_id, toi.order_type, toi.invoicing_company, toi.invoice_type_id, toi.invoice_type, toi.invoice_material,
               toi.invoicing_method, toi.invoicing_object_type, toi.name, toi.tax_identification_number, toi.company_address, toi.company_phone,
               toi.deposit_bank, toi.bank_account, toi.total_amount, toi.invoice_url, toi.mailbox, toi.status, toi.create_time, toi.billing_time,
               toi.billing_user_id
        from t_order_invoice toi
        <where>
            <if test="query.invoicingCompany != null and query.invoicingCompany != ''">
                AND toi.invoicing_company LIKE concat('%',#{query.invoicingCompany},'%')
            </if>
            <if test="query.invoiceType != null and query.invoiceType != ''">
                AND toi.invoice_type LIKE concat('%',#{query.invoiceType},'%')
            </if>
            <if test="query.invoicingObjectType != null">
                AND toi.invoicing_object_type = #{query.invoicingObjectType}
            </if>
            <if test="query.invoiceMaterial != null">
                AND toi.invoice_material = #{query.invoiceMaterial}
            </if>
            <if test="query.invoicingMethod != null">
                AND toi.invoicing_method = #{query.invoicingMethod}
            </if>
            <if test="query.name != null and query.name != ''">
                AND toi.name LIKE concat('%',#{query.name},'%')
            </if>
            <if test="query.startTime != null and query.startTime != '' and query.endTime != null and query.endTime != ''">
                AND toi.billing_time BETWEEN #{query.startTime} AND #{query.endTime}
            </if>
            <if test="query.userIds != null and query.userIds.size()>0">
                AND toi.billing_user_id IN
                <foreach collection="query.userIds" close=")" open="(" item="userId" separator=",">
                    #{userId}
                </foreach>
            </if>
        </where>
        ORDER BY toi.billing_time DESC
    </select>
    <select id="statusCount" resultType="java.util.Map">
        select
            COUNT(CASE WHEN status = 1 THEN 1 END) AS `notAccepted`,
            COUNT(CASE WHEN status = 2 THEN 1 END) AS `processing`,
            COUNT(CASE WHEN status = 3 THEN 1 END) AS `finished`
        from t_order_invoice toi
        <where>
            <if test="query.invoicingCompany != null and query.invoicingCompany != ''">
                AND toi.invoicing_company LIKE concat('%',#{query.invoicingCompany},'%')
            </if>
            <if test="query.invoiceType != null and query.invoiceType != ''">
                AND toi.invoice_type LIKE concat('%',#{query.invoiceType},'%')
            </if>
            <if test="query.invoicingObjectType != null">
                AND toi.invoicing_object_type = #{query.invoicingObjectType}
            </if>
            <if test="query.invoiceMaterial != null">
                AND toi.invoice_material = #{query.invoiceMaterial}
            </if>
            <if test="query.invoicingMethod != null">
                AND toi.invoicing_method = #{query.invoicingMethod}
            </if>
            <if test="query.name != null and query.name != ''">
                AND toi.name LIKE concat('%',#{query.name},'%')
            </if>
            <if test="query.startTime != null and query.startTime != '' and query.endTime != null and query.endTime != ''">
                AND toi.billing_time BETWEEN #{query.startTime} AND #{query.endTime}
            </if>
            <if test="query.userIds != null and query.userIds.size()>0">
                AND toi.billing_user_id IN
                <foreach collection="query.userIds" close=")" open="(" item="userId" separator=",">
                    #{userId}
                </foreach>
            </if>
        </where>
    </select>
    <select id="export" resultType="com.ruoyi.order.api.vo.TOrderInvoiceVO">
        select toi.id, toi.code, toi.app_user_id, toi.order_type, toi.invoicing_company, toi.invoice_type_id, toi.invoice_type, toi.invoice_material,
        toi.invoicing_method, toi.invoicing_object_type, toi.name, toi.tax_identification_number, toi.company_address, toi.company_phone,
        toi.deposit_bank, toi.bank_account, toi.total_amount, toi.invoice_url, toi.mailbox, toi.status, toi.create_time, toi.billing_time,
        toi.billing_user_id
        from t_order_invoice toi
        <where>
            <if test="query.invoicingCompany != null and query.invoicingCompany != ''">
                AND toi.invoicing_company LIKE concat('%',#{query.invoicingCompany},'%')
            </if>
            <if test="query.invoiceType != null and query.invoiceType != ''">
                AND toi.invoice_type LIKE concat('%',#{query.invoiceType},'%')
            </if>
            <if test="query.invoicingObjectType != null">
                AND toi.invoicing_object_type = #{query.invoicingObjectType}
            </if>
            <if test="query.invoiceMaterial != null">
                AND toi.invoice_material = #{query.invoiceMaterial}
            </if>
            <if test="query.invoicingMethod != null">
                AND toi.invoicing_method = #{query.invoicingMethod}
            </if>
            <if test="query.name != null and query.name != ''">
                AND toi.name LIKE concat('%',#{query.name},'%')
            </if>
            <if test="query.startTime != null and query.startTime != '' and query.endTime != null and query.endTime != ''">
                AND toi.billing_time BETWEEN #{query.startTime} AND #{query.endTime}
            </if>
            <if test="query.userIds != null and query.userIds.size()>0">
                AND toi.billing_user_id IN
                <foreach collection="query.userIds" close=")" open="(" item="userId" separator=",">
                    #{userId}
                </foreach>
            </if>
        </where>
        ORDER BY toi.billing_time DESC
    </select>
</mapper>
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java
@@ -194,7 +194,11 @@
            total = total.add(vip.getMaximumDeduction().multiply(BigDecimal.valueOf(vip.getDiscountTimes())));
            for (VipCouponDto vipCouponDto : vipCouponDtos) {
                TCoupon tCoupon = vipCouponDto.getTCoupon();
                total.add(tCoupon.getMaximumDiscountAmount());
                if (tCoupon.getPreferentialMode()==2) {
                    total.add(tCoupon.getMaximumDiscountAmount());
                }else {
                    total.add(tCoupon.getDiscountAmount());
                }
            }
            vipInfoDto.setTotalDiscount(total);
            vipInfoDto.setTimeAmount(vip.getMaximumDeduction().multiply(BigDecimal.valueOf(vip.getDiscountTimes())));