无关风月
2024-10-17 98835fa85ab003f9511d453c527873d21eed1812
Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/mx_charging_pile
104个文件已修改
3个文件已添加
2793 ■■■■■ 已修改文件
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/InfoCouponDto.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserFallbackFactory.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserIntegralChangeFallbackFactory.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserIntegralChangeClient.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUserVipDetail.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/GetSiteListDTO.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/UploadRealTimeMonitoringDataClient.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/AcquisitionBillingMode.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/AcquisitionBillingModeReply.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/BillingModeVerify.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/BillingModeVerifyReply.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/BmsAbort.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/BmsDemandAndChargerExportation.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/BmsInformation.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/ChargingHandshake.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/ChargingPileReturnsGroundLockData.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/ChargingPileStartsCharging.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/ClearOfflineCard.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/ClearOfflineCardReply.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/ConfirmTransactionRecord.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/EndCharge.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/ErrorMessage.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/GroundLockRealTimeData.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/MotorAbort.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/Online.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/OnlineReply.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/OpenOrCloseGroundLock.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/ParameterSetting.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/Ping.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/PlatformConfirmationCharging.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/PlatformRemoteUpdate.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/PlatformRemoteUpdateReply.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/PlatformRestart.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/PlatformRestartReply.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/PlatformStartCharging.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/PlatformStopCharging.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/PlatformStopChargingReply.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/Pong.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/QrCodeDelivery.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/QrCodeDeliveryReply.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/QueryOfflineCard.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/QueryOfflineCardReply.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/ReadRealTimeMonitoringData.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/SetupBillingModel.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/SetupBillingModelReply.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/SynchronizeOfflineCard.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/SynchronizeOfflineCardReply.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/TimingSetting.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/TimingSettingReply.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/TransactionRecord.java 175 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/UpdateBalance.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/UpdateBalanceReply.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/UploadRealTimeMonitoringData.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/WorkingParameterSetting.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/WorkingParameterSettingReply.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/AccountingStrategyDetailOrder.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrder.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TActivityStatisticslVO.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TActivityVO.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TransactionRecordMessageVO.java 188 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/TEvaluationTagClient.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserIntegralChangeController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WxLoginController.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxAppletTools.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TFaultMessageController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingRecordController.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyDetailServiceImpl.java 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java 132 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/resources/bootstrap.yml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/SiteMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/MessageUtil.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/StrategyUtil.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/PlatformStopChargingReplyServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/BmsDemandAndChargerExportationMessage.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/BmsInformationMessage.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/TransactionRecordMessage.java 172 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderEvaluateController.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/SixVipDto.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderAccountingStrategyServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java 1094 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderEvaluateServiceImpl.java 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/EndOfChargePageInfo.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/ReplyEvaluationVO.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingBillMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderEvaluateMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderEvaluateTagMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TVipOrderMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/RuoYiOrderApplicationTests.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/TEvaluationTagMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-payment/src/main/resources/bootstrap.yml 51 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/InfoCouponDto.java
@@ -20,6 +20,7 @@
    @TableField("name")
    private String name;
    private Integer type;
    private Integer couponId;
    @ApiModelProperty(value = "优惠方式(1=满减,2=抵扣)")
    @TableField("preferential_mode")
    private Integer preferentialMode;
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserFallbackFactory.java
@@ -85,6 +85,12 @@
            public R<TAppUserAddress> getAddressById(Long id) {
                return R.fail("通过地址id `查询用户地址失败:"+throwable.getMessage());
            }
            @Override
            public R<String> getWXToken() {
                return R.fail("获取微信token失败:" + throwable.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserIntegralChangeFallbackFactory.java
@@ -27,6 +27,11 @@
            public R addAppUserIntegralChange(TAppUserIntegralChange appUserIntegralChange) {
                return R.fail("添加积分变动记录失败:" + throwable.getMessage());
            }
            @Override
            public R<TAppUserIntegralChange> getTAppUserIntegralChangeByOrderCode(String code) {
                return R.fail("根据订单code获取积分记录失败:" + throwable.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java
@@ -85,4 +85,12 @@
    @PostMapping(value = "/t-app-user/user/give/vip")
    public R giveVip(@RequestBody GiveVipDto giveVipDto);
    /**
     * 获取微信token
     * @return
     */
    @PostMapping("/wxLogin/getWXToken")
    R<String> getWXToken();
}
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserIntegralChangeClient.java
@@ -7,6 +7,7 @@
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;
/**
 * @author zhibing.pu
@@ -22,4 +23,13 @@
     */
    @PostMapping("/t-app-user-integral-change/addAppUserIntegralChange")
    R addAppUserIntegralChange(@RequestBody TAppUserIntegralChange appUserIntegralChange);
    /**
     * 根据订单code获取积分记录
     * @param code
     * @return
     */
    @PostMapping("/t-app-user-integral-change/addAppUserIntegralChange")
    R<TAppUserIntegralChange> getTAppUserIntegralChangeByOrderCode(@RequestParam("code") String code);
}
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUserVipDetail.java
@@ -58,7 +58,7 @@
    @TableField("vip_id")
    private Integer vipId;
    @ApiModelProperty(value = "1月卡2季卡3年卡")
    @ApiModelProperty(value = "1月卡2季卡3年卡4集团")
    @TableField("vip_type")
    private Integer vipType;
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/GetSiteListDTO.java
@@ -4,6 +4,8 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
 * @author zhibing.pu
 * @Date 2024/8/8 9:29
@@ -31,6 +33,10 @@
    private String address;
    @ApiModelProperty(value = "站点电话")
    private String phone;
    @ApiModelProperty(value = "lon")
    private String lon;
    @ApiModelProperty(value = "lat")
    private String lat;
    @ApiModelProperty(value = "服务电话")
    private String servicePhone;
    @ApiModelProperty(value = "车位数")
@@ -53,4 +59,19 @@
    private boolean authUpdate = true;
    @ApiModelProperty(value = "删除权限")
    private boolean authDelete = true;
    @ApiModelProperty("超1")
    private Long c1;
    @ApiModelProperty("超2")
    private Long c2;
    @ApiModelProperty("快1")
    private Long k1;
    @ApiModelProperty("快2")
    private Long k2;
    @ApiModelProperty("慢1")
    private Long m1;
    @ApiModelProperty("慢2")
    private Long m2;
    @ApiModelProperty("利用率")
    private BigDecimal p1;
}
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/UploadRealTimeMonitoringDataClient.java
@@ -24,7 +24,7 @@
     * @return
     */
    @PostMapping("/uploadRealTimeMonitoringData/getOrderInfoByCode")
    R<UploadRealTimeMonitoringData> chargingOrderInfo(String orderId);
    R<UploadRealTimeMonitoringData> chargingOrderInfo(@RequestParam("orderId") String orderId);
    /**
     * 批量查询
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/AcquisitionBillingMode.java
@@ -13,7 +13,6 @@
@Document(collection = "acquisition_billing_mode") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class AcquisitionBillingMode extends BaseModel {
    @Id
    private String charging_pile_code;// 桩编码
}
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/AcquisitionBillingModeReply.java
@@ -15,17 +15,16 @@
@Document(collection = "acquisition_billing_mode_reply") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class AcquisitionBillingModeReply extends BaseModel {
    @Id
    private String charging_pile_code;// 桩编码
    private String billing_model_code;// "计费模型编号
    private BigDecimal sharp_peak_electricity_rate;// 尖费电费费率(精确到五位小数)
    private BigDecimal sharp_peak_service_rate;// 尖服务费费率(精确到五位小数)
    private BigDecimal peak_electricity_rate;// 峰电费费率(精确到五位小数)
    private BigDecimal peak_service_rate;// 峰服务费费率(精确到五位小数)
    private BigDecimal flat_peak_electricity_rate;// 平电费费率(精确到五位小数)
    private BigDecimal flat_peak_service_rate;// 平服务费费率(精确到五位小数)
    private BigDecimal low_peak_electricity_rate;// 谷电费费率(精确到五位小数)
    private BigDecimal low_peak_service_rate;// 谷服务费费率(精确到五位小数)
    private BigDecimal sharp_peak_electricity_rate = BigDecimal.ZERO;// 尖费电费费率(精确到五位小数)
    private BigDecimal sharp_peak_service_rate = BigDecimal.ZERO;// 尖服务费费率(精确到五位小数)
    private BigDecimal peak_electricity_rate = BigDecimal.ZERO;// 峰电费费率(精确到五位小数)
    private BigDecimal peak_service_rate = BigDecimal.ZERO;// 峰服务费费率(精确到五位小数)
    private BigDecimal flat_peak_electricity_rate = BigDecimal.ZERO;// 平电费费率(精确到五位小数)
    private BigDecimal flat_peak_service_rate = BigDecimal.ZERO;// 平服务费费率(精确到五位小数)
    private BigDecimal low_peak_electricity_rate = BigDecimal.ZERO;// 谷电费费率(精确到五位小数)
    private BigDecimal low_peak_service_rate = BigDecimal.ZERO;// 谷服务费费率(精确到五位小数)
    private BigDecimal loss_ratio;// 计损比例
//    private DayTimeBase day_time_base;
    private Integer time1;// 0:00~0:30 时段费率号(0:尖费率,1:峰费率,2:平费率,3:谷费率)
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/BillingModeVerify.java
@@ -13,7 +13,6 @@
@Document(collection = "billing_mode_verify") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class BillingModeVerify extends BaseModel {
    @Id
    private String charging_pile_code;// 桩编码
    private String billing_model_code;// "计费模型编号,首次连接到平台时置零
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/BillingModeVerifyReply.java
@@ -13,7 +13,6 @@
@Document(collection = "billing_mode_verify_reply") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class BillingModeVerifyReply extends BaseModel {
    @Id
    private String charging_pile_code; // 桩编
    private String billing_model_code; // 计费模型编
    private Integer billing_model_result; // 验证结果(0:桩计费模型与平台一致,1:桩计费模型与平台不一致)
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/BmsAbort.java
@@ -15,7 +15,6 @@
@Document(collection = "bms_abort") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class BmsAbort extends BaseModel {
    @Id
    private String transaction_serial_number; // 交易流水号
    private String charging_pile_code; // 桩编码
    private String charging_gun_code; // 抢号
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/BmsDemandAndChargerExportation.java
@@ -15,7 +15,6 @@
@Document(collection = "bms_demand_and_charger_exportation") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class BmsDemandAndChargerExportation extends BaseModel {
    @Id
    private String transaction_serial_number; // 交易流水号
    private String charging_pile_code; // 桩编码
    private String charging_gun_code; // 抢号
@@ -26,10 +25,10 @@
    private BigDecimal bms_current_measurement_value; // BMS 充电电流测量值
    private Integer bms_battery_voltage_and_group_number; // BMS 最高单体动力蓄电池电压及组号(1-12 位:最高单体动力蓄电池电压,数据分辨率:0.01 V/位,0 V 偏移量;数据范围:0~24 V;13-16 位:最高单体动力蓄电池电压所在组号,数据分辨率:1/位,0 偏移量;数据范围:0~15)
    private BigDecimal bms_charged_status; // BMS 当前荷电状态 SOC( %)
    private Integer bms_remaining_charging_time; // BMS 估算剩余充电时间
    private BigDecimal bms_remaining_charging_time; // BMS 估算剩余充电时间
    private BigDecimal voltage_output_value; // 电桩电压输出值
    private BigDecimal current_output_value; // 电桩电流输出值
    private Integer cumulative_charging_time; // 累计充电时间
    private BigDecimal cumulative_charging_time; // 累计充电时间
}
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/BmsInformation.java
@@ -15,15 +15,14 @@
@Document(collection = "bms_information") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class BmsInformation extends BaseModel {
    @Id
    private String transaction_serial_number; // 交易流水号
    private String charging_pile_code; // 桩编码
    private String charging_gun_code; // 抢号
    private Integer bms_highest_voltage_number; // BMS 最高单体动力蓄电池电压所在编号
    private String bms_maximum_battery_temperature; // BMS 最高动力蓄电池温度
    private Integer maximum_temperature_detection_point_number; // 最高温度检测点编号
    private String maximum_temperature_detection_point_number; // 最高温度检测点编号
    private String minimum_cell_temperature; // 最低动力蓄电池温度
    private Integer lowest_temperature_detection_pointt_number; // 最低动力蓄电池温度检测点编号
    private String lowest_temperature_detection_pointt_number; // 最低动力蓄电池温度检测点编号
    private Integer bms_battery_voltage; // BMS 单体动力蓄电池电压过高 /过低(0:正常,1:过高,10:过低)
    private Integer bms_battery_charging_status; // BMS 整车动力蓄电池荷电状态SOC 过高/过低(0:正常,1:过高,10:过低)
    private Integer bms_charging_overcurrent; // BMS 动力蓄电池充电过电流(0:正常,1:过流,10:不可信状态)
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/ChargingHandshake.java
@@ -15,7 +15,6 @@
@Document(collection = "charging_handshake") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class ChargingHandshake extends BaseModel {
    @Id
    private String transaction_serial_number;// 交易流水号
    private String charging_pile_code;// 桩编码
    private String charging_gun_code;// 抢号
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/ChargingPileReturnsGroundLockData.java
@@ -13,7 +13,6 @@
@Document(collection = "charging_pile_returns_ground_lock_data") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class ChargingPileReturnsGroundLockData extends BaseModel {
    @Id
    private String charging_pile_code; //桩编码
    private String charging_gun_code; // 抢号
    private Integer control_state; // 地锁控制返回标志(1:鉴权成功,0:鉴权失败)
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/ChargingPileStartsCharging.java
@@ -13,7 +13,6 @@
@Document(collection = "charging_pile_starts_charging") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class ChargingPileStartsCharging extends BaseModel {
    @Id
    private String charging_pile_code; // 桩编码
    private String charging_gun_code; // 抢号
    private Integer start_method; // 启动方式(1:表示通过刷卡启动充电,2:表示通过帐号启动充电(暂不支持),3:表示vin码启动充电)
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/ClearOfflineCard.java
@@ -13,7 +13,6 @@
@Document(collection = "clear_offline_card") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class ClearOfflineCard extends BaseModel {
    @Id
    private String charging_pile_code; //桩编码
    private Integer physical_card_number; // 清除离线卡的个数,最大 24 个
    private String physical_card1; // 第 1 个卡物理卡号,离线卡物理卡号
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/ClearOfflineCardReply.java
@@ -13,7 +13,6 @@
@Document(collection = "clear_offline_card_reply") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class ClearOfflineCardReply extends BaseModel {
    @Id
    private String charging_pile_code; //桩编码
    private String physical_card1; // 第 1 个卡物理卡号,离线卡物理卡号
    private String physical_card2;
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/ConfirmTransactionRecord.java
@@ -13,7 +13,6 @@
@Document(collection = "confirm_transaction_record") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class ConfirmTransactionRecord extends BaseModel {
    @Id
    private String transaction_serial_number;// 桩编码
    private Integer confirm_result;// 确认结果(0:上传成功,1:非法账单)
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/EndCharge.java
@@ -15,7 +15,6 @@
@Document(collection = "end_charge") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class EndCharge extends BaseModel {
    @Id
    private String transaction_serial_number; // 交易流水号
    private String charging_pile_code; // 桩编码
    private String charging_gun_code; // 抢号
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/ErrorMessage.java
@@ -15,7 +15,6 @@
@Document(collection = "error_message") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class ErrorMessage extends BaseModel {
    @Id
    private String transaction_serial_number; // 交易流水号
    private String charging_pile_code; // 桩编码
    private String charging_gun_code; // 抢号
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/GroundLockRealTimeData.java
@@ -13,7 +13,6 @@
@Document(collection = "ground_lock_real_time_data") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class GroundLockRealTimeData extends BaseModel {
    @Id
    private String charging_pile_code; //桩编码
    private String charging_gun_code; // 抢号
    private Integer parking_lock_status; // 车位锁状态(0:未到位状态,1:升锁到位状态,2:降锁到位状态)
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/MotorAbort.java
@@ -13,7 +13,6 @@
@Document(collection = "motor_abort") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class MotorAbort extends BaseModel {
    @Id
    private String transaction_serial_number; // 交易流水号
    private String charging_pile_code; // 桩编码
    private String charging_gun_code; // 抢号
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/Online.java
@@ -13,7 +13,6 @@
@Document(collection = "online") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class Online extends BaseModel {
    @Id
    private String charging_pile_code;// 充电桩编号
    private Integer charging_pile_type;// 充电桩类型(0 表示直流桩,1 表示交流桩)
    private Integer charging_gun_number;// 充电枪数量
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/OnlineReply.java
@@ -13,7 +13,6 @@
@Document(collection = "online_reply") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class OnlineReply extends BaseModel {
    @Id
    private String charging_pile_code;// 桩编码
    private Integer online_result;// 登陆结果(0:成功,1:失败)
}
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/OpenOrCloseGroundLock.java
@@ -13,7 +13,6 @@
@Document(collection = "open_or_close_ground_lock") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class OpenOrCloseGroundLock extends BaseModel {
    @Id
    private String charging_pile_code; //桩编码
    private String charging_gun_code; // 抢号
    private Integer operate; // 升/降地锁(1:升锁,2:降锁)
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/ParameterSetting.java
@@ -15,7 +15,6 @@
@Document(collection = "parameter_setting") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class ParameterSetting extends BaseModel {
    @Id
    private String transaction_serial_number; // 交易流水号
    private String charging_pile_code; // 桩编码
    private String charging_gun_code; // 抢号
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/Ping.java
@@ -13,7 +13,6 @@
@Document(collection = "ping") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class Ping extends BaseModel {
    @Id
    private String charging_pile_code;// 桩编码
    private String charging_gun_code;// 抢号
    private Integer charging_gun_status;// 抢状态(0:正常,1:故障)
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/PlatformConfirmationCharging.java
@@ -15,7 +15,6 @@
@Document(collection = "platform_confirmation_charging") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class PlatformConfirmationCharging extends BaseModel {
    @Id
    private String transaction_serial_number; // 交易流水号
    private String charging_pile_code; // 桩编码
    private String charging_gun_code; // 抢号
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/PlatformRemoteUpdate.java
@@ -13,7 +13,6 @@
@Document(collection = "platform_remote_update") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class PlatformRemoteUpdate extends BaseModel {
    @Id
    private String charging_pile_code; //桩编码
    private Integer charging_pile_type; // 桩型号(1:直流,2:交流)
    private Integer charging_pile_power; // 桩功率
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/PlatformRemoteUpdateReply.java
@@ -13,7 +13,6 @@
@Document(collection = "platform_remote_update_reply") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class PlatformRemoteUpdateReply extends BaseModel {
    @Id
    private String charging_pile_code; //桩编码
    private Integer escalation_state; // 升级状态(0:成功,1:编码错误,2:程序与桩型号不符,3:下载更新文件超时)
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/PlatformRestart.java
@@ -13,7 +13,6 @@
@Document(collection = "platform_restart") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class PlatformRestart extends BaseModel {
    @Id
    private String charging_pile_code; //桩编码
    private Integer operate; // 执行控制 (1:立即执行,2:空闲执行)
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/PlatformRestartReply.java
@@ -13,7 +13,6 @@
@Document(collection = "platform_restart_reply") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class PlatformRestartReply extends BaseModel {
    @Id
    private String charging_pile_code; //桩编码
    private Integer set_result; // 设置结果(0:失败,1:成功)
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/PlatformStartCharging.java
@@ -16,7 +16,6 @@
@Accessors(chain = true)
public class PlatformStartCharging extends BaseModel {
    @Id
    private String transaction_serial_number; // 交易流水号
    private String charging_pile_code; // 桩编码
    private String charging_gun_code; // 抢号
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/PlatformStopCharging.java
@@ -13,7 +13,6 @@
@Document(collection = "platform_stop_charging") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class PlatformStopCharging extends BaseModel {
    @Id
    private String charging_pile_code; // 桩编码
    private String charging_gun_code; // 抢号
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/PlatformStopChargingReply.java
@@ -15,7 +15,6 @@
@Document(collection = "platform_stop_charging_reply") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class PlatformStopChargingReply extends BaseModel {
    @Id
    private String charging_pile_code; // 桩编码
    private String charging_gun_code; // 抢号
    private Integer stop_result; // 停止结果(0:失败,1:成功)
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/Pong.java
@@ -13,7 +13,6 @@
@Document(collection = "pong") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class Pong extends BaseModel {
    @Id
    private String charging_pile_code;// 桩编码
    private String charging_gun_code;// 抢号
    private Integer charging_gun_status;// 心跳应答(0)
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/QrCodeDelivery.java
@@ -10,7 +10,6 @@
@Accessors(chain = true)
public class QrCodeDelivery {
    @Id
    private String charging_pile_code; // 桩编码
    private Integer code_format; // "0:第一种前缀+桩编号  1:第二种前缀+桩编号+枪编号"
    private Integer prefix_length; // 二维码前缀长度长度最大不超过200 字节
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/QrCodeDeliveryReply.java
@@ -10,7 +10,6 @@
@Accessors(chain = true)
public class QrCodeDeliveryReply {
    @Id
    private String charging_pile_code; // 桩编码
    private Integer delivery_result; // 设置结果(0:成功,1:失败)
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/QueryOfflineCard.java
@@ -13,7 +13,6 @@
@Document(collection = "query_offline_card") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class QueryOfflineCard extends BaseModel {
    @Id
    private String charging_pile_code; //桩编码
    private Integer physical_card_number; //桩编码
    private String physical_card1; // 第 1 个卡物理卡号,离线卡物理卡号
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/QueryOfflineCardReply.java
@@ -13,7 +13,6 @@
@Document(collection = "query_offline_card_reply") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class QueryOfflineCardReply extends BaseModel {
    @Id
    private String charging_pile_code; //桩编码
    private String physical_card1; // 第 1 个卡物理卡号,离线卡物理卡号
    private String physical_card2;
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/ReadRealTimeMonitoringData.java
@@ -13,7 +13,6 @@
@Document(collection = "read_real_time_monitoring_data") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class ReadRealTimeMonitoringData extends BaseModel {
    @Id
    private String charging_pile_code;// 桩编码
    private String charging_gun_code;//  抢号
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/SetupBillingModel.java
@@ -15,7 +15,6 @@
@Document(collection = "setup_billing_model") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class SetupBillingModel extends BaseModel {
    @Id
    private String charging_pile_code; //桩编码
    private String billing_model_code; // 计费模型编号
    private BigDecimal sharp_peak_electricity_rate; // 尖费电费费率(精确到五位小数)
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/SetupBillingModelReply.java
@@ -13,7 +13,6 @@
@Document(collection = "setup_billing_model_reply") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class SetupBillingModelReply extends BaseModel {
    @Id
    private String charging_pile_code; //桩编码
    private String set_result; //设置结果(0:失败,1:成功)
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/SynchronizeOfflineCard.java
@@ -13,7 +13,6 @@
@Document(collection = "synchronize_offline_card") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class SynchronizeOfflineCard extends BaseModel {
    @Id
    private String charging_pile_code; //桩编码
    private Integer card_number; // 下发卡个数
    private String card1; // 第 1 个卡逻辑卡号,离线卡逻辑卡号
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/SynchronizeOfflineCardReply.java
@@ -15,7 +15,6 @@
@Document(collection = "synchronize_offline_card_reply") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class SynchronizeOfflineCardReply extends BaseModel {
    @Id
    private String charging_pile_code; //桩编码
    private Integer save_result; // 保存结果(0:失败,1:成功)
    private Integer failure_cause; // 失败原因(1:卡号格式错误,2:储存空间不足)
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/TimingSetting.java
@@ -13,7 +13,6 @@
@Document(collection = "timing_setting") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class TimingSetting extends BaseModel {
    @Id
    private String charging_pile_code; //桩编码
    private String current_time; //当前时间
}
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/TimingSettingReply.java
@@ -13,7 +13,6 @@
@Document(collection = "timing_setting_reply") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class TimingSettingReply extends BaseModel {
    @Id
    private String charging_pile_code; //桩编码
    private String current_time; //当前时间
}
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/TransactionRecord.java
@@ -15,28 +15,11 @@
@Document(collection = "transaction_record") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class TransactionRecord extends BaseModel {
    @Id
    private String transaction_serial_number;// 交易流水号
    private String charging_pile_code;// 桩编码
    private String charging_gun_code;// 抢号
    private String start_time;// 开始时间
    private String end_time;// 结束时间
    private BigDecimal sharp_peak_unit_price;// 尖单价
    private BigDecimal sharp_peak_charge;// 尖电量
    private BigDecimal loss_sharp_peak_charge;// 计损尖电量
    private BigDecimal sharp_peak_amount;// 尖金额
    private BigDecimal peak_unit_price;// 峰单价
    private BigDecimal peak_charge;// 峰电量
    private BigDecimal loss_peak_charge;// 计损峰电量
    private BigDecimal peak_amount;// 峰金额
    private BigDecimal flat_peak_unit_price;// 平单价
    private BigDecimal flat_peak_charge;// 平电量
    private BigDecimal loss_flat_peak_charge;// 计损平电量
    private BigDecimal flat_peak_amount;// 平金额
    private BigDecimal low_peak_unit_price;// 谷单价
    private BigDecimal low_peak_charge;// 谷电量
    private BigDecimal loss_low_peak_charge;// 计损谷电量
    private BigDecimal low_peak_amount;// 谷金额
    private BigDecimal total_initial_value;// 电表总起值
    private BigDecimal total_stop_value;// 电表总止值
    private BigDecimal total_electricity;// 总电量
@@ -47,8 +30,162 @@
    private String trade_date;// 交易日期、时间
    private Integer stop_reason;// 停止原因
    private String physical_card_number;// 物理卡号
    private String time1;// 计费时段
    private BigDecimal sharp_peak_charge1;// 尖电量
    private BigDecimal loss_sharp_peak_charge1;// 计损尖电量
    private BigDecimal sharp_peak_amount1;// 尖金额
    private BigDecimal flat_peak_charge1;// 平电量
    private BigDecimal loss_flat_peak_char1;// 计损平电量
    private BigDecimal flat_peak_amount1;// 平金额
    private BigDecimal peak_charge1;// 峰电量
    private BigDecimal loss_peak_charge1;// 计损峰电量
    private BigDecimal peak_amount1;// 峰金额
    private BigDecimal low_peak_charge1;// 谷电量
    private BigDecimal loss_low_peak_charge1;// 计损谷电量
    private BigDecimal low_peak_amount1;// 谷金额
    private String time2;// 计费时段
    private BigDecimal sharp_peak_charge2;// 电量
    private BigDecimal loss_sharp_peak_charge2;// 计损电量
    private BigDecimal sharp_peak_amount2;// 金额
    private BigDecimal flat_peak_charge2;// 电量
    private BigDecimal loss_flat_peak_char2;// 计损电量
    private BigDecimal flat_peak_amount2;// 金额
    private BigDecimal peak_charge2;// 电量
    private BigDecimal loss_peak_charge2;// 计损电量
    private BigDecimal peak_amount2;// 金额
    private BigDecimal low_peak_charge2;// 电量
    private BigDecimal loss_low_peak_charge2;// 计损电量
    private BigDecimal low_peak_amount2;// 金额
    private String time3;// 计费时段
    private BigDecimal sharp_peak_charge3;// 电量
    private BigDecimal loss_sharp_peak_charge3;// 计损电量
    private BigDecimal sharp_peak_amount3;// 金额
    private BigDecimal flat_peak_charge3;// 电量
    private BigDecimal loss_flat_peak_char3;// 计损电量
    private BigDecimal flat_peak_amount3;// 金额
    private BigDecimal peak_charge3;// 电量
    private BigDecimal loss_peak_charge3;// 计损电量
    private BigDecimal peak_amount3;// 金额
    private BigDecimal low_peak_charge3;// 电量
    private BigDecimal loss_low_peak_charge3;// 计损电量
    private BigDecimal low_peak_amount3;// 金额
    private String time4;// 计费时段
    private BigDecimal sharp_peak_charge4;// 电量
    private BigDecimal loss_sharp_peak_charge4;// 计损电量
    private BigDecimal sharp_peak_amount4;// 金额
    private BigDecimal flat_peak_charge4;// 电量
    private BigDecimal loss_flat_peak_char4;// 计损电量
    private BigDecimal flat_peak_amount4;// 金额
    private BigDecimal peak_charge4;// 电量
    private BigDecimal loss_peak_charge4;// 计损电量
    private BigDecimal peak_amount4;// 金额
    private BigDecimal low_peak_charge4;// 电量
    private BigDecimal loss_low_peak_charge4;// 计损电量
    private BigDecimal low_peak_amount4;// 金额
    private String time5;// 计费时段
    private BigDecimal sharp_peak_charge5;// 电量
    private BigDecimal loss_sharp_peak_charge5;// 计损电量
    private BigDecimal sharp_peak_amount5;// 金额
    private BigDecimal flat_peak_charge5;// 电量
    private BigDecimal loss_flat_peak_char5;// 计损电量
    private BigDecimal flat_peak_amount5;// 金额
    private BigDecimal peak_charge5;// 电量
    private BigDecimal loss_peak_charge5;// 计损电量
    private BigDecimal peak_amount5;// 金额
    private BigDecimal low_peak_charge5;// 电量
    private BigDecimal loss_low_peak_charge5;// 计损电量
    private BigDecimal low_peak_amount5;// 金额
    private String time6;// 计费时段
    private BigDecimal sharp_peak_charge6;// 电量
    private BigDecimal loss_sharp_peak_charge6;// 计损电量
    private BigDecimal sharp_peak_amount6;// 金额
    private BigDecimal flat_peak_charge6;// 电量
    private BigDecimal loss_flat_peak_char6;// 计损电量
    private BigDecimal flat_peak_amount6;// 金额
    private BigDecimal peak_charge6;// 电量
    private BigDecimal loss_peak_charge6;// 计损电量
    private BigDecimal peak_amount6;// 金额
    private BigDecimal low_peak_charge6;// 电量
    private BigDecimal loss_low_peak_charge6;// 计损电量
    private BigDecimal low_peak_amount6;// 金额
    private String time7;// 计费时段
    private BigDecimal sharp_peak_charge7;// 电量
    private BigDecimal loss_sharp_peak_charge7;// 计损电量
    private BigDecimal sharp_peak_amount7;// 金额
    private BigDecimal flat_peak_charge7;// 电量
    private BigDecimal loss_flat_peak_char7;// 计损电量
    private BigDecimal flat_peak_amount7;// 金额
    private BigDecimal peak_charge7;// 电量
    private BigDecimal loss_peak_charge7;// 计损电量
    private BigDecimal peak_amount7;// 金额
    private BigDecimal low_peak_charge7;// 电量
    private BigDecimal loss_low_peak_charge7;// 计损电量
    private BigDecimal low_peak_amount7;// 金额
    private String time8;// 计费时段
    private BigDecimal sharp_peak_charge8;// 电量
    private BigDecimal loss_sharp_peak_charge8;// 计损电量
    private BigDecimal sharp_peak_amount8;// 金额
    private BigDecimal flat_peak_charge8;// 电量
    private BigDecimal loss_flat_peak_char8;// 计损电量
    private BigDecimal flat_peak_amount8;// 金额
    private BigDecimal peak_charge8;// 电量
    private BigDecimal loss_peak_charge8;// 计损电量
    private BigDecimal peak_amount8;// 金额
    private BigDecimal low_peak_charge8;// 电量
    private BigDecimal loss_low_peak_charge8;// 计损电量
    private BigDecimal low_peak_amount8;// 金额
    private String time9;// 计费时段
    private BigDecimal sharp_peak_charge9;// 电量
    private BigDecimal loss_sharp_peak_charge9;// 计损电量
    private BigDecimal sharp_peak_amount9;// 金额
    private BigDecimal flat_peak_charge9;// 电量
    private BigDecimal loss_flat_peak_char9;// 计损电量
    private BigDecimal flat_peak_amount9;// 金额
    private BigDecimal peak_charge9;// 电量
    private BigDecimal loss_peak_charge9;// 计损电量
    private BigDecimal peak_amount9;// 金额
    private BigDecimal low_peak_charge9;// 电量
    private BigDecimal loss_low_peak_charge9;// 计损电量
    private BigDecimal low_peak_amount9;// 金额
    private String time10;// 计费时段
    private BigDecimal sharp_peak_charge10;// 电量
    private BigDecimal loss_sharp_peak_charge10;// 计损电量
    private BigDecimal sharp_peak_amount10;// 金额
    private BigDecimal flat_peak_charge10;// 电量
    private BigDecimal loss_flat_peak_char10;// 计损电量
    private BigDecimal flat_peak_amount10;// 金额
    private BigDecimal peak_charge10;// 电量
    private BigDecimal loss_peak_charge10;// 计损电量
    private BigDecimal peak_amount10;// 金额
    private BigDecimal low_peak_charge10;// 电量
    private BigDecimal loss_low_peak_charge10;// 计损电量
    private BigDecimal low_peak_amount10;// 金额
    private String time11;// 计费时段
    private BigDecimal sharp_peak_charge11;// 电量
    private BigDecimal loss_sharp_peak_charge11;// 计损电量
    private BigDecimal sharp_peak_amount11;// 金额
    private BigDecimal flat_peak_charge11;// 电量
    private BigDecimal loss_flat_peak_char11;// 计损电量
    private BigDecimal flat_peak_amount11;// 金额
    private BigDecimal peak_charge11;// 电量
    private BigDecimal loss_peak_charge11;// 计损电量
    private BigDecimal peak_amount11;// 金额
    private BigDecimal low_peak_charge11;// 电量
    private BigDecimal loss_low_peak_charge11;// 计损电量
    private BigDecimal low_peak_amount11;// 金额
    private String time12;// 计费时段
    private BigDecimal sharp_peak_charge12;// 电量
    private BigDecimal loss_sharp_peak_charge12;// 计损电量
    private BigDecimal sharp_peak_amount12;// 金额
    private BigDecimal flat_peak_charge12;// 电量
    private BigDecimal loss_flat_peak_char12;// 计损电量
    private BigDecimal flat_peak_amount12;// 金额
    private BigDecimal peak_charge12;// 电量
    private BigDecimal loss_peak_charge12;// 计损电量
    private BigDecimal peak_amount12;// 金额
    private BigDecimal low_peak_charge12;// 电量
    private BigDecimal loss_low_peak_charge12;// 计损电量
    private BigDecimal low_peak_amount12;// 金额
}
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/UpdateBalance.java
@@ -15,7 +15,6 @@
@Document(collection = "update_balance") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class UpdateBalance extends BaseModel {
    @Id
    private String charging_pile_code;// 桩编码
    private String charging_gun_code;// 抢号
    private String physical_card_number;// 物理卡号
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/UpdateBalanceReply.java
@@ -15,7 +15,6 @@
@Document(collection = "update_balance_reply") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class UpdateBalanceReply extends BaseModel {
    @Id
    private String charging_pile_code; //桩编码
    private String physical_card_number; //物理卡号
    private BigDecimal account_balance; //修改结果(:0:修改成功,1:设备编号错误,2:卡号错误)
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/UploadRealTimeMonitoringData.java
@@ -7,6 +7,8 @@
import org.springframework.data.mongodb.core.mapping.Document;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
/**
 * 上传实时监测数据
@@ -16,7 +18,6 @@
@Document(collection = "upload_real_time_monitoring_data") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class UploadRealTimeMonitoringData extends BaseModel {
    @Id
    private String transaction_serial_number; // 交易流水号
    private String charging_pile_code; // 桩编码
    private String charging_gun_code; // 抢号
@@ -46,6 +47,11 @@
    private BigDecimal period_charging_degree;// @ApiModelProperty("时段充电度数")
    private Integer orderType; //1=充电订单(小程序),2=充电订单(刷卡))
    private Integer siteId;
    private Integer status; //状态(0=未知,1=等待中/已插枪,2=启动中,3=充电中,4=停止中,5=已结束)"
    private LocalDateTime startTime; //充电开始时间
    private LocalDateTime endTime; //充电结束时间
}
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/WorkingParameterSetting.java
@@ -13,7 +13,6 @@
@Document(collection = "working_parameter_setting") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class WorkingParameterSetting extends BaseModel {
    @Id
    private String charging_pile_code; //桩编码
    private Integer allow_work;// 是否允许工作(0:表示允许正常工作,1:表示停止使用,锁定充电桩)
    private Integer maximum_output_power; // 充电桩最大允许输出功率
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/WorkingParameterSettingReply.java
@@ -13,7 +13,6 @@
@Document(collection = "working_parameter_setting_reply") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class WorkingParameterSettingReply extends BaseModel {
    @Id
    private String charging_pile_code; //桩编码
    private Integer set_result; //设置结果(0:失败,1:成功)
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java
@@ -153,6 +153,11 @@
            public void terminateSuccessfulResponse(PlatformStopChargingReplyVO platformStopChargingReply) {
                log.error("停止充电应答处理失败:" + throwable.getMessage());
            }
            @Override
            public void endChargeBillingCharge(TransactionRecordMessageVO vo) {
                log.error("停止充电返回账单后计算费用处理失败:" + throwable.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java
@@ -199,4 +199,11 @@
     */
    @PostMapping("/t-charging-order/terminateSuccessfulResponse")
    void terminateSuccessfulResponse(@RequestBody PlatformStopChargingReplyVO platformStopChargingReply);
    /**
     * 停止充电返回账单后计算费用
     * @param vo
     */
    @PostMapping("/t-charging-order/endChargeBillingCharge")
    void endChargeBillingCharge(@RequestBody TransactionRecordMessageVO vo);
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java
@@ -56,7 +56,7 @@
     * @return
     */
    @PostMapping(value = "/t-exchange-order/activityStatistics")
    public R<TActivityVO> activityStatistics(@RequestBody TActivityStatisticsQuery dto);
    R<TActivityVO> activityStatistics(@RequestBody TActivityStatisticsQuery dto);
    @PostMapping(value = "/chargingBill/accountBillList")
    @ApiOperation(value = "列表查询", tags = {"管理后台-账户结算账单"})
    R<AccountListVO> accountBillList(@RequestBody ChargingListQuery dto);
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/AccountingStrategyDetailOrder.java
@@ -22,8 +22,8 @@
    @TableId(type = IdType.INPUT, value = "id")
    private Integer id;
    @ApiModelProperty(value = "策略id")
    @TableField("accounting_strategy_order_id")
    private Integer accountingStrategyOrderId;
    @TableField("accounting_strategy_id")
    private Integer accountingStrategyId;
    
    @ApiModelProperty(value = "阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段)")
    @TableField("type")
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrder.java
@@ -158,6 +158,10 @@
    @ApiModelProperty(value = "退款流水号")
    @TableField("refund_code")
    private String refundCode;
    @ApiModelProperty(value = "标题")
    @TableField("title")
    private String title;
    @ApiModelProperty(value = "退款原因")
    @TableField(exist = false)
    private String refundReason;
@@ -173,6 +177,18 @@
    @ApiModelProperty(value = "累计电费")
    @TableField("electrovalence")
    private BigDecimal electrovalence;
    @ApiModelProperty(value = "电流")
    @TableField("current")
    private BigDecimal current;
    @ApiModelProperty(value = "电压")
    @TableField("voltage")
    private BigDecimal voltage;
    @ApiModelProperty(value = "电量")
    @TableField("electricity")
    private BigDecimal electricity;
    @ApiModelProperty(value = "功率")
    @TableField("power")
    private BigDecimal power;
    @ApiModelProperty(value = "退款状态(1=退款中,2=退款成功)")
    @TableField("refund_status")
@@ -188,7 +204,7 @@
    private LocalDateTime refundTime;
    @ApiModelProperty(value = "总电量")
    @TableField("total_electricity")
    private BigDecimal totalElectricity;// 总电量
    private BigDecimal totalElectricity;
    @ApiModelProperty(value = "支付时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TActivityStatisticslVO.java
@@ -1,5 +1,6 @@
package com.ruoyi.order.api.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.ser.Serializers;
import com.ruoyi.common.core.web.domain.BasePojo;
import com.ruoyi.order.api.model.*;
@@ -8,6 +9,7 @@
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
@ApiModel(value = "管理后台活动费用统计分页列表", description = "管理后台活动费用统计分页列表")
@@ -33,16 +35,17 @@
    @ApiModelProperty(value = "实付")
    private BigDecimal paymentAmount;
    @ApiModelProperty(value = "消费时间")
    private String time;
    @ApiModelProperty(value = "消费时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime time;
    @ApiModelProperty(value = "总计优惠")
    private BigDecimal total;
    @ApiModelProperty(value = "消费时间")
    @ApiModelProperty(value = "优惠券优惠")
    private BigDecimal coupon;
    @ApiModelProperty(value = "消费时间")
    @ApiModelProperty(value = "会员抵扣")
    private BigDecimal discount;
    @ApiModelProperty(value = "消费时间")
    @ApiModelProperty(value = "会员活动")
    private BigDecimal vipActivity;
    @ApiModelProperty(value = "消费时间")
    @ApiModelProperty(value = "赠送会员")
    private BigDecimal grantVip;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TActivityVO.java
@@ -7,7 +7,6 @@
import lombok.Data;
import java.math.BigDecimal;
@Data
@ApiModel(value = "TOrderAppealVO对象", description = "订单申诉VO对象")
public class TActivityVO  {
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TransactionRecordMessageVO.java
New file
@@ -0,0 +1,188 @@
package com.ruoyi.order.api.vo;
import lombok.Data;
import java.math.BigDecimal;
/**
 * 交易记录
 **/
@Data
public class TransactionRecordMessageVO {
    private String transaction_serial_number;// 交易流水号
    private String charging_pile_code;// 桩编码
    private String charging_gun_code;// 抢号
    private String start_time;// 开始时间
    private String end_time;// 结束时间
    private BigDecimal total_initial_value;// 电表总起值
    private BigDecimal total_stop_value;// 电表总止值
    private BigDecimal total_electricity;// 总电量
    private BigDecimal loss_total_electricity;// 计损总电量
    private BigDecimal payment_amount;// 消费金额
    private String vin;// 电动汽车唯一标识
    private Integer start_method;// 交易标识(1:app 启动,2:卡启动,4:离线卡启动,5: vin 码启动充电)
    private String trade_date;// 交易日期、时间
    private Integer stop_reason;// 停止原因
    private String physical_card_number;// 物理卡号
    private String time1;// 计费时段
    private BigDecimal sharp_peak_charge1;// 尖电量
    private BigDecimal loss_sharp_peak_charge1;// 计损尖电量
    private BigDecimal sharp_peak_amount1;// 尖金额
    private BigDecimal flat_peak_charge1;// 平电量
    private BigDecimal loss_flat_peak_char1;// 计损平电量
    private BigDecimal flat_peak_amount1;// 平金额
    private BigDecimal peak_charge1;// 峰电量
    private BigDecimal loss_peak_charge1;// 计损峰电量
    private BigDecimal peak_amount1;// 峰金额
    private BigDecimal low_peak_charge1;// 谷电量
    private BigDecimal loss_low_peak_charge1;// 计损谷电量
    private BigDecimal low_peak_amount1;// 谷金额
    private String time2;// 计费时段
    private BigDecimal sharp_peak_charge2;// 电量
    private BigDecimal loss_sharp_peak_charge2;// 计损电量
    private BigDecimal sharp_peak_amount2;// 金额
    private BigDecimal flat_peak_charge2;// 电量
    private BigDecimal loss_flat_peak_char2;// 计损电量
    private BigDecimal flat_peak_amount2;// 金额
    private BigDecimal peak_charge2;// 电量
    private BigDecimal loss_peak_charge2;// 计损电量
    private BigDecimal peak_amount2;// 金额
    private BigDecimal low_peak_charge2;// 电量
    private BigDecimal loss_low_peak_charge2;// 计损电量
    private BigDecimal low_peak_amount2;// 金额
    private String time3;// 计费时段
    private BigDecimal sharp_peak_charge3;// 电量
    private BigDecimal loss_sharp_peak_charge3;// 计损电量
    private BigDecimal sharp_peak_amount3;// 金额
    private BigDecimal flat_peak_charge3;// 电量
    private BigDecimal loss_flat_peak_char3;// 计损电量
    private BigDecimal flat_peak_amount3;// 金额
    private BigDecimal peak_charge3;// 电量
    private BigDecimal loss_peak_charge3;// 计损电量
    private BigDecimal peak_amount3;// 金额
    private BigDecimal low_peak_charge3;// 电量
    private BigDecimal loss_low_peak_charge3;// 计损电量
    private BigDecimal low_peak_amount3;// 金额
    private String time4;// 计费时段
    private BigDecimal sharp_peak_charge4;// 电量
    private BigDecimal loss_sharp_peak_charge4;// 计损电量
    private BigDecimal sharp_peak_amount4;// 金额
    private BigDecimal flat_peak_charge4;// 电量
    private BigDecimal loss_flat_peak_char4;// 计损电量
    private BigDecimal flat_peak_amount4;// 金额
    private BigDecimal peak_charge4;// 电量
    private BigDecimal loss_peak_charge4;// 计损电量
    private BigDecimal peak_amount4;// 金额
    private BigDecimal low_peak_charge4;// 电量
    private BigDecimal loss_low_peak_charge4;// 计损电量
    private BigDecimal low_peak_amount4;// 金额
    private String time5;// 计费时段
    private BigDecimal sharp_peak_charge5;// 电量
    private BigDecimal loss_sharp_peak_charge5;// 计损电量
    private BigDecimal sharp_peak_amount5;// 金额
    private BigDecimal flat_peak_charge5;// 电量
    private BigDecimal loss_flat_peak_char5;// 计损电量
    private BigDecimal flat_peak_amount5;// 金额
    private BigDecimal peak_charge5;// 电量
    private BigDecimal loss_peak_charge5;// 计损电量
    private BigDecimal peak_amount5;// 金额
    private BigDecimal low_peak_charge5;// 电量
    private BigDecimal loss_low_peak_charge5;// 计损电量
    private BigDecimal low_peak_amount5;// 金额
    private String time6;// 计费时段
    private BigDecimal sharp_peak_charge6;// 电量
    private BigDecimal loss_sharp_peak_charge6;// 计损电量
    private BigDecimal sharp_peak_amount6;// 金额
    private BigDecimal flat_peak_charge6;// 电量
    private BigDecimal loss_flat_peak_char6;// 计损电量
    private BigDecimal flat_peak_amount6;// 金额
    private BigDecimal peak_charge6;// 电量
    private BigDecimal loss_peak_charge6;// 计损电量
    private BigDecimal peak_amount6;// 金额
    private BigDecimal low_peak_charge6;// 电量
    private BigDecimal loss_low_peak_charge6;// 计损电量
    private BigDecimal low_peak_amount6;// 金额
    private String time7;// 计费时段
    private BigDecimal sharp_peak_charge7;// 电量
    private BigDecimal loss_sharp_peak_charge7;// 计损电量
    private BigDecimal sharp_peak_amount7;// 金额
    private BigDecimal flat_peak_charge7;// 电量
    private BigDecimal loss_flat_peak_char7;// 计损电量
    private BigDecimal flat_peak_amount7;// 金额
    private BigDecimal peak_charge7;// 电量
    private BigDecimal loss_peak_charge7;// 计损电量
    private BigDecimal peak_amount7;// 金额
    private BigDecimal low_peak_charge7;// 电量
    private BigDecimal loss_low_peak_charge7;// 计损电量
    private BigDecimal low_peak_amount7;// 金额
    private String time8;// 计费时段
    private BigDecimal sharp_peak_charge8;// 电量
    private BigDecimal loss_sharp_peak_charge8;// 计损电量
    private BigDecimal sharp_peak_amount8;// 金额
    private BigDecimal flat_peak_charge8;// 电量
    private BigDecimal loss_flat_peak_char8;// 计损电量
    private BigDecimal flat_peak_amount8;// 金额
    private BigDecimal peak_charge8;// 电量
    private BigDecimal loss_peak_charge8;// 计损电量
    private BigDecimal peak_amount8;// 金额
    private BigDecimal low_peak_charge8;// 电量
    private BigDecimal loss_low_peak_charge8;// 计损电量
    private BigDecimal low_peak_amount8;// 金额
    private String time9;// 计费时段
    private BigDecimal sharp_peak_charge9;// 电量
    private BigDecimal loss_sharp_peak_charge9;// 计损电量
    private BigDecimal sharp_peak_amount9;// 金额
    private BigDecimal flat_peak_charge9;// 电量
    private BigDecimal loss_flat_peak_char9;// 计损电量
    private BigDecimal flat_peak_amount9;// 金额
    private BigDecimal peak_charge9;// 电量
    private BigDecimal loss_peak_charge9;// 计损电量
    private BigDecimal peak_amount9;// 金额
    private BigDecimal low_peak_charge9;// 电量
    private BigDecimal loss_low_peak_charge9;// 计损电量
    private BigDecimal low_peak_amount9;// 金额
    private String time10;// 计费时段
    private BigDecimal sharp_peak_charge10;// 电量
    private BigDecimal loss_sharp_peak_charge10;// 计损电量
    private BigDecimal sharp_peak_amount10;// 金额
    private BigDecimal flat_peak_charge10;// 电量
    private BigDecimal loss_flat_peak_char10;// 计损电量
    private BigDecimal flat_peak_amount10;// 金额
    private BigDecimal peak_charge10;// 电量
    private BigDecimal loss_peak_charge10;// 计损电量
    private BigDecimal peak_amount10;// 金额
    private BigDecimal low_peak_charge10;// 电量
    private BigDecimal loss_low_peak_charge10;// 计损电量
    private BigDecimal low_peak_amount10;// 金额
    private String time11;// 计费时段
    private BigDecimal sharp_peak_charge11;// 电量
    private BigDecimal loss_sharp_peak_charge11;// 计损电量
    private BigDecimal sharp_peak_amount11;// 金额
    private BigDecimal flat_peak_charge11;// 电量
    private BigDecimal loss_flat_peak_char11;// 计损电量
    private BigDecimal flat_peak_amount11;// 金额
    private BigDecimal peak_charge11;// 电量
    private BigDecimal loss_peak_charge11;// 计损电量
    private BigDecimal peak_amount11;// 金额
    private BigDecimal low_peak_charge11;// 电量
    private BigDecimal loss_low_peak_charge11;// 计损电量
    private BigDecimal low_peak_amount11;// 金额
    private String time12;// 计费时段
    private BigDecimal sharp_peak_charge12;// 电量
    private BigDecimal loss_sharp_peak_charge12;// 计损电量
    private BigDecimal sharp_peak_amount12;// 金额
    private BigDecimal flat_peak_charge12;// 电量
    private BigDecimal loss_flat_peak_char12;// 计损电量
    private BigDecimal flat_peak_amount12;// 金额
    private BigDecimal peak_charge12;// 电量
    private BigDecimal loss_peak_charge12;// 计损电量
    private BigDecimal peak_amount12;// 金额
    private BigDecimal low_peak_charge12;// 电量
    private BigDecimal loss_low_peak_charge12;// 计损电量
    private BigDecimal low_peak_amount12;// 金额
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/TEvaluationTagClient.java
@@ -31,7 +31,7 @@
     * 获取标签列表
     * @return
     */
    @PostMapping("/t-evaluation-tag/getList")
    @GetMapping("/t-evaluation-tag/getList")
    R<List<TEvaluationTagVO>> getList();
    
ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml
@@ -12,7 +12,6 @@
  profiles:
    # 环境配置
    active: dev
#    active: prod
---
spring:
  config:
@@ -55,7 +54,7 @@
    type: nacos
    nacos:
      # 开发环境
      server-addr: 192.168.110.169:8848
      server-addr: 127.0.0.1:8848
      namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb
      group: DEFAULT_GROUP
      data-id: seata-server.properties
@@ -73,7 +72,7 @@
    nacos:
      application: seata-server
      # 开发环境
      server-addr: 192.168.110.169:8848
      server-addr: 127.0.0.1:8848
      namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb
      group: DEFAULT_GROUP
      username: nacos
@@ -88,7 +87,7 @@
    nacos:
      discovery:
        # 开发环境
        server-addr: 192.168.110.169:8848 # nacos注册中心地址
        server-addr: 127.0.0.1:8848 # nacos注册中心地址
        namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb # 命名空间
        group: DEFAULT_GROUP
        application: seata-server #Nacos 中 Seata 名称
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
@@ -639,6 +639,7 @@
                InfoCouponDto infoCouponDto = new InfoCouponDto();
                BeanUtils.copyProperties(coupon, infoCouponDto);
                infoCouponDto.setId(tAppCoupon.getId().toString());
                infoCouponDto.setCouponId(coupon.getId());
                infoCouponDto.setEndTime(tAppCoupon.getEndTime());
                couponDtos1.add(infoCouponDto);
@@ -849,7 +850,7 @@
        boolean doubleVip = false;
        if (one!=null){
            TVip tVip = JSONObject.parseObject(one.getVipJson(), TVip.class);
            if (tVip.getDoubleIntegration()==1){
            if (tVip.getDoubleIntegration()!=null&&tVip.getDoubleIntegration()==1){
                doubleVip = true;
            }
        }
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserIntegralChangeController.java
@@ -1,6 +1,7 @@
package com.ruoyi.account.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.account.api.model.TAppUserIntegralChange;
import com.ruoyi.account.service.TAppUserIntegralChangeService;
import com.ruoyi.common.core.domain.R;
@@ -40,5 +41,18 @@
        appUserIntegralChangeService.save(appUserIntegralChange);
        return R.ok();
    }
    /**
     * 根据订单code获取积分记录
     * @param code
     * @return
     */
    @ResponseBody
    @PostMapping("/getTAppUserIntegralChangeByOrderCode")
    public R<TAppUserIntegralChange> getTAppUserIntegralChangeByOrderCode(@RequestParam("code") String code){
        TAppUserIntegralChange one = appUserIntegralChangeService.getOne(new LambdaQueryWrapper<TAppUserIntegralChange>().eq(TAppUserIntegralChange::getOrderCode, code));
        return R.ok(one);
    }
}
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WxLoginController.java
@@ -15,6 +15,7 @@
import com.ruoyi.account.wx.pojo.AppletUserEncrypteData;
import com.ruoyi.account.wx.tools.WxAppletTools;
import com.ruoyi.account.wx.tools.WxUtils;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.FileUploadUtils;
import com.ruoyi.common.core.utils.StringUtils;
@@ -37,6 +38,7 @@
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -63,6 +65,9 @@
    private WeixinProperties wxConfig;
    @Autowired
    private RestTemplate wxRestTemplate;
    @Resource
    private RedisService redisService;
    /**
     * 上传文件存储在本地的根路径
     */
@@ -76,7 +81,7 @@
    @PostMapping("/openIdByJsCode")
    public AjaxResult<Map<String, Object>> openIdByJsCode(@RequestBody AppletUserEncrypteData data) {
        log.info("<<<<<<<<换取openid开始<<<<<<<<:{}", data.getCode());
        WxAppletTools appletTools = new WxAppletTools(wxRestTemplate, wxConfig);
        WxAppletTools appletTools = new WxAppletTools(wxRestTemplate, wxConfig, redisService);
        Code2SessionRespBody body = appletTools.getOpenIdByJscode2session(new Code2SessionResqBody().build(data.getCode()));
        String openid = body.getOpenid();
        String sessionKey = body.getSessionKey();
@@ -113,7 +118,7 @@
    public AjaxResult getQRCode() {
        InputStream inputStream = null;
        OutputStream outputStream = null;
        WxAppletTools appletTools = new WxAppletTools(wxRestTemplate, wxConfig);
        WxAppletTools appletTools = new WxAppletTools(wxRestTemplate, wxConfig, redisService);
        String accessToken = appletTools.getAccessToken("");
        try {
            String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken;
@@ -162,5 +167,16 @@
        }
        return AjaxResult.success();
    }
    /**
     * 获取微信token
     * @return
     */
    @PostMapping("/getWXToken")
    public R<String> getWXToken(){
        WxAppletTools appletTools = new WxAppletTools(wxRestTemplate, wxConfig, redisService);
        String accessToken = appletTools.getAccessToken("");
        return R.ok(accessToken);
    }
}
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxAppletTools.java
@@ -4,12 +4,14 @@
import com.ruoyi.account.wx.body.resp.Code2SessionRespBody;
import com.ruoyi.account.wx.body.resq.Code2SessionResqBody;
import com.ruoyi.account.wx.model.WeixinProperties;
import com.ruoyi.common.redis.service.RedisService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.client.RestTemplate;
import java.text.MessageFormat;
import java.util.concurrent.TimeUnit;
/**
 * @author xiaochen
@@ -57,11 +59,12 @@
    public static String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}";
    private WeixinProperties wxConfig;
    private RestTemplate wxRestTemplate;
    private WxCacheTemplate<String> wxCacheTemplate;
    private RedisService redisService;
    public WxAppletTools(RestTemplate wxRestTemplate, WeixinProperties wxConfig) {
    public WxAppletTools(RestTemplate wxRestTemplate, WeixinProperties wxConfig, RedisService redisService) {
        this.wxRestTemplate = wxRestTemplate;
        this.wxConfig = wxConfig;
        this.redisService = redisService;
    }
    /**
@@ -101,7 +104,7 @@
     * @return
     */
    public String getAccessToken(String version) {
        String accessToken = wxCacheTemplate.getKey(ACCESSTOKEN_CACHE_KEY + version);
        String accessToken = redisService.getCacheObject(ACCESSTOKEN_CACHE_KEY + version);
        if (StringUtils.hasLength(accessToken)) {
            return accessToken;
        }
@@ -113,7 +116,7 @@
            // 抛出错误
            throw new WxException(accessTokenRespBody.getErrorCode() + ":" + accessTokenRespBody.getErrorMsg());
        }
        wxCacheTemplate.setKey(ACCESSTOKEN_CACHE_KEY + version, accessTokenRespBody.getAccessToken());
        redisService.setCacheObject(ACCESSTOKEN_CACHE_KEY + version, accessTokenRespBody.getAccessToken(), 7200L, TimeUnit.SECONDS);
        return accessTokenRespBody.getAccessToken();
    }
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java
@@ -16,7 +16,6 @@
import com.ruoyi.common.core.dto.ChargingPercentProvinceDto;
import com.ruoyi.chargingPile.service.*;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.GeodesyUtil;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.PageInfo;
@@ -122,7 +121,11 @@
            // 当前时间属于那个阶段 取哪个阶段的电价
            if(LocalTime.now().isAfter(LocalTime.parse(tAccountingStrategyDetail.getStartTime())) && LocalTime.now().isBefore(LocalTime.parse(tAccountingStrategyDetail.getEndTime()))){
                siteInfoVO.setElectrovalence(tAccountingStrategyDetail.getElectrovalence());
                siteInfoVO.setVipElectrovalence(tAccountingStrategyDetail.getElectrovalence().multiply(byId1.getDiscount()).setScale(4, BigDecimal.ROUND_HALF_UP));
                if(null != byId1.getDiscount()){
                    siteInfoVO.setVipElectrovalence(tAccountingStrategyDetail.getElectrovalence().multiply(byId1.getDiscount()).setScale(4, BigDecimal.ROUND_HALF_UP));
                }else{
                    siteInfoVO.setVipElectrovalence(tAccountingStrategyDetail.getElectrovalence());
                }
            }
        }
        siteInfoVO.setChargingGunId(chargingGun.getId());
@@ -148,7 +151,11 @@
            // 当前时间属于那个阶段 取哪个阶段的电价
            if(LocalTime.now().isAfter(LocalTime.parse(tAccountingStrategyDetail.getStartTime())) && LocalTime.now().isBefore(LocalTime.parse(tAccountingStrategyDetail.getEndTime()))){
                siteInfoVO.setElectrovalence(tAccountingStrategyDetail.getElectrovalence());
                siteInfoVO.setVipElectrovalence(tAccountingStrategyDetail.getElectrovalence().multiply(byId1.getDiscount()).setScale(4, BigDecimal.ROUND_HALF_UP));
                if(null != byId1.getDiscount()){
                    siteInfoVO.setVipElectrovalence(tAccountingStrategyDetail.getElectrovalence().multiply(byId1.getDiscount()).setScale(4, BigDecimal.ROUND_HALF_UP));
                }else{
                    siteInfoVO.setVipElectrovalence(tAccountingStrategyDetail.getElectrovalence());
                }
            }
        }
        siteInfoVO.setChargingPileId(one.getId());
@@ -178,9 +185,43 @@
    @GetMapping("/map/getSiteList")
    @ApiOperation(value = "获取站点", tags = {"管理后台-数据分析-电站分析"})
    public R<List<GetSiteListDTO>> getMapSiteList(GetSiteList siteList){
        siteList.setPageCurr(1);
        siteList.setPageCurr(99999);
        siteList.setPageSize(99999);
        PageInfo<GetSiteListDTO> list = siteService.getSiteList(siteList);
        for (GetSiteListDTO record : list.getRecords()) {
            Long count = chargingGunService.lambdaQuery().eq(TChargingGun::getChargingPileId, record.getId()).eq(TChargingGun::getChargeMode, 1).eq(TChargingGun::getStatus, new int[]{3, 4, 5, 6}).count();
            record.setC1(count);
            Long count1 = chargingGunService.lambdaQuery().eq(TChargingGun::getChargingPileId, record.getId()).eq(TChargingGun::getChargeMode, 1).eq(TChargingGun::getStatus, 2).count();
            record.setC2(count1);
            Long count2 = chargingGunService.lambdaQuery().eq(TChargingGun::getChargingPileId, record.getId()).eq(TChargingGun::getChargeMode, 2).eq(TChargingGun::getStatus, new int[]{3, 4, 5, 6}).count();
            record.setK1(count2);
            Long count3 = chargingGunService.lambdaQuery().eq(TChargingGun::getChargingPileId, record.getId()).eq(TChargingGun::getChargeMode, 2).eq(TChargingGun::getStatus, 2).count();
            record.setK2(count3);
            Long count4 = chargingGunService.lambdaQuery().eq(TChargingGun::getChargingPileId, record.getId()).eq(TChargingGun::getChargeMode, 3).eq(TChargingGun::getStatus, new int[]{3, 4, 5, 6}).count();
            record.setM1(count4);
            Long count5 = chargingGunService.lambdaQuery().eq(TChargingGun::getChargingPileId, record.getId()).eq(TChargingGun::getChargeMode, 3).eq(TChargingGun::getStatus, 2).count();
            record.setM2(count5);
            //利用率
            BigDecimal bigDecimal = new BigDecimal("0");
            //获取该站点的总充电度数
            List<TChargingOrder> chargingOrders = chargingOrderClient.getList(record.getId()).getData();
            for (TChargingOrder chargingOrder : chargingOrders) {
                bigDecimal = bigDecimal.add(chargingOrder.getChargingCapacity());
            }
            //获取该站点的所有充电桩
            List<TChargingPile> chargingPiles = chargingPileService.lambdaQuery().eq(TChargingPile::getSiteId, record.getId()).list();
            BigDecimal bigDecimal1 = new BigDecimal("0");
            for (TChargingPile chargingPile : chargingPiles) {
                bigDecimal1 = bigDecimal1.add(chargingPile.getRatedPower());
            }
            BigDecimal multiply = bigDecimal1.multiply(new BigDecimal("24"));
            BigDecimal divide = bigDecimal.divide(multiply, 0, BigDecimal.ROUND_HALF_UP);
            record.setP1(divide);
        }
        return R.ok(list.getRecords());
    }
@@ -236,7 +277,7 @@
        List<GetSiteListDTO> records = siteService.getSiteList(siteList).getRecords();
        List<Integer> collect = records.stream().map(GetSiteListDTO::getId).collect(Collectors.toList());
        // 通过时间段获取和充电桩id获取各个充电站的充电订单
        List<ChargingOrderGroup> data = chargingOrderClient.getBySiteIdAndTime(chargingPercentProvinceDto).getData();
            List<ChargingOrderGroup> data = chargingOrderClient.getBySiteIdAndTime(chargingPercentProvinceDto).getData();
        // 计算利用率展示
        for (ChargingOrderGroup datum : data) {
            List<TChargingPile> chargingPiles = chargingPileService.lambdaQuery().eq(TChargingPile::getSiteId, datum.getSiteId()).list();
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java
@@ -114,6 +114,13 @@
        Long userId = SecurityUtils.getLoginUser().getUserid();
        dto.setUserId(userId);
        accountingStrategyService.save(dto);
        if(null != dto.getSiteId()){
            //下发硬件数据
            List<TChargingPile> list = chargingPileService.lambdaQuery().eq(TChargingPile::getSiteId, dto.getSiteId()).list();
            for (TChargingPile tChargingPile : list) {
                integrationClient.setupBillingModel1(tChargingPile.getCode());
            }
        }
        // 添加明细
        dto.getAccountingStrategyDetails().forEach(detail -> detail.setAccountingStrategyId(dto.getId()));
        accountingStrategyDetailService.saveBatch(dto.getAccountingStrategyDetails());
@@ -165,6 +172,11 @@
                    detail.setId(null);
                });
                accountingStrategyDetailService.saveBatch(accountingStrategyDetails);
            }
            //下发硬件数据
            List<TChargingPile> list = chargingPileService.lambdaQuery().eq(TChargingPile::getSiteId, dto.getSiteId()).list();
            for (TChargingPile tChargingPile : list) {
                integrationClient.setupBillingModel1(tChargingPile.getCode());
            }
        }else {
            // 删除计费策略明细信息
@@ -342,14 +354,11 @@
                    byId1.setAccountingStrategyId(byId.getId());
                    siteService.updateById(byId1);
                }
                //硬件
                 List<TChargingPile> list = chargingPileService.lambdaQuery().eq(TChargingPile::getSiteId, byId.getSiteId()).list();
                List<TChargingPile> list = chargingPileService.lambdaQuery().eq(TChargingPile::getSiteId, byId.getSiteId()).list();
                for (TChargingPile tChargingPile : list) {
                    integrationClient.setupBillingModel1(tChargingPile.getCode());
                }
            }
        }else {
            if (byId.getAuditStatus()==1){
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java
@@ -176,16 +176,24 @@
            out.close();
            inputStream.close();
            
            //清楚服务器上的文件
//            Process process = null;
//            try {
//                process = Runtime.getRuntime().exec("sudo rm -rf " + filePath);
//            } catch (IOException e) {
//                throw new RuntimeException(e);
//            }
//            if (process != null) {
//                process.destroy();
//            }
            //清除服务器上的文件
            try {
                // 使用Runtime执行命令
                Process process = Runtime.getRuntime().exec("sudo rm -rf " + filePath);
                // 读取命令的输出
                BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                String line;
                while ((line = reader.readLine()) != null) {
                    System.out.println(line);
                }
                // 等待命令执行完成
                process.waitFor();
                // 关闭流
                reader.close();
            } catch (IOException | InterruptedException e) {
                e.printStackTrace();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
@@ -258,7 +266,8 @@
     */
    @PostMapping("/getChargingGunByCode")
    public R<TChargingGun> getChargingGunByCode(@RequestBody GetChargingGunByCode code){
        TChargingPile chargingPile = chargingPileService.getOne(new LambdaQueryWrapper<TChargingPile>().eq(TChargingPile::getCode, code.getCharging_pile_code()).eq(TChargingPile::getDelFlag, 0));
        TChargingPile chargingPile = chargingPileService.getOne(new LambdaQueryWrapper<TChargingPile>()
                .eq(TChargingPile::getCode, code.getCharging_pile_code()).eq(TChargingPile::getDelFlag, 0));
        return R.ok(chargingGunService.getOne(Wrappers.lambdaQuery(TChargingGun.class)
                        .eq(TChargingGun::getChargingPileId, chargingPile.getId())
                        .eq(TChargingGun::getCode, code.getCharging_gun_code())
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TFaultMessageController.java
@@ -113,7 +113,7 @@
     * @param gunId
     * @return
     */
    @PostMapping("/t-fault-message/getFaultMessageByGunId/{gunId}")
    @PostMapping("/getFaultMessageByGunId/{gunId}")
    public R<TFaultMessage> getFaultMessageByGunId(@PathVariable("gunId") Integer gunId){
        return R.ok(faultMessageService.getOne(Wrappers.lambdaQuery(TFaultMessage.class)
                .eq(TFaultMessage::getChargingGunId,gunId)
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingRecordController.java
@@ -318,6 +318,34 @@
        return R.ok(tParkLotRecordCountVo);
    }
    @ResponseBody
    @PostMapping(value = "/parking/work1")
    @ApiOperation(value = "停车订单统计", tags = {"管理后台-工作台"})
    public R<TParkLotRecordCountVo> work1(@RequestBody ParkingRecordQueryDto parkingRecordQueryDto){
        List<TParkingRecord> list = parkingRecordService.lambdaQuery().eq(parkingRecordQueryDto.getParkingLotId() != null, TParkingRecord::getParkingLotId, parkingRecordQueryDto.getParkingLotId())
                .between(TParkingRecord::getCreateTime, parkingRecordQueryDto.getStartTime(), parkingRecordQueryDto.getEndTime()).list();
        int count1 = list.size();
        //统计出list中chargingOrderId为null的数据个数
        int count2 = list.stream().filter(item -> item.getChargingOrderId() == null).collect(Collectors.toList()).size();
        int count3 = count1-count2;
        //计算出list中parkingDuration的总和
        int count4 = 0;
        for (TParkingRecord tParkingRecord : list) {
            count4 = count4+tParkingRecord.getParkingDuration();
        }
        //计算出list中orderAmount的总和
        BigDecimal count5 = list.stream().map(TParkingRecord::getOrderAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
        TParkLotRecordCountVo tParkLotRecordCountVo = new TParkLotRecordCountVo();
        tParkLotRecordCountVo.setCount1(count1);
        tParkLotRecordCountVo.setCount2(count2);
        tParkLotRecordCountVo.setCount3(count3);
        tParkLotRecordCountVo.setCount4(count4);
        tParkLotRecordCountVo.setCount5(count5);
        return R.ok(tParkLotRecordCountVo);
    }
    @ResponseBody
    @PostMapping(value = "/parking/income")
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyDetailServiceImpl.java
@@ -88,8 +88,13 @@
                    accountingStrategyDetailVO.setTotalPrice(accountingStrategyDetailVO.getElectrovalence().add(accountingStrategyDetailVO.getServiceCharge().multiply(vip.getDiscount())));
                    accountingStrategyDetailNext.setTotalPrice(accountingStrategyDetailNext.getElectrovalence().add(accountingStrategyDetailNext.getServiceCharge().multiply(vip.getDiscount())));
                } else {
                    accountingStrategyDetailVO.setTotalPrice(accountingStrategyDetailVO.getElectrovalence().add(accountingStrategyDetailVO.getServiceCharge().multiply(accountingStrategy.getDiscount())));
                    accountingStrategyDetailNext.setTotalPrice(accountingStrategyDetailNext.getElectrovalence().add(accountingStrategyDetailNext.getServiceCharge().multiply(accountingStrategy.getDiscount())));
                    if(Objects.isNull(accountingStrategy.getDiscount())){
                        accountingStrategyDetailVO.setTotalPrice(accountingStrategyDetailVO.getElectrovalence().add(accountingStrategyDetailVO.getServiceCharge().multiply(new BigDecimal(1))));
                        accountingStrategyDetailNext.setTotalPrice(accountingStrategyDetailNext.getElectrovalence().add(accountingStrategyDetailNext.getServiceCharge().multiply(new BigDecimal(1))));
                    }else {
                        accountingStrategyDetailVO.setTotalPrice(accountingStrategyDetailVO.getElectrovalence().add(accountingStrategyDetailVO.getServiceCharge().multiply(accountingStrategy.getDiscount())));
                        accountingStrategyDetailNext.setTotalPrice(accountingStrategyDetailNext.getElectrovalence().add(accountingStrategyDetailNext.getServiceCharge().multiply(accountingStrategy.getDiscount())));
                    }
                }
            }else {
                accountingStrategyDetailVO.setTotalPrice(accountingStrategyDetailVO.getElectrovalence().add(accountingStrategyDetailVO.getServiceCharge()));
@@ -121,8 +126,12 @@
                .findFirst().orElseThrow(() -> new ServiceException("当前时间段未查询到计费策略明细"));
//        strategyPriceVO.setDiscountAmount(accountingStrategyDetailVO.getElectrovalence().add(accountingStrategyDetailVO.getServiceCharge())
//                .subtract(accountingStrategyDetailVO.getServiceCharge().multiply(accountingStrategy.getDiscount())).setScale(2, BigDecimal.ROUND_HALF_UP));
        strategyPriceVO.setDiscountAmount(accountingStrategyDetailVO.getServiceCharge()
                .subtract(accountingStrategyDetailVO.getServiceCharge().multiply(accountingStrategy.getDiscount())).setScale(2, BigDecimal.ROUND_HALF_UP));
        if(Objects.isNull(accountingStrategy.getDiscount())){
            strategyPriceVO.setDiscountAmount(BigDecimal.ZERO);
        }else {
            strategyPriceVO.setDiscountAmount(accountingStrategyDetailVO.getServiceCharge()
                    .subtract(accountingStrategyDetailVO.getServiceCharge().multiply(accountingStrategy.getDiscount())).setScale(2, BigDecimal.ROUND_HALF_UP));
        }
        // 查询最高折扣的会员
        TVip monthlyCardDiscount = vipClient.getVipInfoByType(3).getData();
        strategyPriceVO.setServiceFeeDiscount(monthlyCardDiscount.getMonthlyCardDiscount());
@@ -209,8 +218,12 @@
                    accountingStrategyDetailVO.setTotalPrice(accountingStrategyDetailVO.getElectrovalence().add(accountingStrategyDetailVO.getServiceCharge().multiply(vip.getDiscount())));
                    accountingStrategyDetailNext.setTotalPrice(accountingStrategyDetailNext.getElectrovalence().add(accountingStrategyDetailNext.getServiceCharge().multiply(vip.getDiscount())));
                } else {
                    accountingStrategyDetailVO.setTotalPrice(accountingStrategyDetailVO.getElectrovalence().add(accountingStrategyDetailVO.getServiceCharge().multiply(accountingStrategy.getDiscount())));
                    accountingStrategyDetailNext.setTotalPrice(accountingStrategyDetailNext.getElectrovalence().add(accountingStrategyDetailNext.getServiceCharge().multiply(accountingStrategy.getDiscount())));
                    BigDecimal discount = accountingStrategy.getDiscount();
                    if(Objects.isNull(discount)){
                        discount = BigDecimal.ONE;
                    }
                    accountingStrategyDetailVO.setTotalPrice(accountingStrategyDetailVO.getElectrovalence().add(accountingStrategyDetailVO.getServiceCharge().multiply(discount)));
                    accountingStrategyDetailNext.setTotalPrice(accountingStrategyDetailNext.getElectrovalence().add(accountingStrategyDetailNext.getServiceCharge().multiply(discount)));
                }
            }else {
                accountingStrategyDetailVO.setTotalPrice(accountingStrategyDetailVO.getElectrovalence().add(accountingStrategyDetailVO.getServiceCharge()));
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java
@@ -262,7 +262,7 @@
            //调用华为Iot删除设备
            if(StringUtils.isNotEmpty(chargingPile.getIotdDeviceId())){
                DeleteDeviceResp deviceResp = iotInterfaceClient.deleteDevice(chargingPile.getIotdDeviceId()).getData();
                if(null != deviceResp && deviceResp.getHttpStatusCode() == 201){
                if(null != deviceResp && deviceResp.getHttpStatusCode() == 0){
                    this.removeById(chargingPile);
                }
            }
@@ -320,7 +320,7 @@
    public ChargeMonitoring chargeMonitoring(Integer siteId) {
        //获取当前登录账户的站点权限数据
        Set<Integer> siteIds = new HashSet<>();
        if(null == siteId){
        if(0 == siteId){
            SysUser sysUser = sysUserClient.getSysUser(SecurityUtils.getUserId()).getData();
            Integer roleType = sysUser.getRoleType();
            Integer objectId = sysUser.getObjectId();
@@ -334,12 +334,20 @@
                    List<Integer> data1 = roleSiteClient.getSiteIds(data2.get(0).getRoleId()).getData();
                    data.addAll(data1);
                    siteIds = new HashSet<>(data);
                }else{
                    siteIds = null;
                }
            }
        }else{
            siteIds.add(siteId);
        }
        List<Site> sites = siteService.listByIds(siteIds);
        List<Site> sites = null;
        if(null == siteIds){
            sites = siteService.list(new LambdaQueryWrapper<Site>().eq(Site::getDelFlag, 0));
            siteIds = sites.stream().map(Site::getId).collect(Collectors.toSet());
        }else{
            sites = siteService.listByIds(siteIds);
        }
        List<TChargingGun> total = chargingGunService.list(new LambdaQueryWrapper<TChargingGun>().in(TChargingGun::getSiteId, siteIds).eq(TChargingGun::getDelFlag, 0));
        List<TChargingGun> charging = chargingGunService.list(new LambdaQueryWrapper<TChargingGun>().in(TChargingGun::getSiteId, siteIds).eq(TChargingGun::getStatus, 4).eq(TChargingGun::getDelFlag, 0));
        BigDecimal ratedPower = total.stream().map(TChargingGun::getRatedPower).reduce(BigDecimal.ZERO, BigDecimal::add);
@@ -361,9 +369,9 @@
        }
        List<String> dates = new ArrayList<>();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MMM-dd");
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        for (int i = 6; i >= 0; i--) {
            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - i);
            dates.add(sdf.format(calendar.getTime()));
        }
@@ -382,7 +390,7 @@
            if(list.size() == 0){
                value2.add(0D);
            }else{
                Double datum1 = new BigDecimal(datum).divide(new BigDecimal(list.size()).multiply(v).multiply(new BigDecimal(24))).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
                Double datum1 = new BigDecimal(datum).divide(new BigDecimal(list.size()).multiply(v).multiply(new BigDecimal(24)), new MathContext(4, RoundingMode.HALF_EVEN)).multiply(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
                value2.add(datum1);
            }
        }
@@ -404,7 +412,7 @@
    public ChargingGunCountMonitoring getChargingGunCountMonitoring(Integer siteId) {
        //获取当前登录账户的站点权限数据
        Set<Integer> siteIds = new HashSet<>();
        if(null == siteId){
        if(0 == siteId){
            SysUser sysUser = sysUserClient.getSysUser(SecurityUtils.getUserId()).getData();
            Integer roleType = sysUser.getRoleType();
            Integer objectId = sysUser.getObjectId();
@@ -418,6 +426,9 @@
                    List<Integer> data1 = roleSiteClient.getSiteIds(data2.get(0).getRoleId()).getData();
                    data.addAll(data1);
                    siteIds = new HashSet<>(data);
                }else{
                    List<Site> list = siteService.list(new LambdaQueryWrapper<Site>().eq(Site::getDelFlag, 0));
                    siteIds = list.stream().map(Site::getId).collect(Collectors.toSet());
                }
            }
        }else{
@@ -452,7 +463,7 @@
    public PageInfo<ChargingGunMonitoring> getChargingGunMonitoring(GetChargingGunMonitoring query) {
        //获取当前登录账户的站点权限数据
        Set<Integer> siteIds = new HashSet<>();
        if(null == query.getSiteId()){
        if(0 == query.getSiteId()){
            SysUser sysUser = sysUserClient.getSysUser(SecurityUtils.getUserId()).getData();
            Integer roleType = sysUser.getRoleType();
            Integer objectId = sysUser.getObjectId();
@@ -466,6 +477,9 @@
                    List<Integer> data1 = roleSiteClient.getSiteIds(data2.get(0).getRoleId()).getData();
                    data.addAll(data1);
                    siteIds = new HashSet<>(data);
                }else{
                    List<Site> list = siteService.list(new LambdaQueryWrapper<Site>().eq(Site::getDelFlag, 0));
                    siteIds = list.stream().map(Site::getId).collect(Collectors.toSet());
                }
            }
        }else{
@@ -489,62 +503,60 @@
                Integer id = gunMonitoring.getId();
                //根据订单数据查询车牌号
                TChargingOrder chargingOrder = chargingOrderClient.getOrderDetailByGunId(id).getData();
                Long appUserCarId = chargingOrder.getAppUserCarId();
                if(null != appUserCarId){
                if(null != chargingOrder){
                    Long appUserCarId = chargingOrder.getAppUserCarId();
                    TAppUserCar tAppUserCar = appUserCarClient.getCarByIds(Arrays.asList(appUserCarId)).getData().get(0);
                    gunMonitoring.setLicensePlate(tAppUserCar.getLicensePlate());
                }
                UploadRealTimeMonitoringData data = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrder.getCode()).getData();
                gunMonitoring.setChargingRatio(BigDecimal.valueOf(data.getSoc()));
                gunMonitoring.setElectricQuantity(data.getCharging_degree().toString());
                gunMonitoring.setSoc(data.getSoc().toString());
                gunMonitoring.setElectricCurrent(data.getOutput_current().toString());
                gunMonitoring.setVoltage(data.getOutput_voltage().toString());
                switch (data.getHardware_fault()){
                    case 1:
                        gunMonitoring.setFaultCause("急停按钮动作故障");
                        break;
                    case 2:
                        gunMonitoring.setFaultCause("无可用整流模块");
                        break;
                    case 3:
                        gunMonitoring.setFaultCause("出风口温度过高");
                        break;
                    case 4:
                        gunMonitoring.setFaultCause("交流防雷故障");
                        break;
                    case 5:
                        gunMonitoring.setFaultCause("交直流模块 DC20 通信中断");
                        break;
                    case 6:
                        gunMonitoring.setFaultCause("绝缘检测模块 FC08 通信中断");
                        break;
                    case 7:
                        gunMonitoring.setFaultCause("电度表通信中断");
                        break;
                    case 8:
                        gunMonitoring.setFaultCause("读卡器通信中断");
                        break;
                    case 9:
                        gunMonitoring.setFaultCause("RC10 通信中断");
                        break;
                    case 10:
                        gunMonitoring.setFaultCause("风扇调速板故障");
                        break;
                    case 11:
                        gunMonitoring.setFaultCause("直流熔断器故障");
                        break;
                    case 12:
                        gunMonitoring.setFaultCause("高压接触器故障");
                        break;
                    case 13:
                        gunMonitoring.setFaultCause("门打开");
                        break;
                    UploadRealTimeMonitoringData data = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrder.getCode()).getData();
                    gunMonitoring.setChargingRatio(BigDecimal.valueOf(data.getSoc()));
                    gunMonitoring.setElectricQuantity(data.getCharging_degree().toString());
                    gunMonitoring.setSoc(data.getSoc().toString());
                    gunMonitoring.setElectricCurrent(data.getOutput_current().toString());
                    gunMonitoring.setVoltage(data.getOutput_voltage().toString());
                    switch (data.getHardware_fault()){
                        case 1:
                            gunMonitoring.setFaultCause("急停按钮动作故障");
                            break;
                        case 2:
                            gunMonitoring.setFaultCause("无可用整流模块");
                            break;
                        case 3:
                            gunMonitoring.setFaultCause("出风口温度过高");
                            break;
                        case 4:
                            gunMonitoring.setFaultCause("交流防雷故障");
                            break;
                        case 5:
                            gunMonitoring.setFaultCause("交直流模块 DC20 通信中断");
                            break;
                        case 6:
                            gunMonitoring.setFaultCause("绝缘检测模块 FC08 通信中断");
                            break;
                        case 7:
                            gunMonitoring.setFaultCause("电度表通信中断");
                            break;
                        case 8:
                            gunMonitoring.setFaultCause("读卡器通信中断");
                            break;
                        case 9:
                            gunMonitoring.setFaultCause("RC10 通信中断");
                            break;
                        case 10:
                            gunMonitoring.setFaultCause("风扇调速板故障");
                            break;
                        case 11:
                            gunMonitoring.setFaultCause("直流熔断器故障");
                            break;
                        case 12:
                            gunMonitoring.setFaultCause("高压接触器故障");
                            break;
                        case 13:
                            gunMonitoring.setFaultCause("门打开");
                            break;
                    }
                }
            }
        }
        return pageInfo.setRecords(chargingGunMonitoring);
    }
ruoyi-service/ruoyi-chargingPile/src/main/resources/bootstrap.yml
@@ -13,7 +13,6 @@
  profiles:
    # 环境配置
    active: dev
#    active: prod
---
spring:
  config:
@@ -47,7 +46,7 @@
  enabled: true
  application-id: ${spring.application.name}
  tx-service-group: seata_tx_group    #此处配置自定义的seata事务分组名称
  enable-auto-data-source-proxy: false
  enable-auto-data-source-proxy: true
  service:
    vgroup-mapping:
      seata_tx_group: default
@@ -56,7 +55,7 @@
    type: nacos
    nacos:
      # 开发环境
      server-addr: 192.168.110.169:8848
      server-addr: 127.0.0.1:8848
      namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb
      group: DEFAULT_GROUP
      data-id: seata-server.properties
@@ -74,7 +73,7 @@
    nacos:
      application: seata-server
      # 开发环境
      server-addr: 192.168.110.169:8848
      server-addr: 127.0.0.1:8848
      namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb
      group: DEFAULT_GROUP
      username: nacos
@@ -89,7 +88,7 @@
    nacos:
      discovery:
        # 开发环境
        server-addr: 192.168.110.169:8848 # nacos注册中心地址
        server-addr: 127.0.0.1:8848 # nacos注册中心地址
        namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb # 命名空间
        group: DEFAULT_GROUP
        application: seata-server #Nacos 中 Seata 名称
ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/SiteMapper.xml
@@ -64,6 +64,8 @@
        DATE_FORMAT(a.establishment_time, '%Y-%m-%d %H:%i:%s') as establishmentTime,
        c.num as chargingPileNumber,
        a.sort,
        a.lon,
        a.lat,
        a.accounting_strategy_id as accountingStrategyId,
        if(a.accounting_strategy_id is null, 1, if(d.site_id is null, 1, 2)) as accountingStrategyType
        from t_site a
@@ -195,14 +197,14 @@
        POW(
        SIN(
        (
        #{query.lat} * PI() / 180 - ts.lat * PI() / 180
        #{query.lat} * PI() / 180 - lat * PI() / 180
        ) / 2
        ),
        2
        ) + COS(#{query.lat} * PI() / 180) * COS(ts.lat * PI() / 180) * POW(
        ) + COS(#{query.lat} * PI() / 180) * COS(lat * PI() / 180) * POW(
        SIN(
        (
        #{query.lon} * PI() / 180 - ts.lon * PI() / 180
        #{query.lon} * PI() / 180 - lon * PI() / 180
        ) / 2
        ),
        2
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java
@@ -146,14 +146,14 @@
                AcquisitionBillingModeMessage acquisitionBillingModeMessage = JSON.parseObject(content.toJSONString(),AcquisitionBillingModeMessage.class);
                chargingMessage.setAcquisitionBillingModeMessage(acquisitionBillingModeMessage);
                // 响应硬件   计费模型请求应答  1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段
                List<TAccountingStrategyDetail> accountingStrategyDetails = accountingStrategyDetailClient.getDetailListByCode(acquisitionBillingModeMessage.getCharging_pile_code().substring(0,14)).getData();
                List<TAccountingStrategyDetail> accountingStrategyDetails = accountingStrategyDetailClient.getDetailListByCode(acquisitionBillingModeMessage.getCharging_pile_code()).getData();
                Map<Integer, TAccountingStrategyDetail> strategyPrice = StrategyUtil.getStrategyPrice(accountingStrategyDetails);
                // 价格设置
                AcquisitionBillingModeReply acquisitionBillingModeReply = new AcquisitionBillingModeReply();
                StrategyUtil.setStrategyPrice(strategyPrice,acquisitionBillingModeReply);
                // 时段设置
                StrategyUtil.setTime(accountingStrategyDetails,acquisitionBillingModeReply);
                TAccountingStrategyDetail accountingStrategyDetail = accountingStrategyDetailClient.getDetailByCode(acquisitionBillingModeMessage.getCharging_pile_code().substring(0,14)).getData();
                TAccountingStrategyDetail accountingStrategyDetail = accountingStrategyDetailClient.getDetailByCode(acquisitionBillingModeMessage.getCharging_pile_code()).getData();
                acquisitionBillingModeReply.setBilling_model_code(accountingStrategyDetail.getId().toString());
                acquisitionBillingModeReply.setCharging_pile_code(acquisitionBillingModeMessage.getCharging_pile_code());
                acquisitionBillingModeReply.setLoss_ratio(BigDecimal.ZERO);
@@ -161,6 +161,7 @@
                sendResult = enhanceProduce.chargingMessage(chargingMessage);
                break;
            case SendTagConstant.UPLOAD_REAL_TIME_MONITORING_DATA:
                log.info("充电实时数据上传");
                UploadRealTimeMonitoringDataMessage uploadRealTimeMonitoringDataMessage = JSON.parseObject(content.toJSONString(),UploadRealTimeMonitoringDataMessage.class);
                chargingMessage.setUploadRealTimeMonitoringDataMessage(uploadRealTimeMonitoringDataMessage);
                sendResult = enhanceProduce.chargingMessage(chargingMessage);
@@ -380,9 +381,8 @@
    }
    @ApiOperation(value = "计费模型设置",tags = {"硬件接口"})
    @GetMapping(value = "/setupBillingModel")
    public R setupBillingModel(String deviceId) {
        // TODO 罗  计费模型设置
    @PostMapping(value = "/setupBillingModel")
    public R setupBillingModel(@RequestParam("deviceId") String deviceId) {
        SetupBillingModel setupBillingModel = new SetupBillingModel();
        // 计费模型
        List<TAccountingStrategyDetail> accountingStrategyDetails = accountingStrategyDetailClient.getDetailListByCode(deviceId).getData();
@@ -442,5 +442,25 @@
        String message = iotMessageProduce.sendMessage(platformStopCharging.getCharging_pile_code(), ServiceIdMenu.PLATFORM_STOP_CHARGING.getKey(),messageUtil.platformStopCharging(platformStopCharging));
        return R.ok(message);
    }
    @ApiOperation(value = "计费模板下发",tags = {"硬件接口"})
    @GetMapping(value = "/accountingStrategy")
    public R accountingStrategy() {
        String code = "3401231001200202";
        String deviceId = "3401231001200202";
        List<TAccountingStrategyDetail> accountingStrategyDetails = accountingStrategyDetailClient.getDetailListByCode(code).getData();
        Map<Integer, TAccountingStrategyDetail> strategyPrice = StrategyUtil.getStrategyPrice(accountingStrategyDetails);
        // 价格设置
        AcquisitionBillingModeReply acquisitionBillingModeReply = new AcquisitionBillingModeReply();
        StrategyUtil.setStrategyPrice(strategyPrice,acquisitionBillingModeReply);
        // 时段设置
        StrategyUtil.setTime(accountingStrategyDetails,acquisitionBillingModeReply);
        TAccountingStrategyDetail accountingStrategyDetail = accountingStrategyDetailClient.getDetailByCode(code).getData();
        acquisitionBillingModeReply.setBilling_model_code(accountingStrategyDetail.getId().toString());
        acquisitionBillingModeReply.setCharging_pile_code(code);
        acquisitionBillingModeReply.setLoss_ratio(BigDecimal.ZERO);
        System.err.println(acquisitionBillingModeReply);
        iotMessageProduce.sendMessage(deviceId, ServiceIdMenu.ACQUISITION_BILLING_MODE_REPLY.getKey(),messageUtil.acquisitionBillingModeReply(acquisitionBillingModeReply));
        return R.ok();
    }
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/MessageUtil.java
@@ -64,6 +64,7 @@
     * @return
     */
    public JSONObject onlineReply(OnlineReply onlineReply){
        log.info("登录认证应答:{}", onlineReply);
        onlineReplyService.create(onlineReply);
        return  getMessageJsonString(onlineReply, ServiceIdMenu.ONLINE_REPLY.getValue());
    }
@@ -74,6 +75,7 @@
     * @return
     */
    public JSONObject pong(Pong pong){
        log.info("心跳包应答:{}", pong);
        pongService.create(pong);
        return  getMessageJsonString(pong, ServiceIdMenu.PONG.getValue());
    }
@@ -84,6 +86,7 @@
     * @return
     */
    public JSONObject billingModeVerifyReply(BillingModeVerifyReply billingModeVerifyReply){
        log.info("计费模型验证请求应答:{}", billingModeVerifyReply);
        billingModeVerifyReplyService.create(billingModeVerifyReply);
        return  getMessageJsonString(billingModeVerifyReply, ServiceIdMenu.BILLING_MODE_VERIFY_REPLY.getValue());
    }
@@ -94,6 +97,7 @@
     * @return
     */
    public JSONObject acquisitionBillingModeReply(AcquisitionBillingModeReply acquisitionBillingModeReply){
        log.info("计费模型验证请求应答:{}", acquisitionBillingModeReply);
        acquisitionBillingModeReplyService.create(acquisitionBillingModeReply);
        return  getMessageJsonString(acquisitionBillingModeReply, ServiceIdMenu.ACQUISITION_BILLING_MODE_REPLY.getValue());
    }
@@ -104,6 +108,7 @@
     * @return
     */
    public JSONObject readRealTimeMonitoringData(ReadRealTimeMonitoringData readRealTimeMonitoringData){
        log.info("读取实时监测数据:{}", readRealTimeMonitoringData);
        readRealTimeMonitoringDataService.create(readRealTimeMonitoringData);
        return  getMessageJsonString(readRealTimeMonitoringData, ServiceIdMenu.READ_REAL_TIME_MONITORING_DATA.getValue());
    }
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/StrategyUtil.java
@@ -6,6 +6,7 @@
import lombok.extern.slf4j.Slf4j;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalTime;
import java.util.*;
import java.util.stream.Collectors;
@@ -34,22 +35,30 @@
     */
    public static void setStrategyPrice(Map<Integer, TAccountingStrategyDetail> accountingStrategyDetails,AcquisitionBillingModeReply acquisitionBillingModeReply) {
        accountingStrategyDetails.forEach((k,v)->{
            BigDecimal electrovalence = v.getElectrovalence();
            BigDecimal serviceCharge = v.getServiceCharge();
            if(Objects.isNull(electrovalence)){
                electrovalence = BigDecimal.ZERO;
            }
            if(Objects.isNull(serviceCharge)){
                serviceCharge = BigDecimal.ZERO;
            }
            switch (k){
                case 1:
                    acquisitionBillingModeReply.setSharp_peak_electricity_rate(v.getElectrovalence());
//                    acquisitionBillingModeReply.setSharp_peak_service_rate(v.getServiceCharge());
                    acquisitionBillingModeReply.setSharp_peak_electricity_rate(electrovalence);
                    acquisitionBillingModeReply.setSharp_peak_service_rate(serviceCharge);
                    break;
                case 2:
                    acquisitionBillingModeReply.setPeak_electricity_rate(v.getElectrovalence());
//                    acquisitionBillingModeReply.setPeak_service_rate(v.getServiceCharge());
                    acquisitionBillingModeReply.setPeak_electricity_rate(electrovalence);
                    acquisitionBillingModeReply.setPeak_service_rate(serviceCharge);
                    break;
                case 3:
                    acquisitionBillingModeReply.setFlat_peak_electricity_rate(v.getElectrovalence());
//                    acquisitionBillingModeReply.setFlat_peak_service_rate(v.getServiceCharge());
                    acquisitionBillingModeReply.setFlat_peak_electricity_rate(electrovalence);
                    acquisitionBillingModeReply.setFlat_peak_service_rate(serviceCharge);
                    break;
                default:
                    acquisitionBillingModeReply.setLow_peak_electricity_rate(v.getElectrovalence());
//                    acquisitionBillingModeReply.setLow_peak_service_rate(v.getServiceCharge());
                    acquisitionBillingModeReply.setLow_peak_electricity_rate(electrovalence);
                    acquisitionBillingModeReply.setLow_peak_service_rate(serviceCharge);
                    break;
            }
        });
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/PlatformStopChargingReplyServiceImpl.java
@@ -43,7 +43,7 @@
    public PlatformStopChargingReply getPlatformStopChargingReply(GetPlatformStopChargingReply query) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        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()).and("create_time").lte(sdf.format(new Date())).and("create_time").gte(query.getEnd_time())), PlatformStopChargingReply.class);
                .and("charging_gun_code").is(query.getCharging_gun_code()).and("create_time").lte(sdf.format(new Date())).gte(query.getEnd_time())), PlatformStopChargingReply.class);
        return platformStopChargingReplies.size() > 0 ? platformStopChargingReplies.get(0) : null;
    }
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/BmsDemandAndChargerExportationMessage.java
@@ -25,10 +25,10 @@
    private BigDecimal bms_battery_voltage; //  最高电压 BMS 最高单体动力蓄电池电压及组号(1-12 位:最高单体动力蓄电池电压,数据分辨率:0.01 V/位,0 V 偏移量;数据范围:0~24 V;13-16 位:最高单体动力蓄电池电压所在组号,数据分辨率:1/位,0 偏移量;数据范围:0~15)
    private Integer bms_group_number; //  所在组号 BMS 最高单体动力蓄电池电压及组号(1-12 位:最高单体动力蓄电池电压,数据分辨率:0.01 V/位,0 V 偏移量;数据范围:0~24 V;13-16 位:最高单体动力蓄电池电压所在组号,数据分辨率:1/位,0 偏移量;数据范围:0~15)
    private BigDecimal bms_charged_status; // BMS 当前荷电状态 SOC( %)
    private Integer bms_remaining_charging_time; // BMS 估算剩余充电时间
    private BigDecimal bms_remaining_charging_time; // BMS 估算剩余充电时间
    private BigDecimal voltage_output_value; // 电桩电压输出值
    private BigDecimal current_output_value; // 电桩电流输出值
    private Integer cumulative_charging_time; // 累计充电时间
    private BigDecimal cumulative_charging_time; // 累计充电时间
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/BmsInformationMessage.java
@@ -17,9 +17,9 @@
    private String charging_gun_code; // 抢号
    private Integer bms_highest_voltage_number; // BMS 最高单体动力蓄电池电压所在编号
    private String bms_maximum_battery_temperature; // BMS 最高动力蓄电池温度
    private Integer maximum_temperature_detection_point_number; // 最高温度检测点编号
    private String maximum_temperature_detection_point_number; // 最高温度检测点编号
    private String minimum_cell_temperature; // 最低动力蓄电池温度
    private Integer lowest_temperature_detection_pointt_number; // 最低动力蓄电池温度检测点编号
    private String lowest_temperature_detection_pointt_number; // 最低动力蓄电池温度检测点编号
    private Integer bms_battery_voltage; // BMS 单体动力蓄电池电压过高 /过低(0:正常,1:过高,10:过低)
    private Integer bms_battery_charging_status; // BMS 整车动力蓄电池荷电状态SOC 过高/过低(0:正常,1:过高,10:过低)
    private Integer bms_charging_overcurrent; // BMS 动力蓄电池充电过电流(0:正常,1:过流,10:不可信状态)
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/TransactionRecordMessage.java
@@ -19,22 +19,6 @@
    private String charging_gun_code;// 抢号
    private String start_time;// 开始时间
    private String end_time;// 结束时间
    private BigDecimal sharp_peak_unit_price;// 尖单价
    private BigDecimal sharp_peak_charge;// 尖电量
    private BigDecimal loss_sharp_peak_charge;// 计损尖电量
    private BigDecimal sharp_peak_amount;// 尖金额
    private BigDecimal peak_unit_price;// 峰单价
    private BigDecimal peak_charge;// 峰电量
    private BigDecimal loss_peak_charge;// 计损峰电量
    private BigDecimal peak_amount;// 峰金额
    private BigDecimal flat_peak_unit_price;// 平单价
    private BigDecimal flat_peak_charge;// 平电量
    private BigDecimal loss_flat_peak_charge;// 计损平电量
    private BigDecimal flat_peak_amount;// 平金额
    private BigDecimal low_peak_unit_price;// 谷单价
    private BigDecimal low_peak_charge;// 谷电量
    private BigDecimal loss_low_peak_charge;// 计损谷电量
    private BigDecimal low_peak_amount;// 谷金额
    private BigDecimal total_initial_value;// 电表总起值
    private BigDecimal total_stop_value;// 电表总止值
    private BigDecimal total_electricity;// 总电量
@@ -45,6 +29,162 @@
    private String trade_date;// 交易日期、时间
    private Integer stop_reason;// 停止原因
    private String physical_card_number;// 物理卡号
    private String time1;// 计费时段
    private BigDecimal sharp_peak_charge1;// 尖电量
    private BigDecimal loss_sharp_peak_charge1;// 计损尖电量
    private BigDecimal sharp_peak_amount1;// 尖金额
    private BigDecimal flat_peak_charge1;// 平电量
    private BigDecimal loss_flat_peak_char1;// 计损平电量
    private BigDecimal flat_peak_amount1;// 平金额
    private BigDecimal peak_charge1;// 峰电量
    private BigDecimal loss_peak_charge1;// 计损峰电量
    private BigDecimal peak_amount1;// 峰金额
    private BigDecimal low_peak_charge1;// 谷电量
    private BigDecimal loss_low_peak_charge1;// 计损谷电量
    private BigDecimal low_peak_amount1;// 谷金额
    private String time2;// 计费时段
    private BigDecimal sharp_peak_charge2;// 电量
    private BigDecimal loss_sharp_peak_charge2;// 计损电量
    private BigDecimal sharp_peak_amount2;// 金额
    private BigDecimal flat_peak_charge2;// 电量
    private BigDecimal loss_flat_peak_char2;// 计损电量
    private BigDecimal flat_peak_amount2;// 金额
    private BigDecimal peak_charge2;// 电量
    private BigDecimal loss_peak_charge2;// 计损电量
    private BigDecimal peak_amount2;// 金额
    private BigDecimal low_peak_charge2;// 电量
    private BigDecimal loss_low_peak_charge2;// 计损电量
    private BigDecimal low_peak_amount2;// 金额
    private String time3;// 计费时段
    private BigDecimal sharp_peak_charge3;// 电量
    private BigDecimal loss_sharp_peak_charge3;// 计损电量
    private BigDecimal sharp_peak_amount3;// 金额
    private BigDecimal flat_peak_charge3;// 电量
    private BigDecimal loss_flat_peak_char3;// 计损电量
    private BigDecimal flat_peak_amount3;// 金额
    private BigDecimal peak_charge3;// 电量
    private BigDecimal loss_peak_charge3;// 计损电量
    private BigDecimal peak_amount3;// 金额
    private BigDecimal low_peak_charge3;// 电量
    private BigDecimal loss_low_peak_charge3;// 计损电量
    private BigDecimal low_peak_amount3;// 金额
    private String time4;// 计费时段
    private BigDecimal sharp_peak_charge4;// 电量
    private BigDecimal loss_sharp_peak_charge4;// 计损电量
    private BigDecimal sharp_peak_amount4;// 金额
    private BigDecimal flat_peak_charge4;// 电量
    private BigDecimal loss_flat_peak_char4;// 计损电量
    private BigDecimal flat_peak_amount4;// 金额
    private BigDecimal peak_charge4;// 电量
    private BigDecimal loss_peak_charge4;// 计损电量
    private BigDecimal peak_amount4;// 金额
    private BigDecimal low_peak_charge4;// 电量
    private BigDecimal loss_low_peak_charge4;// 计损电量
    private BigDecimal low_peak_amount4;// 金额
    private String time5;// 计费时段
    private BigDecimal sharp_peak_charge5;// 电量
    private BigDecimal loss_sharp_peak_charge5;// 计损电量
    private BigDecimal sharp_peak_amount5;// 金额
    private BigDecimal flat_peak_charge5;// 电量
    private BigDecimal loss_flat_peak_char5;// 计损电量
    private BigDecimal flat_peak_amount5;// 金额
    private BigDecimal peak_charge5;// 电量
    private BigDecimal loss_peak_charge5;// 计损电量
    private BigDecimal peak_amount5;// 金额
    private BigDecimal low_peak_charge5;// 电量
    private BigDecimal loss_low_peak_charge5;// 计损电量
    private BigDecimal low_peak_amount5;// 金额
    private String time6;// 计费时段
    private BigDecimal sharp_peak_charge6;// 电量
    private BigDecimal loss_sharp_peak_charge6;// 计损电量
    private BigDecimal sharp_peak_amount6;// 金额
    private BigDecimal flat_peak_charge6;// 电量
    private BigDecimal loss_flat_peak_char6;// 计损电量
    private BigDecimal flat_peak_amount6;// 金额
    private BigDecimal peak_charge6;// 电量
    private BigDecimal loss_peak_charge6;// 计损电量
    private BigDecimal peak_amount6;// 金额
    private BigDecimal low_peak_charge6;// 电量
    private BigDecimal loss_low_peak_charge6;// 计损电量
    private BigDecimal low_peak_amount6;// 金额
    private String time7;// 计费时段
    private BigDecimal sharp_peak_charge7;// 电量
    private BigDecimal loss_sharp_peak_charge7;// 计损电量
    private BigDecimal sharp_peak_amount7;// 金额
    private BigDecimal flat_peak_charge7;// 电量
    private BigDecimal loss_flat_peak_char7;// 计损电量
    private BigDecimal flat_peak_amount7;// 金额
    private BigDecimal peak_charge7;// 电量
    private BigDecimal loss_peak_charge7;// 计损电量
    private BigDecimal peak_amount7;// 金额
    private BigDecimal low_peak_charge7;// 电量
    private BigDecimal loss_low_peak_charge7;// 计损电量
    private BigDecimal low_peak_amount7;// 金额
    private String time8;// 计费时段
    private BigDecimal sharp_peak_charge8;// 电量
    private BigDecimal loss_sharp_peak_charge8;// 计损电量
    private BigDecimal sharp_peak_amount8;// 金额
    private BigDecimal flat_peak_charge8;// 电量
    private BigDecimal loss_flat_peak_char8;// 计损电量
    private BigDecimal flat_peak_amount8;// 金额
    private BigDecimal peak_charge8;// 电量
    private BigDecimal loss_peak_charge8;// 计损电量
    private BigDecimal peak_amount8;// 金额
    private BigDecimal low_peak_charge8;// 电量
    private BigDecimal loss_low_peak_charge8;// 计损电量
    private BigDecimal low_peak_amount8;// 金额
    private String time9;// 计费时段
    private BigDecimal sharp_peak_charge9;// 电量
    private BigDecimal loss_sharp_peak_charge9;// 计损电量
    private BigDecimal sharp_peak_amount9;// 金额
    private BigDecimal flat_peak_charge9;// 电量
    private BigDecimal loss_flat_peak_char9;// 计损电量
    private BigDecimal flat_peak_amount9;// 金额
    private BigDecimal peak_charge9;// 电量
    private BigDecimal loss_peak_charge9;// 计损电量
    private BigDecimal peak_amount9;// 金额
    private BigDecimal low_peak_charge9;// 电量
    private BigDecimal loss_low_peak_charge9;// 计损电量
    private BigDecimal low_peak_amount9;// 金额
    private String time10;// 计费时段
    private BigDecimal sharp_peak_charge10;// 电量
    private BigDecimal loss_sharp_peak_charge10;// 计损电量
    private BigDecimal sharp_peak_amount10;// 金额
    private BigDecimal flat_peak_charge10;// 电量
    private BigDecimal loss_flat_peak_char10;// 计损电量
    private BigDecimal flat_peak_amount10;// 金额
    private BigDecimal peak_charge10;// 电量
    private BigDecimal loss_peak_charge10;// 计损电量
    private BigDecimal peak_amount10;// 金额
    private BigDecimal low_peak_charge10;// 电量
    private BigDecimal loss_low_peak_charge10;// 计损电量
    private BigDecimal low_peak_amount10;// 金额
    private String time11;// 计费时段
    private BigDecimal sharp_peak_charge11;// 电量
    private BigDecimal loss_sharp_peak_charge11;// 计损电量
    private BigDecimal sharp_peak_amount11;// 金额
    private BigDecimal flat_peak_charge11;// 电量
    private BigDecimal loss_flat_peak_char11;// 计损电量
    private BigDecimal flat_peak_amount11;// 金额
    private BigDecimal peak_charge11;// 电量
    private BigDecimal loss_peak_charge11;// 计损电量
    private BigDecimal peak_amount11;// 金额
    private BigDecimal low_peak_charge11;// 电量
    private BigDecimal loss_low_peak_charge11;// 计损电量
    private BigDecimal low_peak_amount11;// 金额
    private String time12;// 计费时段
    private BigDecimal sharp_peak_charge12;// 电量
    private BigDecimal loss_sharp_peak_charge12;// 计损电量
    private BigDecimal sharp_peak_amount12;// 金额
    private BigDecimal flat_peak_charge12;// 电量
    private BigDecimal loss_flat_peak_char12;// 计损电量
    private BigDecimal flat_peak_amount12;// 金额
    private BigDecimal peak_charge12;// 电量
    private BigDecimal loss_peak_charge12;// 计损电量
    private BigDecimal peak_amount12;// 金额
    private BigDecimal low_peak_charge12;// 电量
    private BigDecimal loss_low_peak_charge12;// 计损电量
    private BigDecimal low_peak_amount12;// 金额
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java
@@ -22,6 +22,7 @@
import com.ruoyi.order.api.vo.PlatformStartChargingReplyMessageVO;
import com.ruoyi.order.api.vo.PlatformStopChargingReplyVO;
import com.ruoyi.order.api.vo.SecurityDetectionVO;
import com.ruoyi.order.api.vo.TransactionRecordMessageVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.MessageModel;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
@@ -185,75 +186,87 @@
                acquisitionBillingModeService.create(acquisitionBillingMode);
                break;
            case SendTagConstant.UPLOAD_REAL_TIME_MONITORING_DATA:
                UploadRealTimeMonitoringDataMessage uploadRealTimeMonitoringDataMessage = message.getUploadRealTimeMonitoringDataMessage();
                log.info("上传实时监测数据-业务消息处理:{}",uploadRealTimeMonitoringDataMessage);
                // 持久化消息
                UploadRealTimeMonitoringData uploadRealTimeMonitoringData = new UploadRealTimeMonitoringData();
                BeanUtils.copyProperties(uploadRealTimeMonitoringDataMessage,uploadRealTimeMonitoringData);
                // 查询mogondb上一条数据
                UploadRealTimeMonitoringData data = uploadRealTimeMonitoringDataService.getLastDataById(uploadRealTimeMonitoringDataMessage.getTransaction_serial_number());
                // 查询订单
                TChargingOrder chargingOrder = chargingOrderClient.getOrderByCode(uploadRealTimeMonitoringDataMessage.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(uploadRealTimeMonitoringDataMessage.getPaid_amount().divide(data.getPaid_amount()));
                    uploadRealTimeMonitoringData.setPeriod_charging_degree(uploadRealTimeMonitoringDataMessage.getCharging_degree().divide(data.getCharging_degree()));
                    uploadRealTimeMonitoringData.setPeriod_service_price(uploadRealTimeMonitoringDataMessage.getCharging_degree().multiply(accountingStrategyDetail.getServiceCharge()).setScale(4, RoundingMode.HALF_UP));
                }else {
                    log.info("首次上传实时监测数据");
                    uploadRealTimeMonitoringData.setPeriod_electric_price(uploadRealTimeMonitoringDataMessage.getPaid_amount());
                    uploadRealTimeMonitoringData.setPeriod_charging_degree(uploadRealTimeMonitoringDataMessage.getCharging_degree());
                    uploadRealTimeMonitoringData.setPeriod_service_price(uploadRealTimeMonitoringDataMessage.getCharging_degree().multiply(accountingStrategyDetail.getServiceCharge()).setScale(4, RoundingMode.HALF_UP));
                }
                uploadRealTimeMonitoringDataService.create(uploadRealTimeMonitoringData);
                // 业务处理
                UploadRealTimeMonitoringDataQuery query = new UploadRealTimeMonitoringDataQuery();
                BeanUtils.copyProperties(uploadRealTimeMonitoringData, query);
                chargingOrderClient.chargeMonitoring(query);
                GetChargingGunByCode code = new GetChargingGunByCode();
                code.setCharging_pile_code(uploadRealTimeMonitoringDataMessage.getCharging_pile_code());
                code.setCharging_gun_code(uploadRealTimeMonitoringDataMessage.getCharging_gun_code());
                TChargingGun chargingGun = chargingGunClient.getChargingGunByCode(code).getData();
                if(Objects.nonNull(chargingGun)){
                    // 存储状态信息
                    TFaultMessage faultMessage = new TFaultMessage();
                    if(uploadRealTimeMonitoringDataMessage.getCharging_gun_status().equals(0) || uploadRealTimeMonitoringDataMessage.getCharging_gun_status().equals(1)){
                        faultMessage.setSiteId(chargingGun.getSiteId());
                        faultMessage.setChargingPileId(chargingGun.getChargingPileId());
                        faultMessage.setChargingGunId(chargingGun.getId());
                        switch (uploadRealTimeMonitoringDataMessage.getCharging_gun_status()){
                            case 0:
                                faultMessage.setStatus(1);
                                chargingGun.setStatus(1);
                                break;
                            case 1:
                                faultMessage.setStatus(2);
                                chargingGun.setStatus(7);
                                break;
                        }
                        faultMessage.setDownTime(LocalDateTime.now());
                        faultMessageClient.createFaultMessage(faultMessage);
                try {
                    UploadRealTimeMonitoringDataMessage uploadRealTimeMonitoringDataMessage = message.getUploadRealTimeMonitoringDataMessage();
                    log.info("上传实时监测数据-业务消息处理:{}",uploadRealTimeMonitoringDataMessage);
                    // 持久化消息
                    UploadRealTimeMonitoringData uploadRealTimeMonitoringData = new UploadRealTimeMonitoringData();
                    BeanUtils.copyProperties(uploadRealTimeMonitoringDataMessage,uploadRealTimeMonitoringData);
                    // 查询mogondb上一条数据
                    UploadRealTimeMonitoringData data = uploadRealTimeMonitoringDataService.getLastDataById(uploadRealTimeMonitoringDataMessage.getTransaction_serial_number());
                    // 查询订单
                    TChargingOrder chargingOrder = chargingOrderClient.getOrderByCode(uploadRealTimeMonitoringDataMessage.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(uploadRealTimeMonitoringDataMessage.getPaid_amount().subtract(data.getPaid_amount()));
                        uploadRealTimeMonitoringData.setPeriod_charging_degree(uploadRealTimeMonitoringDataMessage.getCharging_degree().subtract(data.getCharging_degree()));
                        uploadRealTimeMonitoringData.setPeriod_service_price(uploadRealTimeMonitoringDataMessage.getCharging_degree().multiply(accountingStrategyDetail.getServiceCharge()).setScale(4, RoundingMode.HALF_UP));
                    }else {
                        switch (uploadRealTimeMonitoringDataMessage.getCharging_gun_status()){
                            case 2:
                                chargingGun.setStatus(2);
                                break;
                            case 3:
                                chargingGun.setStatus(4);
                                break;
                        }
                        // 空闲 充电 查询是否该设备之前存在离线记录或者故障记录
                        faultMessage = faultMessageClient.getFaultMessageByGunId(chargingGun.getId()).getData();
                        if(Objects.nonNull(faultMessage)){
                            faultMessage.setEndTime(LocalDateTime.now());
                            faultMessageClient.updateFaultMessage(faultMessage);
                        }
                        log.info("首次上传实时监测数据");
                        uploadRealTimeMonitoringData.setPeriod_electric_price(uploadRealTimeMonitoringDataMessage.getPaid_amount());
                        uploadRealTimeMonitoringData.setPeriod_charging_degree(uploadRealTimeMonitoringDataMessage.getCharging_degree());
                        uploadRealTimeMonitoringData.setPeriod_service_price(uploadRealTimeMonitoringDataMessage.getCharging_degree().multiply(accountingStrategyDetail.getServiceCharge()).setScale(4, RoundingMode.HALF_UP));
                    }
                    chargingGunClient.updateChargingGunById(chargingGun);
                    uploadRealTimeMonitoringData.setOrderType(chargingOrder.getOrderType());
                    uploadRealTimeMonitoringData.setSiteId(chargingOrder.getSiteId());
                    uploadRealTimeMonitoringData.setStatus(chargingOrder.getStatus());
                    uploadRealTimeMonitoringData.setStartTime(chargingOrder.getStartTime());
                    uploadRealTimeMonitoringData.setEndTime(chargingOrder.getEndTime());
                    int i = uploadRealTimeMonitoringDataService.create(uploadRealTimeMonitoringData);
                    if(i == 0){
                        log.error("数据存储mongo失败");
                    }
                    // 业务处理
                    UploadRealTimeMonitoringDataQuery query = new UploadRealTimeMonitoringDataQuery();
                    BeanUtils.copyProperties(uploadRealTimeMonitoringData, query);
                    chargingOrderClient.chargeMonitoring(query);
                    GetChargingGunByCode code = new GetChargingGunByCode();
                    code.setCharging_pile_code(uploadRealTimeMonitoringDataMessage.getCharging_pile_code());
                    code.setCharging_gun_code(uploadRealTimeMonitoringDataMessage.getCharging_gun_code());
                    TChargingGun chargingGun = chargingGunClient.getChargingGunByCode(code).getData();
                    if(Objects.nonNull(chargingGun)){
                        // 存储状态信息
                        TFaultMessage faultMessage = new TFaultMessage();
                        if(uploadRealTimeMonitoringDataMessage.getCharging_gun_status().equals(0) || uploadRealTimeMonitoringDataMessage.getCharging_gun_status().equals(1)){
                            faultMessage.setSiteId(chargingGun.getSiteId());
                            faultMessage.setChargingPileId(chargingGun.getChargingPileId());
                            faultMessage.setChargingGunId(chargingGun.getId());
                            switch (uploadRealTimeMonitoringDataMessage.getCharging_gun_status()){
                                case 0:
                                    faultMessage.setStatus(1);
                                    chargingGun.setStatus(1);
                                    break;
                                case 1:
                                    faultMessage.setStatus(2);
                                    chargingGun.setStatus(7);
                                    break;
                            }
                            faultMessage.setDownTime(LocalDateTime.now());
                            faultMessageClient.createFaultMessage(faultMessage);
                        }else {
                            switch (uploadRealTimeMonitoringDataMessage.getCharging_gun_status()){
                                case 2:
                                    chargingGun.setStatus(2);
                                    break;
                                case 3:
                                    chargingGun.setStatus(4);
                                    break;
                            }
                            // 空闲 充电 查询是否该设备之前存在离线记录或者故障记录
                            faultMessage = faultMessageClient.getFaultMessageByGunId(chargingGun.getId()).getData();
                            if(Objects.nonNull(faultMessage)){
                                faultMessage.setEndTime(LocalDateTime.now());
                                faultMessageClient.updateFaultMessage(faultMessage);
                            }
                        }
                        chargingGunClient.updateChargingGunById(chargingGun);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
            case SendTagConstant.CHARGING_HANDSHAKE:
@@ -358,6 +371,10 @@
                    chargingOrderRecord.setTotalElectricity(transactionRecordMessage.getTotal_electricity());
                    chargingOrderClient.updateChargingOrder(chargingOrderRecord);
                }
                //计算费用
                TransactionRecordMessageVO vo = new TransactionRecordMessageVO();
                BeanUtils.copyProperties(transactionRecordMessage,vo);
                chargingOrderClient.endChargeBillingCharge(vo);
                break;
            case SendTagConstant.UPDATE_BALANCE_REPLY:
                UpdateBalanceReplyMessage updateBalanceReplyMessage = message.getUpdateBalanceReplyMessage();
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -55,6 +55,7 @@
import com.ruoyi.order.service.*;
import com.ruoyi.order.service.impl.TChargingOrderServiceImpl;
import com.ruoyi.order.util.PreviousSixMonths;
import com.ruoyi.order.vo.EndOfChargePageInfo;
import com.ruoyi.payment.api.feignClient.AliPaymentClient;
import com.ruoyi.payment.api.feignClient.WxPaymentClient;
import com.ruoyi.payment.api.vo.AliQueryOrder;
@@ -143,6 +144,9 @@
    private AppUserCarClient appUserCarClient;
    @Resource
    private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService;
    @Resource
    private TOrderInvoiceService invoiceService;
    /**
@@ -471,6 +475,7 @@
    @ResponseBody
    @PostMapping(value = "/securityDetection")
    public void securityDetection(@RequestBody SecurityDetectionVO securityDetection){
        log.error("-------------------安全检测数据-------------------:" + securityDetection);
        chargingOrderService.securityDetection(securityDetection);
    }
    
@@ -571,6 +576,17 @@
    public void terminateSuccessfulResponse(@RequestBody PlatformStopChargingReplyVO platformStopChargingReply){
        log.error("-------------------远程停止充电请求应答-------------------:" + platformStopChargingReply);
        chargingOrderService.terminateSuccessfulResponse(platformStopChargingReply);
    }
    /**
     * 停止充电返回账单后计算费用
     * @param vo
     */
    @PostMapping("/endChargeBillingCharge")
    public void endChargeBillingCharge(@RequestBody TransactionRecordMessageVO vo){
        log.error("-------------------停止充电返回账单后计算费用及修改业务状态-------------------:" + vo);
        chargingOrderService.endChargeBillingCharge(vo);
    }
    
    
@@ -697,7 +713,10 @@
        for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : data1) {
            ChargingOrderAndUploadRealTimeMonitoringDataDto dataDto = new ChargingOrderAndUploadRealTimeMonitoringDataDto();
            BeanUtils.copyProperties(uploadRealTimeMonitoringData,dataDto);
            BeanUtils.copyProperties(map.get(uploadRealTimeMonitoringData.getCharging_pile_code()),dataDto);
            TChargingOrder tChargingOrder = map.get(uploadRealTimeMonitoringData.getCharging_pile_code());
            if (tChargingOrder!=null) {
                BeanUtils.copyProperties(tChargingOrder, dataDto);
            }
            dtos.add(dataDto);
        }
@@ -768,16 +787,16 @@
            // 获取本月1号的日期
            YearMonth yearMonth = YearMonth.from(today);
            start = yearMonth.atDay(1);
            System.out.println("本月1号是: " + start);
//            start = yearMonth.atDay(1);
//
//            System.out.println("本月1号是: " + start);
        }else if (statisticsQueryDto.getDayType()==4){
            LocalDate today = LocalDate.now();
            // 获取当前年份
            int currentYear = today.getYear();
            // 获取今年1月1日的日期
            start = LocalDate.of(currentYear, 1, 1);
            System.out.println("今年1月1日是: " + start);
            start = statisticsQueryDto.getStartTime();
            end = statisticsQueryDto.getEndTime();
        }else if (statisticsQueryDto.getDayType()==5){
            // 获取今年1月1日的日期
@@ -1301,8 +1320,7 @@
    }
    @Resource
    private TOrderInvoiceService invoiceService;
    @ResponseBody
    @GetMapping(value = "/work/shopOrder")
    @ApiOperation(value = "购物订单统计", tags = {"管理后台-工作台"})
@@ -1335,14 +1353,18 @@
            return R.ok(userMap);
    }
    public static void main(String[] args) {
        // 示例数据
        List<TChargingOrder> list = getSampleData();
        System.err.println(list);
        List<Map<String, BigDecimal>> result = processData(list);
        result.forEach(System.out::println);
    @GetMapping(value = "/getGunIdsByUserId")
    @ApiOperation(value = "查询当前用户正在充电中的枪id集合", tags = {"小程序-首页-用户充电订单信息"})
    public R<List<Integer>> getGunIdsByUserId() {
        Long userId = tokenService.getLoginUserApplet().getUserId();
        List<TChargingOrder> list = chargingOrderService.list(Wrappers.lambdaQuery(TChargingOrder.class)
                .eq(TChargingOrder::getAppUserId, userId)
                .eq(TChargingOrder::getStatus, 3));
        List<Integer> gunIds = list.stream().map(TChargingOrder::getChargingGunId).collect(Collectors.toList());
        return R.ok(gunIds);
    }
    private static List<TChargingOrder> getSampleData() {
@@ -1395,6 +1417,7 @@
     */
    @PostMapping("/endCharge")
    public void endCharge(@RequestParam("code") String code){
        log.error(code + ":-------------------充电桩自动结束充电-------------------");
        chargingOrderService.endCharge(code, 2);
    }
@@ -1404,6 +1427,7 @@
     */
    @PostMapping("/excelEndCharge")
    public void excelEndCharge(@RequestParam("code") String code){
        log.error(code + ":-------------------充电异常,停止充电-------------------");
        chargingOrderService.excelEndCharge(code);
    }
@@ -1428,4 +1452,16 @@
        chargingOrderService.updateById(chargingOrder);
        return R.ok();
    }
    @ResponseBody
    @GetMapping(value = "/getEndOfChargePageInfo/{id}")
    @ApiOperation(value = "获取充电结束页面数据", tags = {"小程序-扫一扫"})
    @ApiImplicitParams({
            @ApiImplicitParam(name = "id", value = "订单id", required = true)
    })
    public AjaxResult<EndOfChargePageInfo> getEndOfChargePageInfo(@PathVariable("id") String id){
        EndOfChargePageInfo endOfChargePageInfo = chargingOrderService.getEndOfChargePageInfo(id);
        return AjaxResult.success(endOfChargePageInfo);
    }
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderEvaluateController.java
@@ -11,6 +11,7 @@
import com.ruoyi.order.dto.GetOrderEvaluatePageListDTO;
import com.ruoyi.order.dto.OrderEvaluateVo;
import com.ruoyi.order.service.TOrderEvaluateService;
import com.ruoyi.order.vo.ReplyEvaluationVO;
import com.ruoyi.other.api.vo.TEvaluationTagVO;
import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
@@ -63,9 +64,9 @@
    
    
    
    @DeleteMapping(value = "/delOrderEvaluate")
    @DeleteMapping(value = "/delOrderEvaluate/{id}")
    @ApiOperation(value = "删除充电评价", tags = {"管理后台-充电评价"})
    public AjaxResult delOrderEvaluate(@PathVariable Long id){
    public AjaxResult delOrderEvaluate(@PathVariable("id") Long id){
        TOrderEvaluate orderEvaluate = orderEvaluateService.getById(id);
        orderEvaluateService.removeById(orderEvaluate);
        return AjaxResult.success();
@@ -76,9 +77,9 @@
    
    @PostMapping(value = "/replyEvaluation")
    @ApiOperation(value = "充电评价回复", tags = {"管理后台-充电评价"})
    public AjaxResult replyEvaluation(@PathVariable("id") Long id, @RequestParam("reply") String reply){
        TOrderEvaluate orderEvaluate = orderEvaluateService.getById(id);
        reply = reply.replaceAll("& #40;", "(")
    public AjaxResult replyEvaluation(@RequestBody ReplyEvaluationVO vo){
        TOrderEvaluate orderEvaluate = orderEvaluateService.getById(vo.getId());
        String reply = vo.getReply().replaceAll("& #40;", "(")
                .replaceAll("& #41;", ")")
                .replaceAll("& #40;", "(")
                .replaceAll("& #41;", ")")
@@ -94,9 +95,9 @@
    
    
    
    @DeleteMapping(value = "/delOrderEvaluateReply")
    @DeleteMapping(value = "/delOrderEvaluateReply/{id}")
    @ApiOperation(value = "删除充电评价回复", tags = {"管理后台-充电评价"})
    public AjaxResult delOrderEvaluateReply(@PathVariable Long id){
    public AjaxResult delOrderEvaluateReply(@PathVariable("id") Long id){
        TOrderEvaluate orderEvaluate = orderEvaluateService.getById(id);
        orderEvaluate.setEvaluationResponse("");
        orderEvaluateService.updateById(orderEvaluate);
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/SixVipDto.java
@@ -7,7 +7,7 @@
@Data
public class SixVipDto {
    private String month;
    private String vipName;
    private String name;
    private Integer vipId;
    private BigDecimal paymentAmount;
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java
@@ -69,20 +69,20 @@
    List<Map<String, Object>> getSumByType(@Param("chargingOrderIds")List<Long> chargingOrderIds);
    List<Map<String, Object>> getDateData(List<Long> chargingOrderIds);
    List<Map<String, Object>> getDateData(@Param("chargingOrderIds")List<Long> chargingOrderIds);
    List<Map<String, Object>> getWeekData(List<Long> chargingOrderIds);
    List<Map<String, Object>> getWeekData(@Param("chargingOrderIds")List<Long> chargingOrderIds);
    List<Map<String, Object>> getMonthData(List<Long> chargingOrderIds);
    List<Map<String, Object>> getMonthData(@Param("chargingOrderIds")List<Long> chargingOrderIds);
    List<Map<String, Object>> getYearData(List<Long> chargingOrderIds);
    List<Map<String, Object>> getYearData(@Param("chargingOrderIds")List<Long> chargingOrderIds);
    List<ChargingOrderListVO> chargingList(@Param("pageInfo")PageInfo<ChargingOrderListVO> pageInfo, @Param("req") ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2);
    List<ChargingOrderListVO> chargingListNoPage( @Param("req")ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2);
    List<Map<String, Object>> getByDate(List<Long> chargingOrderIds);
    List<Map<String, Object>> getByDate(@Param("chargingOrderIds")List<Long> chargingOrderIds);
    List<Map<String, Object>> queryPower(List<Integer> siteIds);
    List<Map<String, Object>> queryPower(@Param("siteIds")List<Integer> siteIds);
    Map<String, Object> queryPowerLevel(@Param("siteIds") List<Integer> siteIds,@Param("statisticsQueryDto")  ChargingStatisticsQueryDto statisticsQueryDto);
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java
@@ -17,6 +17,8 @@
import com.ruoyi.order.api.vo.*;
import com.ruoyi.order.dto.*;
import com.ruoyi.order.vo.ChargingOrderListInfoVO;
import com.ruoyi.order.vo.EndOfChargePageInfo;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
@@ -168,7 +170,14 @@
     * @param code
     */
    void endCharge(String code, Integer endMode);
    /**
     * 停止充电返回账单后计算费用
     * @param vo
     */
    void endChargeBillingCharge(TransactionRecordMessageVO vo);
    /**
     * 异常结束充电处理逻辑
@@ -248,4 +257,12 @@
    List<Map<String, Object>> countAllUserData();
    List<Map<String, Object>> needElec1(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto);
    /**
     * 获取充电结束页面详情
     * @param id
     * @return
     */
    EndOfChargePageInfo getEndOfChargePageInfo(String id);
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderAccountingStrategyServiceImpl.java
@@ -13,8 +13,10 @@
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.LongStream;
@@ -43,19 +45,20 @@
    @Override
    public List<List<Map<String, Object>>> getTotalElectricQuantity(Integer days, Set<Integer> siteIds) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        DateTimeFormatter sdf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - days);
        String startTime = sdf.format(calendar.getTime()) + " 00:00:00";
        List<TChargingOrder> list = chargingOrderService.list(new LambdaQueryWrapper<TChargingOrder>().in(TChargingOrder::getSiteId, siteIds).eq(TChargingOrder::getStatus, 5)
                .eq(TChargingOrder::getDelFlag, 0).last(" and end_time between '" + startTime + "' and DATE_FORMAT('%Y-%m-%d %H:%i:%s', now())"));
                .eq(TChargingOrder::getDelFlag, 0).last(" and start_time between '" + startTime + "' and DATE_FORMAT(now(), '%Y-%m-%d %H:%i:%s')"));
        List<Long> orderId = list.stream().map(TChargingOrder::getId).collect(Collectors.toList());
        List<TChargingOrderAccountingStrategy> list1 = this.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().in(TChargingOrderAccountingStrategy::getChargingOrderId, orderId));
        
        List<List<Map<String, Object>>> list2 = new ArrayList<>();
        Calendar nowDateTime = Calendar.getInstance();
        for (int i = days; i >= 0; i--) {
            Calendar nowDateTime = Calendar.getInstance();
            nowDateTime.set(Calendar.DAY_OF_YEAR, nowDateTime.get(Calendar.DAY_OF_YEAR) - i);
            List<TChargingOrder> collect = list.stream().filter(s -> sdf.format(s.getEndTime()).equals(sdf.format(nowDateTime.getTime()))).collect(Collectors.toList());
            List<TChargingOrder> collect = list.stream().filter(s -> s.getStartTime().format(sdf1).equals(sdf.format(nowDateTime.getTime()))).collect(Collectors.toList());
            List<Long> orderIds = collect.stream().map(TChargingOrder::getId).collect(Collectors.toList());
            
            
@@ -105,15 +108,15 @@
        calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - days);
        String startTime = sdf.format(calendar.getTime()) + " 00:00:00";
        List<TChargingOrder> list = chargingOrderService.list(new LambdaQueryWrapper<TChargingOrder>().in(TChargingOrder::getSiteId, siteIds).eq(TChargingOrder::getStatus, 5)
                .eq(TChargingOrder::getDelFlag, 0).last(" and end_time between '" + startTime + "' and DATE_FORMAT('%Y-%m-%d %H:%i:%s', now())"));
                .eq(TChargingOrder::getDelFlag, 0).last(" and start_time between '" + startTime + "' and DATE_FORMAT(now(), '%Y-%m-%d %H:%i:%s')"));
        
        List<Double> list2 = new ArrayList<>();
        Calendar nowDateTime = Calendar.getInstance();
        //遍历获取每天的数值
        for (int i = days; i >= 0; i--) {
            Calendar nowDateTime = Calendar.getInstance();
            nowDateTime.set(Calendar.DAY_OF_YEAR, nowDateTime.get(Calendar.DAY_OF_YEAR) - i);
            //充电量
            BigDecimal reduce = list.stream().filter(s -> sdf.format(s.getEndTime()).equals(sdf.format(nowDateTime.getTime())))
            BigDecimal reduce = list.stream().filter(s -> s.getStartTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")).equals(sdf.format(nowDateTime.getTime())))
                    .map(TChargingOrder::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
            list2.add(reduce.doubleValue());
        }
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -47,6 +47,7 @@
import com.ruoyi.order.service.TChargingOrderService;
import com.ruoyi.order.service.TOrderEvaluateService;
import com.ruoyi.order.service.*;
import com.ruoyi.order.vo.EndOfChargePageInfo;
import com.ruoyi.other.api.domain.*;
import com.ruoyi.order.vo.ChargingOrderListInfoVO;
import com.ruoyi.other.api.feignClient.*;
@@ -56,7 +57,6 @@
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.feignClient.SysUserClient;
import io.seata.spring.annotation.GlobalTransactional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -65,14 +65,15 @@
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.format.TextStyle;
import java.time.temporal.WeekFields;
import java.util.*;
import java.util.concurrent.*;
import java.util.stream.Collectors;
@@ -97,8 +98,7 @@
    @Resource
    private SiteClient siteClient;
    @Resource
    private AppUserCarClient appUserCarClient;
    @Resource
@@ -139,16 +139,12 @@
    @Resource
    private TOrderEvaluateService orderEvaluateService;
    @Resource
    private AccountingStrategyDetailClient accountingStrategyDetailClient;
    @Resource
    private AccountingStrategyDetailOrderClient accountingStrategyDetailOrderClient;
    @Resource
    private AccountingStrategyOrderClient accountingStrategyOrderClient;
    @Resource
    private AccountingStrategyClient accountingStrategyClient;
@@ -262,8 +258,8 @@
        }else{
            myChargingOrderInfo.setLicensePlate("无");
        }
        myChargingOrderInfo.setStartTime(chargingOrder.getStartTime().toInstant(ZoneOffset.of("+8")).toEpochMilli());
        myChargingOrderInfo.setEndTime(chargingOrder.getEndTime().toInstant(ZoneOffset.of("+8")).toEpochMilli());
        myChargingOrderInfo.setStartTime(chargingOrder.getStartTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000);
        myChargingOrderInfo.setEndTime(chargingOrder.getEndTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000);
        myChargingOrderInfo.setOrderAmount(chargingOrder.getOrderAmount());
        myChargingOrderInfo.setPaymentAmount(chargingOrder.getPaymentAmount());
        myChargingOrderInfo.setRechargeAmount(chargingOrder.getRechargeAmount());
@@ -295,7 +291,7 @@
            myChargingOrderInfo.setCurrentAndVoltage(currentAndVoltage);
            //在MongoDB中获取数据
            List<Integer> soc = dataList.stream().map(UploadRealTimeMonitoringData::getSoc).collect(Collectors.toList());
            List<BigDecimal> po = dataList.stream().map(s -> s.getOutput_current().multiply(s.getOutput_voltage()).divide(new BigDecimal(1000))).collect(Collectors.toList());
            List<BigDecimal> po = dataList.stream().map(s -> s.getOutput_current().multiply(s.getOutput_voltage()).divide(new BigDecimal(1000),2, RoundingMode.HALF_DOWN)).collect(Collectors.toList());
            List<Map<String, Object>> power = new ArrayList<>();
            for (int i = 0; i < time.size(); i++) {
                Map<String, Object> map = new HashMap<>();
@@ -308,7 +304,7 @@
            }
            myChargingOrderInfo.setPower(power);
        }
        myChargingOrderInfo.setActionable(myChargingOrderInfo.getEndTime() + 604800000L > System.currentTimeMillis() ? 0 : 1);
        myChargingOrderInfo.setActionable(myChargingOrderInfo.getEndTime() + 604800000L < System.currentTimeMillis() ? 0 : 1);
        return myChargingOrderInfo;
    }
    
@@ -434,6 +430,7 @@
        chargingOrder.setAppUserId(userId);
        chargingOrder.setAppUserCarId(addChargingOrder.getAppUserCarId());
        TChargingGun tChargingGun = chargingGunClient.getChargingGunById(addChargingOrder.getId()).getData();
        TChargingPile chargingPile = chargingPileClient.getChargingPileById(tChargingGun.getChargingPileId()).getData();
        chargingOrder.setSiteId(tChargingGun.getSiteId());
        chargingOrder.setChargingPileId(tChargingGun.getChargingPileId());
        chargingOrder.setChargingGunId(addChargingOrder.getId());
@@ -443,6 +440,8 @@
        chargingOrder.setAppCouponId(addChargingOrder.getAppUserCouponId());
        chargingOrder.setVipDiscount(new BigDecimal(10));
        chargingOrder.setVipDiscountAmount(BigDecimal.ZERO);
        chargingOrder.setOrderSource(0);
        chargingOrder.setTitle("【充电桩充电】" + chargingPile.getNumber() + "号桩/" + tChargingGun.getCode() + "号枪");
        
        Site site = siteClient.getSiteByIds(Arrays.asList(tChargingGun.getSiteId())).getData().get(0);
        Integer accountingStrategyId = tChargingGun.getAccountingStrategyId();
@@ -557,80 +556,83 @@
        //根据支付金额,获取出使用的计费策略明细
        //计算电费金额和服务费
        BigDecimal serviceCharge = BigDecimal.ZERO;
        BigDecimal electrovalence = BigDecimal.ZERO;
        BigDecimal discountAmount = BigDecimal.ZERO;
        BigDecimal discount = chargingOrder.getVipDiscount();
        //先根据额定功率计算出每秒充电度数,然后计算出支付金额能充多少度电
        TChargingGun tChargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
        //1秒充电度数
        BigDecimal s_degrees = tChargingGun.getRatedPower().divide(new BigDecimal(3600), 6, RoundingMode.HALF_EVEN);
        TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
        List<AccountingStrategyDetailOrder> list = accountingStrategyDetailOrderClient.getAllAccountingStrategyDetailOrder(chargingOrder.getId()).getData();
        for (AccountingStrategyDetailOrder accountingStrategyDetailOrder : list) {
            Integer start = Integer.valueOf(accountingStrategyDetailOrder.getStartTime().replaceAll(":", ""));
            Integer end = Integer.valueOf(accountingStrategyDetailOrder.getEndTime().replaceAll(":", ""));
            String[] split = accountingStrategyDetailOrder.getEndTime().split(":");
            if(now >= start && now < end){
                Calendar calendar = Calendar.getInstance();
                calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split[0]));
                calendar.set(Calendar.MINUTE, Integer.valueOf(split[1]));
                //到此策略结束的秒数
                if(null == nowTimeMillis){
                    String[] split1 = accountingStrategyDetailOrder.getStartTime().split(":");
                    Calendar calendar1 = Calendar.getInstance();
                    calendar1.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split1[0]));
                    calendar1.set(Calendar.MINUTE, Integer.valueOf(split1[1]));
                    nowTimeMillis = calendar.getTimeInMillis();
        //判断会员是否还有充电优惠次数,计算会员优惠的折扣金额
        if(null != appUser.getVipId()){
            GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail();
            getAppUserVipDetail.setAppUserId(chargingOrder.getAppUserId());
            getAppUserVipDetail.setVipId(appUser.getVipId());
            TAppUserVipDetail data = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData();
            if(null != data && data.getChargeNum() > 0){
                //计算折扣
                List<AccountingStrategyDetailOrder> list = accountingStrategyDetailOrderClient.getAllAccountingStrategyDetailOrder(chargingOrder.getId()).getData();
                //将数据叠加两份,处理跨天的情况
                list.addAll(list);
                boolean sta = false;
                for (AccountingStrategyDetailOrder accountingStrategyDetailOrder : list) {
                    Integer start = Integer.valueOf(accountingStrategyDetailOrder.getStartTime().replaceAll(":", ""));
                    Integer end = Integer.valueOf(accountingStrategyDetailOrder.getEndTime().replaceAll(":", ""));
                    String[] split = accountingStrategyDetailOrder.getEndTime().split(":");
                    if(sta || now >= start){
                        sta = true;
                        Calendar end_calendar = Calendar.getInstance();
                        end_calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split[0]));
                        end_calendar.set(Calendar.MINUTE, Integer.valueOf(split[1]));
                        //到此策略结束的秒数
                        if(null == nowTimeMillis){
                            String[] split1 = accountingStrategyDetailOrder.getStartTime().split(":");
                            Calendar start_calendar = Calendar.getInstance();
                            start_calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split1[0]));
                            start_calendar.set(Calendar.MINUTE, Integer.valueOf(split1[1]));
                            nowTimeMillis = start_calendar.getTimeInMillis();
                        }
                        //间隔秒数
                        long m = (end_calendar.getTimeInMillis() - nowTimeMillis) / 1000;
                        //每秒需要支付的服务费金额
                        BigDecimal total_until = accountingStrategyDetailOrder.getElectrovalence().add(accountingStrategyDetailOrder.getServiceCharge());
                        BigDecimal s_total_amount = s_degrees.multiply(total_until);
                        //每秒需要支付的服务费金额
                        BigDecimal s_server_amount = s_degrees.multiply(accountingStrategyDetailOrder.getServiceCharge());
                        //计算剩余金额能充多长时间的电
                        long times = rechargeAmount1.divide(s_server_amount, 0, RoundingMode.DOWN).longValue();
                        if(times > m){
                            //充电时间跨度两个计费策略,需要继续对下一个策略进行计算
                            serviceCharge = s_server_amount.multiply(new BigDecimal(m));
                            discountAmount = discountAmount.add(serviceCharge.multiply((new BigDecimal(10).subtract(discount)).divide(new BigDecimal(10))));
                            rechargeAmount1 = rechargeAmount1.subtract(s_total_amount.multiply(new BigDecimal(m)));
                            nowTimeMillis = null;
                        }else{
                            serviceCharge = s_server_amount.multiply(new BigDecimal(times));
                            discountAmount = discountAmount.add(serviceCharge.multiply((new BigDecimal(10).subtract(discount)).divide(new BigDecimal(10))));
                            break;
                        }
                    }
                }
                long m = (calendar.getTimeInMillis() - nowTimeMillis) / 1000;
                //每度电的单价
                BigDecimal total_unit = accountingStrategyDetailOrder.getElectrovalence().add(accountingStrategyDetailOrder.getServiceCharge());
                //每秒需要支付的金额
                BigDecimal multiply = s_degrees.multiply(total_unit);
                //计算充值金额能充多长时间的电
                long times = rechargeAmount1.divide(multiply, 0, RoundingMode.DOWN).longValue();
                if(times > m){
                    //充电时间跨度两个计费策略,需要继续对下一个策略进行计算
                    electrovalence = accountingStrategyDetailOrder.getElectrovalence().multiply(s_degrees).multiply(new BigDecimal(m));
                    serviceCharge = accountingStrategyDetailOrder.getServiceCharge().multiply(s_degrees).multiply(new BigDecimal(m));
                    discountAmount = discountAmount.add(serviceCharge.multiply((new BigDecimal(10).subtract(discount)).divide(new BigDecimal(10))));
                    rechargeAmount1 = rechargeAmount1.subtract(multiply.multiply(new BigDecimal(m)));
                    nowTimeMillis = null;
                }else{
                    electrovalence = accountingStrategyDetailOrder.getElectrovalence().multiply(s_degrees).multiply(new BigDecimal(times));
                    serviceCharge = accountingStrategyDetailOrder.getServiceCharge().multiply(s_degrees).multiply(new BigDecimal(times));
                    discountAmount = discountAmount.add(serviceCharge.multiply((new BigDecimal(10).subtract(discount)).divide(new BigDecimal(10))));
                    break;
                if(discountAmount.compareTo(BigDecimal.ZERO) >= 0){
                    //计算会员最大优惠金额
                    TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
                    BigDecimal maximumDeduction = vip.getMaximumDeduction();
                    //普通会员有最高优惠限制
                    if(vip.getType() == 1 && discountAmount.compareTo(maximumDeduction) > 0){
                        discountAmount = maximumDeduction;
                    }
                }
            }
        }
        if(discountAmount.compareTo(BigDecimal.ZERO) >= 0){
            //计算会员最大优惠金额
            if(null != appUser.getVipId()){
                TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
                BigDecimal maximumDeduction = vip.getMaximumDeduction();
                //普通会员有最高优惠限制
                if(vip.getType() == 1 && discountAmount.compareTo(maximumDeduction) > 0){
                    discountAmount = maximumDeduction;
                }
                //判断会员是否还有充电优惠次数
                GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail();
                getAppUserVipDetail.setAppUserId(chargingOrder.getAppUserId());
                getAppUserVipDetail.setVipId(appUser.getVipId());
                TAppUserVipDetail data = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData();
                if(null != data && data.getChargeNum() > 0){
                    data.setChargeNum(data.getChargeNum() - 1);
                    appUserVipDetailClient.updateAppUserVipDetail(data);
                    //会员有充电优惠次数,直接将优惠金额加入到充电费用中增加充电时长
                    electrovalence = electrovalence.add(discountAmount);
                }
                discountAmount = discountAmount.setScale(4, RoundingMode.HALF_EVEN);
            }
        }
        
        electrovalence = electrovalence.setScale(2, RoundingMode.HALF_EVEN);
        discountAmount = discountAmount.setScale(2, RoundingMode.HALF_EVEN);
        chargingOrder.setChargeAmount(electrovalence);
        //机子上显示的金额为用户充值的金额+会员折扣金额
        BigDecimal account_balance = chargingOrder.getRechargeAmount().add(discountAmount).setScale(4, RoundingMode.HALF_EVEN);
        chargingOrder.setChargeAmount(account_balance);
        chargingOrder.setVipDiscountAmount(discountAmount);
        this.updateById(chargingOrder);
@@ -643,11 +645,9 @@
        platformStartCharging.setCharging_gun_code(tChargingGun.getCode());
        //使用订单id作为逻辑卡号
        platformStartCharging.setCard_number(chargingOrder.getId().toString());
        platformStartCharging.setAccount_balance(electrovalence);
        platformStartCharging.setAccount_balance(account_balance);
        
        log.error(chargingOrder.getCode() + ":-------------------远程调起开始充电请求-------------------");
        log.error(platformStartCharging.toString());
        log.error(chargingOrder.getCode() + ":-------------------远程调起开始充电请求-------------------" + platformStartCharging.toString());
        sendMessageClient.platformStartCharging(platformStartCharging);
        //异步线程检测远程启动的应答结果。如果失败,则需要全额退款
        Long id = chargingOrder.getId();
@@ -679,17 +679,19 @@
        if(null != securityDetection){
            PreChargeCheck preChargeCheck1 =  redisService.getCacheObject("AQJC_" + chargingOrder.getChargingGunId());
            if(null != preChargeCheck1){
                preChargeCheck1.setElectronicLockLock(preChargeCheck1.getElectronicLockLock());
                preChargeCheck1.setElectronicLockLock(true);
                preChargeCheck1.setInsulationTesting(true);
                preChargeCheck1.setSecureConnectionDetection(preChargeCheck1.getSecureConnectionDetection());
                preChargeCheck1.setSecureConnectionDetection(securityDetection.getSecure_connection() == 1);
                preChargeCheck1.setStartupSuccess(1);
                redisService.setCacheObject("AQJC_" + chargingOrder.getChargingGunId(), preChargeCheck1, 24L, TimeUnit.HOURS);
            }
        }
        
        List<PlatformStartChargingReply> data = platformStartChargingReplyClient.getPlatformStartChargingReply(code).getData();
        log.error(code + ":-------------------开始检查调起充电结果-------------------");
        log.error(data.toString());
        if(null == data){
            return false;
        }
        log.error(code + ":-------------------开始检查调起充电结果-------------------" + data.toString());
        if(data.size() != 0){
            PlatformStartChargingReply platformStartChargingReply = data.get(1);
            Integer startup_result = platformStartChargingReply.getStartup_result();
@@ -728,9 +730,8 @@
            redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS);
            return true;
        }else{
            log.error(code + ":-------------------未上传开启充电结果-------------------");
            Integer counter = boot_failed_map.get(code);
            log.error(code + ":-------------------未上传开启充电结果-------------------" + counter);
            PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key);
            //5分钟内未启动成功,退回金额。
            if(null == counter || counter < 300){
@@ -770,18 +771,17 @@
        code.setCharging_pile_code(securityDetection.getCharging_pile_code());
        code.setCharging_gun_code(securityDetection.getCharging_gun_code());
        TChargingGun chargingGun = chargingGunClient.getChargingGunByCode(code).getData();
        PreChargeCheck preChargeCheck1 =  redisService.getCacheObject("AQJC_" + chargingGun.getId());
        PreChargeCheck preChargeCheck1 = redisService.getCacheObject("AQJC_" + chargingGun.getId());
        if(null != preChargeCheck1){
            preChargeCheck1.setElectronicLockLock(preChargeCheck1.getElectronicLockLock());
            preChargeCheck1.setElectronicLockLock(true);
            preChargeCheck1.setInsulationTesting(true);
            preChargeCheck1.setSecureConnectionDetection(preChargeCheck1.getSecureConnectionDetection());
            preChargeCheck1.setStartupSuccess(1);
            preChargeCheck1.setSecureConnectionDetection(securityDetection.getSecure_connection() == 1);
            redisService.setCacheObject("AQJC_" + chargingGun.getId(), preChargeCheck1, 24L, TimeUnit.HOURS);
        }
    }
    
    /**
     * 启动充电应发
     * 启动充电应答
     * @param message
     */
    @Override
@@ -795,9 +795,8 @@
        String code = order.getCode();
        PreChargeCheck preChargeCheck1 =  redisService.getCacheObject("AQJC_" + order.getChargingGunId());
        if(null != preChargeCheck1){
            preChargeCheck1.setElectronicLockLock(preChargeCheck1.getElectronicLockLock());
            preChargeCheck1.setElectronicLockLock(true);
            preChargeCheck1.setInsulationTesting(true);
            preChargeCheck1.setSecureConnectionDetection(preChargeCheck1.getSecureConnectionDetection());
            preChargeCheck1.setStartupSuccess(1);
        }
        if(0 == startup_result){
@@ -889,13 +888,11 @@
     * @return
     */
    public AjaxResult chargingOrderStartupFailureWxRefund(String out_refund_no, String refund_id, String tradeState, String success_time){
        if("SUCCESS".equals(tradeState)){
            TChargingOrderRefund one = chargingOrderRefundService.getOne(new LambdaQueryWrapper<TChargingOrderRefund>().eq(TChargingOrderRefund::getRefundCode, out_refund_no));
            one.setRefundSerialNumber(refund_id);
            one.setRefundStatus(2);
            one.setRefundTime(LocalDateTime.parse(success_time, DateTimeFormatter.ofPattern("yyyy-MM-DDTHH:mm:ss+TIMEZONE")));
            chargingOrderRefundService.updateById(one);
        }
        TChargingOrderRefund one = chargingOrderRefundService.getOne(new LambdaQueryWrapper<TChargingOrderRefund>().eq(TChargingOrderRefund::getRefundCode, out_refund_no));
        one.setRefundSerialNumber(refund_id);
        one.setRefundStatus(2);
        one.setRefundTime(LocalDateTime.now());
        chargingOrderRefundService.updateById(one);
        return AjaxResult.success();
    }
@@ -911,7 +908,7 @@
    public ChargingDetails getChargingDetails(Integer id) {
        Long userId = tokenService.getLoginUserApplet().getUserId();
        TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, userId).eq(TChargingOrder::getChargingGunId, id)
                .in(TChargingOrder::getStatus, Arrays.asList(1, 2, 3)).eq(TChargingOrder::getRechargePaymentStatus, 2).eq(TChargingOrder::getDelFlag, 0));
                .eq(TChargingOrder::getRechargePaymentStatus, 2).eq(TChargingOrder::getDelFlag, 0).orderByDesc(TChargingOrder::getStartTime).last(" limit 0, 1"));
        if(null == one){
            return null;
        }
@@ -965,10 +962,96 @@
            return AjaxResult.error("不能重复操作");
        }
        chargingOrder.setEndTime(LocalDateTime.now());
        chargingOrder.setStatus(4);
        chargingOrder.setEndMode(1);
        this.updateById(chargingOrder);
        
        String code1 = chargingOrder.getCode();
        TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
        //异步线程处理停机
        ExecutorService cachedThreadPool = Executors.newFixedThreadPool(1);
        cachedThreadPool.execute(()->{
            //调用硬件停止充电,停止成功后开始计算费用退款
            TChargingPile chargingPile = chargingPileClient.getChargingPileById(chargingOrder.getChargingPileId()).getData();
            PlatformStopCharging platformStopCharging = new PlatformStopCharging();
            platformStopCharging.setCharging_pile_code(chargingPile.getCode());
            platformStopCharging.setCharging_gun_code(chargingGun.getCode());
            sendMessageClient.platformStopCharging(platformStopCharging);
            log.error(code1 + ":-------------------远程停止充电请求-------------------");
            log.error(platformStopCharging.toString());
            //开始查询停机应答,成功后开始计费费用
            boolean stop_status = false;
            for (int i = 0; i < 60; i++) {
                TChargingOrder chargingOrder1 = this.getById(id);
                if(chargingOrder1.getStatus() != 3){
                    stop_status = true;
                    break;
                }
                GetPlatformStopChargingReply query = new GetPlatformStopChargingReply();
                query.setCharging_gun_code(chargingGun.getCode());
                query.setCharging_pile_code(chargingPile.getCode());
                //将时间转换成UTC时间后查询数据(mongodb存储时间以UTC格式存储)
                ZoneId zoneId = ZoneId.systemDefault();
                ZonedDateTime zonedDateTime = ZonedDateTime.of(chargingOrder.getEndTime(), zoneId);
                ZonedDateTime endTime = zonedDateTime.withZoneSameInstant(ZoneId.of("UTC"));
                query.setEnd_time(endTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                PlatformStopChargingReply reply = platformStopChargingReplyClient.getPlatformStopChargingReply(query).getData();
                log.error(code1 + ":-------------------查询远程停止充电应答-------------------");
                if(null == reply){
                    log.error(code1 + ":-------------------远程停止充电应答无数据-------------------");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    continue;
                }
                log.error(reply.toString());
                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(code1 + ":停机失败:订单号:{},失败原因:{}", chargingOrder.getCode(), failure_cause);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }else{
                    log.error(code1 + ":-------------------远程停止充电请求成功-------------------");
                    stop_status = true;
                    break;
                }
            }
            if(stop_status){
                chargingOrder.setEndMode(1);
                this.updateById(chargingOrder);
            }else{
                log.error(code1 + ":-------------------远程停止充电应答最终失败-------------------");
            }
        });
        return AjaxResult.success();
    }
    /**
     * 结束充电后处理用户标签数据
     * @param chargingOrder
     */
    public void editUserTag(TChargingOrder chargingOrder){
        //处理用户标签数据
        List<TUserTag> data = userTagClient.getAllUserTag().getData();
        //累计充电次数
@@ -1025,79 +1108,14 @@
                }
            }
        }
        String code1 = chargingOrder.getCode();
        //异步线程处理停机
        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);
            log.error(code1 + ":-------------------远程停止充电请求-------------------");
            log.error(platformStopCharging.toString());
            //开始查询停机应答,成功后开始计费费用
            for (int i = 0; i < 60; i++) {
                GetPlatformStopChargingReply query = new GetPlatformStopChargingReply();
                query.setCharging_gun_code(chargingGun.getCode());
                query.setCharging_pile_code(chargingPile.getCode());
                query.setEnd_time(chargingOrder.getEndTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                PlatformStopChargingReply reply = platformStopChargingReplyClient.getPlatformStopChargingReply(query).getData();
                log.error(code1 + ":-------------------查询远程停止充电应答-------------------");
                log.error(reply.toString());
                if(null == reply){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    continue;
                }
                TChargingOrder chargingOrder1 = this.getById(id);
                if(chargingOrder1.getStatus() != 3){
                    break;
                }
                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(code1 + ":停机失败:订单号:{},失败原因:{}", chargingOrder.getCode(), failure_cause);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    continue;
                }
                // 将枪状态重置为空闲
                chargingGun.setStatus(2);
                chargingGunClient.updateChargingGunById(chargingGun);
                //计算费用,处理退款
                endCharge(chargingOrder);
                log.error(code1 + ":-------------------远程停止充电请求成功-------------------");
                break;
            }
        });
    }
    /**
     * 推荐奖励(被推荐首单奖励)
     * @param chargingOrder
     */
    public void referralReward(TChargingOrder chargingOrder){
        //处理推荐奖励(被推荐首单奖励)
        TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
        long count = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId())
@@ -1141,13 +1159,12 @@
            appUserIntegralChange.setHistoricalIntegral(appUser1.getPoints());
            appUserIntegralChange.setCurrentIntegral(appUser1.getPoints() + num1);
            appUserIntegralChange.setCreateTime(LocalDateTime.now());
            appUserIntegralChange.setOrderCode(chargingOrder.getCode());
            appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange);
            appUser1.setPoints(appUser1.getPoints() + num1);
            appUserClient.updateAppUser(appUser1);
        }
        return AjaxResult.success();
    }
    
    
@@ -1167,6 +1184,7 @@
        if(null != order && order.getStatus() != 3){
            return;
        }
        String code1 = order.getCode();
        if(0 == platformStopChargingReply.getStop_result()){
            String failure_cause = "";
@@ -1185,176 +1203,16 @@
                    break;
            }
            log.error(code1 + ":停机失败:订单号:{},失败原因:{}", order.getCode(), failure_cause);
            return;
        }else{
            TChargingOrder chargingOrder = new TChargingOrder();
            chargingOrder.setId(order.getId());
            chargingOrder.setAppUserId(order.getAppUserId());
            chargingOrder.setEndMode(1);
            this.updateById(chargingOrder);
        }
        // 将枪状态重置为空闲
        chargingGun.setStatus(2);
        chargingGunClient.updateChargingGunById(chargingGun);
        //计算费用,处理退款
        endCharge(order);
    }
    
    
    /**
     * 手动结束后的费用计算和退款逻辑
     */
    @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);
        }
        if(chargingOrder.getEndMode() == 2){
            chargingOrder.setEndMode(refundAmount.compareTo(BigDecimal.ZERO) > 0 ? 2 : 3);
        }
        chargingOrder.setStatus(5);
        chargingOrder.setPaymentAmount(payAmount);
        this.updateById(chargingOrder);
        //添加积分
        TIntegralRule integralRule = integralRuleClient.getSet().getData();
        if(null != integralRule){
            TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
            Integer num1 = JSON.parseObject(integralRule.getChargeCredit()).getInteger("num1");
            Integer integral = payAmount.multiply(new BigDecimal(num1)).intValue();
            if(null != appUser.getVipId()){
                TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
                Integer doubleIntegration = vip.getDoubleIntegration();
                //双倍积分
                if(1 == doubleIntegration){
                    integral *= 2;
                }
            }
            TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange();
            appUserIntegralChange.setAppUserId(appUser.getId());
            appUserIntegralChange.setChangeType(2);
            appUserIntegralChange.setHistoricalIntegral(appUser.getPoints());
            appUser.setPoints(appUser.getPoints() + integral);
            appUserIntegralChange.setCurrentIntegral(appUser.getPoints());
            appUserIntegralChange.setCreateTime(LocalDateTime.now());
            appUserClient.updateAppUser(appUser);
            appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange);
        }
        //计算优惠券
        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()) + (Double.valueOf(Math.random() * 1000).intValue()));
            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("/payment/wx/refund/notify");
                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);
                    }
                }
            }
        }
    }
@@ -1532,13 +1390,8 @@
    public List<Map<String, Object>> 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;
@@ -1753,10 +1606,8 @@
        return chargingOrderTimeVO;
    }
//    @Override
//    public R payRefund(PayOrderRefundDto payOrderQueryDto) {
//        return null;
//    }
    @Override
    public ChargingOrderListInfoVO chargingInfo(String uid) {
@@ -1844,96 +1695,28 @@
     * @param query
     */
    @Override
    @GlobalTransactional(rollbackFor = Exception.class)
    public void chargeMonitoring(UploadRealTimeMonitoringDataQuery query) {
        if(com.ruoyi.common.core.utils.StringUtils.isNotEmpty(query.getCharging_gun_code())){
        if(com.ruoyi.common.core.utils.StringUtils.isNotEmpty(query.getTransaction_serial_number())){
            //获取当前的计费策略
            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);
            TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, query.getTransaction_serial_number()));
            BigDecimal residualAmount = chargingOrder.getRechargeAmount().add(chargingOrder.getVipDiscountAmount()).subtract(query.getPaid_amount());
            chargingOrder.setResidualAmount(residualAmount);
            BigDecimal divide = query.getOutput_current().multiply(query.getOutput_voltage()).divide(new BigDecimal(1000));
            chargingOrder.setChargingPower(divide);
            if(query.getOutput_current().compareTo(BigDecimal.ZERO) != 0){
                BigDecimal divide = (query.getOutput_current().multiply(query.getOutput_voltage())).divide(new BigDecimal(1000));
                chargingOrder.setChargingPower(divide);
                chargingOrder.setCurrent(query.getOutput_current());
                chargingOrder.setVoltage(query.getOutput_voltage());
                chargingOrder.setPower(divide);
                chargingOrder.setNeedElec(query.getOutput_current());
                TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
                chargingGun.setChargingPower(divide);
                chargingGun.setSoc(query.getSoc());
                chargingGunClient.updateChargingGunById(chargingGun);
            }
            chargingOrder.setElectricity(query.getCharging_degree());
            chargingOrder.setTotalElectricity(new BigDecimal(100 - query.getSoc()));
            this.updateById(chargingOrder);
        }
    }
@@ -1946,67 +1729,12 @@
    @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);
        TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, orderCode));
        TChargingOrder chargingOrder = new TChargingOrder();
        chargingOrder.setId(order.getId());
        chargingOrder.setAppUserId(order.getAppUserId());
        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");
            TAppUser appUser1 = appUserClient.getUserById(appUser.getInviteUserId()).getData();
            if(null != appUser1.getVipId()){
                TVip vip = vipClient.getInfo1(appUser1.getVipId()).getData();
                Integer doubleIntegration = vip.getDoubleIntegration();
                //双倍积分
                if(1 == doubleIntegration){
                    num1 *= 2;
                }
            }
            GetInviteUser query = new GetInviteUser();
            query.setAppUserId(appUser1.getId());
            query.setBeInvitedAppUserId(chargingOrder.getAppUserId());
            TInviteUser inviteUser = inviteUserClient.getInviteUser(query).getData();
            if(null == inviteUser){
                inviteUser = new TInviteUser();
                inviteUser.setAppUserId(appUser1.getId());
                inviteUser.setBeInvitedAppUserId(chargingOrder.getAppUserId());
                inviteUser.setAward(num1);
                inviteUser.setCreateTime(LocalDateTime.now());
                inviteUserClient.saveInviteUser(inviteUser);
            }else{
                inviteUser.setAward(num1);
                inviteUserClient.updateInviteUser(inviteUser);
            }
            TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange();
            String code = Double.valueOf(Math.random() * 1000).intValue() + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
            appUserIntegralChange.setCode(code);
            appUserIntegralChange.setAppUserId(appUser1.getId());
            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);
        }
    }
    /**
@@ -2017,7 +1745,297 @@
    public void excelEndCharge(String orderCode) {
        endCharge(orderCode, 0);
    }
    /**
     * 停止充电返回账单后计算费用
     * @param vo
     */
    @Override
    @GlobalTransactional(rollbackFor = Exception.class)
    public void endChargeBillingCharge(TransactionRecordMessageVO vo) {
        TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, vo.getTransaction_serial_number()));
        Integer status = chargingOrder.getStatus();
        if(status == 4 || status == 5){
            return;
        }
        //计算用户标签
        editUserTag(chargingOrder);
        //用户推荐奖励
        referralReward(chargingOrder);
        //如果使用优惠券需要判断优惠券是否满足使用条件
        //根据实际的充电金额计算退款金额   退回费用=(原金额/总金额)*(总金额-实际充电金额)
        //退款金额=优惠券金额+剩余充电金额
        BigDecimal periodElectricPrice_total = BigDecimal.ZERO;
        BigDecimal periodServicePrice_total = BigDecimal.ZERO;
        BigDecimal total = BigDecimal.ZERO;
        //获取订单的计费策略
        List<AccountingStrategyDetailOrder> accountingStrategyDetailOrderList = accountingStrategyDetailOrderClient.getAllAccountingStrategyDetailOrder(chargingOrder.getId()).getData();
        AccountingStrategyDetailOrder accountingStrategyDetailOrder = accountingStrategyDetailOrderList.get(accountingStrategyDetailOrderList.size() - 1);
        if(accountingStrategyDetailOrder.getEndTime().equals("00:00")){
            accountingStrategyDetailOrder.setEndTime("24:00");
        }
        chargingOrderAccountingStrategyService.remove(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()));
        for (int i = 0; i < 12; i++) {
            Class<? extends TransactionRecordMessageVO> clazz = vo.getClass();
            try {
                Object invoke1 = clazz.getMethod("getTime" + (i + 1)).invoke(vo);
                if(null != invoke1){
                    String[] split = invoke1.toString().split("-");
                    AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.stream().filter(s -> s.getStartTime().equals(split[0]) && s.getEndTime().equals(split[1])).findFirst().get();
                    //阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段)
                    Object invoke = null;
                    switch (strategyDetail.getType()){
                        case 1:
                            //充电度数
                            invoke = clazz.getMethod("getSharp_peak_charge" + (i + 1)).invoke(vo);
                            break;
                        case 2:
                            //充电度数
                            invoke = clazz.getMethod("getPeak_charge" + (i + 1)).invoke(vo);
                            break;
                        case 3:
                            //充电度数
                            invoke = clazz.getMethod("getFlat_peak_charge" + (i + 1)).invoke(vo);
                            break;
                        case 4:
                            //充电度数
                            invoke = clazz.getMethod("getLow_peak_charge" + (i + 1)).invoke(vo);
                            break;
                    }
                    if(null == invoke || invoke.toString().equals("0")){
                        continue;
                    }
                    BigDecimal Sharp_peak_charge = new BigDecimal(invoke.toString());
                    TChargingOrderAccountingStrategy chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy();
                    chargingOrderAccountingStrategy.setChargingOrderId(chargingOrder.getId());
                    chargingOrderAccountingStrategy.setAccountingStrategyDetailId(strategyDetail.getId());
                    chargingOrderAccountingStrategy.setType(strategyDetail.getType());
                    chargingOrderAccountingStrategy.setStartTime(chargingOrder.getStartTime().format(DateTimeFormatter.ofPattern("HH:mm")));
                    chargingOrderAccountingStrategy.setEndTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm")));
                    chargingOrderAccountingStrategy.setElectrovalence(strategyDetail.getElectrovalence());
                    chargingOrderAccountingStrategy.setServiceCharge(strategyDetail.getServiceCharge());
                    chargingOrderAccountingStrategy.setCostServiceCharge(strategyDetail.getCostServiceCharge());
                    //已充电总度数
                    BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(Sharp_peak_charge);
                    BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(Sharp_peak_charge);
                    BigDecimal serviceCharge = originalServicePrice;
                    //计算优惠金额
                    if(null != chargingOrder.getVipDiscount()){
                        serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount().divide(new BigDecimal(10)));
                    }
                    chargingOrderAccountingStrategy.setChargingCapacity(Sharp_peak_charge);
                    chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc);
                    chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge);
                    chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice);
                    chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now());
                    chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy);
                    BigDecimal periodElectricPrice = chargingOrderAccountingStrategy.getPeriodElectricPrice();
                    BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodOriginalServicePrice();
                    periodElectricPrice_total = periodElectricPrice_total.add(periodElectricPrice);
                    periodServicePrice_total = periodServicePrice_total.add(periodServicePrice);
                    total = total.add(periodElectricPrice).add(periodServicePrice);
                }
            } catch (IllegalAccessException e) {
                throw new RuntimeException(e);
            } catch (InvocationTargetException e) {
                throw new RuntimeException(e);
            } catch (NoSuchMethodException e) {
                throw new RuntimeException(e);
            }
        }
        //原金额
        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 orderAmount = BigDecimal.valueOf(total.doubleValue());
        BigDecimal payAmount = BigDecimal.valueOf(total.doubleValue());
        //折扣金额
        BigDecimal discountAmount = BigDecimal.ZERO;
        if(null != chargingOrder.getVipDiscount()){
            //服务费折扣
            discountAmount = periodServicePrice_total.multiply((new BigDecimal(10).subtract(chargingOrder.getVipDiscount())).divide(new BigDecimal(10)));
            TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
            if(null != appUser.getVipId()){
                //判断会员是否还有充电优惠次数
                GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail();
                getAppUserVipDetail.setAppUserId(chargingOrder.getAppUserId());
                getAppUserVipDetail.setVipId(appUser.getVipId());
                TAppUserVipDetail data = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData();
                if(null != data && data.getChargeNum() > 0){
                    data.setChargeNum(data.getChargeNum() - 1);
                    appUserVipDetailClient.updateAppUserVipDetail(data);
                }
                TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
                BigDecimal maximumDeduction = vip.getMaximumDeduction();
                //普通会员有最高优惠限制
                if(vip.getType() == 1 && discountAmount.compareTo(maximumDeduction) > 0){
                    discountAmount = maximumDeduction;
                }
            }
            payAmount = payAmount.subtract(discountAmount);
        }
        TChargingOrder order = new TChargingOrder();
        order.setId(chargingOrder.getId());
        order.setAppUserId(chargingOrder.getAppUserId());
        if(null != chargingOrder.getEndMode() && chargingOrder.getEndMode() == 2){
            order.setEndMode(refundAmount.compareTo(BigDecimal.ZERO) > 0 ? 2 : 3);
        }
        if(null == chargingOrder.getEndMode()){
            order.setEndMode(1);
        }
        order.setResidualAmount(rechargeAmount.subtract(total));
        order.setStartTime(LocalDateTime.parse(vo.getStart_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS")));
        order.setEndTime(LocalDateTime.parse(vo.getEnd_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS")));
        order.setStatus(5);
        order.setOrderAmount(orderAmount.setScale(2, RoundingMode.DOWN));
        order.setVipDiscountAmount(discountAmount.setScale(2, RoundingMode.DOWN));
        order.setServiceCharge(periodServicePrice_total.setScale(2, RoundingMode.DOWN));
        order.setElectrovalence(periodElectricPrice_total.setScale(2, RoundingMode.DOWN));
        order.setChargingCapacity(vo.getTotal_electricity());
        //计算优惠券
        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(payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0){
                    refundAmount = refundAmount.add(tCoupon.getDiscountAmount());
                    order.setCouponDiscountAmount(tCoupon.getDiscountAmount());
                    payAmount = payAmount.subtract(tCoupon.getDiscountAmount());
                }else{
                    order.setAppCouponId(null);
                    order.setCouponDiscountAmount(BigDecimal.ZERO);
                    appCouponClient.refund(chargingOrder.getAppCouponId().toString());
                }
            }
            if(2 == preferentialMode){
                //抵扣
                if(payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0){
                    //折扣金额
                    BigDecimal divide = payAmount.multiply(new BigDecimal(10).subtract(tCoupon.getDiscount())).divide(new BigDecimal(10));
                    divide = divide.compareTo(tCoupon.getMaximumDiscountAmount()) > 0 ? tCoupon.getMaximumDiscountAmount() : divide;
                    refundAmount = refundAmount.add(divide);
                    order.setCouponDiscountAmount(divide);
                    payAmount = payAmount.subtract(divide);
                }else{
                    order.setAppCouponId(null);
                    order.setCouponDiscountAmount(BigDecimal.ZERO);
                    appCouponClient.refund(chargingOrder.getAppCouponId().toString());
                }
            }
        }
        order.setPaymentAmount(payAmount.setScale(2, RoundingMode.DOWN));
        order.setRefundAmount(refundAmount.setScale(2, RoundingMode.DOWN));
        order.setRefundStatus(1);
        this.updateById(order);
        chargingOrder = this.getById(order.getId());
        // 将枪状态重置为空闲
        TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
        chargingGun.setStatus(2);
        chargingGun.setChargingPower(BigDecimal.ZERO);
        chargingGun.setSoc(0);
        chargingGunClient.updateChargingGunById(chargingGun);
        //添加积分
        TIntegralRule integralRule = integralRuleClient.getSet().getData();
        if(null != integralRule){
            TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
            Integer num1 = JSON.parseObject(integralRule.getChargeCredit()).getInteger("num1");
            Integer integral = payAmount.multiply(new BigDecimal(num1)).intValue();
            if(null != appUser.getVipId()){
                TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
                Integer doubleIntegration = vip.getDoubleIntegration();
                //双倍积分
                if(1 == doubleIntegration){
                    integral *= 2;
                }
            }
            TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange();
            appUserIntegralChange.setAppUserId(appUser.getId());
            appUserIntegralChange.setChangeType(2);
            appUserIntegralChange.setHistoricalIntegral(appUser.getPoints());
            appUser.setPoints(appUser.getPoints() + integral);
            appUserIntegralChange.setCurrentIntegral(appUser.getPoints());
            appUserIntegralChange.setCreateTime(LocalDateTime.now());
            appUserIntegralChange.setOrderCode(chargingOrder.getCode());
            appUserClient.updateAppUser(appUser);
            appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange);
        }
        //开始构建退款费用
        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()) + (Double.valueOf(Math.random() * 1000).intValue()));
            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("/payment/wx/refund/notify");
                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(refundAmount.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);
                    }
                }
            }
        }
    }
    @Override
    public List<Map<String, Object>> getByDate(List<Long> chargingOrderIds) {
        return this.baseMapper.getByDate(chargingOrderIds);
@@ -2148,10 +2166,10 @@
                    RefundResp resp = aliPaymentClient.refund(dto).getData();
                    if(null != resp){
                        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE");
                        tChargingOrder.setRefundStatus(2);
                        tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
                        chargingOrderRefund.setRefundStatus(2);
                        chargingOrderRefund.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
                        this.baseMapper.updateById(tChargingOrder);
                            chargingOrderRefundService.save(chargingOrderRefund);
                        chargingOrderRefundService.save(chargingOrderRefund);
                    }
                }
@@ -2461,9 +2479,13 @@
            if (!data1.isEmpty()){
                tSettlementConfirm.setSiteName(data1.get(0).getName());
            }
            meteringElectronic = meteringElectronic.add(tSettlementConfirm.getMeteringElectronic());
            chargingElectronic = chargingElectronic.add(tSettlementConfirm.getChargingElectronic());
            lossElectronic = lossElectronic.add(tSettlementConfirm.getLossElectronic());
            if (tSettlementConfirm.getMeteringElectronic()!=null){
                meteringElectronic = meteringElectronic.add(tSettlementConfirm.getMeteringElectronic());
                chargingElectronic = chargingElectronic.add(tSettlementConfirm.getChargingElectronic());
            }
            if (tSettlementConfirm.getLossElectronic()!=null){
                lossElectronic = lossElectronic.add(tSettlementConfirm.getLossElectronic());
            }
            income = income.add(tSettlementConfirm.getIncome());
            venue = venue.add(tSettlementConfirm.getVenue());
            metering = metering.add(tSettlementConfirm.getMetering());
@@ -2527,13 +2549,22 @@
                settlementConfirm.setIncome(settlementConfirm.getElectrovalence().add(settlementConfirm.getServiceCharge()));
                if (tSettlementConfirm.getSiteId().equals(settlementConfirm.getSiteId())){
                    // 电站相同比较收入涨幅跌幅
                    BigDecimal subtract = tSettlementConfirm.getIncome().subtract(settlementConfirm.getIncome()).divide(tSettlementConfirm.getIncome()).setScale(2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100"));
                    tSettlementConfirm.setIncomePercentage(subtract+"%");
                    if (tSettlementConfirm.getIncome().compareTo(BigDecimal.ZERO)>0){
                        BigDecimal subtract = tSettlementConfirm.getIncome().subtract(settlementConfirm.getIncome()).divide(tSettlementConfirm.getIncome()).setScale(2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100"));
                        tSettlementConfirm.setIncomePercentage(subtract+"%");
                    }else {
                        tSettlementConfirm.setIncomePercentage("100"+"%");
                    }
                    // 比较总利润 收入合计-成本合计
                    BigDecimal subtract1 = tSettlementConfirm.getIncome().subtract(tSettlementConfirm.getCost());
                    BigDecimal subtract2 = settlementConfirm.getIncome().subtract(settlementConfirm.getCost());
                    tSettlementConfirm.setTotalPercentage(subtract1.subtract(subtract2).divide(subtract2).setScale(2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100"))+"%");
                }
                    BigDecimal bigDecimal1 = subtract1.subtract(subtract2)
                            .divide(subtract2, 2, RoundingMode.HALF_DOWN)
                            .multiply(new BigDecimal("100"))
                            .setScale(2, RoundingMode.HALF_DOWN);
                    tSettlementConfirm.setTotalPercentage(bigDecimal1+"%");                }
                beforeCost = beforeCost.add(settlementConfirm.getCost());
                beforeIncome = beforeIncome.add(settlementConfirm.getIncome());
@@ -2583,7 +2614,7 @@
        if (subtract2.compareTo(new BigDecimal("0")) == 0){
            tSettlementConfirm.setTotalPercentage(0+"%");
        }else{
            tSettlementConfirm.setTotalPercentage(subtract1.subtract(subtract2).divide(subtract2).setScale(2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100"))+"%");
            tSettlementConfirm.setTotalPercentage(subtract1.subtract(subtract2).divide(subtract2,2, RoundingMode.HALF_DOWN).setScale(2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100"))+"%");
        }
        tSettlementConfirm.setElectronicRefund(0);
        // 查询上次汇报数据 进行比对涨幅跌幅
@@ -2662,12 +2693,33 @@
    public List<Map<String, Object>> needElec1(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
        return this.baseMapper.needElec1(siteIds,statisticsQueryDto);
    }
    public static void main(String[] args) {
//        String format = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH:mm:ss"));
//        String format1 = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH:mm:ss"));
//        System.err.println(format+"至"+format1);
//        LocalDateTime parse = LocalDateTime.parse("2024-01-12 00:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
//        System.err.println(parse.format(DateTimeFormatter.ofPattern("yyyy-dd")));
    /**
     * 获取充电结束页面详情
     * @param id
     * @return
     */
    @Override
    public EndOfChargePageInfo getEndOfChargePageInfo(String id) {
        EndOfChargePageInfo info = new EndOfChargePageInfo();
        TChargingOrder chargingOrder = this.getById(id);
        info.setId(id);
        info.setCode(chargingOrder.getCode());
        info.setPaymentAmount(chargingOrder.getPaymentAmount());
        info.setCouponDiscountAmount(chargingOrder.getCouponDiscountAmount());
        TAppUserIntegralChange integralChange = appUserIntegralChangeClient.getTAppUserIntegralChangeByOrderCode(chargingOrder.getCode()).getData();
        info.setIntegral(null == integralChange ? 0 : integralChange.getCurrentIntegral() - integralChange.getHistoricalIntegral());
        info.setRechargeAmount(chargingOrder.getRechargeAmount());
        info.setRefundAmount(chargingOrder.getRefundAmount());
        LocalDateTime startTime = chargingOrder.getStartTime();
        LocalDateTime endTime = chargingOrder.getEndTime();
        info.setStartDay(startTime.format(DateTimeFormatter.ofPattern("MM月dd日")) + " 周" + startTime.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.SIMPLIFIED_CHINESE));
        info.setStartHour(startTime.format(DateTimeFormatter.ofPattern("HH:mm")));
        info.setEndDay(endTime.format(DateTimeFormatter.ofPattern("MM月dd日")) + " 周" + endTime.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.SIMPLIFIED_CHINESE));
        info.setEndHour(endTime.format(DateTimeFormatter.ofPattern("HH:mm")));
        int hour = endTime.getHour() - startTime.getHour();
        int second = endTime.getMinute() - startTime.getMinute();
        info.setDuration(0 == hour ? String.format("%s分钟", second) : String.format("%s小时%s分钟", hour, second));
        return info;
    }
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderEvaluateServiceImpl.java
@@ -2,6 +2,8 @@
import cn.hutool.db.DaoTemplate;
import com.alibaba.fastjson2.JSON;
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;
@@ -17,6 +19,7 @@
import com.ruoyi.chargingPile.api.model.Site;
import com.ruoyi.chargingPile.api.vo.TAccountingStrategyVO;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.HttpUtils;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.PageInfo;
@@ -120,12 +123,18 @@
        List<Integer> tagIds = tagList.stream().map(TEvaluationTagVO::getId).collect(Collectors.toList());
        // 统计标签使用数量
        List<TEvaluationTagVO> counts = orderEvaluateTagMapper.getCountByTagIds(tagIds);
        List<Integer> ids = counts.stream().map(TEvaluationTagVO::getId).collect(Collectors.toList());
        tagList.forEach(tag -> {
            counts.forEach(count -> {
                if (tag.getId().equals(count.getId())) {
                    tag.setTagCount(count.getTagCount());
                }
            });
            if(ids.contains(tag.getId())){
                counts.forEach(count -> {
                    if (tag.getId().equals(count.getId())) {
                        tag.setTagCount(count.getTagCount());
                    }
                });
            }else{
                tag.setTagCount(0);
            }
        });
        tagList = tagList.stream().sorted(Comparator.comparing(TEvaluationTagVO::getTagCount).reversed()).collect(Collectors.toList());
        // 统计有图,好评,中差评数量
@@ -181,7 +190,7 @@
            siteDetailEvaluateVO.setOrderEvaluateVOS(tChargingOrders);
            // 统计好评率
            long goodCount = tChargingOrders.stream().filter(orderEvaluateVO -> orderEvaluateVO.getMark()>=4).count();
            BigDecimal reviewRate = new BigDecimal(goodCount).divide(new BigDecimal(tChargingOrders.size())).setScale(2, BigDecimal.ROUND_HALF_UP);
            BigDecimal reviewRate = new BigDecimal(goodCount).divide(new BigDecimal(tChargingOrders.size()),2, BigDecimal.ROUND_HALF_UP).setScale(2, BigDecimal.ROUND_HALF_UP);
            siteDetailEvaluateVO.setReviewRate(reviewRate);
            siteDetailEvaluateVO.setEvaluateCount(tChargingOrders.size());
            siteDetailEvaluateVO.setOrderEvaluateVOS(tChargingOrders.stream().limit(3).collect(Collectors.toList()));
@@ -221,9 +230,11 @@
        List<GetOrderEvaluatePageListDTO> list = this.baseMapper.getPageList(pageList, evaluationTagIds, pageInfo);
        for (GetOrderEvaluatePageListDTO dto : list) {
            TAppUser appUser = appUserClient.getUserById(dto.getAppUserId()).getData();
            dto.setAvatar(appUser.getAvatar());
            String phone = appUser.getPhone();
            dto.setPhone(phone.substring(0, 3) + "****" + phone.substring(6));
            if(null != appUser){
                dto.setAvatar(appUser.getAvatar());
                String phone = appUser.getPhone();
                dto.setPhone(phone.substring(0, 3) + "****" + phone.substring(6));
            }
            Site site = siteClient.getSiteByIds(Arrays.asList(dto.getSiteId())).getData().get(0);
            dto.setSiteName(site.getName());
            List<TOrderEvaluateTag> tOrderEvaluateTags = orderEvaluateTagMapper.selectList(new LambdaQueryWrapper<TOrderEvaluateTag>().eq(TOrderEvaluateTag::getOrderEvaluateId, dto.getId()));
@@ -259,6 +270,39 @@
            TChargingOrder chargingOrder = chargingOrderService.getById(query.getOrderId());
            orderEvaluate.setAppUserCarId(chargingOrder.getAppUserCarId());
        }
        TAppUser appUser = appUserClient.getUserById(userid).getData();
        //检测敏感词
        String content = orderEvaluate.getContent();
        if(StringUtils.isNotEmpty(content)){
            String token = appUserClient.getWXToken().getData();
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("content", content);
            jsonObject.put("version", 2);
            jsonObject.put("scene", 2);
            jsonObject.put("openid", appUser.getWxOpenid());
            String post = HttpUtils.post("https://api.weixin.qq.com/wxa/msg_sec_check?access_token=" + token, jsonObject.toString());
            JSONObject object = JSONObject.parseObject(post);
            Integer errcode = object.getInteger("errcode");
            if(0 != errcode){
                throw new RuntimeException(object.getString("errmsg"));
            }
            JSONArray detail = object.getJSONArray("detail");
            for (int i = 0; i < detail.size(); i++) {
                JSONObject jsonObject1 = detail.getJSONObject(i);
                Integer errcode1 = jsonObject1.getInteger("errcode");
                if(0 == errcode1){
                    String suggest = jsonObject1.getString("suggest");
                    Integer label = jsonObject1.getInteger("label");
                    String keyword = jsonObject1.getString("keyword");
                    Integer prob = jsonObject1.getInteger("prob");
                    if(("risky".equals(suggest) || "review".equals(suggest)) && 100 != label && StringUtils.isNotEmpty(keyword) && 80 <= prob){
                        return AjaxResult.error("评价包含违规内容,请重新评价!");
                    }
                }
            }
        }
        orderEvaluate.setContent(content);
        this.save(orderEvaluate);
    
        List<Integer> tagIds = query.getTagIds();
@@ -276,7 +320,6 @@
            //积分
            Integer num1 = JSON.parseObject(credit).getInteger("num1");
            if(null != num1 && 0 < num1){
                TAppUser appUser = appUserClient.getUserById(userid).getData();
                if(null != appUser.getVipId()){
                    TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
                    Integer doubleIntegration = vip.getDoubleIntegration();
@@ -296,6 +339,7 @@
                appUserIntegralChange.setHistoricalIntegral(points);
                appUserIntegralChange.setCurrentIntegral(points + num1);
                appUserIntegralChange.setCreateTime(LocalDateTime.now());
                appUserIntegralChange.setOrderCode(orderEvaluate.getId().toString());
                appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange);
            }
        }
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java
@@ -127,15 +127,15 @@
                        coupon = coupon.add(tActivityStatisticslVO.getCouponDiscountAmount());
                        stringBuilder.append("优惠券抵扣").append("+");
                }
                    if (tActivityStatisticslVO.getVipDiscountAmount()!=null
                            &&
                            (tActivityStatisticslVO.getCouponDiscountAmount().compareTo(BigDecimal.ZERO)>0)){
                    if (tActivityStatisticslVO.getVipDiscountAmount()!=null &&(tActivityStatisticslVO.getVipDiscountAmount().compareTo(BigDecimal.ZERO)>0)){
                        discount = discount.add(tActivityStatisticslVO.getVipDiscountAmount());
                        stringBuilder.append("会员抵扣").append("+");
                    }
                    stringBuilder.deleteCharAt(stringBuilder.length()-1);
                    tActivityStatisticslVO.setType(stringBuilder.toString());
                    tActivityStatisticslVO.setTime(simpleDateFormat.format(tActivityStatisticslVO.getCreateTime()));
                    if (stringBuilder.length()>0){
                        stringBuilder.deleteCharAt(stringBuilder.length()-1);
                        tActivityStatisticslVO.setType(stringBuilder.toString());
                    }
                    tActivityStatisticslVO.setTime(tActivityStatisticslVO.getCreateTime());
                    break;
                case 2:
                    StringBuilder stringBuilder1 = new StringBuilder();
@@ -155,7 +155,7 @@
                    }
                    stringBuilder1.deleteCharAt(stringBuilder1.length()-1);
                    tActivityStatisticslVO.setType(stringBuilder1.toString());
                    tActivityStatisticslVO.setTime(simpleDateFormat.format(tActivityStatisticslVO.getCreateTime()));
                    tActivityStatisticslVO.setTime(tActivityStatisticslVO.getCreateTime());
                    break;
                case 3:
                    // 会员订单 优惠金额大于0
@@ -165,19 +165,19 @@
                        vipActivity = vipActivity.add(tActivityStatisticslVO.getVipDiscountAmount());
                    }
                    tActivityStatisticslVO.setType("会员活动");
                    tActivityStatisticslVO.setTime(simpleDateFormat.format(tActivityStatisticslVO.getCreateTime()));
                    tActivityStatisticslVO.setTime(tActivityStatisticslVO.getCreateTime());
                    break;
                case 4:
                    // 赠送会员订单 如果支付金额为0 那么就是后台赠送的会员
                    if (tActivityStatisticslVO.getPaymentAmount().compareTo(BigDecimal.ZERO)==0){
                        grantVip = grantVip.add(tActivityStatisticslVO.getOrderAmount());
                        tActivityStatisticslVO.setType("赠送会员");
                        tActivityStatisticslVO.setTime(simpleDateFormat.format(tActivityStatisticslVO.getCreateTime()));
                        tActivityStatisticslVO.setTime(tActivityStatisticslVO.getCreateTime());
                    }else{
                        // 赠送
                        grantVip = grantVip.add(tActivityStatisticslVO.getVipDiscountAmount());
                        tActivityStatisticslVO.setType("赠送会员");
                        tActivityStatisticslVO.setTime(simpleDateFormat.format(tActivityStatisticslVO.getCreateTime()));
                        tActivityStatisticslVO.setTime(tActivityStatisticslVO.getCreateTime());
                    }
                    break;
            }
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/EndOfChargePageInfo.java
New file
@@ -0,0 +1,40 @@
package com.ruoyi.order.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
 * @author zhibing.pu
 * @Date 2024/10/12 9:20
 */
@Data
@ApiModel
public class EndOfChargePageInfo {
    @ApiModelProperty("订单id")
    private String id;
    @ApiModelProperty("充电金额")
    private BigDecimal paymentAmount;
    @ApiModelProperty("优惠金额")
    private BigDecimal couponDiscountAmount;
    @ApiModelProperty("积分")
    private Integer integral;
    @ApiModelProperty("订单编号")
    private String code;
    @ApiModelProperty("预充金额")
    private BigDecimal rechargeAmount;
    @ApiModelProperty("退还金额")
    private BigDecimal refundAmount;
    @ApiModelProperty("开始日期")
    private String startDay;
    @ApiModelProperty("开始时间")
    private String startHour;
    @ApiModelProperty("结束日期")
    private String endDay;
    @ApiModelProperty("结束时间")
    private String endHour;
    @ApiModelProperty("充电时长")
    private String duration;
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/ReplyEvaluationVO.java
New file
@@ -0,0 +1,13 @@
package com.ruoyi.order.vo;
import lombok.Data;
/**
 * @author zhibing.pu
 * @Date 2024/10/10 11:40
 */
@Data
public class ReplyEvaluationVO {
    private Long id;
    private String reply;
}
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingBillMapper.xml
@@ -6,7 +6,7 @@
    <select id="chargingBillList" resultType="com.ruoyi.order.api.vo.ChargingBillListVO">
    select t1.* from t_charging_bill t1
    where 1=1
        <if test="req.type != null ">
        <if test="req.type != null and req.type!=0">
            and t1.type = #{req.type}
        </if>
      <if test="req.state != null ">
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
@@ -62,7 +62,7 @@
        </if>
    </select>
    <select id="getNoInvoicedOrder" resultMap="BaseResultMap">
        select * from t_charging_order where del_flag = 0 and status = 5 and recharge_payment_status = 2 and payment_amount is null and app_user_id = #{appUserId}
        select * from t_charging_order where del_flag = 0 and status = 5 and recharge_payment_status = 2 and payment_amount is not null and app_user_id = #{appUserId}
        <if test="null != month and '' != month">
            and DATE_FORMAT(end_time, '%Y-%m') = #{month}
        </if>
@@ -292,20 +292,23 @@
    </select>
    <select id="chargingOrderGroup" resultType="com.ruoyi.common.core.dto.ChargingOrderGroup">
        SELECT SUM(charging_capacity) ,site_id
        FROM t_charging_order
        GROUP BY site_id
        SELECT SUM(tc.charging_capacity) as  charging_capacity,tc.site_id
        FROM t_charging_order tc
        left join `charging_pile_service`.`t_site` ts on tc.site_id = ts.id
        <where>
            <if test="chargingPercentProvinceDto.date1 != null">
                AND create_time &gt;= #{chargingPercentProvinceDto.date1}
                AND tc.create_time &gt;= #{chargingPercentProvinceDto.date1}
            </if>
            <if test="chargingPercentProvinceDto.date2 != null">
                AND create_time &lt;= #{chargingPercentProvinceDto.date2}
                AND tc.create_time &lt;= #{chargingPercentProvinceDto.date2}
            </if>
            <if test="chargingPercentProvinceDto.provinceCode != null">
                AND province_code = #{chargingPercentProvinceDto.provinceCode}
                AND ts.province_code = #{chargingPercentProvinceDto.provinceCode}
            </if>
        </where>
        GROUP BY site_id
    </select>
@@ -363,7 +366,7 @@
    </select>
    <select id="countAll" resultType="java.util.Map">
        select sum(electrovalence),sum(service_charge),sum(commission_amount),sum(sharing_amount)
        select sum(electrovalence) as electrovalence,sum(service_charge) as service_charge,sum(commission_amount) as commission_amount,sum(sharing_amount) as sharing_amount
        from t_charging_order
        where create_time &gt;= #{sixBefore} and del_flag = 0 and recharge_payment_status = 2 and  ISNULL(refund_status)
    </select>
@@ -391,6 +394,7 @@
            DATE_FORMAT( create_time, '%Y-%m-%d %H' ) as time,
    SUM(service_charge) as servicecharge,
    SUM(electrovalence) as electrovalence,
    SUM(payment_amount) AS paymentAmount,
    count(1) as orderCount
        FROM
            t_charging_order
@@ -414,6 +418,7 @@
        DATE_FORMAT( create_time, '%Y-%m-%d' ) as time,
        SUM(service_charge) as servicecharge,
        SUM(electrovalence) as electrovalence,
        SUM(payment_amount) AS paymentAmount,
        count(1) as orderCount
        FROM
        t_charging_order
@@ -437,6 +442,7 @@
        DATE_FORMAT( create_time, '%Y-%m-%d' ) as time,
        SUM(service_charge) as servicecharge,
        SUM(electrovalence) as electrovalence,
        SUM(payment_amount) AS paymentAmount,
        count(1) as orderCount
        FROM
        t_charging_order
@@ -460,11 +466,13 @@
        DATE_FORMAT( create_time, '%Y-%m-%d' ) as time,
        SUM(service_charge) as servicecharge,
        SUM(electrovalence) as electrovalence,
        SUM(payment_amount) AS paymentAmount,
        count(1) as orderCount
        FROM
        t_charging_order
        <where>
            del_flag = 0 and recharge_payment_status = 2 and  ISNULL(refund_status) and YEAR(createTime) = YEAR(NOW())
            del_flag = 0 and recharge_payment_status = 2 and  ISNULL(refund_status) and YEAR(create_time) = YEAR(NOW())
            <if test="chargingOrderIds != null and chargingOrderIds.size() > 0">
                AND id IN
                <foreach collection="chargingOrderIds" item="chargingOrderId" open="(" separator="," close=")">
@@ -505,7 +513,7 @@
    <select id="queryPower" resultType="java.util.Map">
        SELECT
            'today' AS data_type,
            DATE_FORMAT(create_time, '%Y-%m-%d %H') AS TIME,
            DATE_FORMAT(create_time, '%H') AS TIME,
    SUM(power) AS power
        FROM
            t_charging_order
@@ -527,7 +535,7 @@
        SELECT
            'yesterday' AS data_type,
            DATE_FORMAT(create_time, '%Y-%m-%d %H') AS TIME,
            DATE_FORMAT(create_time, '%H') AS TIME,
    SUM(power) AS power
        FROM
            t_charging_order
@@ -633,19 +641,19 @@
            charging_pile_account.t_app_user
        WHERE
            del_flag = 0
        <if test="statisticsQueryDto.dayType =1 ">
        <if test="statisticsQueryDto.dayType ==1 ">
            AND DATE(create_time) = CURDATE()
        </if>
        <if test="statisticsQueryDto.dayType =2 ">
        <if test="statisticsQueryDto.dayType == 2 ">
            AND WEEKOFYEAR(create_time) = WEEKOFYEAR(CURDATE())
        </if>
        <if test="statisticsQueryDto.dayType =3 ">
        <if test="statisticsQueryDto.dayType == 3 ">
            AND MONTH(create_time) = MONTH(CURDATE())
        </if>
        <if test="statisticsQueryDto.dayType =4">
        <if test="statisticsQueryDto.dayType == 4">
            AND YEAR(create_time) = YEAR(CURDATE())
        </if>
        <if test="statisticsQueryDto.dayType =5">
        <if test="statisticsQueryDto.dayType == 5">
            <if test="statisticsQueryDto.startTime != null">
                AND create_time >= #{statisticsQueryDto.startTime}
            </if>
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderEvaluateMapper.xml
@@ -94,7 +94,7 @@
    
    <select id="getPageList" resultType="com.ruoyi.order.dto.GetOrderEvaluatePageListDTO">
        select
        CAST(a.id AS CHAR) as id,
        a.id,
        b.`code`,
        a.mark,
        b.site_id as siteId,
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderEvaluateTagMapper.xml
@@ -14,7 +14,7 @@
        id, order_evaluate_id, evaluation_tag_id
    </sql>
    <select id="getCountByTagIds" resultType="com.ruoyi.other.api.vo.TEvaluationTagVO">
        SELECT  evaluation_tag_id,count(id) AS tagCount FROM t_order_evaluate_tag
        SELECT  evaluation_tag_id as id,count(id) AS tagCount FROM t_order_evaluate_tag
        <where> 
             <if test="tagIds != null and tagIds.size() > 0">
                AND evaluation_tag_id IN
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TVipOrderMapper.xml
@@ -63,7 +63,7 @@
        t_vip_order
        <where>
            del_flag = 0 AND
            payment_status = 2 AND
            payment_status = 2
            <if test="sixBefore != null">
                AND create_time &gt; #{sixBefore}
            </if>
@@ -72,7 +72,7 @@
        LEFT JOIN `charging_pile_other`.`t_vip` tp on  subquery.vip_id = tp.id
        GROUP BY
        DATE_FORMAT(subquery.create_time, '%Y-%m'),
        tp.`name`;
        tp.`name`
    </select>
ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/RuoYiOrderApplicationTests.java
@@ -1,8 +1,25 @@
package com.ruoyi.order;
import com.alibaba.fastjson2.JSON;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.order.dto.MyChargingOrderInfo;
import com.ruoyi.order.service.TChargingOrderService;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.io.PrintWriter;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = RuoYiOrderApplication.class)
public class RuoYiOrderApplicationTests {
    @Resource
    private TChargingOrderService chargingOrderService;
    @Test
    public void test(){
        MyChargingOrderInfo myChargingOrderInfo = chargingOrderService.getMyChargingOrderInfo("1846484071567437825");
        System.err.println(JSON.toJSONString(myChargingOrderInfo));
    }
}
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/TEvaluationTagMapper.xml
@@ -26,7 +26,7 @@
    
    
    <select id="pageList" resultMap="BaseResultMap">
    <select id="pageList" resultType="com.ruoyi.other.api.domain.TEvaluationTag">
        select * from t_evaluation_tag where del_flag = 0
        <if test="null != name and '' != name">
            and name like CONCAT('%', #{name}, '%')
ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java
@@ -123,7 +123,7 @@
     */
    @PostMapping("pay/notify")
    @ApiOperation("订单回调")
    public R<Map<String, Object>> payNotify(HttpServletRequest request) throws Exception {
    public void payNotify(HttpServletRequest request) throws Exception {
        try {
            Map<String, Object> params = wxV3Pay.verifyNotify(request, new TypeReference<Map<String, Object>>() {});
            log.info("支付回调:{}", params);
@@ -147,13 +147,10 @@
                    break;
            }
            wxV3Pay.ack();
            return R.ok(params);
        } catch (Exception e) {
            log.error("支付回调异常:{}", e, e);
            wxV3Pay.ack(false, e.getMessage());
            return R.fail("回调异常");
        }
    }
    
    /**
@@ -175,7 +172,7 @@
     * 退款回调
     */
    @PostMapping("refund/notify")
    public R<WxRefundNotifyResp> refundNotify(HttpServletRequest request) throws IOException {
    public void refundNotify(HttpServletRequest request) throws IOException {
        try {
            Map<String, Object> params = wxV3Pay.verifyNotify(request, new TypeReference<Map<String, Object>>() {
            });
@@ -219,14 +216,13 @@
                resp.setRefund_id(refund_id);
                resp.setSuccess_time(success_time);
                wxV3Pay.ack();
                return R.ok(resp);
            } else {
                wxV3Pay.ack(false, "不是成功的退款状态");
            }
        } catch (Exception e) {
            e.printStackTrace();
            wxV3Pay.ack(false, e.getMessage());
        }
        return R.fail();
    }
    
    /**
ruoyi-service/ruoyi-payment/src/main/resources/bootstrap.yml
@@ -1,7 +1,3 @@
server:
  port: 9500
  tomcat:
    basedir: /data/tomcat
# Spring
spring:
  application:
@@ -13,7 +9,6 @@
  profiles:
    # 环境配置
    active: dev
#    active: prod
---
spring:
  config:
@@ -42,7 +37,10 @@
        # 共享配置
        shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
---
seata:
  enabled: true
  application-id: ${spring.application.name}
@@ -55,57 +53,36 @@
  config:
    type: nacos
    nacos:
      # 开发环境
      server-addr: 192.168.110.169:8848
      server-addr: 127.0.0.1:8848
      namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb
      group: DEFAULT_GROUP
      data-id: seata-server.properties
      username: nacos
      password: nacos
      # 生产环境
#      server-addr: 192.168.0.137:8848,192.168.0.123:8848
#      namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
#      group: DEFAULT_GROUP
#      data-id: seata-server.properties
#      username: nacos
#      password: nacos
  registry:
    type: nacos
    nacos:
      application: seata-server
      # 开发环境
      server-addr: 192.168.110.169:8848
      server-addr: 127.0.0.1:8848
      namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb
      group: DEFAULT_GROUP
      username: nacos
      password: nacos
      # 生产环境
#      server-addr: 192.168.0.137:8848,192.168.0.123:8848
#      namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
#      group: DEFAULT_GROUP
#      username: nacos
#      password: nacos
  cloud:
    nacos:
      discovery:
        # 开发环境
        server-addr: 192.168.110.169:8848 # nacos注册中心地址
        server-addr: 127.0.0.1:8848 # nacos注册中心地址
        namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb # 命名空间
        group: DEFAULT_GROUP
        application: seata-server #Nacos 中 Seata 名称
        username: nacos
        password: nacos
        # 生产环境
#        server-addr: 192.168.0.137:8848,192.168.0.123:8848
#        namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
#        group: DEFAULT_GROUP
#        application: seata-server #Nacos 中 Seata 名称
#        username: nacos
#        password: nacos
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080  #  Sentinel控制台地址
      eager: true
---
spring:
  config:
@@ -115,18 +92,14 @@
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 192.168.0.137:8848,192.168.0.123:8848
        server-addr: 127.0.0.1:8848
        service: ${spring.application.name}
        group: DEFAULT_GROUP
        namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
        username: nacos
        password: nacos
        namespace: 3452d750-b08d-4485-a1e9-4fb0548f1fc2
      config:
        # 配置中心地址
        server-addr: 192.168.0.137:8848,192.168.0.123:8848
        namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
        username: nacos
        password: nacos
        server-addr: 127.0.0.1:8848
        namespace: 3452d750-b08d-4485-a1e9-4fb0548f1fc2
        group: DEFAULT_GROUP
        name: ${spring.application.name}
        # 配置文件格式