luodangjia
2024-10-15 a41e23347029bf69a3f59438749658252de81d2e
Merge remote-tracking branch 'origin/master'
79个文件已修改
3个文件已添加
1575 ■■■■■ 已修改文件
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-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 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/BmsInformation.java 1 ●●●● 补丁 | 查看 | 原始文档 | 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 1 ●●●● 补丁 | 查看 | 原始文档 | 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 1 ●●●● 补丁 | 查看 | 原始文档 | 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/model/AccountingStrategyDetailOrder.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TransactionRecordMessageVO.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/TEvaluationTagClient.java 2 ●●● 补丁 | 查看 | 原始文档 | 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 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java 12 ●●●● 补丁 | 查看 | 原始文档 | 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/service/impl/TAccountingStrategyDetailServiceImpl.java 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/SiteMapper.xml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java 25 ●●●●● 补丁 | 查看 | 原始文档 | 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/produce/ChargingMessageListener.java 146 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java 49 ●●●● 补丁 | 查看 | 原始文档 | 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/service/TChargingOrderService.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java 887 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderEvaluateServiceImpl.java 60 ●●●● 补丁 | 查看 | 原始文档 | 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/bootstrap.yml 1 ●●●● 补丁 | 查看 | 原始文档 | 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/test/java/com/ruoyi/order/RuoYiOrderApplicationTests.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/bootstrap.yml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/TEvaluationTagMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
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-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; // 抢号
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/BmsInformation.java
@@ -15,7 +15,6 @@
@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; // 抢号
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,7 +15,6 @@
@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;// 抢号
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
@@ -16,7 +16,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; // 抢号
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/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/vo/TransactionRecordMessageVO.java
New file
@@ -0,0 +1,49 @@
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 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;// 总电量
    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;// 物理卡号
}
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-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;
@@ -162,5 +163,16 @@
        }
        return AjaxResult.success();
    }
    /**
     * 获取微信token
     * @return
     */
    @PostMapping("/getWXToken")
    public R<String> getWXToken(){
        WxAppletTools appletTools = new WxAppletTools(wxRestTemplate, wxConfig);
        String accessToken = appletTools.getAccessToken("");
        return R.ok(accessToken);
    }
}
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java
@@ -121,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());
@@ -147,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());
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/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/resources/mapper/chargingPile/SiteMapper.xml
@@ -197,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);
@@ -442,5 +443,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/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,82 @@
                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().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 {
                    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);
                    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 +366,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);
    }
    
    
@@ -1301,8 +1317,7 @@
    }
    @Resource
    private TOrderInvoiceService invoiceService;
    @ResponseBody
    @GetMapping(value = "/work/shopOrder")
    @ApiOperation(value = "购物订单统计", tags = {"管理后台-工作台"})
@@ -1335,14 +1350,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 +1414,7 @@
     */
    @PostMapping("/endCharge")
    public void endCharge(@RequestParam("code") String code){
        log.error(code + ":-------------------充电桩自动结束充电-------------------");
        chargingOrderService.endCharge(code, 2);
    }
@@ -1404,6 +1424,7 @@
     */
    @PostMapping("/excelEndCharge")
    public void excelEndCharge(@RequestParam("code") String code){
        log.error(code + ":-------------------充电异常,停止充电-------------------");
        chargingOrderService.excelEndCharge(code);
    }
@@ -1428,4 +1449,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/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/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;
@@ -73,6 +73,8 @@
import java.time.LocalDateTime;
import java.time.ZoneOffset;
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 +99,7 @@
    @Resource
    private SiteClient siteClient;
    @Resource
    private AppUserCarClient appUserCarClient;
    @Resource
@@ -139,8 +140,7 @@
    @Resource
    private TOrderEvaluateService orderEvaluateService;
    @Resource
    private AccountingStrategyDetailClient accountingStrategyDetailClient;
@@ -557,80 +557,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 +646,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 +680,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 +731,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 +772,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 +796,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){
@@ -893,7 +893,7 @@
            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")));
            one.setRefundTime(LocalDateTime.now());
            chargingOrderRefundService.updateById(one);
        }
        return AjaxResult.success();
@@ -911,7 +911,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;
        }
@@ -969,6 +969,96 @@
        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){
                    break;
                }
                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 + ":-------------------查询远程停止充电应答-------------------");
                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);
                    }
                    continue;
                }else{
                    log.error(code1 + ":-------------------远程停止充电请求成功-------------------");
                    stop_status = true;
                }
                break;
            }
            if(stop_status){
                chargingOrder.setStatus(5);
                this.updateById(chargingOrder);
                //计算用户标签
                editUserTag(chargingOrder);
                //用户推荐奖励
                referralReward(chargingOrder);
                // 将枪状态重置为空闲
                chargingGun.setStatus(2);
                chargingGunClient.updateChargingGunById(chargingGun);
            }else{
                log.error(code1 + ":-------------------远程停止充电应答最终失败-------------------");
            }
        });
        return AjaxResult.success();
    }
    /**
     * 结束充电后处理用户标签数据
     * @param chargingOrder
     */
    public void editUserTag(TChargingOrder chargingOrder){
        //处理用户标签数据
        List<TUserTag> data = userTagClient.getAllUserTag().getData();
        //累计充电次数
@@ -1025,79 +1115,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 +1166,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 +1191,7 @@
        if(null != order && order.getStatus() != 3){
            return;
        }
        String code1 = order.getCode();
        if(0 == platformStopChargingReply.getStop_result()){
            String failure_cause = "";
@@ -1185,176 +1210,22 @@
                    break;
            }
            log.error(code1 + ":停机失败:订单号:{},失败原因:{}", order.getCode(), failure_cause);
            return;
        }else{
            order.setEndTime(LocalDateTime.now());
            order.setStatus(5);
            order.setEndMode(1);
            this.updateById(order);
            //计算用户标签
            editUserTag(order);
            //用户推荐奖励
            referralReward(order);
            // 将枪状态重置为空闲
            chargingGun.setStatus(2);
            chargingGunClient.updateChargingGunById(chargingGun);
        }
        // 将枪状态重置为空闲
        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 +1403,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 +1619,8 @@
        return chargingOrderTimeVO;
    }
//    @Override
//    public R payRefund(PayOrderRefundDto payOrderQueryDto) {
//        return null;
//    }
    @Override
    public ChargingOrderListInfoVO chargingInfo(String uid) {
@@ -1845,23 +1709,23 @@
     */
    @Override
    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()));
            TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, query.getTransaction_serial_number()));
            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.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 charging_degree = query.getCharging_degree();
                BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(charging_degree);
                BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(charging_degree);
@@ -1878,9 +1742,7 @@
                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);
@@ -1889,24 +1751,23 @@
                    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()));
                    chargingOrderAccountingStrategy.setChargingCapacity(charging_degree);
                    chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc);
                    chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge);
                    chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice);
                    chargingOrderAccountingStrategy.setEndTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm")));
                    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());
                    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 charging_degree = query.getCharging_degree();
                    BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(charging_degree);
                    BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(charging_degree);
@@ -1915,22 +1776,23 @@
                    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);
                    chargingOrderAccountingStrategy.setChargingCapacity(charging_degree);
                    chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc);
                    chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge);
                    chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice);
                    chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now());
                    chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy);
                }
            }
            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);
            BigDecimal residualAmount = chargingOrder.getRechargeAmount().subtract(t).setScale(4, RoundingMode.HALF_EVEN);
            chargingOrder.setResidualAmount(residualAmount);
            BigDecimal divide = query.getOutput_current().multiply(query.getOutput_voltage()).divide(new BigDecimal(1000));
            chargingOrder.setChargingPower(divide);
@@ -1953,60 +1815,17 @@
        }
        chargingOrder.setStatus(5);
        chargingOrder.setEndMode(endMode);
        chargingOrder.setEndTime(LocalDateTime.now());
        this.updateById(chargingOrder);
        //计算费用,处理退款
        endCharge(chargingOrder);
        // 将枪状态重置为空闲
        TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
        chargingGun.setStatus(2);
        chargingGunClient.updateChargingGunById(chargingGun);
        
        //处理推荐奖励(被推荐首单奖励)
        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);
        }
        //计算用户标签
        editUserTag(chargingOrder);
        //用户推荐奖励
        referralReward(chargingOrder);
    }
    /**
@@ -2017,7 +1836,194 @@
    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()));
        List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()));
        BigDecimal periodElectricPrice_total = BigDecimal.ZERO;
        BigDecimal periodServicePrice_total = BigDecimal.ZERO;
        BigDecimal total = BigDecimal.ZERO;
        for (TChargingOrderAccountingStrategy chargingOrderAccountingStrategy : list) {
            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);
        }
        //原金额
        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);
        }
        if(chargingOrder.getEndMode() == 2){
            chargingOrder.setEndMode(refundAmount.compareTo(BigDecimal.ZERO) > 0 ? 2 : 3);
        }
        chargingOrder.setStatus(5);
        chargingOrder.setOrderAmount(orderAmount);
        chargingOrder.setVipDiscountAmount(discountAmount);
        //计算优惠券
        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());
                    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(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);
                    chargingOrder.setCouponDiscountAmount(divide);
                    payAmount = payAmount.subtract(divide);
                }else{
                    chargingOrder.setAppCouponId(null);
                    chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO);
                    appCouponClient.refund(chargingOrder.getAppCouponId().toString());
                }
            }
        }
        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());
            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(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);
                    }
                }
            }
        }
    }
    @Override
    public List<Map<String, Object>> getByDate(List<Long> chargingOrderIds) {
        return this.baseMapper.getByDate(chargingOrderIds);
@@ -2662,12 +2668,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.getSecond() - startTime.getSecond();
        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());
        // 统计有图,好评,中差评数量
@@ -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,37 @@
            TChargingOrder chargingOrder = chargingOrderService.getById(query.getOrderId());
            orderEvaluate.setAppUserCarId(chargingOrder.getAppUserCarId());
        }
        TAppUser appUser = appUserClient.getUserById(userid).getData();
        //检测敏感词
        String content = orderEvaluate.getContent();
        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){
                    content = content.replaceAll(keyword, "***");
                }
            }
        }
        orderEvaluate.setContent(content);
        this.save(orderEvaluate);
    
        List<Integer> tagIds = query.getTagIds();
@@ -276,7 +318,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 +337,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/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/bootstrap.yml
@@ -29,6 +29,7 @@
        namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb
        username: nacos
        password: nacos
#        ip: 192.168.110.85
      config:
        # 配置中心地址
        server-addr: 192.168.110.169:8848
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/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/test/java/com/ruoyi/order/RuoYiOrderApplicationTests.java
@@ -1,8 +1,23 @@
package com.ruoyi.order;
import com.ruoyi.common.core.web.domain.AjaxResult;
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(){
        AjaxResult ajaxResult = chargingOrderService.chargingOrderCallback(2, "CD55720241011143234718", "4200002400202410113181486798", "");
    }
}
ruoyi-service/ruoyi-other/src/main/resources/bootstrap.yml
@@ -29,6 +29,7 @@
        namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb
        username: nacos
        password: nacos
#        ip: 192.168.110.85
      config:
        # 配置中心地址
        server-addr: 192.168.110.169:8848
ruoyi-service/ruoyi-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}, '%')