From 9a2af549d8ccd0e6fe539093c47257d64535d03e Mon Sep 17 00:00:00 2001 From: Guoqs <123@jsowell.com> Date: Fri, 20 Sep 2024 08:39:45 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E7=94=B5=E5=8D=95=E8=BD=A6=E5=8D=8F?= =?UTF-8?q?=E8=AE=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/jsowell/service/OrderService.java | 10 ++- ...onse.java => EBikeChargeResponseEnum.java} | 10 +-- .../enums/ebike/EBikeStopReasonEnum.java | 68 +++++++++++++++++++ .../ChargingOperationResponse.java | 2 +- .../ebike/deviceupload/EBikeMessageCmd03.java | 15 ++-- .../pile/service/PileRemoteService.java | 4 +- .../impl/OrderBasicInfoServiceImpl.java | 2 +- .../DelayMerchantProgramLogic.java | 29 ++++++++ 8 files changed, 123 insertions(+), 17 deletions(-) rename jsowell-common/src/main/java/com/jsowell/common/enums/ebike/{EBikeChargeCommandResponse.java => EBikeChargeResponseEnum.java} (82%) create mode 100644 jsowell-common/src/main/java/com/jsowell/common/enums/ebike/EBikeStopReasonEnum.java diff --git a/jsowell-admin/src/main/java/com/jsowell/service/OrderService.java b/jsowell-admin/src/main/java/com/jsowell/service/OrderService.java index fa9cd88da..3e2a85fe2 100644 --- a/jsowell-admin/src/main/java/com/jsowell/service/OrderService.java +++ b/jsowell-admin/src/main/java/com/jsowell/service/OrderService.java @@ -631,9 +631,15 @@ public class OrderService { vo.setOutputCurrent(data.getOutputCurrent()); vo.setOutputVoltage(data.getOutputVoltage()); vo.setSOC(data.getSOC()); - BigDecimal chargingAmount = new BigDecimal(monitorData.getChargingAmount()).setScale(4, RoundingMode.HALF_UP); // 充电金额 + BigDecimal chargingAmount = BigDecimal.ZERO; + if (monitorData.getChargingAmount() != null) { + chargingAmount = new BigDecimal(monitorData.getChargingAmount()).setScale(4, RoundingMode.HALF_UP); // 充电金额 + } vo.setChargingAmount(chargingAmount.toString()); - BigDecimal chargingDegree = new BigDecimal(monitorData.getChargingDegree()).setScale(4, RoundingMode.HALF_UP); // 充电度数 + BigDecimal chargingDegree = BigDecimal.ZERO; + if (monitorData.getChargingDegree() != null) { + chargingDegree = new BigDecimal(monitorData.getChargingDegree()).setScale(4, RoundingMode.HALF_UP); // 充电度数 + } vo.setChargingDegree(chargingDegree.toString()); vo.setSumChargingTime(monitorData.getSumChargingTime()); vo.setTimeRemaining(monitorData.getTimeRemaining()); diff --git a/jsowell-common/src/main/java/com/jsowell/common/enums/ebike/EBikeChargeCommandResponse.java b/jsowell-common/src/main/java/com/jsowell/common/enums/ebike/EBikeChargeResponseEnum.java similarity index 82% rename from jsowell-common/src/main/java/com/jsowell/common/enums/ebike/EBikeChargeCommandResponse.java rename to jsowell-common/src/main/java/com/jsowell/common/enums/ebike/EBikeChargeResponseEnum.java index f4ec52214..6443328a8 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/enums/ebike/EBikeChargeCommandResponse.java +++ b/jsowell-common/src/main/java/com/jsowell/common/enums/ebike/EBikeChargeResponseEnum.java @@ -1,6 +1,6 @@ package com.jsowell.common.enums.ebike; -public enum EBikeChargeCommandResponse { +public enum EBikeChargeResponseEnum { SUCCESS(0, "执行成功(启动或停止充电)"), NO_CHARGER_PLUGGED(1, "端口未插充电器(不执行)"), @@ -19,7 +19,7 @@ public enum EBikeChargeCommandResponse { private final int code; private final String description; - EBikeChargeCommandResponse(int code, String description) { + EBikeChargeResponseEnum(int code, String description) { this.code = code; this.description = description; } @@ -32,8 +32,8 @@ public enum EBikeChargeCommandResponse { return description; } - public static EBikeChargeCommandResponse fromCode(int code) { - for (EBikeChargeCommandResponse response : values()) { + public static EBikeChargeResponseEnum fromCode(int code) { + for (EBikeChargeResponseEnum response : values()) { if (response.getCode() == code) { return response; } @@ -43,7 +43,7 @@ public enum EBikeChargeCommandResponse { public static String getDescriptionByCode(int code) { try { - EBikeChargeCommandResponse response = fromCode(code); + EBikeChargeResponseEnum response = fromCode(code); return response.getDescription(); } catch (IllegalArgumentException e) { return "未知应答码: " + code; diff --git a/jsowell-common/src/main/java/com/jsowell/common/enums/ebike/EBikeStopReasonEnum.java b/jsowell-common/src/main/java/com/jsowell/common/enums/ebike/EBikeStopReasonEnum.java new file mode 100644 index 000000000..4bfede56a --- /dev/null +++ b/jsowell-common/src/main/java/com/jsowell/common/enums/ebike/EBikeStopReasonEnum.java @@ -0,0 +1,68 @@ +package com.jsowell.common.enums.ebike; + +/** + * 电单车停止原因枚举 + */ +public enum EBikeStopReasonEnum { + FULLY_CHARGED(0x01, "充满自停"), + MAX_CHARGE_TIME_REACHED(0x02, "达到最大充电时间"), + PRESET_TIME_REACHED(0x03, "达到预设时间"), + PRESET_POWER_REACHED(0x04, "达到预设电量"), + USER_REMOVED(0x05, "用户拔出"), + OVERLOAD(0x06, "负载过大"), + SERVER_CONTROL_STOPPED(0x07, "服务器控制停止"), + DYNAMIC_OVERLOAD(0x08, "动态过载"), + POWER_TOO_LOW(0x09, "功率过小"), + ENVIRONMENTAL_TEMP_HIGH(0x0A, "环境温度过高 (仅适用于AP262、AP360)"), + PORT_TEMP_HIGH(0x0B, "端口温度过高 (仅适用于AP262)"), + OVERCURRENT(0x0C, "过流"), + USER_REMOVED_1(0x0D, "用户拔出-1,可能是插座弹片卡住"), + NO_POWER_STOPPED(0x0E, "无功率停止,可能是接触不良或保险丝烧断故障"), + RELAY_BAD_FUSE_BROKEN(0x0F, "预检-继电器坏或保险丝断"), + WATER_INTRUSION(0x10, "水浸断电"), + FIRE_EXTINGUISHING_SETTLEMENT_LOCAL(0x11, "灭火结算(本端口)"), + FIRE_EXTINGUISHING_SETTLEMENT_REMOTE(0x12, "灭火结算(非本端口)"), + USER_PASSWORD_LOCKOUT(0x13, "用户密码开柜断电"), + DOOR_NOT_CLOSED(0x14, "未关好柜门"), + EXTERNAL_OPERATION_STOPPED(0x15, "外部操作停止"), + CARD_SWIPE_STOPPED(0x16, "刷卡操作停止"), + SERVER_FORCED_STOP(0x17, "服务器强制停止(主要用于充电柜强制开柜门)"), + FIRE_SYSTEM_TRIGGERED(0x18, "消防系统触发停止"), + MEMORY_ERROR(0x19, "存储器错误"), + OVERVOLTAGE(0x1A, "过压"), + UNDERVOLTAGE(0x1B, "欠压"); + + private final int code; + private final String description; + + EBikeStopReasonEnum(int code, String description) { + this.code = code; + this.description = description; + } + + public int getCode() { + return code; + } + + public String getDescription() { + return description; + } + + public static EBikeStopReasonEnum fromCode(int code) { + for (EBikeStopReasonEnum reason : values()) { + if (reason.getCode() == code) { + return reason; + } + } + throw new IllegalArgumentException("Invalid code: " + code); + } + + public static String getDescriptionByCode(int code) { + try { + EBikeStopReasonEnum reason = fromCode(code); + return reason.getDescription(); + } catch (IllegalArgumentException e) { + return "未知停止原因: " + Integer.toHexString(code); + } + } +} \ No newline at end of file diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/domain/ebike/deviceupload/ChargingOperationResponse.java b/jsowell-pile/src/main/java/com/jsowell/pile/domain/ebike/deviceupload/ChargingOperationResponse.java index d1d90d2f5..742ed740d 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/domain/ebike/deviceupload/ChargingOperationResponse.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/domain/ebike/deviceupload/ChargingOperationResponse.java @@ -64,7 +64,7 @@ public class ChargingOperationResponse extends AbsEBikeMessage2 { public static void main(String[] args) { - String s = "444e591d00198bca07f106820013273881052409191439471814850828040000ad06"; + String s = "444e591d00198bca0727268200132738810524091914394718148508280400000306"; byte[] messageBytes = BytesUtil.hexStringToByteArray(s); ChargingOperationResponse response = new ChargingOperationResponse(messageBytes); System.out.println(response); diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/domain/ebike/deviceupload/EBikeMessageCmd03.java b/jsowell-pile/src/main/java/com/jsowell/pile/domain/ebike/deviceupload/EBikeMessageCmd03.java index 342411109..e9895e3c3 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/domain/ebike/deviceupload/EBikeMessageCmd03.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/domain/ebike/deviceupload/EBikeMessageCmd03.java @@ -7,19 +7,21 @@ import lombok.Getter; import lombok.Setter; import lombok.ToString; +import java.math.BigDecimal; + @Getter @Setter @ToString(callSuper = true) public class EBikeMessageCmd03 extends AbsEBikeMessage2 { private int chargingTime; // 充电时长, 单位:"秒" - private int maxPower; // 最大功率, 单位:"0.1W" - private int consumedEnergy; // 耗电量, 单位:"0.01度" + private BigDecimal maxPower; // 最大功率, 桩给的数据单位:"0.1W", 代码已经转为瓦 + private BigDecimal consumedEnergy; // 耗电量, 桩给的数据单位:"0.01度", 代码已经转为度 private String connectorCode; // 端口号 private int startMode; // 在线/离线启动/验证码 private int cardNumberOrVerificationCode; // 卡号/验证码 private int stopReason; // 停止原因 private String orderNumber; // 订单编号 - private int secondMaxPower; // 第二最大功率 + private BigDecimal secondMaxPower; // 第二最大功率 // private String timestamp; // 时间戳 上发指令当时的时间,有时候不准确,该字段属于调试使用,服务器无需关心此字段 // private String placeholderDuration; // 占位时长 充电柜专用,其他设备忽略此字段 表示充满后占用设备的时长,单位为分钟 @@ -32,11 +34,12 @@ public class EBikeMessageCmd03 extends AbsEBikeMessage2 { startIndex += length; length = 2; - this.maxPower = BytesUtil.bytesToIntLittle(BytesUtil.copyBytes(messageBytes, startIndex, length)); + this.maxPower = new BigDecimal(BytesUtil.bytesToIntLittle(BytesUtil.copyBytes(messageBytes, startIndex, length))).multiply(new BigDecimal("0.1")); startIndex += length; length = 2; - this.consumedEnergy = BytesUtil.bytesToIntLittle(BytesUtil.copyBytes(messageBytes, startIndex, length)); + this.consumedEnergy = new BigDecimal(BytesUtil.bytesToIntLittle(BytesUtil.copyBytes(messageBytes, startIndex, length))) + .multiply(new BigDecimal("0.01")); startIndex += length; length = 1; @@ -60,7 +63,7 @@ public class EBikeMessageCmd03 extends AbsEBikeMessage2 { startIndex += length; length = 2; - this.secondMaxPower = BytesUtil.bytesToIntLittle(BytesUtil.copyBytes(messageBytes, startIndex, length)); + this.secondMaxPower = new BigDecimal(BytesUtil.bytesToIntLittle(BytesUtil.copyBytes(messageBytes, startIndex, length))).multiply(new BigDecimal("0.1")); // this.timestamp = BytesUtil.bytesToIntLittle(Arrays.copyOfRange(messageBytes, 31, 35)) + ""; // this.placeholderDuration = BytesUtil.bytesToIntLittle(Arrays.copyOfRange(messageBytes, 35, 37)) + ""; diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/PileRemoteService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/PileRemoteService.java index 5b62106ba..7afbe07ce 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/PileRemoteService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/PileRemoteService.java @@ -5,7 +5,7 @@ import com.google.common.collect.Lists; import com.jsowell.common.constant.CacheConstants; import com.jsowell.common.core.domain.ykc.YKCDataProtocol; import com.jsowell.common.core.redis.RedisCache; -import com.jsowell.common.enums.ebike.EBikeChargeCommandResponse; +import com.jsowell.common.enums.ebike.EBikeChargeResponseEnum; import com.jsowell.common.enums.ykc.ChargingFailedReasonEnum; import com.jsowell.common.enums.ykc.ReturnCodeEnum; import com.jsowell.common.exception.BusinessException; @@ -141,7 +141,7 @@ public class PileRemoteService { // 启动成功 orderBasicInfoService.chargingPileStartedSuccessfully(transactionCode); } else { - String failedReasonMsg = EBikeChargeCommandResponse.getDescriptionByCode(result); + String failedReasonMsg = EBikeChargeResponseEnum.getDescriptionByCode(result); // 启动失败 682204000001000000000041 orderBasicInfoService.chargingPileFailedToStart(transactionCode, failedReasonMsg); } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java index d6f8e76f5..ca1df99f8 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java @@ -3103,8 +3103,8 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { */ @Override public void payOrderSuccessCallback(PayOrderSuccessCallbackDTO dto) { - logger.info("订单:{}支付成功 支付回调", dto.getOrderCode()); OrderBasicInfo orderInfo = this.getOrderInfoByOrderCode(dto.getOrderCode()); + logger.info("订单:{}支付成功支付回调, OrderBasicInfo:{}", dto.getOrderCode(), JSON.toJSONString(orderInfo)); BigDecimal payAmount = dto.getPayAmount(); // 是否发送启动指令 diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java index 36bec05d9..cb55c5e2f 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java @@ -20,6 +20,7 @@ import com.jsowell.common.enums.DelFlagEnum; import com.jsowell.common.enums.MemberWalletEnum; import com.jsowell.common.enums.adapay.AdapayStatusEnum; import com.jsowell.common.enums.adapay.MerchantDelayModeEnum; +import com.jsowell.common.enums.ebike.EBikeStopReasonEnum; import com.jsowell.common.enums.ykc.*; import com.jsowell.common.exception.BusinessException; import com.jsowell.common.util.AdapayUtil; @@ -473,7 +474,35 @@ public class DelayMerchantProgramLogic extends AbstractProgramLogic { @Override public void settleOrderForEBike(EBikeMessageCmd03 message, OrderBasicInfo orderBasicInfo) { + // 判断订单状态 + if (StringUtils.equals(orderBasicInfo.getOrderStatus(), OrderStatusEnum.ORDER_COMPLETE.getValue())) { + logger.info("结算订单:{}, 是订单完成状态", orderBasicInfo.getOrderCode()); + return; + } + // 订单状态 + orderBasicInfo.setOrderStatus(OrderStatusEnum.ORDER_COMPLETE.getValue()); + // 停止原因 + orderBasicInfo.setReason(EBikeStopReasonEnum.getDescriptionByCode(message.getStopReason())); + + // 更新订单详情 + OrderDetail orderDetail = orderBasicInfoService.getOrderDetailByOrderCode(orderBasicInfo.getOrderCode()); + if (orderDetail != null) { + orderDetail.setTotalUsedElectricity(message.getConsumedEnergy()); + orderDetail.setFlatUsedElectricity(message.getConsumedEnergy()); + } + + // 更新数据库 + OrderTransactionDTO dto = new OrderTransactionDTO(); + dto.setOrderBasicInfo(orderBasicInfo); + dto.setOrderDetail(orderDetail); + transactionService.doUpdateOrder(dto); + + // 充电时间大于30秒不退费 + int chargingTime = message.getChargingTime(); + if (chargingTime < 30) { + // 退款 + } } /**