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