From e083a5f327fc9873f4f9359faf3791f2e9c929e0 Mon Sep 17 00:00:00 2001 From: 无关风月 <443237572@qq.com> Date: 星期三, 09 十月 2024 11:50:10 +0800 Subject: [PATCH] Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/mx_charging_pile --- ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java | 271 +++++- ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/api/IotInterfaceUtil.java | 30 ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/PlatformStartChargingReply.java | 1 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/constant/SendTagConstant.java | 1 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUserIntegralChange.java | 4 ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/IotInterfaceClient.java | 38 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUserVipDetail.java | 11 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java | 76 + ruoyi-service/ruoyi-other/src/main/resources/bootstrap.yml | 1 ruoyi-api/ruoyi-api-integration/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports | 4 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingGunServiceImpl.java | 37 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TCharingUserMapVO.java | 1 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserVipDetailController.java | 16 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TExchangeOrderController.java | 3 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderEvaluateServiceImpl.java | 2 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ChargingGunFallbackFactory.java | 3 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PayOrderInfoDto.java | 2 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java | 28 ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/vo/DeleteDeviceResp.java | 19 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/controller/SecurityDetectionController.java | 34 ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml | 175 ++- ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/GiveVipUtil.java | 1 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TEnterpriseUserApplicationController.java | 3 ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/SecurityDetection.java | 3 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/RuoYiIntegrationApplication.java | 5 ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/SecurityDetectionClient.java | 26 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/SignDayUtil.java | 2 ruoyi-service/ruoyi-order/src/main/resources/bootstrap.yml | 1 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/UploadRealTimeMonitoringDataMessageListener.java | 7 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/GetChargingGunByCode.java | 13 ruoyi-service/ruoyi-account/src/main/resources/bootstrap.yml | 1 ruoyi-gateway/src/main/resources/bootstrap.yml | 1 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/controller/IotInterfaceController.java | 48 + ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/SecurityDetection.java | 14 ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderEvaluateMapper.xml | 42 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/ISiteService.java | 5 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/PlatformStartChargingReplyMessage.java | 16 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java | 32 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java | 14 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ChargingGunClient.java | 5 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TimingSettingMessageListener.java | 4 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/VipInfoDto.java | 45 + ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TApplyChargingPileController.java | 2 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java | 5 ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml | 1 ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/SendMessageClient.java | 10 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/PlatformStartChargingReplyMessageListener.java | 11 ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/IotInterfaceFallbackFactory.java | 40 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TVipOrderServiceImpl.java | 2 ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/SecurityDetectionFallbackFactory.java | 35 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TCharingUserEquimentVO.java | 10 ruoyi-service/ruoyi-account/pom.xml | 5 ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/vo/AddDeviceResp.java | 69 + ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java | 15 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TOrderEvaluateMapper.java | 4 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java | 33 ruoyi-service/ruoyi-chargingPile/src/main/resources/bootstrap.yml | 1 ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/SendMessageFallbackFactory.java | 6 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java | 26 ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/SiteMapper.xml | 2 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/EndChargeMessageListener.java | 5 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/EnhanceProduce.java | 11 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/SecurityDetectionServiceImpl.java | 14 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java | 17 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java | 2 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java | 4 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java | 45 + ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/SiteMapper.java | 3 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TChargingPile.java | 4 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java | 154 +++ ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WxLoginController.java | 24 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/task/TaskUtil.java | 2 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/GroundLockRealTimeDataMessage.java | 1 ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TParkingRecordMapper.xml | 52 ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TVipOrderMapper.xml | 28 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/ChargingMessage.java | 44 + ruoyi-auth/src/main/resources/bootstrap.yml | 1 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/SecurityDetectionService.java | 9 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingRecordController.java | 75 + ruoyi-service/ruoyi-integration/src/main/resources/bootstrap.yml | 1 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppCouponServiceImpl.java | 5 ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TShoppingOrderMapper.xml | 8 ruoyi-service/ruoyi-payment/src/main/resources/bootstrap.yml | 1 ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/vo/AddDevice.java | 27 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java | 5 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/base/BaseMessage.java | 5 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java | 89 + ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java | 484 +++++++++++ ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppUserVipDetailServiceImpl.java | 3 89 files changed, 2,084 insertions(+), 361 deletions(-) diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUserIntegralChange.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUserIntegralChange.java index 1b5f369..3375419 100644 --- a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUserIntegralChange.java +++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUserIntegralChange.java @@ -74,5 +74,9 @@ @TableField(exist = false) private String orderNum; + @TableField(exist = false) + private Integer goodType; + + } diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUserVipDetail.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUserVipDetail.java index 046b4b8..07c35bf 100644 --- a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUserVipDetail.java +++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUserVipDetail.java @@ -8,10 +8,12 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.List; /** * <p> @@ -62,15 +64,19 @@ @ApiModelProperty(value = "会员开始时间") @TableField("start_time") - @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime startTime; @ApiModelProperty(value = "会员结束时间") @TableField("end_time") - @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime endTime; @TableField("create_time") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime createTime; @ApiModelProperty(value = "已赠送的月份") @@ -87,4 +93,5 @@ private String vipName; + } diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ChargingGunFallbackFactory.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ChargingGunFallbackFactory.java index 56d4782..11c4cb6 100644 --- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ChargingGunFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ChargingGunFallbackFactory.java @@ -5,6 +5,7 @@ import com.ruoyi.chargingPile.api.model.TChargingGun; import com.ruoyi.chargingPile.api.model.TChargingPile; import com.ruoyi.chargingPile.api.model.TFaultMessage; +import com.ruoyi.chargingPile.api.vo.GetChargingGunByCode; import com.ruoyi.chargingPile.api.vo.SiteNameVO; import com.ruoyi.common.core.domain.R; import org.slf4j.Logger; @@ -45,7 +46,7 @@ } @Override - public R<TChargingGun> getChargingGunByCode(String code) { + public R<TChargingGun> getChargingGunByCode(GetChargingGunByCode code) { return R.fail("根据枪编号获取充电枪失败:" + throwable.getMessage()); } diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ChargingGunClient.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ChargingGunClient.java index f27cd5d..77548f2 100644 --- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ChargingGunClient.java +++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ChargingGunClient.java @@ -3,6 +3,7 @@ import com.ruoyi.chargingPile.api.factory.ChargingGunFallbackFactory; import com.ruoyi.chargingPile.api.model.TChargingGun; import com.ruoyi.chargingPile.api.model.TFaultMessage; +import com.ruoyi.chargingPile.api.vo.GetChargingGunByCode; import com.ruoyi.chargingPile.api.vo.SiteNameVO; import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.domain.R; @@ -48,8 +49,8 @@ * @param code * @return */ - @PostMapping("/t-charging-gun/getChargingGunByCode/{code}") - R<TChargingGun> getChargingGunByCode(@PathVariable("code") String code); + @PostMapping("/t-charging-gun/getChargingGunByCode") + R<TChargingGun> getChargingGunByCode(@RequestBody GetChargingGunByCode code); /** * 编辑充电枪 * @param chargingGun diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TChargingPile.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TChargingPile.java index e1d69a9..fe22081 100644 --- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TChargingPile.java +++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TChargingPile.java @@ -96,4 +96,8 @@ @ApiModelProperty(value = "设备状态(1=工作中,2=离线,3=故障)") @TableField("status") private Integer status; + + @ApiModelProperty(value = "iotd设备id") + @TableField("iotd_device_id") + private String iotdDeviceId; } diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/GetChargingGunByCode.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/GetChargingGunByCode.java new file mode 100644 index 0000000..82b6e50 --- /dev/null +++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/GetChargingGunByCode.java @@ -0,0 +1,13 @@ +package com.ruoyi.chargingPile.api.vo; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2024/10/8 16:58 + */ +@Data +public class GetChargingGunByCode { + private String charging_pile_code; // 桩编码 + private String charging_gun_code; // 抢号 +} diff --git a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/IotInterfaceFallbackFactory.java b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/IotInterfaceFallbackFactory.java new file mode 100644 index 0000000..c7050fa --- /dev/null +++ b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/IotInterfaceFallbackFactory.java @@ -0,0 +1,40 @@ +package com.ruoyi.integration.api.factory; + +import com.ruoyi.common.core.domain.R; +import com.ruoyi.integration.api.feignClient.IotInterfaceClient; +import com.ruoyi.integration.api.feignClient.SwitchwayGateClient; +import com.ruoyi.integration.api.vo.AddDevice; +import com.ruoyi.integration.api.vo.AddDeviceResp; +import com.ruoyi.integration.api.vo.DeleteDeviceResp; +import com.ruoyi.integration.api.vo.SwitchwayGateReq; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +/** + * 充电桩服务降级处理 + * + * @author ruoyi + */ +@Component +public class IotInterfaceFallbackFactory implements org.springframework.cloud.openfeign.FallbackFactory<IotInterfaceClient> { + private static final Logger log = LoggerFactory.getLogger(IotInterfaceFallbackFactory.class); + + @Override + public IotInterfaceClient create(Throwable throwable) { + log.error("调用失败:{}", throwable.getMessage()); + return new IotInterfaceClient() { + + + @Override + public R<AddDeviceResp> addDevice(AddDevice addDevice) { + return R.fail("添加设备失败:" + throwable.getMessage()); + } + + @Override + public R<DeleteDeviceResp> deleteDevice(String deviceId) { + return R.fail("删除设备失败:" + throwable.getMessage()); + } + }; + } +} diff --git a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/SecurityDetectionFallbackFactory.java b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/SecurityDetectionFallbackFactory.java new file mode 100644 index 0000000..5445dd3 --- /dev/null +++ b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/SecurityDetectionFallbackFactory.java @@ -0,0 +1,35 @@ +package com.ruoyi.integration.api.factory; + +import com.ruoyi.common.core.domain.R; +import com.ruoyi.integration.api.feignClient.SecurityDetectionClient; +import com.ruoyi.integration.api.feignClient.SendMessageClient; +import com.ruoyi.integration.api.model.PlatformStartCharging; +import com.ruoyi.integration.api.model.PlatformStopCharging; +import com.ruoyi.integration.api.model.QrCodeDelivery; +import com.ruoyi.integration.api.model.SecurityDetection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +/** + * 充电桩服务降级处理 + * + * @author ruoyi + */ +@Component +public class SecurityDetectionFallbackFactory implements org.springframework.cloud.openfeign.FallbackFactory<SecurityDetectionClient> +{ + private static final Logger log = LoggerFactory.getLogger(SecurityDetectionFallbackFactory.class); + + @Override + public SecurityDetectionClient create(Throwable throwable) { + log.error("调用失败:{}", throwable.getMessage()); + return new SecurityDetectionClient() { + + @Override + public R<SecurityDetection> getSecurityDetection(String transactionSerialNumber) { + return R.fail("获取安全检测数据失败:" + throwable.getMessage()); + } + }; + } +} diff --git a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/SendMessageFallbackFactory.java b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/SendMessageFallbackFactory.java index 89f13bb..e063231 100644 --- a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/SendMessageFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/SendMessageFallbackFactory.java @@ -6,6 +6,7 @@ import com.ruoyi.integration.api.model.ChargingHandshake; import com.ruoyi.integration.api.model.PlatformStartCharging; import com.ruoyi.integration.api.model.PlatformStopCharging; +import com.ruoyi.integration.api.model.QrCodeDelivery; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.openfeign.FallbackFactory; @@ -36,6 +37,11 @@ public String platformStopCharging(PlatformStopCharging platformStopCharging) { return "远程停机失败"; } + + @Override + public String qrCodeDelivery(QrCodeDelivery qrCodeDelivery) { + return "二维码下发失败"; + } }; } } diff --git a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/IotInterfaceClient.java b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/IotInterfaceClient.java new file mode 100644 index 0000000..13f7b58 --- /dev/null +++ b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/IotInterfaceClient.java @@ -0,0 +1,38 @@ +package com.ruoyi.integration.api.feignClient; + +import com.ruoyi.common.core.constant.ServiceNameConstants; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.integration.api.factory.IotInterfaceFallbackFactory; +import com.ruoyi.integration.api.vo.AddDevice; +import com.ruoyi.integration.api.vo.AddDeviceResp; +import com.ruoyi.integration.api.vo.DeleteDeviceResp; +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 + * @Date 2024/10/8 10:24 + */ +@FeignClient(contextId = "IotInterfaceClient", value = ServiceNameConstants.INTEGRATION_SERVICE, fallbackFactory = IotInterfaceFallbackFactory.class) +public interface IotInterfaceClient { + + + /** + * 添加设备 + * @param addDevice + * @return + */ + @PostMapping("/iotInterface/addDevice") + R<AddDeviceResp> addDevice(@RequestBody AddDevice addDevice); + + + /** + * 删除设备 + * @param deviceId + * @return + */ + @PostMapping("/iotInterface/deleteDevice") + R<DeleteDeviceResp> deleteDevice(@RequestParam("deviceId") String deviceId); +} diff --git a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/SecurityDetectionClient.java b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/SecurityDetectionClient.java new file mode 100644 index 0000000..ba6bf09 --- /dev/null +++ b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/SecurityDetectionClient.java @@ -0,0 +1,26 @@ +package com.ruoyi.integration.api.feignClient; + +import com.ruoyi.common.core.constant.ServiceNameConstants; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.integration.api.factory.SecurityDetectionFallbackFactory; +import com.ruoyi.integration.api.model.SecurityDetection; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; + +/** + * @author zhibing.pu + * @Date 2024/10/8 14:23 + */ +@FeignClient(contextId = "SecurityDetectionClient", value = ServiceNameConstants.INTEGRATION_SERVICE, fallbackFactory = SecurityDetectionFallbackFactory.class) +public interface SecurityDetectionClient { + + + /** + * 获取安全检测数据 + * @param transactionSerialNumber + * @return + */ + @PostMapping("/securityDetection/getSecurityDetection") + R<SecurityDetection> getSecurityDetection(@RequestParam("transactionSerialNumber") String transactionSerialNumber); +} diff --git a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/SendMessageClient.java b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/SendMessageClient.java index df4db22..9d3263b 100644 --- a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/SendMessageClient.java +++ b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/SendMessageClient.java @@ -4,6 +4,7 @@ import com.ruoyi.integration.api.factory.SendMessageFallbackFactory; import com.ruoyi.integration.api.model.PlatformStartCharging; import com.ruoyi.integration.api.model.PlatformStopCharging; +import com.ruoyi.integration.api.model.QrCodeDelivery; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -32,4 +33,13 @@ */ @PostMapping("/sendMessage/platformStopCharging") String platformStopCharging(@RequestBody PlatformStopCharging platformStopCharging); + + + /** + * 二维码下发 + * @param qrCodeDelivery + * @return + */ + @PostMapping("/sendMessage/qrCodeDelivery") + String qrCodeDelivery(@RequestBody QrCodeDelivery qrCodeDelivery); } diff --git a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/PlatformStartChargingReply.java b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/PlatformStartChargingReply.java index 54f09f3..af8b03e 100644 --- a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/PlatformStartChargingReply.java +++ b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/PlatformStartChargingReply.java @@ -15,7 +15,6 @@ @Document(collection = "platform_start_charging_reply") //指定要对应的文档名(表名) @Accessors(chain = true) public class PlatformStartChargingReply extends BaseModel { - @Id private String transaction_serial_number; // 交易流水号 private String charging_pile_code; // 桩编码 private String charging_gun_code; // 抢号 diff --git a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/SecurityDetection.java b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/SecurityDetection.java index b59b244..06be3e2 100644 --- a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/SecurityDetection.java +++ b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/SecurityDetection.java @@ -9,8 +9,7 @@ @Document(collection = "security_detection") //指定要对应的文档名(表名) @Accessors(chain = true) public class SecurityDetection { - - @Id + private String transaction_serial_number; // 交易流水号 private String charging_pile_code; // 桩编码 private String charging_gun_code; // 抢号 private Integer secure_connection; // 车枪连接(0=未连接,1=连接) diff --git a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/vo/AddDevice.java b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/vo/AddDevice.java new file mode 100644 index 0000000..9479517 --- /dev/null +++ b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/vo/AddDevice.java @@ -0,0 +1,27 @@ +package com.ruoyi.integration.api.vo; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2024/10/8 10:26 + */ +@Data +public class AddDevice { + /** + * 产品ID + */ + private String productId; + /** + * 设备标识码 设备编号 + */ + private String nodeId; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备描述 + */ + private String description; +} diff --git a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/vo/AddDeviceResp.java b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/vo/AddDeviceResp.java new file mode 100644 index 0000000..8fbe429 --- /dev/null +++ b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/vo/AddDeviceResp.java @@ -0,0 +1,69 @@ +package com.ruoyi.integration.api.vo; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + + +/** + * @author zhibing.pu + * @Date 2024/10/8 10:37 + */ +@Data +public class AddDeviceResp { + private int httpStatusCode; + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty("app_id") + private String appId; + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty("app_name") + private String appName; + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty("device_id") + private String deviceId; + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty("node_id") + private String nodeId; + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty("gateway_id") + private String gatewayId; + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty("device_name") + private String deviceName; + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty("node_type") + private String nodeType; + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty("description") + private String description; + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty("fw_version") + private String fwVersion; + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty("sw_version") + private String swVersion; + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty("device_sdk_version") + private String deviceSdkVersion; + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty("product_id") + private String productId; + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty("product_name") + private String productName; + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty("status") + private String status; + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty("create_time") + private String createTime; + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty("connection_status_update_time") + private String connectionStatusUpdateTime; + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty("active_time") + private String activeTime; + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty("extension_info") + private Object extensionInfo; +} diff --git a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/vo/DeleteDeviceResp.java b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/vo/DeleteDeviceResp.java new file mode 100644 index 0000000..55376fd --- /dev/null +++ b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/vo/DeleteDeviceResp.java @@ -0,0 +1,19 @@ +package com.ruoyi.integration.api.vo; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2024/10/8 10:40 + */ +@Data +public class DeleteDeviceResp { + @JsonIgnore + private int httpStatusCode; + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty("body") + private String body; +} diff --git a/ruoyi-api/ruoyi-api-integration/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-api/ruoyi-api-integration/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index fa602cc..e9bb146 100644 --- a/ruoyi-api/ruoyi-api-integration/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-api/ruoyi-api-integration/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -4,4 +4,6 @@ com.ruoyi.integration.api.factory.SendMessageFallbackFactory com.ruoyi.integration.api.factory.PlatformStartChargingReplyFallbackFactory com.ruoyi.integration.api.factory.PlatformStopChargingReplyFallbackFactory -com.ruoyi.integration.api.factory.SwitchwayGateFallbackFactory \ No newline at end of file +com.ruoyi.integration.api.factory.SwitchwayGateFallbackFactory +com.ruoyi.integration.api.factory.IotInterfaceFallbackFactory +com.ruoyi.integration.api.factory.SecurityDetectionFallbackFactory \ No newline at end of file diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java index f51d11a..15f974f 100644 --- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java @@ -9,9 +9,7 @@ import com.ruoyi.order.api.model.TSettlementConfirm; import com.ruoyi.order.api.query.TChargingCountQuery; import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery; -import com.ruoyi.order.api.vo.ChargingBillVO; -import com.ruoyi.order.api.vo.GetChargingOrderByLicensePlate; -import com.ruoyi.order.api.vo.SettlementTotalVO; +import com.ruoyi.order.api.vo.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.openfeign.FallbackFactory; @@ -140,6 +138,16 @@ log.error("购物订单退款回调通知失败:" + throwable.getMessage()); } + + @Override + public void securityDetection(SecurityDetection securityDetection) { + log.error("修改安全检测数据失败:" + throwable.getMessage()); + } + + @Override + public void startChargeSuccessfully(PlatformStartChargingReplyMessage message) { + log.error("远程启动充电应答失败:" + throwable.getMessage()); + } }; } } diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java index 0dc3302..02f977b 100644 --- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java +++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java @@ -11,12 +11,10 @@ import com.ruoyi.order.api.model.TSettlementConfirm; import com.ruoyi.order.api.query.TChargingCountQuery; import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery; -import com.ruoyi.order.api.vo.ChargingBillVO; -import com.ruoyi.order.api.vo.SettlementTotalVO; +import com.ruoyi.order.api.vo.*; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import com.ruoyi.order.api.vo.GetChargingOrderByLicensePlate; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.*; @@ -162,10 +160,10 @@ * @param success_time */ @PostMapping("/t-charging-order/chargingOrderStartupFailureWxRefund") - void chargingOrderStartupFailureWxRefund(@RequestParam("out_trade_no") String out_refund_no, - @RequestParam("out_trade_no") String refund_id, - @RequestParam("out_trade_no") String tradeState, - @RequestParam("out_trade_no") String success_time); + void chargingOrderStartupFailureWxRefund(@RequestParam("out_refund_no") String out_refund_no, + @RequestParam("refund_id") String refund_id, + @RequestParam("tradeState") String tradeState, + @RequestParam("success_time") String success_time); /** * 管理后台取消购物订单后退款回调 * @param out_refund_no @@ -178,4 +176,20 @@ @RequestParam("out_trade_no") String refund_id, @RequestParam("out_trade_no") String tradeState, @RequestParam("out_trade_no") String success_time); + + //todo 待监听完成后调用此方法 + /** + * 修改安全检测数据 + * @param securityDetection + */ + @PostMapping("/t-charging-order/securityDetection") + void securityDetection(@RequestBody SecurityDetection securityDetection); + + + /** + * 远程启动充电应答 + * @param message + */ + @PostMapping("/t-charging-order/startChargeSuccessfully") + void startChargeSuccessfully(PlatformStartChargingReplyMessage message); } diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/PlatformStartChargingReplyMessage.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/PlatformStartChargingReplyMessage.java new file mode 100644 index 0000000..e074bdd --- /dev/null +++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/PlatformStartChargingReplyMessage.java @@ -0,0 +1,16 @@ +package com.ruoyi.order.api.vo; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2024/10/8 17:16 + */ +@Data +public class PlatformStartChargingReplyMessage { + private String transaction_serial_number; // 交易流水号 + private String charging_pile_code; // 桩编码 + private String charging_gun_code; // 抢号 + private Integer startup_result; // 启动结果(0:失败,1:成功) + private Integer failure_cause; // "失败原因(0:无,1:设备编号不匹配,2:枪已在充电,3:设备故障,4:设备离线,5:未插枪桩在收到启充命令后,检测到未插枪则发送 0x33 报文回复充电失败。若在 60 秒(以收到 0x34 时间开始计算)内检测到枪重新连接,则补送 0x33 成功报文;超时或者离线等其他异常,桩不启充、不补发 0x33 报文)" +} diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/SecurityDetection.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/SecurityDetection.java new file mode 100644 index 0000000..0f24456 --- /dev/null +++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/SecurityDetection.java @@ -0,0 +1,14 @@ +package com.ruoyi.order.api.vo; + +import lombok.Data; + +@Data +public class SecurityDetection { + private String transaction_serial_number; // 交易流水号 + private String charging_pile_code; // 桩编码 + private String charging_gun_code; // 抢号 + private Integer secure_connection; // 车枪连接(0=未连接,1=连接) + private Integer nsulation_detection; // 绝缘检测(0=安全,1=不安全) + private Integer electronic_lock_lock; // 电磁锁状态(0=未锁,1=已锁) + +} diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TCharingUserEquimentVO.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TCharingUserEquimentVO.java index 29c7b90..c28ba50 100644 --- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TCharingUserEquimentVO.java +++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TCharingUserEquimentVO.java @@ -20,6 +20,12 @@ List<Map<String,Object>> equipmentMapOut1; @ApiModelProperty("交流离网率") List<Map<String,Object>> equipmentMapOut2; - @ApiModelProperty("需求电流满足率") - List<Map<String,Object>> needElec; + @ApiModelProperty("需求电流满足率直流") + List<Map<String,Object>> needElec1; + @ApiModelProperty("需求电流满足率交流") + List<Map<String,Object>> needElec2; + double average1; + double average2; + double average3; + double average4; } diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TCharingUserMapVO.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TCharingUserMapVO.java index e8859d1..3015b43 100644 --- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TCharingUserMapVO.java +++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TCharingUserMapVO.java @@ -11,6 +11,7 @@ public class TCharingUserMapVO { @ApiModelProperty("上分折线图") private List<Map<String,Object>> map; + private List<Map<String,Object>> map1; @ApiModelProperty("用户标签") private List<Map<String,Object>> userMaps; @ApiModelProperty("单位消费") diff --git a/ruoyi-auth/src/main/resources/bootstrap.yml b/ruoyi-auth/src/main/resources/bootstrap.yml index 0122628..866e429 100644 --- a/ruoyi-auth/src/main/resources/bootstrap.yml +++ b/ruoyi-auth/src/main/resources/bootstrap.yml @@ -7,6 +7,7 @@ profiles: # 环境配置 active: dev +# active: prod application: # 应用名称 name: ruoyi-auth diff --git a/ruoyi-gateway/src/main/resources/bootstrap.yml b/ruoyi-gateway/src/main/resources/bootstrap.yml index 1beff53..48963f2 100644 --- a/ruoyi-gateway/src/main/resources/bootstrap.yml +++ b/ruoyi-gateway/src/main/resources/bootstrap.yml @@ -13,6 +13,7 @@ profiles: # 环境配置 active: dev +# active: prod --- spring: config: diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml b/ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml index d837d2b..dbd2ab0 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml @@ -12,6 +12,7 @@ profiles: # 环境配置 active: dev +# active: prod --- spring: config: diff --git a/ruoyi-service/ruoyi-account/pom.xml b/ruoyi-service/ruoyi-account/pom.xml index 23763ed..a464162 100644 --- a/ruoyi-service/ruoyi-account/pom.xml +++ b/ruoyi-service/ruoyi-account/pom.xml @@ -16,11 +16,6 @@ <dependencies> <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-mock</artifactId> - <version>2.0.8</version> - </dependency> - <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-api-order</artifactId> </dependency> diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java index 7a955dd..88236a3 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java @@ -60,7 +60,7 @@ @Autowired private TAppUserCarService appUserCarService; - @Autowired + @Resource private TokenService tokenService; @Resource private ChargingPileClient chargingPileClient; @@ -118,7 +118,7 @@ Integer data2 = otherClient.getAddCarIntegral().getData(); data.setIntegral(data2); if (!cars.isEmpty()){ - if (data1 == -1){ + if (null == data1 || data1 == -1){ // 没有充电订单 展示最新添加的车辆 data.setLicensePlate(cars.get(0).getLicensePlate()); data.setVehicleBrand(cars.get(0).getVehicleBrand()); diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java index 71175d4..9293ee1 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java @@ -36,6 +36,7 @@ import com.ruoyi.order.api.model.TChargingOrder; import com.ruoyi.order.api.model.TExchangeOrder; import com.ruoyi.other.api.domain.*; +import com.ruoyi.other.api.domain.TCoupon; import com.ruoyi.other.api.dto.UnitListQueryDto; import com.ruoyi.other.api.feignClient.IntegralRuleClient; import com.ruoyi.other.api.feignClient.OtherClient; @@ -228,6 +229,7 @@ .eq(userListQueryDto.getStatus() != null, TAppUser::getStatus, userListQueryDto.getStatus()) .eq(userListQueryDto.getVipTypeId() != null, TAppUser::getVipId, userListQueryDto.getVipTypeId()) .in(!userIds.isEmpty(),TAppUser::getId,userIds) + .orderByDesc(BasePojo::getCreateTime) .page(Page.of(userListQueryDto.getPageCurr(), userListQueryDto.getPageSize())); if (page.getRecords().isEmpty()){ return R.ok(page); @@ -496,7 +498,7 @@ for (TAppUserIntegralChange record : page.getRecords()) { record.setDateTime(record.getCreateTime()); record.setUid(record.getId().toString()); - if (record.getChangeType()==2){ + if (record.getChangeType()==2||record.getChangeType()==3){ R<TChargingOrder> tChargingOrderR = chargingOrderClient.orderDetail(Long.valueOf(record.getExtension())); if (tChargingOrderR.getData()!=null) { record.setOrderNum(tChargingOrderR.getData().getCode()); @@ -518,6 +520,10 @@ @GetMapping(value = "/user/points/detail") public R<TAppUserIntegralChange> pointsDetail(String id) { TAppUserIntegralChange byId = integralChangeService.getById(id); + TExchangeOrder data = exchangeOrderClient.orderDetail(Long.valueOf(byId.getExtension())).getData(); + if (data!=null) { + byId.setGoodType(data.getOrderType()); + } return R.ok(byId); } @@ -573,6 +579,14 @@ }else { appUserInfoDto.setIsVip(1); appUserInfoDto.setVipExpireTime(byId.getVipEndTime()); + + + + + + + + } //判断当天是否签到 Long count = signService.lambdaQuery().eq(TAppUserSign::getAppUserId,userId).eq(TAppUserSign::getSignDay, LocalDate.now()).count(); @@ -588,8 +602,26 @@ appUserInfoDto.setUserCars(list); appUserInfoDto.setFirstAdd(byId.getFirstAdd()!=null?byId.getFirstAdd():0); appUserInfoDto.setPoints(byId.getPoints()==null?0:byId.getPoints()); + + + + + return R.ok(appUserInfoDto); + + } + + + @ApiOperation(value = "设置头像", tags = {"小程序-个人中心"}) + @GetMapping(value = "/user/set/avatar") + public R avatar(String url) { + Long userId = tokenService.getLoginUserApplet().getUserId(); + TAppUser byId = appUserService.getById(userId); + byId.setAvatar(url); + appUserService.updateById(byId); + + return R.ok(); } @@ -1015,6 +1047,17 @@ String brand = CarBrandUtil.getBrand(); JSONObject jsonObject = JSON.parseObject(brand); JSONArray data = jsonObject.getJSONArray("data"); + JSONArray data1 = new JSONArray(); + if (name!=null) { + for (int i = 0; i < data.size(); i++) { + JSONObject brand1 = data.getJSONObject(i); + String o = (String) brand1.get("name"); + if (o.contains(name)) { + data1.add(brand1); + } + } + return R.ok(data1); + } return R.ok(data); } diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserVipDetailController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserVipDetailController.java index 2bedb36..6802f7c 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserVipDetailController.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserVipDetailController.java @@ -1,17 +1,25 @@ package com.ruoyi.account.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.account.api.dto.SendCouponDto; import com.ruoyi.account.api.model.TAppUserVipDetail; import com.ruoyi.account.api.vo.GetAppUserVipDetail; import com.ruoyi.account.service.TAppUserVipDetailService; +import com.ruoyi.account.util.VipInfoDto; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.security.service.TokenService; +import com.ruoyi.other.api.domain.TCoupon; import com.ruoyi.other.api.domain.TVip; +import com.ruoyi.other.api.dto.VipCouponDto; +import com.ruoyi.other.api.feignClient.OtherClient; import com.ruoyi.other.api.feignClient.VipClient; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; /** @@ -43,12 +51,14 @@ @Resource private VipClient vipClient; + @Resource + private OtherClient otherClient; @GetMapping("/getVipUseDetail") @ApiOperation(value = "生效会员列表", tags = {"小程序-个人中心"}) public R<List<TAppUserVipDetail>> getVipUseDetail(){ Long userId = tokenService.getLoginUserApplet().getUserId(); - List<TAppUserVipDetail> list = appUserVipDetailService.lambdaQuery().eq(TAppUserVipDetail::getAppUserId, userId).last(" and now() between start_time and end_time order by start_time asc").list(); + List<TAppUserVipDetail> list = appUserVipDetailService.lambdaQuery().eq(TAppUserVipDetail::getAppUserId, userId).last(" and now() <= end_time order by start_time asc").list(); for (TAppUserVipDetail tAppUserVipDetail : list) { if(null != tAppUserVipDetail.getVipId()){ @@ -56,6 +66,10 @@ tAppUserVipDetail.setVipName(data.getName()); } } + + + + return R.ok(list); } diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WxLoginController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WxLoginController.java index b640f7d..4d5e00f 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WxLoginController.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WxLoginController.java @@ -30,7 +30,7 @@ import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; -import org.springframework.mock.web.MockMultipartFile; +//import org.springframework.mock.web.MockMultipartFile; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.bind.annotation.*; @@ -66,8 +66,12 @@ /** * 上传文件存储在本地的根路径 */ - @Value("${file.path}") + @Value("${file.upload.location}") private String localFilePath; + + + + @ApiOperation(value = "通过code获得openid,获取用户信息",tags = {"微信小程序登录"}) @PostMapping("/openIdByJsCode") public AjaxResult<Map<String, Object>> openIdByJsCode(@RequestBody AppletUserEncrypteData data) { @@ -99,9 +103,11 @@ public AjaxResult<Map<String, Object>> openIdByJsCode(@RequestBody AppletUserDecodeData appletUserDecodeData) { return AjaxResult.success(appUserService.wxLogin(appletUserDecodeData, null)); } - public static MultipartFile convertInputStreamToMultipartFile(InputStream inputStream, String fileName, String contentType) throws IOException { - return new MockMultipartFile(fileName, fileName, contentType, inputStream); - } + +// public static MultipartFile convertInputStreamToMultipartFile(InputStream inputStream, String fileName, String contentType) throws IOException { +// return new MockMultipartFile(fileName, fileName, contentType, inputStream); +// } + @ApiOperation(value = "获取微信小程序二维码",tags = {"获取微信小程序二维码"}) @PostMapping("/getQRCode") public AjaxResult getQRCode() { @@ -132,10 +138,10 @@ System.err.println(Base64.encodeBase64String(result)); inputStream = new ByteArrayInputStream(result); String finalFileName = System.currentTimeMillis() + "" + new SecureRandom().nextInt(0x0400) + ".jpeg"; - MultipartFile multipartFile = convertInputStreamToMultipartFile(inputStream, finalFileName, "image/jpeg"); - String name = FileUploadUtils.upload(localFilePath, multipartFile); - System.err.println(name); - return AjaxResult.success(name); +// MultipartFile multipartFile = convertInputStreamToMultipartFile(inputStream, finalFileName, "image/jpeg"); +// String name = FileUploadUtils.upload(localFilePath, multipartFile); +// System.err.println(name); + return AjaxResult.success(null); } catch (Exception e) { System.err.println("调用小程序生成微信永久小程序码URL接口异常" + e); } finally { diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppCouponServiceImpl.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppCouponServiceImpl.java index aaee34a..f4d78d6 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppCouponServiceImpl.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppCouponServiceImpl.java @@ -15,20 +15,15 @@ import com.ruoyi.account.service.TAppCouponService; import com.ruoyi.account.service.TAppUserVipDetailService; import com.ruoyi.chargingPile.api.feignClient.ChargingPileClient; -import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.DateUtils; -import com.ruoyi.common.core.web.page.BasePage; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.order.api.feignClient.ChargingOrderClient; import com.ruoyi.order.api.feignClient.OrderClient; import com.ruoyi.order.api.query.TChargingCountQuery; -import com.ruoyi.other.api.domain.TCoupon; import com.ruoyi.other.api.domain.TVip; import com.ruoyi.other.api.feignClient.OtherClient; import com.ruoyi.other.api.feignClient.VipClient; -import io.swagger.models.auth.In; -import org.apache.poi.ss.formula.functions.T; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppUserVipDetailServiceImpl.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppUserVipDetailServiceImpl.java index 1894f70..b5907d9 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppUserVipDetailServiceImpl.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppUserVipDetailServiceImpl.java @@ -3,7 +3,6 @@ import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.account.api.dto.SendCouponDto; -import com.ruoyi.account.api.feignClient.AppCouponClient; import com.ruoyi.account.api.model.TAppCoupon; import com.ruoyi.account.api.model.TAppUserVipDetail; import com.ruoyi.account.mapper.TAppUserVipDetailMapper; @@ -11,9 +10,7 @@ import com.ruoyi.account.service.TAppCouponService; import com.ruoyi.account.service.TAppUserVipDetailService; import com.ruoyi.common.core.domain.R; -import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.other.api.domain.TCoupon; -import com.ruoyi.other.api.domain.TVip; import com.ruoyi.other.api.feignClient.OtherClient; import com.ruoyi.other.api.feignClient.VipClient; import org.springframework.stereotype.Service; diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/task/TaskUtil.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/task/TaskUtil.java index 122ca09..578e04a 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/task/TaskUtil.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/task/TaskUtil.java @@ -5,8 +5,6 @@ import com.ruoyi.account.api.model.TAppUserVipDetail; import com.ruoyi.account.service.TAppUserService; import com.ruoyi.account.service.TAppUserVipDetailService; -import org.intellij.lang.annotations.RegExp; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/GiveVipUtil.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/GiveVipUtil.java index b33e709..12dccfc 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/GiveVipUtil.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/GiveVipUtil.java @@ -1,7 +1,6 @@ package com.ruoyi.account.util; import com.alibaba.fastjson2.JSON; -import com.alibaba.fastjson2.JSONArray; import com.ruoyi.account.api.dto.SendCouponDto; import com.ruoyi.account.api.model.TAppCoupon; import com.ruoyi.account.api.model.TAppUser; diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/SignDayUtil.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/SignDayUtil.java index 5a287f5..3431f5f 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/SignDayUtil.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/SignDayUtil.java @@ -71,6 +71,6 @@ // 更新最后的连续天数 maxContinuousDays = Math.max(maxContinuousDays, currentContinuousDays); - return maxContinuousDays; + return currentContinuousDays; } } diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/VipInfoDto.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/VipInfoDto.java new file mode 100644 index 0000000..bd622b4 --- /dev/null +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/VipInfoDto.java @@ -0,0 +1,45 @@ +package com.ruoyi.account.util; + +import com.ruoyi.other.api.dto.VipCouponDto; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +@Data +public class VipInfoDto { + private Integer id; + @ApiModelProperty("月卡价格") + private BigDecimal monthlyCard; + @ApiModelProperty(value = "月卡折扣") + private BigDecimal monthlyCardDiscount; + @ApiModelProperty("季卡价格") + private BigDecimal seasonCard; + @ApiModelProperty(value = "季卡折扣") + private BigDecimal seasonCardDiscount; + @ApiModelProperty("年卡价格") + private BigDecimal annualCard; + @ApiModelProperty(value = "年卡折扣") + private BigDecimal annualCardDiscount; + @ApiModelProperty("最高抵扣价格") + private BigDecimal maximumDeduction; + private BigDecimal timeAmount; + @ApiModelProperty("抵扣次数") + private Integer discountTimes; + + @ApiModelProperty(value = "双倍积分开关(0=否,1=是)") + private Integer doubleIntegration; + + @ApiModelProperty(value = "商城专享价开关(0=否,1=是)") + private Integer mallExclusivePrice; + @ApiModelProperty(value = "可赠送的优惠卷列表") + + private List<VipCouponDto> vipCouponDtos; + + @ApiModelProperty(value = "最高总折扣") + private BigDecimal totalDiscount; + + @ApiModelProperty(value = "会员名称") + private String name; +} diff --git a/ruoyi-service/ruoyi-account/src/main/resources/bootstrap.yml b/ruoyi-service/ruoyi-account/src/main/resources/bootstrap.yml index 4631e31..ce8973a 100644 --- a/ruoyi-service/ruoyi-account/src/main/resources/bootstrap.yml +++ b/ruoyi-service/ruoyi-account/src/main/resources/bootstrap.yml @@ -13,6 +13,7 @@ profiles: # 环境配置 active: dev +# active: prod --- spring: config: diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java index 8d76a88..11e7230 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java @@ -304,7 +304,7 @@ @ApiOperation(value = "获取站点详细信息", tags = {"小程序-站点管理-站点详情"}) @PostMapping("/getDetailById") public AjaxResult<SiteDetailVO> getDetailById(@Validated @RequestBody SiteDetailQuery query){ - SiteDetailVO siteDetailVO = siteService.getDetailById(query.getSiteId()); + SiteDetailVO siteDetailVO = siteService.getDetailById(query); // 查询合作商名称 Partner partner = partnerService.getById(siteDetailVO.getPartnerId()); if(Objects.nonNull(partner)){ diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TApplyChargingPileController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TApplyChargingPileController.java index c7e799f..4170703 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TApplyChargingPileController.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TApplyChargingPileController.java @@ -6,6 +6,7 @@ import com.ruoyi.chargingPile.api.model.Partner; import com.ruoyi.chargingPile.api.model.Site; import com.ruoyi.common.core.utils.WebUtils; +import com.ruoyi.common.core.web.domain.BasePojo; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.order.api.model.ExportUidDto; import com.ruoyi.order.api.feignClient.OrderClient; @@ -133,6 +134,7 @@ public AjaxResult<Page<TApplyChargingPile>> page(@RequestBody ApplyChargingQuery applyChargingQuery) { Page<TApplyChargingPile> page = applyChargingPileService.lambdaQuery() .like(applyChargingQuery.getLandlordPhone() != null && !applyChargingQuery.getLandlordPhone().equals(""), TApplyChargingPile::getLandlordPhone, applyChargingQuery.getLandlordPhone()) + .orderByDesc(BasePojo::getCreateTime ) .page(Page.of(applyChargingQuery.getPageCurr(), applyChargingQuery.getPageSize())); return AjaxResult.ok(page); } diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java index 6855288..765d06c 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java @@ -3,6 +3,7 @@ import cn.hutool.core.img.ImgUtil; import cn.hutool.core.io.FileUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.chargingPile.api.dto.GetSiteListDTO; import com.ruoyi.chargingPile.api.dto.TChargingGunDTO; @@ -11,6 +12,7 @@ import com.ruoyi.chargingPile.api.model.TChargingPile; import com.ruoyi.chargingPile.api.model.TFaultMessage; import com.ruoyi.chargingPile.api.query.TChargingGunQuery; +import com.ruoyi.chargingPile.api.vo.GetChargingGunByCode; import com.ruoyi.chargingPile.api.vo.GunStatusStatisticsVO; import com.ruoyi.chargingPile.api.vo.SiteNameVO; import com.ruoyi.chargingPile.api.vo.TChargingGunVO; @@ -155,7 +157,7 @@ public void downloadQRCode(@PathVariable Integer id, HttpServletResponse response){ try { TChargingGun chargingGun = chargingGunService.getById(id); - TChargingPile chargingPile = chargingPileService.getById(chargingGun.getId()); + TChargingPile chargingPile = chargingPileService.getById(chargingGun.getChargingPileId()); String code = chargingPile.getCode() + chargingGun.getCode(); String fileName = URLEncoder.encode(code, "UTF-8") + ".jpg"; response.setContentType("application/force-download"); @@ -175,15 +177,15 @@ 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(); - } +// Process process = null; +// try { +// process = Runtime.getRuntime().exec("sudo rm -rf " + filePath); +// } catch (IOException e) { +// throw new RuntimeException(e); +// } +// if (process != null) { +// process.destroy(); +// } }catch (Exception e){ e.printStackTrace(); } @@ -254,11 +256,14 @@ * @param code * @return */ - @PostMapping("/getChargingGunByCode/{code}") - public R<TChargingGun> getChargingGunByCode(@PathVariable("code") String code){ + @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)); return R.ok(chargingGunService.getOne(Wrappers.lambdaQuery(TChargingGun.class) - .eq(TChargingGun::getCode, code) - .last("LIMIT 1"))); + .eq(TChargingGun::getChargingPileId, chargingPile.getId()) + .eq(TChargingGun::getCode, code.getCharging_gun_code()) + .eq(TChargingGun::getDelFlag, 0) + .last("LIMIT 1"))); } /** * 根据枪编号获取充电枪 diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingRecordController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingRecordController.java index 09bedaa..a663380 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingRecordController.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingRecordController.java @@ -36,7 +36,10 @@ import java.io.IOException; import java.math.BigDecimal; import java.net.URLEncoder; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -195,9 +198,62 @@ if (parkingRecordQueryDto.getDayType()==1) { List<Map<String, Object>> maps = parkingRecordService.parkingData(parkingRecordQueryDto); - tParkLotRecordVO.setMaps(maps); + + + List<Map<String, Object>> charMap = new ArrayList<>(); + // 生成从 "00:00" 到 "23:00" 的时间数据 + for (int hour = 0; hour < 24; hour++) { + String time = String.format("%02d:00", hour); + Map<String, Object> mapWithTimeValue = findMapWithTimeValue(maps, time); + if (mapWithTimeValue!=null){ + charMap.add(mapWithTimeValue); + }else { + Map<String, Object> timeMap = new HashMap<>(); + timeMap.put("time", time); // 初始化值为 null + timeMap.put("orders", 0); + timeMap.put("timeoutAmount", 0); + + charMap.add(timeMap); + } + } + + tParkLotRecordVO.setMaps(charMap); }else { List<Map<String, Object>> maps = parkingRecordService.parkingDataByDate(parkingRecordQueryDto); + if(parkingRecordQueryDto.getDayType()==2||parkingRecordQueryDto.getDayType()==3){ + //按日 + // 解析 startTime 和 endTime 为 LocalDate + LocalDate startDate = parkingRecordQueryDto.getStartTime(); + LocalDate endDate = parkingRecordQueryDto.getEndTime(); + + List<Map<String, Object>> dateRangeStatistics = new ArrayList<>(); + + // 遍历日期范围 + while (!startDate.isAfter(endDate)) { + String formattedDate = startDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + Map<String, Object> dailyStats = findMapWithDateValue(maps, formattedDate); + + if (dailyStats != null) { + dateRangeStatistics.add(dailyStats); + } else { + Map<String, Object> dateMap = new HashMap<>(); + dateMap.put("time", formattedDate); + dateMap.put("electrovalence", 0); + dateMap.put("orderCount", 0); + dateMap.put("servicecharge", 0); + dateMap.put("electricity", 0); + dateRangeStatistics.add(dateMap); + } + + // 移动到下一天 + startDate = startDate.plusDays(1); + } + tParkLotRecordVO.setMaps(dateRangeStatistics); + + }else { + + } + tParkLotRecordVO.setMaps(maps); } @@ -217,8 +273,23 @@ return R.ok(tParkLotRecordVO); } + private static Map<String, Object> findMapWithTimeValue(List<Map<String, Object>> charMap1,String timeValue) { + for (Map<String, Object> map : charMap1) { + if (map.containsKey("time") && map.get("time").equals(timeValue)) { + return map; + } + } + return null; // 如果没有找到,返回 null + } - + private Map<String, Object> findMapWithDateValue(List<Map<String, Object>> list, String date) { + for (Map<String, Object> map : list) { + if (date.equals(map.get("time"))) { + return map; + } + } + return null; + } @ResponseBody @PostMapping(value = "/parking/work") @ApiOperation(value = "停车订单统计", tags = {"管理后台-工作台"}) diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/SiteMapper.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/SiteMapper.java index 9a7ab8d..435801d 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/SiteMapper.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/SiteMapper.java @@ -4,6 +4,7 @@ import com.ruoyi.chargingPile.api.dto.GetSiteListDTO; import com.ruoyi.chargingPile.api.model.Site; import com.ruoyi.chargingPile.api.query.GetSiteList; +import com.ruoyi.chargingPile.api.query.SiteDetailQuery; import com.ruoyi.chargingPile.api.query.SiteQuery; import com.ruoyi.chargingPile.api.vo.SiteDetailVO; import com.ruoyi.chargingPile.api.vo.SiteVO; @@ -41,7 +42,7 @@ * @param siteId * @return */ - SiteDetailVO getDetailById(@Param("siteId")Integer siteId); + SiteDetailVO getDetailById(@Param("query") SiteDetailQuery query); /** * 获取站点列表不分页 管理后台-停车场绑定 diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/ISiteService.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/ISiteService.java index 15cf0c5..367d6da 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/ISiteService.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/ISiteService.java @@ -4,6 +4,7 @@ import com.ruoyi.chargingPile.api.dto.GetSiteListDTO; import com.ruoyi.chargingPile.api.model.Site; import com.ruoyi.chargingPile.api.query.GetSiteList; +import com.ruoyi.chargingPile.api.query.SiteDetailQuery; import com.ruoyi.chargingPile.api.query.SiteQuery; import com.ruoyi.chargingPile.api.vo.SiteDetailVO; import com.ruoyi.chargingPile.api.vo.SiteVO; @@ -72,10 +73,10 @@ /** * 获取站点详情 - * @param siteId + * @param query * @return */ - SiteDetailVO getDetailById(Integer siteId); + SiteDetailVO getDetailById(SiteDetailQuery query); /** * 获取站点列表不分页 管理后台-停车场绑定 diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java index e83c91e..8029ad5 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java @@ -10,6 +10,7 @@ import com.ruoyi.chargingPile.api.model.TChargingPile; import com.ruoyi.chargingPile.api.model.TParkingLot; import com.ruoyi.chargingPile.api.query.GetSiteList; +import com.ruoyi.chargingPile.api.query.SiteDetailQuery; import com.ruoyi.chargingPile.api.query.SiteQuery; import com.ruoyi.chargingPile.api.vo.SiteDetailVO; import com.ruoyi.chargingPile.api.vo.SiteVO; @@ -296,8 +297,8 @@ } @Override - public SiteDetailVO getDetailById(Integer siteId) { - return this.baseMapper.getDetailById(siteId); + public SiteDetailVO getDetailById(SiteDetailQuery query) { + return this.baseMapper.getDetailById(query); } @Override diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingGunServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingGunServiceImpl.java index 0a3d4e7..c512cb8 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingGunServiceImpl.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingGunServiceImpl.java @@ -19,6 +19,8 @@ import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.security.utils.SecurityUtils; +import com.ruoyi.integration.api.feignClient.SendMessageClient; +import com.ruoyi.integration.api.model.QrCodeDelivery; import com.ruoyi.other.api.feignClient.RoleSiteClient; import com.ruoyi.other.api.feignClient.UserSiteClient; import com.ruoyi.system.api.domain.SysUser; @@ -60,6 +62,9 @@ @Resource private SysUserRoleClient sysUserRoleClient; + + @Resource + private SendMessageClient sendMessageClient; @@ -116,6 +121,17 @@ return AjaxResult.error("接口编码已存在"); } this.save(dto); + TChargingPile chargingPile = chargingPileService.getById(dto.getChargingPileId()); + + //下发硬件充电二维码 + String code_prefix = "https://mxcd.zhinenganguan.com?No="; + QrCodeDelivery qrCodeDelivery = new QrCodeDelivery(); + qrCodeDelivery.setCharging_pile_code(chargingPile.getCode()); + qrCodeDelivery.setCode_format(1); + qrCodeDelivery.setPrefix_length(code_prefix.length()); + qrCodeDelivery.setCode_prefix(code_prefix); + qrCodeDelivery.setQr_code(code_prefix + chargingPile.getCode() + dto.getCode()); + sendMessageClient.qrCodeDelivery(qrCodeDelivery); return AjaxResult.success(); } @@ -141,6 +157,17 @@ return AjaxResult.error("接口编码已存在"); } this.updateById(dto); + TChargingPile chargingPile = chargingPileService.getById(dto.getChargingPileId()); + + //下发硬件充电二维码 + String code_prefix = "https://mxcd.zhinenganguan.com?No="; + QrCodeDelivery qrCodeDelivery = new QrCodeDelivery(); + qrCodeDelivery.setCharging_pile_code(chargingPile.getCode()); + qrCodeDelivery.setCode_format(1); + qrCodeDelivery.setPrefix_length(code_prefix.length()); + qrCodeDelivery.setCode_prefix(code_prefix); + qrCodeDelivery.setQr_code(code_prefix + chargingPile.getCode() + dto.getCode()); + sendMessageClient.qrCodeDelivery(qrCodeDelivery); return AjaxResult.success(); } @@ -230,14 +257,17 @@ Long count = this.baseMapper.selectCount(Wrappers.lambdaQuery(TChargingGun.class) .eq(TChargingGun::getStatus, 1)); HashMap<String, Integer> objectObjectHashMap1 = new HashMap<>(); - objectObjectHashMap1.put("1", count.intValue()); + objectObjectHashMap1.put("charge_mode",1); + objectObjectHashMap1.put("modeCount", count.intValue()); statusStatistics.add(objectObjectHashMap1); // statusStatistics.put(1, count.intValue()); // 故障 count = this.baseMapper.selectCount(Wrappers.lambdaQuery(TChargingGun.class) .eq(TChargingGun::getStatus, 7)); HashMap<String, Integer> objectObjectHashMap2 = new HashMap<>(); - objectObjectHashMap2.put("2", count.intValue()); +// objectObjectHashMap2.put("2", count.intValue()); + objectObjectHashMap2.put("charge_mode",2); + objectObjectHashMap2.put("modeCount", count.intValue()); statusStatistics.add(objectObjectHashMap2); // statusStatistics.put(2, count.intValue()); @@ -245,7 +275,8 @@ count = this.baseMapper.selectCount(Wrappers.lambdaQuery(TChargingGun.class) .in(TChargingGun::getStatus, Arrays.asList(3,4,5,6))); HashMap<String, Integer> objectObjectHashMap = new HashMap<>(); - objectObjectHashMap.put("3", count.intValue()); + objectObjectHashMap.put("charge_mode",3); + objectObjectHashMap.put("modeCount", count.intValue()); statusStatistics.add(objectObjectHashMap); // statusStatistics.put(3, count.intValue()); diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java index d95c38f..96f1155 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java @@ -23,12 +23,17 @@ import com.ruoyi.chargingPile.service.ISiteService; import com.ruoyi.chargingPile.service.TChargingGunService; import com.ruoyi.chargingPile.service.TChargingPileService; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.security.utils.SecurityUtils; +import com.ruoyi.integration.api.feignClient.IotInterfaceClient; import com.ruoyi.integration.api.feignClient.UploadRealTimeMonitoringDataClient; import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData; +import com.ruoyi.integration.api.vo.AddDevice; +import com.ruoyi.integration.api.vo.AddDeviceResp; +import com.ruoyi.integration.api.vo.DeleteDeviceResp; import com.ruoyi.order.api.feignClient.ChargingOrderAccountingStrategyClient; import com.ruoyi.order.api.feignClient.ChargingOrderClient; import com.ruoyi.order.api.model.TChargingOrder; @@ -93,6 +98,9 @@ @Resource private SysUserRoleClient sysUserRoleClient; + @Resource + private IotInterfaceClient iotInterfaceClient; + @@ -151,7 +159,20 @@ if(count > 0){ return AjaxResult.error("设备编号已存在"); } - this.save(chargingPile); + //调用华为Iot创建设备 + AddDevice addDevice = new AddDevice(); + addDevice.setProductId("66da68d21837002b28b34ec0"); + addDevice.setNodeId(chargingPile.getCode()); + addDevice.setDeviceName(chargingPile.getName()); + addDevice.setDescription(chargingPile.getNumber().toString()); + AddDeviceResp deviceResp = iotInterfaceClient.addDevice(addDevice).getData(); + if(null != deviceResp){ + int httpStatusCode = deviceResp.getHttpStatusCode(); + if(httpStatusCode == 201){ + chargingPile.setIotdDeviceId(deviceResp.getDeviceId()); + this.save(chargingPile); + } + } return AjaxResult.success(); } @@ -227,7 +248,6 @@ @Override public AjaxResult delChargingPile(Integer[] ids) { //检查是否有关联数据 - //接口 long count = chargingGunService.count(new LambdaQueryWrapper<TChargingGun>().in(TChargingGun::getChargingPileId, Arrays.asList(ids)) .eq(TChargingGun::getDelFlag, 0)); if(count > 0){ @@ -235,7 +255,13 @@ } for (Integer id : ids) { TChargingPile chargingPile = this.getById(id); - this.removeById(chargingPile); + //调用华为Iot删除设备 + if(StringUtils.isNotEmpty(chargingPile.getIotdDeviceId())){ + DeleteDeviceResp deviceResp = iotInterfaceClient.deleteDevice(chargingPile.getIotdDeviceId()).getData(); + if(null != deviceResp && deviceResp.getHttpStatusCode() == 201){ + this.removeById(chargingPile); + } + } } return AjaxResult.success(); } diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/resources/bootstrap.yml b/ruoyi-service/ruoyi-chargingPile/src/main/resources/bootstrap.yml index af5069b..7c025cd 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/resources/bootstrap.yml +++ b/ruoyi-service/ruoyi-chargingPile/src/main/resources/bootstrap.yml @@ -13,6 +13,7 @@ profiles: # 环境配置 active: dev +# active: prod --- spring: config: diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/SiteMapper.xml b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/SiteMapper.xml index 111e8fb..a683383 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/SiteMapper.xml +++ b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/SiteMapper.xml @@ -210,7 +210,7 @@ ) ) * 1000 ) AS distance - FROM t_site WHERE id = #{siteId} AND del_flag = ${@com.ruoyi.common.core.enums.DelFlagEnum@NO.getCode()} + FROM t_site WHERE id = #{query.siteId} AND del_flag = ${@com.ruoyi.common.core.enums.DelFlagEnum@NO.getCode()} </select> <select id="getSiteListParkLot" resultType="com.ruoyi.chargingPile.api.model.Site"> select ts.id, ts.partner_id, ts.code, ts.`name`, ts.site_type, ts.business_category, ts.status diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TParkingRecordMapper.xml b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TParkingRecordMapper.xml index c2a81d1..5ffee38 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TParkingRecordMapper.xml +++ b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TParkingRecordMapper.xml @@ -84,7 +84,7 @@ </select> <select id="parkingData" resultType="java.util.Map"> SELECT - DATE_FORMAT( create_time, '%Y-%m-%d %H' ) AS TIME, + DATE_FORMAT( create_time, '%Y-%m-%d %H' ) AS time, count( 1 ) AS orders, SUM( timeout_amount ) AS timeoutAmount FROM @@ -94,13 +94,13 @@ AND parking_lot_id = #{parkingRecordQueryDto.parkingLotId} </if> GROUP BY - TIME + time ORDER BY - TIME + time </select> <select id="parkingDataByDate" resultType="java.util.Map"> SELECT - DATE_FORMAT( create_time, '%Y-%m-%d' ) AS TIME, + DATE_FORMAT( create_time, '%Y-%m-%d' ) AS time, count( 1 ) AS orders, SUM( timeout_amount ) AS timeoutAmount FROM @@ -110,27 +110,27 @@ AND parking_lot_id = #{parkingRecordQueryDto.parkingLotId} </if> <if test="parkingRecordQueryDto.dayType == 2"> - AND WEEKOFYEAR( co.create_time ) = WEEKOFYEAR( CURDATE() ) + AND WEEKOFYEAR( create_time ) = WEEKOFYEAR( CURDATE() ) </if> <if test="parkingRecordQueryDto.dayType == 3"> - AND MONTH( co.create_time ) = MONTH(CURDATE()) + AND MONTH( create_time ) = MONTH(CURDATE()) </if> <if test="parkingRecordQueryDto.dayType == 4"> - AND YEAR( co.create_time ) = YEAR(CURDATE() ) + AND YEAR( create_time ) = YEAR(CURDATE() ) </if> <if test="parkingRecordQueryDto.dayType == 5"> <if test="parkingRecordQueryDto.startTime != null"> - AND co.create_time >= #{parkingRecordQueryDto.startTime} + AND create_time >= #{parkingRecordQueryDto.startTime} </if> <if test="parkingRecordQueryDto.endTime != null"> - AND co.create_time <= #{parkingRecordQueryDto.endTime} + AND create_time <= #{parkingRecordQueryDto.endTime} </if> </if> </where> GROUP BY - TIME + time ORDER BY - TIME + time </select> @@ -147,20 +147,20 @@ AND DATE( create_time ) = CURDATE() </if> <if test="parkingRecordQueryDto.dayType == 2"> - AND WEEKOFYEAR( co.create_time ) = WEEKOFYEAR( CURDATE() ) + AND WEEKOFYEAR( create_time ) = WEEKOFYEAR( CURDATE() ) </if> <if test="parkingRecordQueryDto.dayType == 3"> - AND MONTH( co.create_time ) = MONTH(CURDATE()) + AND MONTH( create_time ) = MONTH(CURDATE()) </if> <if test="parkingRecordQueryDto.dayType == 4"> - AND YEAR( co.create_time ) = YEAR(CURDATE() ) + AND YEAR( create_time ) = YEAR(CURDATE() ) </if> <if test="parkingRecordQueryDto.dayType == 5"> <if test="parkingRecordQueryDto.startTime != null"> - AND co.create_time >= #{parkingRecordQueryDto.startTime} + AND create_time >= #{parkingRecordQueryDto.startTime} </if> <if test="parkingRecordQueryDto.endTime != null"> - AND co.create_time <= #{parkingRecordQueryDto.endTime} + AND create_time <= #{parkingRecordQueryDto.endTime} </if> </if> </where> @@ -180,20 +180,20 @@ AND DATE( create_time ) = CURDATE() </if> <if test="parkingRecordQueryDto.dayType == 2"> - AND WEEKOFYEAR( co.create_time ) = WEEKOFYEAR( CURDATE() ) + AND WEEKOFYEAR( create_time ) = WEEKOFYEAR( CURDATE() ) </if> <if test="parkingRecordQueryDto.dayType == 3"> - AND MONTH( co.create_time ) = MONTH(CURDATE()) + AND MONTH( create_time ) = MONTH(CURDATE()) </if> <if test="parkingRecordQueryDto.dayType == 4"> - AND YEAR( co.create_time ) = YEAR(CURDATE() ) + AND YEAR( create_time ) = YEAR(CURDATE() ) </if> <if test="parkingRecordQueryDto.dayType == 5"> <if test="parkingRecordQueryDto.startTime != null"> - AND co.create_time >= #{parkingRecordQueryDto.startTime} + AND create_time >= #{parkingRecordQueryDto.startTime} </if> <if test="parkingRecordQueryDto.endTime != null"> - AND co.create_time <= #{parkingRecordQueryDto.endTime} + AND create_time <= #{parkingRecordQueryDto.endTime} </if> </if> </where> @@ -216,20 +216,20 @@ AND DATE( create_time ) = CURDATE() </if> <if test="parkingRecordQueryDto.dayType == 2"> - AND WEEKOFYEAR( co.create_time ) = WEEKOFYEAR( CURDATE() ) + AND WEEKOFYEAR( create_time ) = WEEKOFYEAR( CURDATE() ) </if> <if test="parkingRecordQueryDto.dayType == 3"> - AND MONTH( co.create_time ) = MONTH(CURDATE()) + AND MONTH( create_time ) = MONTH(CURDATE()) </if> <if test="parkingRecordQueryDto.dayType == 4"> - AND YEAR( co.create_time ) = YEAR(CURDATE() ) + AND YEAR( create_time ) = YEAR(CURDATE() ) </if> <if test="parkingRecordQueryDto.dayType == 5"> <if test="parkingRecordQueryDto.startTime != null"> - AND co.create_time >= #{parkingRecordQueryDto.startTime} + AND create_time >= #{parkingRecordQueryDto.startTime} </if> <if test="parkingRecordQueryDto.endTime != null"> - AND co.create_time <= #{parkingRecordQueryDto.endTime} + AND create_time <= #{parkingRecordQueryDto.endTime} </if> </if> </where> diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/RuoYiIntegrationApplication.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/RuoYiIntegrationApplication.java index a05ffbf..a6e9f2b 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/RuoYiIntegrationApplication.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/RuoYiIntegrationApplication.java @@ -6,6 +6,10 @@ import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.annotation.StreamListener; +import org.springframework.cloud.stream.messaging.Sink; +import org.springframework.cloud.stream.messaging.Source; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.transaction.annotation.EnableTransactionManagement; @@ -20,6 +24,7 @@ @SpringBootApplication @EnableScheduling//开启定时任务 @EnableTransactionManagement//开启事务 +@EnableBinding({ Source.class, Sink.class }) public class RuoYiIntegrationApplication { public static void main(String[] args) { SpringApplication.run(RuoYiIntegrationApplication.class, args); diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/controller/SecurityDetectionController.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/controller/SecurityDetectionController.java new file mode 100644 index 0000000..618b007 --- /dev/null +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/controller/SecurityDetectionController.java @@ -0,0 +1,34 @@ +package com.ruoyi.integration.controller; + +import com.ruoyi.common.core.domain.R; +import com.ruoyi.integration.api.model.SecurityDetection; +import com.ruoyi.integration.mongodb.service.SecurityDetectionService; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +/** + * @author zhibing.pu + * @Date 2024/10/8 14:25 + */ +@RestController +@RequestMapping("/securityDetection") +public class SecurityDetectionController { + + @Resource + private SecurityDetectionService securityDetectionService; + + /** + * 获取安全检测数据 + * @param transactionSerialNumber + * @return + */ + @PostMapping("/getSecurityDetection") + public R<SecurityDetection> getSecurityDetection(@RequestParam("transactionSerialNumber") String transactionSerialNumber){ + SecurityDetection securityDetection = securityDetectionService.getSecurityDetection(transactionSerialNumber); + return R.ok(securityDetection); + } +} diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/constant/SendTagConstant.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/constant/SendTagConstant.java index 6d92d1a..9b263b9 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/constant/SendTagConstant.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/constant/SendTagConstant.java @@ -126,4 +126,5 @@ * 安全监测 */ public final static String SECURITY_DETECTION ="security_detection"; + public static final String CHARGING_MESSAGE ="charging_message"; } diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/controller/IotInterfaceController.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/controller/IotInterfaceController.java new file mode 100644 index 0000000..e68a21f --- /dev/null +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/controller/IotInterfaceController.java @@ -0,0 +1,48 @@ +package com.ruoyi.integration.iotda.controller; + +import com.huaweicloud.sdk.iotda.v5.model.AddDeviceResponse; +import com.huaweicloud.sdk.iotda.v5.model.DeleteDeviceResponse; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.integration.api.vo.AddDevice; +import com.ruoyi.integration.api.vo.AddDeviceResp; +import com.ruoyi.integration.api.vo.DeleteDeviceResp; +import com.ruoyi.integration.iotda.utils.api.IotInterfaceUtil; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +/** + * @author zhibing.pu + * @Date 2024/10/8 10:29 + */ +@RestController +@RequestMapping("/iotInterface") +public class IotInterfaceController { + + @Resource + private IotInterfaceUtil iotInterfaceUtil; + + + + + + /** + * 添加设备 + * @return + */ + @PostMapping("/addDevice") + public R<AddDeviceResp> addDevice(@RequestBody AddDevice addDevice){ + return iotInterfaceUtil.addDeviceRequest(addDevice.getProductId(), addDevice.getNodeId(), addDevice.getDeviceName(), addDevice.getDescription()); + } + + + /** + * 删除设备 + * @param deviceId + * @return + */ + @PostMapping("/deleteDevice") + public R<DeleteDeviceResp> deleteDevice(@RequestParam("deviceId") String deviceId){ + return iotInterfaceUtil.deleteDeviceRequest(deviceId); + } +} diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/api/IotInterfaceUtil.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/api/IotInterfaceUtil.java index 7582df9..0f2fb02 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/api/IotInterfaceUtil.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/api/IotInterfaceUtil.java @@ -1,22 +1,19 @@ package com.ruoyi.integration.iotda.utils.api; -import com.huaweicloud.sdk.core.auth.AbstractCredentials; -import com.huaweicloud.sdk.core.auth.ICredential; import com.huaweicloud.sdk.core.exception.ConnectionException; import com.huaweicloud.sdk.core.exception.RequestTimeoutException; import com.huaweicloud.sdk.core.exception.ServiceResponseException; -import com.huaweicloud.sdk.iotda.v5.IoTDAClient; import com.huaweicloud.sdk.iotda.v5.model.*; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.CodeGenerateUtils; -import com.ruoyi.common.core.utils.uuid.UUID; +import com.ruoyi.integration.api.vo.AddDeviceResp; +import com.ruoyi.integration.api.vo.DeleteDeviceResp; import com.ruoyi.integration.iotda.builder.IotBuilder; -import com.ruoyi.integration.iotda.config.IotAccountConfig; import com.ruoyi.integration.iotda.config.IotDAConfig; -import com.ruoyi.integration.iotda.constant.IotConstant; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RestController; import java.text.MessageFormat; import java.util.ArrayList; @@ -26,7 +23,7 @@ * iot接口调用工具类 */ @Slf4j -@RestController +@Component public class IotInterfaceUtil { private static final String dataFormat = "json"; @@ -118,7 +115,7 @@ * @param description 设备描述 * @return AddDeviceResponse */ - public AddDeviceResponse addDeviceRequest(String productId,String nodeId,String deviceName,String description) { + public R<AddDeviceResp> addDeviceRequest(String productId,String nodeId,String deviceName,String description) { AddDeviceRequest request = new AddDeviceRequest(); AddDevice body = new AddDevice(); body.withDeviceId(nodeId); @@ -130,7 +127,10 @@ try { AddDeviceResponse response = iotBuilder.buildIot().addDevice(request); log.info("创建设备:{}",response.toString()); - return response; + + AddDeviceResp addDeviceResp = new AddDeviceResp(); + BeanUtils.copyProperties(response, addDeviceResp); + return R.ok(addDeviceResp); } catch (ConnectionException e) { e.printStackTrace(); } catch (RequestTimeoutException e) { @@ -142,7 +142,7 @@ System.out.println(e.getErrorCode()); System.out.println(e.getErrorMsg()); } - return null; + return R.fail(); } /** @@ -234,13 +234,15 @@ * @param deviceId 设备ID 使用已有设备编号 * @return DeleteDeviceResponse */ - public DeleteDeviceResponse deleteDeviceRequest(String deviceId) { + public R<DeleteDeviceResp> deleteDeviceRequest(String deviceId) { DeleteDeviceRequest request = new DeleteDeviceRequest(); request.withDeviceId(deviceId); try { DeleteDeviceResponse response = iotBuilder.buildIot().deleteDevice(request); log.info("删除设备:{}",response.toString()); - return response; + DeleteDeviceResp deleteDeviceResp = new DeleteDeviceResp(); + BeanUtils.copyProperties(response, deleteDeviceResp); + return R.ok(deleteDeviceResp); } catch (ConnectionException e) { e.printStackTrace(); } catch (RequestTimeoutException e) { @@ -252,6 +254,6 @@ System.out.println(e.getErrorCode()); System.out.println(e.getErrorMsg()); } - return null; + return R.fail(); } } \ No newline at end of file diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java index bbc01a0..6684de3 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java @@ -68,12 +68,15 @@ writer.write("服务id:"+service_id+"\n"); writer.close(); SendResult sendResult; + ChargingMessage chargingMessage = new ChargingMessage(); + chargingMessage.setServiceId(service_id); // 设备消息下发 String result; switch (service_id){ case SendTagConstant.ONLINE: OnlineMessage onlineMessage = JSON.parseObject(content.toJSONString(),OnlineMessage.class); - sendResult = enhanceProduce.onlineMessage(onlineMessage); + chargingMessage.setOnlineMessage(onlineMessage); + sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 // 业务处理 登录认证应答 OnlineReply onlineReply = new OnlineReply(); @@ -89,7 +92,8 @@ break; case SendTagConstant.PING: PingMessage pingMessage = JSON.parseObject(content.toJSONString(),PingMessage.class); - sendResult = enhanceProduce.pingMessage(pingMessage); + chargingMessage.setPingMessage(pingMessage); + sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 Pong pong = new Pong(); pong.setCharging_pile_code(pingMessage.getCharging_pile_code()); @@ -100,17 +104,20 @@ break; case SendTagConstant.END_CHARGE: EndChargeMessage endChargeMessage = JSON.parseObject(content.toJSONString(),EndChargeMessage.class); - sendResult = enhanceProduce.endChargeMessage(endChargeMessage); + chargingMessage.setEndChargeMessage(endChargeMessage); + sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.ERROR_MESSAGE: ErrorMessageMessage errorMessageMessage = JSON.parseObject(content.toJSONString(),ErrorMessageMessage.class); - sendResult = enhanceProduce.errorMessageMessage(errorMessageMessage); + chargingMessage.setErrorMessageMessage(errorMessageMessage); + sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.BILLING_MODE_VERIFY: BillingModeVerifyMessage billingModeVerifyMessage = JSON.parseObject(content.toJSONString(),BillingModeVerifyMessage.class); - sendResult = enhanceProduce.billingModeVerifyMessage(billingModeVerifyMessage); + chargingMessage.setBillingModeVerifyMessage(billingModeVerifyMessage); + sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 BillingModeVerifyReply billingModeVerifyReply = new BillingModeVerifyReply(); if(billingModeVerifyMessage.getBilling_model_code().equals("0")){ @@ -137,7 +144,8 @@ break; case SendTagConstant.ACQUISITION_BILLING_MODE: AcquisitionBillingModeMessage acquisitionBillingModeMessage = JSON.parseObject(content.toJSONString(),AcquisitionBillingModeMessage.class); - sendResult = enhanceProduce.acquisitionBillingModeMessage(acquisitionBillingModeMessage); + chargingMessage.setAcquisitionBillingModeMessage(acquisitionBillingModeMessage); + sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 计费模型请求应答 1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段 List<TAccountingStrategyDetail> accountingStrategyDetails = accountingStrategyDetailClient.getDetailListByCode(acquisitionBillingModeMessage.getCharging_pile_code().substring(0,14)).getData(); Map<Integer, TAccountingStrategyDetail> strategyPrice = StrategyUtil.getStrategyPrice(accountingStrategyDetails); @@ -154,40 +162,48 @@ break; case SendTagConstant.UPLOAD_REAL_TIME_MONITORING_DATA: UploadRealTimeMonitoringDataMessage uploadRealTimeMonitoringDataMessage = JSON.parseObject(content.toJSONString(),UploadRealTimeMonitoringDataMessage.class); - sendResult = enhanceProduce.uploadRealTimeMonitoringDataMessage(uploadRealTimeMonitoringDataMessage); + chargingMessage.setUploadRealTimeMonitoringDataMessage(uploadRealTimeMonitoringDataMessage); + sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.CHARGING_HANDSHAKE: ChargingHandshakeMessage chargingHandshakeMessage = JSON.parseObject(content.toJSONString(),ChargingHandshakeMessage.class); - sendResult = enhanceProduce.chargingHandshakeMessage(chargingHandshakeMessage); + chargingMessage.setChargingHandshakeMessage(chargingHandshakeMessage); + sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.PARAMETER_SETTING: ParameterSettingMessage parameterSettingMessage = JSON.parseObject(content.toJSONString(),ParameterSettingMessage.class); - sendResult = enhanceProduce.parameterSettingMessage(parameterSettingMessage); + chargingMessage.setParameterSettingMessage(parameterSettingMessage); + sendResult = enhanceProduce.chargingMessage(chargingMessage); break; case SendTagConstant.BMS_ABORT: BmsAbortMessage bmsAbortMessage = JSON.parseObject(content.toJSONString(),BmsAbortMessage.class); - sendResult = enhanceProduce.bmsAbortMessage(bmsAbortMessage); + chargingMessage.setBmsAbortMessage(bmsAbortMessage); + sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.MOTOR_ABORT: MotorAbortMessage motorAbortMessage = JSON.parseObject(content.toJSONString(),MotorAbortMessage.class); - sendResult = enhanceProduce.motorAbortMessage(motorAbortMessage); + chargingMessage.setMotorAbortMessage(motorAbortMessage); + sendResult = enhanceProduce.chargingMessage(chargingMessage); break; case SendTagConstant.BMS_DEMAND_AND_CHARGER_EXPORTATION: BmsDemandAndChargerExportationMessage bmsDemandAndChargerExportationMessage = JSON.parseObject(content.toJSONString(),BmsDemandAndChargerExportationMessage.class); - sendResult = enhanceProduce.bmsDemandAndChargerExportationMessage(bmsDemandAndChargerExportationMessage); + chargingMessage.setBmsDemandAndChargerExportationMessage(bmsDemandAndChargerExportationMessage); + sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.BMS_INFORMATION: BmsInformationMessage bmsInformationMessage = JSON.parseObject(content.toJSONString(),BmsInformationMessage.class); - sendResult = enhanceProduce.bmsInformationMessage(bmsInformationMessage); + chargingMessage.setBmsInformationMessage(bmsInformationMessage); + sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.CHARGING_PILE_STARTS_CHARGING: ChargingPileStartsChargingMessage chargingPileStartsChargingMessage = JSON.parseObject(content.toJSONString(),ChargingPileStartsChargingMessage.class); - sendResult = enhanceProduce.chargingPileStartsChargingMessage(chargingPileStartsChargingMessage); + chargingMessage.setChargingPileStartsChargingMessage(chargingPileStartsChargingMessage); + sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 PlatformConfirmationCharging platformConfirmationCharging = new PlatformConfirmationCharging(); platformConfirmationCharging.setCharging_pile_code(chargingPileStartsChargingMessage.getCharging_pile_code()); @@ -200,17 +216,20 @@ break; case SendTagConstant.PLATFORM_START_CHARGING_REPLY: PlatformStartChargingReplyMessage platformStartChargingReplyMessage = JSON.parseObject(content.toJSONString(),PlatformStartChargingReplyMessage.class); - sendResult = enhanceProduce.platformStartChargingReplyMessage(platformStartChargingReplyMessage); + chargingMessage.setPlatformStartChargingReplyMessage(platformStartChargingReplyMessage); + sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.PLATFORM_STOP_CHARGING_REPLY: PlatformStopChargingReplyMessage platformStopChargingReplyMessage = JSON.parseObject(content.toJSONString(),PlatformStopChargingReplyMessage.class); - sendResult = enhanceProduce.platformStopChargingReplyMessage(platformStopChargingReplyMessage); + chargingMessage.setPlatformStopChargingReplyMessage(platformStopChargingReplyMessage); + sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.TRANSACTION_RECORD: TransactionRecordMessage transactionRecordMessage = JSON.parseObject(content.toJSONString(),TransactionRecordMessage.class); - sendResult = enhanceProduce.transactionRecordMessage(transactionRecordMessage); + chargingMessage.setTransactionRecordMessage(transactionRecordMessage); + sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 ConfirmTransactionRecord confirmTransactionRecord = new ConfirmTransactionRecord(); confirmTransactionRecord.setTransaction_serial_number(transactionRecordMessage.getTransaction_serial_number()); @@ -219,27 +238,32 @@ break; case SendTagConstant.UPDATE_BALANCE_REPLY: UpdateBalanceReplyMessage updateBalanceReplyMessage = JSON.parseObject(content.toJSONString(),UpdateBalanceReplyMessage.class); - sendResult = enhanceProduce.updateBalanceReplyMessage(updateBalanceReplyMessage); + chargingMessage.setUpdateBalanceReplyMessage(updateBalanceReplyMessage); + sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.SYNCHRONIZE_OFFLINE_CARD_REPLY: SynchronizeOfflineCardReplyMessage synchronizeOfflineCardReplyMessage = JSON.parseObject(content.toJSONString(),SynchronizeOfflineCardReplyMessage.class); - sendResult = enhanceProduce.synchronizeOfflineCardReplyMessage(synchronizeOfflineCardReplyMessage); + chargingMessage.setSynchronizeOfflineCardReplyMessage(synchronizeOfflineCardReplyMessage); + sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.CLEAR_OFFLINE_CARD_REPLY: ClearOfflineCardReplyMessage clearOfflineCardReplyMessage = JSON.parseObject(content.toJSONString(),ClearOfflineCardReplyMessage.class); - sendResult = enhanceProduce.clearOfflineCardReplyMessage(clearOfflineCardReplyMessage); + chargingMessage.setClearOfflineCardReplyMessage(clearOfflineCardReplyMessage); + sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.WORKING_PARAMETER_SETTING_REPLY: WorkingParameterSettingReplyMessage workingParameterSettingReplyMessage = JSON.parseObject(content.toJSONString(),WorkingParameterSettingReplyMessage.class); - sendResult = enhanceProduce.workingParameterSettingReplyMessage(workingParameterSettingReplyMessage); + chargingMessage.setWorkingParameterSettingReplyMessage(workingParameterSettingReplyMessage); + sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.TIMING_SETTING: TimingSettingMessage timingSettingMessage = JSON.parseObject(content.toJSONString(),TimingSettingMessage.class); - sendResult = enhanceProduce.timingSettingMessage(timingSettingMessage); + chargingMessage.setTimingSettingMessage(timingSettingMessage); + sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 对时设置应答 TimingSettingReply timingSettingReply = new TimingSettingReply(); timingSettingReply.setCharging_pile_code(timingSettingMessage.getCharging_pile_code()); @@ -248,37 +272,44 @@ break; case SendTagConstant.SETUP_BILLING_MODEL_REPLY: SetupBillingModelReplyMessage setupBillingModelReplyMessage = JSON.parseObject(content.toJSONString(),SetupBillingModelReplyMessage.class); - sendResult = enhanceProduce.setupBillingModelReplyMessage(setupBillingModelReplyMessage); + chargingMessage.setSetupBillingModelReplyMessage(setupBillingModelReplyMessage); + sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.GROUND_LOCK_REAL_TIME_DATA: GroundLockRealTimeDataMessage groundLockRealTimeDataMessage = JSON.parseObject(content.toJSONString(),GroundLockRealTimeDataMessage.class); - sendResult = enhanceProduce.groundLockRealTimeDataMessage(groundLockRealTimeDataMessage); + chargingMessage.setGroundLockRealTimeDataMessage(groundLockRealTimeDataMessage); + sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.CHARGING_PILE_RETURNS_GROUND_LOCK_DATA: ChargingPileReturnsGroundLockDataMessage chargingPileReturnsGroundLockDataMessage = JSON.parseObject(content.toJSONString(),ChargingPileReturnsGroundLockDataMessage.class); - sendResult = enhanceProduce.chargingPileReturnsGroundLockDataMessage(chargingPileReturnsGroundLockDataMessage); + chargingMessage.setChargingPileReturnsGroundLockDataMessage(chargingPileReturnsGroundLockDataMessage); + sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.PLATFORM_RESTART_REPLY: PlatformRestartReplyMessage platformRestartReplyMessage = JSON.parseObject(content.toJSONString(),PlatformRestartReplyMessage.class); - sendResult = enhanceProduce.platformRestartReplyMessage(platformRestartReplyMessage); + chargingMessage.setPlatformRestartReplyMessage(platformRestartReplyMessage); + sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.QR_CODE_DELIVERY_REPLY: QrCodeDeliveryReplyMessage qrCodeDeliveryReplyMessage = JSON.parseObject(content.toJSONString(),QrCodeDeliveryReplyMessage.class); - sendResult = enhanceProduce.qrCodeDeliveryReplyMessage(qrCodeDeliveryReplyMessage); + chargingMessage.setQrCodeDeliveryReplyMessage(qrCodeDeliveryReplyMessage); + sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.SECURITY_DETECTION: SecurityDetectionMessage securityDetectionMessage = JSON.parseObject(content.toJSONString(),SecurityDetectionMessage.class); - sendResult = enhanceProduce.securityDetectionMessage(securityDetectionMessage); + chargingMessage.setSecurityDetectionMessage(securityDetectionMessage); + sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; default: PlatformRemoteUpdateReplyMessage platformRemoteUpdateReplyMessage = JSON.parseObject(content.toJSONString(),PlatformRemoteUpdateReplyMessage.class); - sendResult = enhanceProduce.platformRemoteUpdateReplyMessage(platformRemoteUpdateReplyMessage); + chargingMessage.setPlatformRemoteUpdateReplyMessage(platformRemoteUpdateReplyMessage); + sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; } diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/SecurityDetectionService.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/SecurityDetectionService.java index 8ba09de..ae025dd 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/SecurityDetectionService.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/SecurityDetectionService.java @@ -7,5 +7,12 @@ /** */ public interface SecurityDetectionService extends BaseService<SecurityDetection> { - + + + /** + * 根据业务流水号查询数据 + * @param transactionSerialNumber + * @return + */ + SecurityDetection getSecurityDetection(String transactionSerialNumber); } diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/SecurityDetectionServiceImpl.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/SecurityDetectionServiceImpl.java index 2f27fc9..b7963bb 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/SecurityDetectionServiceImpl.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/SecurityDetectionServiceImpl.java @@ -5,6 +5,8 @@ import com.ruoyi.integration.mongodb.service.SecurityDetectionService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Service; import java.util.List; @@ -33,4 +35,16 @@ public List<SecurityDetection> findAll() { return mongoTemplate.findAll(SecurityDetection.class); } + + /** + * 根据业务流水号查询数据 + * @param transactionSerialNumber + * @return + */ + @Override + public SecurityDetection getSecurityDetection(String transactionSerialNumber) { + List<SecurityDetection> securityDetectionList = mongoTemplate.find(new Query().addCriteria(Criteria.where("transaction_serial_number") + .is(transactionSerialNumber)), SecurityDetection.class); + return securityDetectionList.size() > 0 ? securityDetectionList.get(0) : null; + } } diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/base/BaseMessage.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/base/BaseMessage.java index 6129be7..fa708e9 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/base/BaseMessage.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/base/BaseMessage.java @@ -27,4 +27,9 @@ * 重试次数,用于判断重试次数,超过重试次数发送异常警告 */ protected Integer retryTimes = 0; + + /** + * 服务id + */ + protected String serviceId; } \ No newline at end of file diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/EndChargeMessageListener.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/EndChargeMessageListener.java index 19a3046..bb8d506 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/EndChargeMessageListener.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/EndChargeMessageListener.java @@ -35,11 +35,6 @@ @Autowired private EndChargeService endChargeService; - @Autowired - private MessageUtil messageUtil; - @Autowired - private IotMessageProduce iotMessageProduce; - @Resource private ChargingOrderClient chargingOrderClient; diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/PlatformStartChargingReplyMessageListener.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/PlatformStartChargingReplyMessageListener.java index d60ef45..5aded73 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/PlatformStartChargingReplyMessageListener.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/PlatformStartChargingReplyMessageListener.java @@ -5,6 +5,7 @@ import com.ruoyi.integration.mongodb.service.PlatformStartChargingReplyService; import com.ruoyi.integration.rocket.model.PlatformStartChargingReplyMessage; import com.ruoyi.integration.rocket.util.EnhanceMessageHandler; +import com.ruoyi.order.api.feignClient.ChargingOrderClient; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.spring.annotation.MessageModel; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; @@ -12,6 +13,8 @@ import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; + +import javax.annotation.Resource; @Slf4j @Component @@ -26,6 +29,11 @@ @Autowired private PlatformStartChargingReplyService platformStartChargingReplyService; + + @Resource + private ChargingOrderClient chargingOrderClient; + + @Override protected void handleMessage(PlatformStartChargingReplyMessage message) throws Exception { @@ -36,6 +44,9 @@ BeanUtils.copyProperties(message,platformStartChargingReply); platformStartChargingReplyService.create(platformStartChargingReply); // 业务处理 + com.ruoyi.order.api.vo.PlatformStartChargingReplyMessage message1 = new com.ruoyi.order.api.vo.PlatformStartChargingReplyMessage(); + BeanUtils.copyProperties(message, message1); + chargingOrderClient.startChargeSuccessfully(message1); } @Override diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TimingSettingMessageListener.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TimingSettingMessageListener.java index fc49297..635ed19 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TimingSettingMessageListener.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TimingSettingMessageListener.java @@ -33,10 +33,6 @@ @Autowired private TimingSettingService timingSettingService; - @Autowired - private IotMessageProduce iotMessageProduce; - @Autowired - private MessageUtil messageUtil; @Override protected void handleMessage(TimingSettingMessage message) throws Exception { // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试 diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/UploadRealTimeMonitoringDataMessageListener.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/UploadRealTimeMonitoringDataMessageListener.java index ce52b46..a08aeb8 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/UploadRealTimeMonitoringDataMessageListener.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/UploadRealTimeMonitoringDataMessageListener.java @@ -6,6 +6,7 @@ import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail; import com.ruoyi.chargingPile.api.model.TChargingGun; import com.ruoyi.chargingPile.api.model.TFaultMessage; +import com.ruoyi.chargingPile.api.vo.GetChargingGunByCode; import com.ruoyi.integration.api.model.Online; import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData; import com.ruoyi.integration.mongodb.service.UploadRealTimeMonitoringDataService; @@ -83,8 +84,10 @@ UploadRealTimeMonitoringDataQuery query = new UploadRealTimeMonitoringDataQuery(); BeanUtils.copyProperties(uploadRealTimeMonitoringData, query); chargingOrderClient.chargeMonitoring(query); - - TChargingGun chargingGun = chargingGunClient.getChargingGunByCode(message.getCharging_gun_code()).getData(); + GetChargingGunByCode code = new GetChargingGunByCode(); + code.setCharging_pile_code(message.getCharging_pile_code()); + code.setCharging_gun_code(message.getCharging_gun_code()); + TChargingGun chargingGun = chargingGunClient.getChargingGunByCode(code).getData(); if(Objects.nonNull(chargingGun)){ // 存储状态信息 TFaultMessage faultMessage = new TFaultMessage(); diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/ChargingMessage.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/ChargingMessage.java new file mode 100644 index 0000000..149cd59 --- /dev/null +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/ChargingMessage.java @@ -0,0 +1,44 @@ +package com.ruoyi.integration.rocket.model; + +import com.ruoyi.integration.rocket.base.BaseMessage; +import lombok.Data; +import org.apache.poi.ss.formula.functions.T; + +@Data +public class ChargingMessage extends BaseMessage { + + private AcquisitionBillingModeMessage acquisitionBillingModeMessage; + private BillingModeVerifyMessage billingModeVerifyMessage; + private BmsAbortMessage bmsAbortMessage; + private BmsDemandAndChargerExportationMessage bmsDemandAndChargerExportationMessage; + private BmsInformationMessage bmsInformationMessage; + private ChargingHandshakeMessage chargingHandshakeMessage; + private ChargingMessage chargingMessage; + private ChargingPileReturnsGroundLockDataMessage chargingPileReturnsGroundLockDataMessage; + private ChargingPileStartsChargingMessage chargingPileStartsChargingMessage; + private ClearOfflineCardReplyMessage clearOfflineCardReplyMessage; + private EndChargeMessage endChargeMessage; + private ErrorMessageMessage errorMessageMessage; + private GroundLockRealTimeDataMessage groundLockRealTimeDataMessage; + private MotorAbortMessage motorAbortMessage; + private OnlineMessage onlineMessage; + private ParameterSettingMessage parameterSettingMessage; + private PingMessage pingMessage; + private PlatformRemoteUpdateReplyMessage platformRemoteUpdateReplyMessage; + private PlatformRestartReplyMessage platformRestartReplyMessage; + private PlatformStartChargingReplyMessage platformStartChargingReplyMessage; + private PlatformStopChargingReplyMessage platformStopChargingReplyMessage; + private QrCodeDeliveryMessage qrCodeDeliveryMessage; + private QrCodeDeliveryReplyMessage qrCodeDeliveryReplyMessage; + private QueryOfflineCardReplyMessage queryOfflineCardReplyMessage; + private SecurityDetectionMessage securityDetectionMessage; + private SetupBillingModelReplyMessage setupBillingModelReplyMessage; + private SynchronizeOfflineCardReplyMessage synchronizeOfflineCardReplyMessage; + private TimingSettingMessage timingSettingMessage; + private TimingSettingReplyMessage timingSettingReplyMessage; + private TransactionRecordMessage transactionRecordMessage; + private UpdateBalanceReplyMessage updateBalanceReplyMessage; + private UploadRealTimeMonitoringDataMessage uploadRealTimeMonitoringDataMessage; + private WorkingParameterSettingReplyMessage workingParameterSettingReplyMessage; + +} \ No newline at end of file diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/GroundLockRealTimeDataMessage.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/GroundLockRealTimeDataMessage.java index c2dd9b5..9f7481b 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/GroundLockRealTimeDataMessage.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/GroundLockRealTimeDataMessage.java @@ -1,6 +1,7 @@ package com.ruoyi.integration.rocket.model; import com.ruoyi.integration.rocket.base.BaseMessage; +import lombok.AllArgsConstructor; import lombok.Data; import lombok.experimental.Accessors; import org.springframework.data.mongodb.core.mapping.Document; diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java new file mode 100644 index 0000000..521a8e3 --- /dev/null +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java @@ -0,0 +1,484 @@ +package com.ruoyi.integration.rocket.produce; + +import com.alibaba.fastjson.JSON; +import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyDetailClient; +import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient; +import com.ruoyi.chargingPile.api.feignClient.FaultMessageClient; +import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail; +import com.ruoyi.chargingPile.api.model.TChargingGun; +import com.ruoyi.chargingPile.api.model.TFaultMessage; +import com.ruoyi.chargingPile.api.vo.GetChargingGunByCode; +import com.ruoyi.integration.api.model.*; +import com.ruoyi.integration.iotda.constant.SendTagConstant; +import com.ruoyi.integration.iotda.enums.ServiceIdMenu; +import com.ruoyi.integration.iotda.utils.tools.CP56Time2aConverter; +import com.ruoyi.integration.mongodb.service.*; +import com.ruoyi.integration.rocket.model.*; +import com.ruoyi.integration.rocket.util.EnhanceMessageHandler; +import com.ruoyi.order.api.feignClient.ChargingOrderClient; +import com.ruoyi.order.api.model.TChargingOrder; +import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery; +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.spring.annotation.MessageModel; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.stream.annotation.StreamListener; +import org.springframework.cloud.stream.messaging.Sink; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import javax.annotation.Resource; +import java.math.RoundingMode; +import java.time.LocalDateTime; +import java.util.Date; +import java.util.Objects; + +@Slf4j +@Component +@RocketMQMessageListener( + messageModel = MessageModel.CLUSTERING, + consumerGroup = "charge_charging_message", + topic = "charge_charging_message", + selectorExpression = "charging_message", + consumeThreadMax = 5 //默认是64个线程并发消息,配置 consumeThreadMax 参数指定并发消费线程数,避免太大导致资源不够 +) +public class ChargingMessageListener extends EnhanceMessageHandler<ChargingMessage> implements RocketMQListener<ChargingMessage> { + + @Autowired + private AcquisitionBillingModeService acquisitionBillingModeService; + @Autowired + private BillingModeVerifyService billingModeVerifyService; + @Autowired + private BmsAbortService bmsAbortService; + @Resource + private ChargingOrderClient chargingOrderClient; + @Autowired + private BmsDemandAndChargerExportationService bmsDemandAndChargerExportationService; + @Autowired + private OnlineService onlineService; + @Autowired + private PingService pingService; + @Autowired + private EndChargeService endChargeService; + @Autowired + private ErrorMessageMessageService errorMessageMessageService; + @Autowired + private UploadRealTimeMonitoringDataService uploadRealTimeMonitoringDataService; + @Resource + private AccountingStrategyDetailClient accountingStrategyDetailClient; + @Resource + private ChargingGunClient chargingGunClient; + @Resource + private FaultMessageClient faultMessageClient; + @Autowired + private ChargingHandshakeService chargingHandshakeService; + @Autowired + private ParameterSettingService parameterSettingService; + @Autowired + private MotorAbortService motorAbortService; + @Autowired + private BmsInformationService bmsInformationService; + @Autowired + private ChargingPileStartsChargingService chargingPileStartsChargingService; + @Autowired + private PlatformStartChargingReplyService platformStartChargingReplyService; + @Autowired + private PlatformStopChargingReplyService platformStopChargingReplyService; + @Autowired + private TransactionRecordService transactionRecordService; + @Autowired + private UpdateBalanceReplyService updateBalanceReplyService; + @Autowired + private SynchronizeOfflineCardReplyService synchronizeOfflineCardReplyService; + @Autowired + private ClearOfflineCardReplyService clearOfflineCardReplyService; + @Autowired + private WorkingParameterSettingReplyService workingParameterSettingReplyService; + @Autowired + private TimingSettingService timingSettingService; + @Autowired + private SetupBillingModelReplyService setupBillingModelReplyService; + @Autowired + private GroundLockRealTimeDataService groundLockRealTimeDataService; + @Autowired + private ChargingPileReturnsGroundLockDataService chargingPileReturnsGroundLockDataService; + @Autowired + private PlatformRestartReplyService platformRestartReplyService; + @Autowired + private PlatformRemoteUpdateReplyService platformRemoteUpdateReplyService; + @Autowired + private QrCodeDeliveryReplyService qrCodeDeliveryReplyService; + @Autowired + private SecurityDetectionService securityDetectionService; + @StreamListener("input") + @Override + protected void handleMessage(ChargingMessage message) throws Exception { + String serviceId = message.getServiceId(); + if(!StringUtils.hasLength(serviceId)){ + return; + } + switch (serviceId){ + case SendTagConstant.ONLINE: + OnlineMessage onlineMessage = message.getOnlineMessage(); + log.info("充电桩登录认证业务消息处理:{}",onlineMessage); + // 持久化消息 + Online online = new Online(); + BeanUtils.copyProperties(onlineMessage,online); + onlineService.create(online); + break; + case SendTagConstant.PING: + PingMessage pingMessage = message.getPingMessage(); + log.info("充电桩心跳包-业务消息处理:{}",pingMessage); + // 持久化消息 + Ping ping = new Ping(); + BeanUtils.copyProperties(pingMessage,ping); + pingService.create(ping); + break; + case SendTagConstant.END_CHARGE: + EndChargeMessage endChargeMessage = message.getEndChargeMessage(); + log.info("充电结束-业务消息处理:{}",endChargeMessage); + // 持久化消息 + EndCharge endCharge = new EndCharge(); + BeanUtils.copyProperties(endChargeMessage,endCharge); + endChargeService.create(endCharge); + // 业务处理 + chargingOrderClient.endCharge(endCharge.getTransaction_serial_number()); + break; + case SendTagConstant.ERROR_MESSAGE: + ErrorMessageMessage errorMessageMessage1 = message.getErrorMessageMessage(); + log.info("错误报文-业务消息处理:{}",errorMessageMessage1); + // 持久化消息 + ErrorMessageMessage errorMessageMessage = new ErrorMessageMessage(); + BeanUtils.copyProperties(errorMessageMessage1,errorMessageMessage); + errorMessageMessageService.create(errorMessageMessage); + break; + case SendTagConstant.BILLING_MODE_VERIFY: + BillingModeVerifyMessage billingModeVerifyMessage = message.getBillingModeVerifyMessage(); + log.info("计费模型验证请求-业务消息处理:{}",billingModeVerifyMessage); + // 持久化消息 + BillingModeVerify billingModeVerify = new BillingModeVerify(); + BeanUtils.copyProperties(billingModeVerifyMessage,billingModeVerify); + billingModeVerifyService.create(billingModeVerify); + break; + case SendTagConstant.ACQUISITION_BILLING_MODE: + AcquisitionBillingModeMessage acquisitionBillingModeMessage = message.getAcquisitionBillingModeMessage(); + log.info("充电桩计费模型请求-业务消息处理:{}",acquisitionBillingModeMessage); + // 持久化消息 + AcquisitionBillingMode acquisitionBillingMode = new AcquisitionBillingMode(); + BeanUtils.copyProperties(acquisitionBillingModeMessage,acquisitionBillingMode); + 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); + }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); + } + break; + case SendTagConstant.CHARGING_HANDSHAKE: + ChargingHandshakeMessage chargingHandshakeMessage = message.getChargingHandshakeMessage(); + log.info("充电握手-业务消息处理:{}",chargingHandshakeMessage); + // 持久化消息 + ChargingHandshake chargingHandshake = new ChargingHandshake(); + BeanUtils.copyProperties(chargingHandshakeMessage,chargingHandshake); + chargingHandshakeService.create(chargingHandshake); + break; + case SendTagConstant.PARAMETER_SETTING: + ParameterSettingMessage parameterSettingMessage = message.getParameterSettingMessage(); + log.info("业务消息处理:{}",parameterSettingMessage); + // 持久化消息 + ParameterSetting parameterSetting = new ParameterSetting(); + BeanUtils.copyProperties(parameterSettingMessage,parameterSetting); + parameterSettingService.create(parameterSetting); + break; + case SendTagConstant.BMS_ABORT: + BmsAbortMessage bmsAbortMessage = message.getBmsAbortMessage(); + log.info("充电阶段BMS中止-业务消息处理:{}",bmsAbortMessage); + // 持久化消息 + BmsAbort bmsAbort = new BmsAbort(); + BeanUtils.copyProperties(bmsAbortMessage,bmsAbort); + bmsAbortService.create(bmsAbort); + // 业务处理 + chargingOrderClient.excelEndCharge(bmsAbort.getTransaction_serial_number()); + break; + case SendTagConstant.MOTOR_ABORT: + MotorAbortMessage motorAbortMessage = message.getMotorAbortMessage(); + log.info("充电阶段充电机中止-业务消息处理:{}",motorAbortMessage); + // 持久化消息 + MotorAbort motorAbort = new MotorAbort(); + BeanUtils.copyProperties(motorAbortMessage,motorAbort); + motorAbortService.create(motorAbort); + // 业务处理 + chargingOrderClient.excelEndCharge(motorAbort.getTransaction_serial_number()); + break; + case SendTagConstant.BMS_DEMAND_AND_CHARGER_EXPORTATION: + BmsDemandAndChargerExportationMessage bmsDemandAndChargerExportationMessage = message.getBmsDemandAndChargerExportationMessage(); + log.info("充电过程BMS需求、充电机输出-业务消息处理:{}",bmsDemandAndChargerExportationMessage); + // 持久化消息 + BmsDemandAndChargerExportation bmsDemandAndChargerExportation = new BmsDemandAndChargerExportation(); + BeanUtils.copyProperties(bmsDemandAndChargerExportationMessage,bmsDemandAndChargerExportation); + bmsDemandAndChargerExportationService.create(bmsDemandAndChargerExportation); + // 业务处理 + TChargingOrder chargingOrderBms = chargingOrderClient.getOrderByCode(bmsDemandAndChargerExportationMessage.getTransaction_serial_number()).getData(); + if(Objects.nonNull(chargingOrderBms)){ + chargingOrderBms.setNeedElec(bmsDemandAndChargerExportationMessage.getBms_current_requirements()); + chargingOrderClient.updateChargingOrder(chargingOrderBms); + } + break; + case SendTagConstant.BMS_INFORMATION: + BmsInformationMessage bmsInformationMessage = message.getBmsInformationMessage(); + log.info("充电过程BMS信息-业务消息处理:{}",bmsInformationMessage); + // 持久化消息 + BmsInformation bmsInformation = new BmsInformation(); + BeanUtils.copyProperties(bmsInformationMessage,bmsInformation); + bmsInformationService.create(bmsInformation); + break; + case SendTagConstant.CHARGING_PILE_STARTS_CHARGING: + ChargingPileStartsChargingMessage chargingPileStartsChargingMessage = message.getChargingPileStartsChargingMessage(); + log.info("充电桩主动申请启动充电-业务消息处理:{}",chargingPileStartsChargingMessage); + // 持久化消息 + ChargingPileStartsCharging chargingPileStartsCharging = new ChargingPileStartsCharging(); + BeanUtils.copyProperties(chargingPileStartsChargingMessage,chargingPileStartsCharging); + chargingPileStartsChargingService.create(chargingPileStartsCharging); + break; + case SendTagConstant.PLATFORM_START_CHARGING_REPLY: + PlatformStartChargingReplyMessage platformStartChargingReplyMessage = message.getPlatformStartChargingReplyMessage(); + log.info("远程启机命令回复-业务消息处理:{}",platformStartChargingReplyMessage); + // 持久化消息 + PlatformStartChargingReply platformStartChargingReply = new PlatformStartChargingReply(); + BeanUtils.copyProperties(platformStartChargingReplyMessage,platformStartChargingReply); + platformStartChargingReplyService.create(platformStartChargingReply); + // 业务处理 + com.ruoyi.order.api.vo.PlatformStartChargingReplyMessage message1 = new com.ruoyi.order.api.vo.PlatformStartChargingReplyMessage(); + BeanUtils.copyProperties(platformStartChargingReplyMessage, message1); + chargingOrderClient.startChargeSuccessfully(message1); + break; + case SendTagConstant.PLATFORM_STOP_CHARGING_REPLY: + PlatformStopChargingReplyMessage platformStopChargingReplyMessage = message.getPlatformStopChargingReplyMessage(); + log.info("远程停机命令回复-业务消息处理:{}",platformStopChargingReplyMessage); + // 持久化消息 + PlatformStopChargingReply platformStopChargingReply = new PlatformStopChargingReply(); + BeanUtils.copyProperties(platformStopChargingReplyMessage,platformStopChargingReply); + platformStopChargingReplyService.create(platformStopChargingReply); + break; + case SendTagConstant.TRANSACTION_RECORD: + TransactionRecordMessage transactionRecordMessage = message.getTransactionRecordMessage(); + log.info("交易记录-业务消息处理:{}",transactionRecordMessage); + // 持久化消息 + TransactionRecord transactionRecord = new TransactionRecord(); + BeanUtils.copyProperties(transactionRecordMessage,transactionRecord); + transactionRecordService.create(transactionRecord); + // 业务处理 + TChargingOrder chargingOrderRecord = chargingOrderClient.getOrderByCode(transactionRecordMessage.getTransaction_serial_number()).getData(); + if(Objects.nonNull(chargingOrderRecord)){ + chargingOrderRecord.setTotalElectricity(transactionRecordMessage.getTotal_electricity()); + chargingOrderClient.updateChargingOrder(chargingOrderRecord); + } + break; + case SendTagConstant.UPDATE_BALANCE_REPLY: + UpdateBalanceReplyMessage updateBalanceReplyMessage = message.getUpdateBalanceReplyMessage(); + log.info("余额更新应答-业务消息处理:{}",updateBalanceReplyMessage); + // 持久化消息 + UpdateBalanceReply updateBalanceReply = new UpdateBalanceReply(); + BeanUtils.copyProperties(updateBalanceReplyMessage,updateBalanceReply); + updateBalanceReplyService.create(updateBalanceReply); + break; + case SendTagConstant.SYNCHRONIZE_OFFLINE_CARD_REPLY: + SynchronizeOfflineCardReplyMessage synchronizeOfflineCardReplyMessage = message.getSynchronizeOfflineCardReplyMessage(); + log.info("卡数据同步应答-业务消息处理:{}",synchronizeOfflineCardReplyMessage); + // 持久化消息 + SynchronizeOfflineCardReply synchronizeOfflineCardReply = new SynchronizeOfflineCardReply(); + BeanUtils.copyProperties(synchronizeOfflineCardReplyMessage,synchronizeOfflineCardReply); + synchronizeOfflineCardReplyService.create(synchronizeOfflineCardReply); + break; + case SendTagConstant.CLEAR_OFFLINE_CARD_REPLY: + ClearOfflineCardReplyMessage clearOfflineCardReplyMessage = message.getClearOfflineCardReplyMessage(); + log.info("离线卡数据清除应答-业务消息处理:{}",clearOfflineCardReplyMessage); + // 持久化消息 + ClearOfflineCardReply clearOfflineCardReply = new ClearOfflineCardReply(); + BeanUtils.copyProperties(clearOfflineCardReplyMessage,clearOfflineCardReply); + clearOfflineCardReplyService.create(clearOfflineCardReply); + break; + case SendTagConstant.WORKING_PARAMETER_SETTING_REPLY: + WorkingParameterSettingReplyMessage workingParameterSettingReplyMessage = message.getWorkingParameterSettingReplyMessage(); + log.info("充电桩工作参数设置应答-业务消息处理:{}",workingParameterSettingReplyMessage); + // 持久化消息 + WorkingParameterSettingReply workingParameterSettingReply = new WorkingParameterSettingReply(); + BeanUtils.copyProperties(workingParameterSettingReplyMessage,workingParameterSettingReply); + workingParameterSettingReplyService.create(workingParameterSettingReply); + break; + case SendTagConstant.TIMING_SETTING: + TimingSettingMessage timingSettingMessage = message.getTimingSettingMessage(); + log.info("对时设置-业务消息处理:{}",timingSettingMessage); + // 持久化消息 + TimingSetting timingSetting = new TimingSetting(); + BeanUtils.copyProperties(timingSettingMessage,timingSetting); + timingSettingService.create(timingSetting); + break; + case SendTagConstant.SETUP_BILLING_MODEL_REPLY: + SetupBillingModelReplyMessage setupBillingModelReplyMessage = message.getSetupBillingModelReplyMessage(); + log.info("计费模型应答-业务消息处理:{}",setupBillingModelReplyMessage); + // 持久化消息 + SetupBillingModelReply setupBillingModelReply = new SetupBillingModelReply(); + BeanUtils.copyProperties(setupBillingModelReplyMessage,setupBillingModelReply); + setupBillingModelReplyService.create(setupBillingModelReply); + break; + case SendTagConstant.GROUND_LOCK_REAL_TIME_DATA: + GroundLockRealTimeDataMessage groundLockRealTimeDataMessage = message.getGroundLockRealTimeDataMessage(); + log.info("地锁数据上送(充电桩上送)-业务消息处理:{}",groundLockRealTimeDataMessage); + // 持久化消息 + GroundLockRealTimeData groundLockRealTimeData = new GroundLockRealTimeData(); + BeanUtils.copyProperties(groundLockRealTimeDataMessage,groundLockRealTimeData); + groundLockRealTimeDataService.create(groundLockRealTimeData); + break; + case SendTagConstant.CHARGING_PILE_RETURNS_GROUND_LOCK_DATA: + ChargingPileReturnsGroundLockDataMessage chargingPileReturnsGroundLockDataMessage = message.getChargingPileReturnsGroundLockDataMessage(); + log.info("充电桩返回数据(上行)-业务消息处理:{}",chargingPileReturnsGroundLockDataMessage); + // 持久化消息 + ChargingPileReturnsGroundLockData chargingPileReturnsGroundLockData = new ChargingPileReturnsGroundLockData(); + BeanUtils.copyProperties(chargingPileReturnsGroundLockDataMessage,chargingPileReturnsGroundLockData); + chargingPileReturnsGroundLockDataService.create(chargingPileReturnsGroundLockData); + break; + case SendTagConstant.PLATFORM_RESTART_REPLY: + PlatformRestartReplyMessage platformRestartReplyMessage = message.getPlatformRestartReplyMessage(); + log.info("远程重启应答-业务消息处理:{}",platformRestartReplyMessage); + // 持久化消息 + PlatformRestartReply platformRestartReply = new PlatformRestartReply(); + BeanUtils.copyProperties(platformRestartReplyMessage,platformRestartReply); + platformRestartReplyService.create(platformRestartReply); + break; + case SendTagConstant.QR_CODE_DELIVERY_REPLY: + QrCodeDeliveryReplyMessage qrCodeDeliveryReplyMessage = message.getQrCodeDeliveryReplyMessage(); + log.info("二维码下发应答-业务消息处理:{}",qrCodeDeliveryReplyMessage); + QrCodeDeliveryReply qrCodeDeliveryReply = new QrCodeDeliveryReply(); + BeanUtils.copyProperties(qrCodeDeliveryReplyMessage,qrCodeDeliveryReply); + qrCodeDeliveryReplyService.create(qrCodeDeliveryReply); + break; + case SendTagConstant.SECURITY_DETECTION: + SecurityDetectionMessage securityDetectionMessage = message.getSecurityDetectionMessage(); + log.info("安全监测-业务消息处理:{}",securityDetectionMessage); + SecurityDetection securityDetection = new SecurityDetection(); + BeanUtils.copyProperties(securityDetectionMessage,securityDetection); + securityDetectionService.create(securityDetection); + com.ruoyi.order.api.vo.SecurityDetection securityDetection1 = new com.ruoyi.order.api.vo.SecurityDetection(); + BeanUtils.copyProperties(securityDetection, securityDetection1); + chargingOrderClient.securityDetection(securityDetection1); + break; + default: + PlatformRemoteUpdateReplyMessage platformRemoteUpdateReplyMessage = message.getPlatformRemoteUpdateReplyMessage(); + log.info("远程更新应答-业务消息处理:{}",platformRemoteUpdateReplyMessage); + PlatformRemoteUpdateReply platformRemoteUpdateReply = new PlatformRemoteUpdateReply(); + BeanUtils.copyProperties(platformRemoteUpdateReplyMessage,platformRemoteUpdateReply); + platformRemoteUpdateReplyService.create(platformRemoteUpdateReply); + break; + } + } + + @Override + protected void handleMaxRetriesExceeded(ChargingMessage message) { + // 当超过指定重试次数消息时此处方法会被调用 + // 生产中可以进行回退或其他业务操作 + log.error("消息消费失败,请执行后续处理"); + } + + + /** + * 是否执行重试机制 + */ + @Override + protected boolean isRetry() { + return true; + } + + @Override + protected boolean throwException() { + // 是否抛出异常,false搭配retry自行处理异常 + return false; + } + + /** + * 若需要处理消息过滤,在父级中进行统一处理,或者在此处实现之后,自行处理 + * @param message 待处理消息 + * @return true: 本次消息被过滤,false:不过滤 + */ + @Override + protected boolean filter(ChargingMessage message) { + // 此处可做消息过滤 + return false; + } + + /** + * 监听消费消息,不需要执行业务处理,委派给父类做基础操作,父类做完基础操作后会调用子类的实际处理类型 + */ + @Override + public void onMessage(ChargingMessage message) { + super.dispatchMessage(message); + } +} \ No newline at end of file diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/EnhanceProduce.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/EnhanceProduce.java index 21d9a0e..ce9a938 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/EnhanceProduce.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/EnhanceProduce.java @@ -343,4 +343,15 @@ return rocketMQEnhanceTemplate.send(TOPIC+SendTagConstant.SECURITY_DETECTION, SendTagConstant.SECURITY_DETECTION, message); } + /** + * 充电桩登录认证 + */ + public SendResult chargingMessage(ChargingMessage message) { + // 设置业务key + message.setKey(UUID.randomUUID().toString()); + // 设置消息来源,便于查询 + message.setSource(SendTagConstant.CHARGING_MESSAGE); + return rocketMQEnhanceTemplate.send(TOPIC+SendTagConstant.CHARGING_MESSAGE, SendTagConstant.CHARGING_MESSAGE, message); + } + } \ No newline at end of file diff --git a/ruoyi-service/ruoyi-integration/src/main/resources/bootstrap.yml b/ruoyi-service/ruoyi-integration/src/main/resources/bootstrap.yml index 20bdc83..b61f26e 100644 --- a/ruoyi-service/ruoyi-integration/src/main/resources/bootstrap.yml +++ b/ruoyi-service/ruoyi-integration/src/main/resources/bootstrap.yml @@ -13,6 +13,7 @@ profiles: # 环境配置 active: dev +# active: prod --- spring: diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java index 5d956d1..21535a0 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java @@ -457,7 +457,30 @@ @RequestParam("attach") String attach) { AjaxResult ajaxResult = chargingOrderService.chargingOrderCallback(1, out_trade_no, transaction_id, attach); } - + + + /** + * 修改安全检测数据 + * @param securityDetection + */ + @ResponseBody + @PostMapping(value = "/securityDetection") + public void securityDetection(@RequestBody SecurityDetection securityDetection){ + chargingOrderService.securityDetection(securityDetection); + } + + /** + * 远程启动充电应答 + * @param message + */ + @ResponseBody + @PostMapping(value = "/startChargeSuccessfully") + public void startChargeSuccessfully(@RequestBody PlatformStartChargingReplyMessage message){ + System.err.println("远程启动应答:" + message); + chargingOrderService.startChargeSuccessfully(message); + } + + /** * 支付宝支付成功后的回调 @@ -487,10 +510,10 @@ */ @ResponseBody @PostMapping(value = "/chargingOrderStartupFailureWxRefund") - public void chargingOrderStartupFailureWxRefund(@RequestParam("out_trade_no") String out_refund_no, - @RequestParam("out_trade_no") String refund_id, - @RequestParam("out_trade_no") String tradeState, - @RequestParam("out_trade_no") String success_time){ + public void chargingOrderStartupFailureWxRefund(@RequestParam("out_refund_no") String out_refund_no, + @RequestParam("refund_id") String refund_id, + @RequestParam("tradeState") String tradeState, + @RequestParam("success_time") String success_time){ chargingOrderService.chargingOrderStartupFailureWxRefund(out_refund_no, refund_id, tradeState, success_time); } @@ -592,7 +615,7 @@ } @ResponseBody - @GetMapping(value = "/work/shop") + @PostMapping(value = "/work/shop") @ApiOperation(value = "购物收入", tags = {"后台-工作台"}) public R workShop(@RequestBody ChargingStatisticsQueryDto statisticsQueryDto) { //count近6个月的数据 @@ -810,9 +833,73 @@ //上方折现 if (statisticsQueryDto.getDayType()==1){ List<Map<String,Object>> map = chargingOrderService.usersDay(); - tCharingUserMapVO.setMap(map); + + List<Map<String, Object>> charMap = new ArrayList<>(); + // 生成从 "00:00" 到 "23:00" 的时间数据 + for (int hour = 0; hour < 24; hour++) { + String time = String.format("%02d:00", hour); + Map<String, Object> mapWithTimeValue = findMapWithTimeValue(map, time); + if (mapWithTimeValue!=null){ + charMap.add(mapWithTimeValue); + }else { + Map<String, Object> timeMap = new HashMap<>(); + timeMap.put("time", time); // 初始化值为 null + timeMap.put("counts", 0); + + charMap.add(timeMap); + } + } + + List<Map<String,Object>> map1 = chargingOrderService.usersDay1(); + + List<Map<String, Object>> charMap1 = new ArrayList<>(); + // 生成从 "00:00" 到 "23:00" 的时间数据 + for (int hour = 0; hour < 24; hour++) { + String time = String.format("%02d:00", hour); + Map<String, Object> mapWithTimeValue = findMapWithTimeValue(map1, time); + if (mapWithTimeValue!=null){ + charMap1.add(mapWithTimeValue); + }else { + Map<String, Object> timeMap = new HashMap<>(); + timeMap.put("time", time); // 初始化值为 null + timeMap.put("counts", 0); + + charMap1.add(timeMap); + } + } + + + tCharingUserMapVO.setMap(charMap); + tCharingUserMapVO.setMap1(charMap1); }else { List<Map<String,Object>> map = chargingOrderService.usersByQuery(statisticsQueryDto); + + + //按日 + // 解析 startTime 和 endTime 为 LocalDate + LocalDate startDate = statisticsQueryDto.getStartTime(); + LocalDate endDate = statisticsQueryDto.getEndTime(); + + List<Map<String, Object>> dateRangeStatistics = new ArrayList<>(); + + // 遍历日期范围 + while (!startDate.isAfter(endDate)) { + String formattedDate = startDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + Map<String, Object> dailyStats = findMapWithDateValue(map, formattedDate); + + if (dailyStats != null) { + dateRangeStatistics.add(dailyStats); + } else { + Map<String, Object> dateMap = new HashMap<>(); + dateMap.put("time", formattedDate); + dateMap.put("counts", 0); + dateRangeStatistics.add(dateMap); + } + + // 移动到下一天 + startDate = startDate.plusDays(1); + } + tCharingUserMapVO.setMap(map); } @@ -901,18 +988,37 @@ List<Map<String,Object>> equipmentMap1 = chargingOrderService.equipmentUserType1(siteIds,statisticsQueryDto); //交流可用率 List<Map<String,Object>> equipmentMap2= chargingOrderService.equipmentUserType2(siteIds,statisticsQueryDto); + + //取出直流可用率和交流可用率的percent的平均值保留两位小数 + + double average1 = calculateAveragePercent(equipmentMap1, equipmentMap2); + System.out.printf("The average percent is: %.2f\n", average1); + + //直流故障率 List<Map<String,Object>> equipmentMapbroke1 = chargingOrderService.equipmentMapbroke1(siteIds,statisticsQueryDto); //交流故障率 List<Map<String,Object>> equipmentMapbroke2 = chargingOrderService.equipmentMapbroke2(siteIds,statisticsQueryDto); + + + double average2 = calculateAveragePercent(equipmentMapbroke1, equipmentMapbroke2); + System.out.printf("The average percent is: %.2f\n", average2); //直流离网率 List<Map<String,Object>> equipmentMapOut1 = chargingOrderService.equipmentMapOut1(siteIds,statisticsQueryDto); //交流离网率 List<Map<String,Object>> equipmentMapOut2 = chargingOrderService.equipmentMapOut2(siteIds,statisticsQueryDto); + double average3 = calculateAveragePercent(equipmentMapOut1, equipmentMapOut2); + System.out.printf("The average percent is: %.2f\n", average3); //需求电流满足率 - List<Map<String,Object>> needElec = chargingOrderService.needElec(siteIds,statisticsQueryDto); + List<Map<String,Object>> needElec1 = chargingOrderService.needElec(siteIds,statisticsQueryDto); + List<Map<String,Object>> needElec2 = chargingOrderService.needElec1(siteIds,statisticsQueryDto); + + double average4 = calculateAveragePercent(needElec1, needElec2); + System.out.printf("The average percent is: %.2f\n", average4); + + TCharingUserEquimentVO tCharingUserEquimentVO = new TCharingUserEquimentVO(); tCharingUserEquimentVO.setEquipmentMap1(equipmentMap1); @@ -921,11 +1027,41 @@ tCharingUserEquimentVO.setEquipmentMapbroke2(equipmentMapbroke2); tCharingUserEquimentVO.setEquipmentMapOut1(equipmentMapOut1); tCharingUserEquimentVO.setEquipmentMapOut2(equipmentMapOut2); - tCharingUserEquimentVO.setNeedElec(needElec); + tCharingUserEquimentVO.setNeedElec1(needElec1); + tCharingUserEquimentVO.setNeedElec2(needElec2); + tCharingUserEquimentVO.setAverage1(average1); + tCharingUserEquimentVO.setAverage2(average2); + tCharingUserEquimentVO.setAverage3(average3); + tCharingUserEquimentVO.setAverage4(average4); return R.ok(tCharingUserEquimentVO); } + private static double calculateAveragePercent(List<Map<String, Object>> mapList1, List<Map<String, Object>> mapList2) { + int totalElements = mapList1.size() + mapList2.size(); + double sum = 0.0; + + // 累加两个列表中所有元素的 "percent" 值 + for (Map<String, Object> map : mapList1) { + if (map.containsKey("percent")) { + sum += Double.parseDouble((String) map.get("percent")); + } + } + for (Map<String, Object> map : mapList2) { + if (map.containsKey("percent")) { + sum += Double.parseDouble((String) map.get("percent")); + } + } + + // 防止除以零错误 + if (totalElements == 0) { + return 0.0; + } + + // 计算平均值 + return sum / totalElements; + } + @ResponseBody @PostMapping(value = "/work/charge") @ApiOperation(value = "上方充电数据统计", tags = {"管理后台-工作台"}) diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TExchangeOrderController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TExchangeOrderController.java index 42d7456..f686282 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TExchangeOrderController.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TExchangeOrderController.java @@ -281,7 +281,7 @@ tExchangeOrder.setPurchaseQuantity(1); tExchangeOrder.setAppUserAddressId(exchangeDto.getAddressId()==null?null:Long.valueOf(exchangeDto.getAddressId())); tExchangeOrder.setPoints(exchangeDto.getPoint()); - tExchangeOrder.setRemark(""); + tExchangeOrder.setRemark(exchangeDto.getRemark()); if (exchangeDto.getGoodType()==1){ tExchangeOrder.setStatus(1); }else { @@ -312,6 +312,7 @@ @ApiOperation(value = "获取兑换订单详情", tags = {"小程序-兑换记录"}) public AjaxResult<ExchangeOrderGoodsInfo> getGoodsExchangeOrder(@PathVariable String id){ ExchangeOrderGoodsInfo goodsExchangeOrder = exchangeOrderService.getGoodsExchangeOrder(id); + return AjaxResult.success(goodsExchangeOrder); } diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java index 85a3ca5..3158616 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java @@ -357,8 +357,12 @@ shoppingOrder.setOrderType(exchangeDto.getGoodType()); if (exchangeDto.getGoodType() == 1) { shoppingOrder.setGoodsId(exchangeDto.getGoodId()); + shoppingOrder.setStatus(1); + } else { shoppingOrder.setCouponId(exchangeDto.getGoodId()); + shoppingOrder.setStatus(3); + } shoppingOrder.setPurchaseQuantity(exchangeDto.getNum()); shoppingOrder.setAppUserAddressId(exchangeDto.getAddressId()); @@ -373,7 +377,6 @@ shoppingOrder.setPaymentStatus(1); shoppingOrder.setPaymentType(exchangeDto.getPayMethod()); shoppingOrder.setRemark(exchangeDto.getRemark()); - shoppingOrder.setStatus(1); shoppingOrder.setPhone(exchangeDto.getPhone()); shoppingOrder.setCreateTime(LocalDateTime.now()); shoppingOrder.setDelFlag(false); diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PayOrderInfoDto.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PayOrderInfoDto.java index 5bb36ce..880dca7 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PayOrderInfoDto.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PayOrderInfoDto.java @@ -1,5 +1,6 @@ package com.ruoyi.order.dto; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -19,6 +20,7 @@ @ApiModelProperty("支付金额") private BigDecimal payAmount; @ApiModelProperty("支付时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime payTime; @ApiModelProperty("退款金额") private BigDecimal refundAmount; diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java index b86d8b1..71c3b12 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java @@ -86,17 +86,18 @@ Map<String, Object> queryPowerLevel(@Param("siteIds") List<Integer> siteIds,@Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto); - List<Map<String, Object>> queryOrderCountAndMoneyBySiteIdDate(List<Integer> siteIds); + List<Map<String, Object>> queryOrderCountAndMoneyBySiteIdDate(@Param("siteIds")List<Integer> siteIds); List<Map<String, Object>> usersDay(); + List<Map<String, Object>> usersDay1(); - List<Map<String, Object>> usersByQuery(ChargingStatisticsQueryDto statisticsQueryDto); + List<Map<String, Object>> usersByQuery(@Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto); List<Map<String, Object>> getUserTagCount(); List<Map<String, Object>> getVipCount(); - List<Map<String, Object>> unitConsumption(ChargingStatisticsQueryDto statisticsQueryDto); + List<Map<String, Object>> unitConsumption(@Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto); List<Map<String, Object>> carUserMethod(); @@ -104,11 +105,11 @@ Map<String, Object> countLocalCar(); - Long getAver(List<Integer> siteIds); + Long getAver(@Param("siteIds") List<Integer> siteIds); - List<Map<String, Object>> getLevelEvaluate(List<Integer> siteIds); + List<Map<String, Object>> getLevelEvaluate(@Param("siteIds")List<Integer> siteIds); - List<Map<String, Object>> countBySource(List<Integer> siteIds); + List<Map<String, Object>> countBySource(@Param("siteIds")List<Integer> siteIds); List<Map<String, Object>> equipmentUserType1(@Param("siteIds") List<Integer> siteIds, @Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto); @@ -133,4 +134,6 @@ List<Map<String, Object>> getchargingCapacity(@Param("siteIds")List<Integer> siteIds,@Param("statisticsQueryDto") ChargingDetailQueryDto statisticsQueryDto); List<Map<String, Object>> countAllUserData(); + + List<Map<String, Object>> needElec1(@Param("siteIds")List<Integer> siteIds,@Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto); } diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TOrderEvaluateMapper.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TOrderEvaluateMapper.java index 8edbcfd..75a7287 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TOrderEvaluateMapper.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TOrderEvaluateMapper.java @@ -50,7 +50,7 @@ */ List<TOrderEvaluateVO> getOrderEvaluateBySiteId(@Param("siteId")Integer siteId); - List<Map<String, Object>> goodTop(List<Integer> siteIds); + List<Map<String, Object>> goodTop(@Param("siteIds")List<Integer> siteIds); - List<Map<String, Object>> badTop(List<Integer> siteIds); + List<Map<String, Object>> badTop(@Param("siteIds")List<Integer> siteIds); } diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java index 7ca2197..790dc57 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java @@ -80,6 +80,20 @@ /** + * 安全检测数据 + * @param securityDetection + */ + void securityDetection(SecurityDetection securityDetection); + + + /** + * 启动充电应发 + * @param message + */ + void startChargeSuccessfully(PlatformStartChargingReplyMessage message); + + + /** * 充电启动失败后的退款回调处理 * @param out_refund_no * @param refund_id @@ -166,6 +180,7 @@ List<Map<String, Object>> queryOrderCountAndMoneyBySiteIdDate(List<Integer> siteIds); List<Map<String, Object>> usersDay(); + List<Map<String, Object>> usersDay1(); List<Map<String, Object>> usersByQuery(ChargingStatisticsQueryDto statisticsQueryDto); @@ -226,4 +241,6 @@ List<Map<String, Object>> getchargingCapacity(List<Integer> siteIds, ChargingDetailQueryDto statisticsQueryDto); List<Map<String, Object>> countAllUserData(); + + List<Map<String, Object>> needElec1(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto); } diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java index 352d1d3..a4206d6 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java @@ -1,9 +1,7 @@ package com.ruoyi.order.service.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; -import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -13,6 +11,7 @@ import com.ruoyi.account.api.vo.GetInviteUser; import com.ruoyi.chargingPile.api.feignClient.*; import com.ruoyi.chargingPile.api.model.*; +import com.ruoyi.chargingPile.api.vo.GetChargingGunByCode; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.dto.ChargingOrderGroup; import com.ruoyi.common.core.dto.ChargingPercentProvinceDto; @@ -34,12 +33,12 @@ import com.ruoyi.order.api.dto.SettlementConfirmAdd; import com.ruoyi.order.api.feignClient.AccountingStrategyDetailOrderClient; import com.ruoyi.order.api.feignClient.AccountingStrategyOrderClient; -import com.ruoyi.order.api.feignClient.ChargingOrderAccountingStrategyClient; import com.ruoyi.order.api.model.*; import com.ruoyi.order.api.query.ChargingOrderQuery; import com.ruoyi.order.api.query.SettlementListQuery; import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery; import com.ruoyi.order.api.vo.*; +import com.ruoyi.order.api.vo.SecurityDetection; import com.ruoyi.order.dto.*; import com.ruoyi.order.mapper.TChargingOrderMapper; import com.ruoyi.order.mapper.TSettlementConfirmMapper; @@ -58,15 +57,11 @@ import com.ruoyi.payment.api.model.WxPaymentRefundModel; import com.ruoyi.payment.api.vo.*; import com.ruoyi.system.api.feignClient.SysUserClient; -import com.sun.org.apache.bcel.internal.generic.NEW; import io.seata.spring.annotation.GlobalTransactional; -import io.swagger.annotations.ApiModelProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import javax.annotation.Resource; @@ -190,9 +185,15 @@ @Resource private AppUserTagClient appUserTagClient; + + @Resource + private SecurityDetectionClient securityDetectionClient; //计数器 private Map<String, Integer> counter_map = new HashMap<>(); + + //计数器 + private Map<String, Integer> boot_failed_map = new HashMap<>(); @@ -453,7 +454,7 @@ //直营站点才可以享受会员折扣 if(null != appUser.getVipId() && 1 == site.getBusinessCategory()){ - TVip vip = vipClient.getInfo(appUser.getVipId()).getData(); + TVip vip = vipClient.getInfo1(appUser.getVipId()).getData(); BigDecimal discount = null; if(1 == vip.getType()){ //普通会员折扣使用积分策略上的折扣,且有最高优惠金额 @@ -545,7 +546,7 @@ preChargeCheck.setSecureConnectionDetection(false); preChargeCheck.setStartupSuccess(1); String key = "AQJC_" + chargingOrder.getChargingGunId(); - redisService.setCacheObject(key, preChargeCheck); + redisService.setCacheObject(key, preChargeCheck, 24L, TimeUnit.HOURS); //根据当前充值的金额和计费模板算出充电的金额 BigDecimal rechargeAmount = chargingOrder.getRechargeAmount(); @@ -606,7 +607,7 @@ if(discountAmount.compareTo(BigDecimal.ZERO) >= 0){ //计算会员最大优惠金额 if(null != appUser.getVipId()){ - TVip vip = vipClient.getInfo(appUser.getVipId()).getData(); + TVip vip = vipClient.getInfo1(appUser.getVipId()).getData(); BigDecimal maximumDeduction = vip.getMaximumDeduction(); //普通会员有最高优惠限制 if(vip.getType() == 1 && discountAmount.compareTo(maximumDeduction) > 0){ @@ -618,7 +619,7 @@ getAppUserVipDetail.setAppUserId(chargingOrder.getAppUserId()); getAppUserVipDetail.setVipId(appUser.getVipId()); TAppUserVipDetail data = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData(); - if(data.getChargeNum() > 0){ + if(null != data && data.getChargeNum() > 0){ data.setChargeNum(data.getChargeNum() - 1); appUserVipDetailClient.updateAppUserVipDetail(data); //会员有充电优惠次数,直接将优惠金额加入到充电费用中增加充电时长 @@ -640,59 +641,18 @@ //使用订单id作为逻辑卡号 platformStartCharging.setCard_number(chargingOrder.getId().toString()); platformStartCharging.setAccount_balance(electrovalence); - - System.err.println("-------------------远程调起开始充电请求-------------------"); - System.err.println(platformStartCharging.toString()); + + log.error(chargingOrder.getCode() + ":-------------------远程调起开始充电请求-------------------"); + log.error(platformStartCharging.toString()); sendMessageClient.platformStartCharging(platformStartCharging); //异步线程检测远程启动的应答结果。如果失败,则需要全额退款 - String code = chargingOrder.getCode(); + Long id = chargingOrder.getId(); //执行5分钟的定时任务检测 ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); scheduler.scheduleAtFixedRate(()->{ - List<PlatformStartChargingReply> data = platformStartChargingReplyClient.getPlatformStartChargingReply(code).getData(); - System.err.println("-------------------开始检查调起充电结果-------------------"); - System.err.println(data.toString()); - if(data.size() != 0){ - PlatformStartChargingReply platformStartChargingReply = data.get(1); - Integer startup_result = platformStartChargingReply.getStartup_result(); - Integer failure_cause = platformStartChargingReply.getFailure_cause(); - Integer counter = counter_map.get(code); - PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key); - //5分钟内还未插枪则取消充电,退回金额。 - if(failure_cause == 5 && (null == counter || counter < 300)){ - counter = (null == counter ? 0 : counter) + 1; - counter_map.put(code, counter); - //启动失败 - preChargeCheck1.setStartupSuccess(3); - preChargeCheck1.setFailureCause(failure_cause); - redisService.setCacheObject(key, preChargeCheck1); - return; - } - - //清除计时器中的无效数据 - counter_map.remove(code); - TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code)); - if(0 == startup_result){ - //启动失败 - preChargeCheck1.setStartupSuccess(3); - preChargeCheck1.setFailureCause(failure_cause); - //启动失败后取消订单,退款操作 - refund(code); - order.setStatus(-1); - order.setEndMode(0); - }else{ - //启动成功 - preChargeCheck1.setStartupSuccess(2); - order.setStatus(3); - order.setStartTime(LocalDateTime.now()); - } - this.updateById(order); - redisService.setCacheObject(key, preChargeCheck1); - //提前结束定时任务 + if(timingDetection(id)){ scheduler.shutdown(); - }else{ - log.error("未上传开启充电结果........"); } }, 5, 1, TimeUnit.SECONDS); return AjaxResult.success(); @@ -700,10 +660,167 @@ /** + * 定时检测mongodb数据库数据 + * @param id + * @return + */ + public boolean timingDetection(Long id){ + TChargingOrder chargingOrder = this.getById(id); + if(chargingOrder.getStatus() != 2){ + return true; + } + String code = chargingOrder.getCode(); + String key = "AQJC_" + chargingOrder.getChargingGunId(); + //获取安全校验 + com.ruoyi.integration.api.model.SecurityDetection securityDetection = securityDetectionClient.getSecurityDetection(chargingOrder.getCode()).getData(); + if(null != securityDetection){ + PreChargeCheck preChargeCheck1 = redisService.getCacheObject("AQJC_" + chargingOrder.getChargingGunId()); + if(null != preChargeCheck1){ + preChargeCheck1.setElectronicLockLock(preChargeCheck1.getElectronicLockLock()); + preChargeCheck1.setInsulationTesting(true); + preChargeCheck1.setSecureConnectionDetection(preChargeCheck1.getSecureConnectionDetection()); + 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(data.size() != 0){ + PlatformStartChargingReply platformStartChargingReply = data.get(1); + Integer startup_result = platformStartChargingReply.getStartup_result(); + Integer failure_cause = platformStartChargingReply.getFailure_cause(); + Integer counter = counter_map.get(code); + PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key); + //5分钟内还未插枪则取消充电,退回金额。 + if(failure_cause == 5 && (null == counter || counter < 300)){ + counter = (null == counter ? 0 : counter) + 1; + counter_map.put(code, counter); + //启动失败 + preChargeCheck1.setStartupSuccess(3); + preChargeCheck1.setFailureCause(failure_cause); + redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS); + return false; + } + + //清除计时器中的无效数据 + counter_map.remove(code); + TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code)); + if(0 == startup_result){ + //启动失败 + preChargeCheck1.setStartupSuccess(3); + preChargeCheck1.setFailureCause(failure_cause); + //启动失败后取消订单,退款操作 + refund(code); + order.setStatus(-1); + order.setEndMode(0); + }else{ + //启动成功 + preChargeCheck1.setStartupSuccess(2); + order.setStatus(3); + order.setStartTime(LocalDateTime.now()); + } + this.updateById(order); + redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS); + return true; + }else{ + log.error(code + ":-------------------未上传开启充电结果-------------------"); + + Integer counter = boot_failed_map.get(code); + PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key); + //5分钟内未启动成功,退回金额。 + if(null == counter || counter < 300){ + counter = (null == counter ? 0 : counter) + 1; + boot_failed_map.put(code, counter); + //启动失败 + preChargeCheck1.setStartupSuccess(3); + preChargeCheck1.setFailureCause(0); + redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS); + return false; + } + + //清除计时器中的无效数据 + boot_failed_map.remove(code); + TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code)); + //启动失败 + preChargeCheck1.setStartupSuccess(3); + preChargeCheck1.setFailureCause(0); + //启动失败后取消订单,退款操作 + refund(code); + order.setStatus(-1); + order.setEndMode(0); + this.updateById(order); + redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS); + return true; + } + } + + + /** + * 修改安全检测数据 + * @param securityDetection + */ + @Override + public void securityDetection(SecurityDetection securityDetection){ + GetChargingGunByCode code = new GetChargingGunByCode(); + 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()); + if(null != preChargeCheck1){ + preChargeCheck1.setElectronicLockLock(preChargeCheck1.getElectronicLockLock()); + preChargeCheck1.setInsulationTesting(true); + preChargeCheck1.setSecureConnectionDetection(preChargeCheck1.getSecureConnectionDetection()); + preChargeCheck1.setStartupSuccess(1); + redisService.setCacheObject("AQJC_" + chargingGun.getId(), preChargeCheck1, 24L, TimeUnit.HOURS); + } + } + + /** + * 启动充电应发 + * @param message + */ + @Override + public void startChargeSuccessfully(PlatformStartChargingReplyMessage message) { + Integer startup_result = message.getStartup_result(); + Integer failure_cause = message.getFailure_cause(); + TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, message.getTransaction_serial_number())); + if(order.getStatus() != 2){ + return; + } + String code = order.getCode(); + PreChargeCheck preChargeCheck1 = redisService.getCacheObject("AQJC_" + order.getChargingGunId()); + if(null != preChargeCheck1){ + preChargeCheck1.setElectronicLockLock(preChargeCheck1.getElectronicLockLock()); + preChargeCheck1.setInsulationTesting(true); + preChargeCheck1.setSecureConnectionDetection(preChargeCheck1.getSecureConnectionDetection()); + preChargeCheck1.setStartupSuccess(1); + } + if(0 == startup_result){ + //启动失败 + preChargeCheck1.setStartupSuccess(3); + preChargeCheck1.setFailureCause(failure_cause); + //启动失败后取消订单,退款操作 + refund(code); + order.setStatus(-1); + order.setEndMode(0); + }else{ + //启动成功 + preChargeCheck1.setStartupSuccess(2); + order.setStatus(3); + order.setStartTime(LocalDateTime.now()); + } + redisService.setCacheObject("AQJC_" + order.getChargingGunId(), preChargeCheck1, 24L, TimeUnit.HOURS); + this.updateById(order); + } + + /** * 启动失败后的退款,取消订单 * @param code */ public void refund(String code){ + log.error(code + ":-------------------充电启动失败,执行退款-------------------"); TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code)); if(chargingOrder.getStatus() == 2){ Integer rechargePaymentType = chargingOrder.getRechargePaymentType(); @@ -970,7 +1087,7 @@ TAppUser appUser1 = appUserClient.getUserById(appUser.getInviteUserId()).getData(); if(null != appUser1.getVipId()){ - TVip vip = vipClient.getInfo(appUser1.getVipId()).getData(); + TVip vip = vipClient.getInfo1(appUser1.getVipId()).getData(); Integer doubleIntegration = vip.getDoubleIntegration(); //双倍积分 if(1 == doubleIntegration){ @@ -1052,7 +1169,7 @@ Integer num1 = JSON.parseObject(integralRule.getChargeCredit()).getInteger("num1"); Integer integral = payAmount.multiply(new BigDecimal(num1)).intValue(); if(null != appUser.getVipId()){ - TVip vip = vipClient.getInfo(appUser.getVipId()).getData(); + TVip vip = vipClient.getInfo1(appUser.getVipId()).getData(); Integer doubleIntegration = vip.getDoubleIntegration(); //双倍积分 if(1 == doubleIntegration){ @@ -1782,7 +1899,7 @@ TAppUser appUser1 = appUserClient.getUserById(appUser.getInviteUserId()).getData(); if(null != appUser1.getVipId()){ - TVip vip = vipClient.getInfo(appUser1.getVipId()).getData(); + TVip vip = vipClient.getInfo1(appUser1.getVipId()).getData(); Integer doubleIntegration = vip.getDoubleIntegration(); //双倍积分 if(1 == doubleIntegration){ @@ -1856,6 +1973,11 @@ } @Override + public List<Map<String, Object>> usersDay1() { + return this.baseMapper.usersDay1(); + } + + @Override public List<Map<String, Object>> usersByQuery(ChargingStatisticsQueryDto statisticsQueryDto) { return this.baseMapper.usersByQuery(statisticsQueryDto); } @@ -1903,6 +2025,8 @@ @Resource private TShoppingOrderService shoppingOrderService; + @Resource + private TShoppingOrderRefundService shoppingOrderRefundService; @Override public R payRefund(PayOrderRefundDto payOrderQueryDto) { if (payOrderQueryDto.getType()==1){ @@ -1937,6 +2061,9 @@ model.setAmount(amount); R<String> orderR = wxPaymentClient.refundOrderR(model); if(200 == orderR.getCode()){ + tChargingOrder.setRefundStatus(2); + tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount())); + this.baseMapper.updateById(tChargingOrder); chargingOrderRefundService.save(chargingOrderRefund); } } @@ -1950,6 +2077,9 @@ 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())); + this.baseMapper.updateById(tChargingOrder); chargingOrderRefundService.save(chargingOrderRefund); } @@ -1962,8 +2092,8 @@ } if (payOrderQueryDto.getType()==2){ TShoppingOrder tChargingOrder = shoppingOrderService.getById(payOrderQueryDto.getOrderId()); - TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund(); - chargingOrderRefund.setChargingOrderId(tChargingOrder.getId()); + TShoppingOrderRefund chargingOrderRefund = new TShoppingOrderRefund(); + chargingOrderRefund.setShoppingOrderId(tChargingOrder.getId()); chargingOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount()); chargingOrderRefund.setRefundStatus(1); chargingOrderRefund.setPayType(tChargingOrder.getPaymentType()); @@ -1992,7 +2122,10 @@ model.setAmount(amount); R<String> orderR = wxPaymentClient.refundOrderR(model); if(200 == orderR.getCode()){ - chargingOrderRefundService.save(chargingOrderRefund); + tChargingOrder.setRefundStatus(2); + tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount())); + shoppingOrderService.updateById(tChargingOrder); + shoppingOrderRefundService.save(chargingOrderRefund); } } @@ -2005,7 +2138,12 @@ RefundResp resp = aliPaymentClient.refund(dto).getData(); if(null != resp){ SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE"); - chargingOrderRefundService.save(chargingOrderRefund); + + tChargingOrder.setRefundStatus(2); + tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount())); + shoppingOrderService.updateById(tChargingOrder); + + shoppingOrderRefundService.save(chargingOrderRefund); } } @@ -2449,6 +2587,11 @@ return this.baseMapper.countAllUserData(); } + @Override + 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")); diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderEvaluateServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderEvaluateServiceImpl.java index 221c46f..689b6e2 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderEvaluateServiceImpl.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderEvaluateServiceImpl.java @@ -278,7 +278,7 @@ if(null != num1 && 0 < num1){ TAppUser appUser = appUserClient.getUserById(userid).getData(); if(null != appUser.getVipId()){ - TVip vip = vipClient.getInfo(appUser.getVipId()).getData(); + TVip vip = vipClient.getInfo1(appUser.getVipId()).getData(); Integer doubleIntegration = vip.getDoubleIntegration(); //双倍积分 if(1 == doubleIntegration){ diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TVipOrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TVipOrderServiceImpl.java index 23aeefd..b341dd9 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TVipOrderServiceImpl.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TVipOrderServiceImpl.java @@ -53,7 +53,7 @@ for (TVipOrder tVipOrder : list) { tVipOrder.setUid(tVipOrder.getId().toString()); tVipOrder.setUserUid(tVipOrder.getAppUserId().toString()); - TVip data = vipClient.getInfo(tVipOrder.getVipId()).getData(); + TVip data = vipClient.getInfo1(tVipOrder.getVipId()).getData(); if (data!=null){ tVipOrder.setName(data.getName()); } diff --git a/ruoyi-service/ruoyi-order/src/main/resources/bootstrap.yml b/ruoyi-service/ruoyi-order/src/main/resources/bootstrap.yml index a49dc2a..d0b8691 100644 --- a/ruoyi-service/ruoyi-order/src/main/resources/bootstrap.yml +++ b/ruoyi-service/ruoyi-order/src/main/resources/bootstrap.yml @@ -13,6 +13,7 @@ profiles: # 环境配置 active: dev +# active: prod --- spring: config: diff --git a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml index a1b1e71..abb234b 100644 --- a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml +++ b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml @@ -191,7 +191,7 @@ AND o.code LIKE CONCAT('%',#{data.code},'%') </if> <if test="data.phone != null and data.phone != ''"> - AND o.phone LIKE CONCAT('%',#{data.phone},'%') + AND i.phone LIKE CONCAT('%',#{data.phone},'%') </if> <if test="data.type != null"> AND o.type = #{data.type} @@ -211,7 +211,7 @@ <if test="data.isRefund == 1"> AND o.refund_status is not null </if> - <if test="data.isRefund == 1"> + <if test="data.isRefund == 2"> AND o.refund_status is null </if> @@ -592,25 +592,10 @@ </select> <select id="usersDay" resultType="java.util.Map"> + SELECT - 'today' AS data_type, - '1' as type, - DATE_FORMAT( create_time, '%Y-%m-%d %H' ) AS TIME, - count(DISTINCT app_user_id) AS counts - FROM - t_charging_order - WHERE - del_flag = 0 - AND recharge_payment_status = 2 - AND ISNULL( refund_status ) - AND DATE ( create_time ) = CURDATE() - GROUP BY - TIME - UNION all - SELECT - 'today' AS data_type, - '2' as type, - DATE_FORMAT( create_time, '%Y-%m-%d %H' ) AS TIME, + + DATE_FORMAT( create_time, '%Y-%m-%d %H' ) AS time, count(1) AS counts FROM charging_pile_account.t_app_user @@ -618,47 +603,31 @@ del_flag = 0 AND DATE ( create_time ) = CURDATE() GROUP BY - TIME + time </select> - <select id="usersByQuery" resultType="java.util.Map"> + + + <select id="usersDay1" resultType="java.util.Map"> SELECT 'today' AS data_type, '1' as type, - DATE_FORMAT( create_time, '%Y-%m-%d' ) AS TIME, - count(DISTINCT app_user_id) AS counts + DATE_FORMAT( create_time, '%Y-%m-%d %H' ) AS time, + count(DISTINCT app_user_id) AS counts FROM t_charging_order WHERE del_flag = 0 AND recharge_payment_status = 2 AND ISNULL( refund_status ) - <if test="statisticsQueryDto.dayType =1 "> - AND DATE(create_time) = CURDATE() - </if> - <if test="statisticsQueryDto.dayType =2 "> - AND WEEKOFYEAR(create_time) = WEEKOFYEAR(CURDATE()) - </if> - <if test="statisticsQueryDto.dayType =3 "> - AND MONTH(create_time) = MONTH(CURDATE()) - </if> - <if test="statisticsQueryDto.dayType =4"> - AND YEAR(create_time) = YEAR(CURDATE()) - </if> - <if test="statisticsQueryDto.dayType =5"> - <if test="statisticsQueryDto.startTime != null"> - AND create_time >= #{statisticsQueryDto.startTime} - </if> - <if test="statisticsQueryDto.endTime != null"> - AND create_time <= #{statisticsQueryDto.endTime} - </if> - </if> + AND DATE ( create_time ) = CURDATE() GROUP BY - TIME - UNION all + time + </select> + <select id="usersByQuery" resultType="java.util.Map"> + SELECT - 'today' AS data_type, - '2' as type, - DATE_FORMAT( create_time, '%Y-%m-%d' ) AS TIME, + + DATE_FORMAT( create_time, '%Y-%m-%d' ) AS time, count(1) AS counts FROM charging_pile_account.t_app_user @@ -685,43 +654,51 @@ </if> </if> GROUP BY - TIME + time </select> <select id="getUserTagCount" resultType="java.util.Map"> - SELECT user_tag_id,COUNT(1) as count from ( + SELECT + tt.`name`, + COUNT( 1 ) AS count + FROM + ( SELECT a.app_user_id, a.user_tag_id, a.create_time FROM charging_pile_account.t_app_user_tag a - JOIN ( - SELECT - app_user_id, - MAX(create_time) AS max_create_time - FROM - charging_pile_account.t_app_user_tag - GROUP BY - app_user_id - ) b ON a.app_user_id = b.app_user_id AND a.create_time = b.max_create_time + JOIN ( SELECT app_user_id, MAX( create_time ) AS max_create_time FROM charging_pile_account.t_app_user_tag GROUP BY app_user_id ) b ON a.app_user_id = b.app_user_id + AND a.create_time = b.max_create_time ) o - GROUP BY o.user_tag_id + LEFT JOIN `charging_pile_other`.`t_user_tag` tt on o.user_tag_id = tt.id + GROUP BY + tt.name </select> <select id="getVipCount" resultType="java.util.Map"> - SELECT vip_id,count(1) as Counts - FROM charging_pile_account.t_app_user - WHERE del_flag = 0 - GROUP BY vip_id + SELECT + tv.`name`, + count(1) AS Counts + FROM + charging_pile_account.t_app_user ta + LEFT JOIN `charging_pile_other`.`t_vip` tv on ta.vip_id = tv.id + WHERE + ta.del_flag = 0 + GROUP BY + tv.`name` </select> <select id="unitConsumption" resultType="java.util.Map"> SELECT + tc.`name`, au.company_id as companyId, SUM( co.charging_capacity ) as chargingCapacity FROM charging_pile_order.t_charging_order co LEFT JOIN charging_pile_account.t_app_user au ON co.app_user_id = au.id + LEFT JOIN `charging_pile_other`.`t_company` tc on au.company_id = tc.id + <where> co.del_flag = 0 <if test="statisticsQueryDto.dayType == 1"> @@ -746,7 +723,7 @@ </if> </where> GROUP BY - au.company_id + tc.`name`, au.company_id </select> <select id="carUserMethod" resultType="java.util.Map"> SELECT @@ -777,13 +754,14 @@ `t_order_evaluate` te LEFT JOIN t_charging_order co on te.order_id = co.id WHERE + 1 = 1 <if test="siteIds != null and siteIds.size() > 0"> AND co.site_id IN <foreach collection="siteIds" item="siteId" open="(" separator="," close=")"> #{siteId} </foreach> </if> - te.del_flag = 0 + AND te.del_flag = 0 </select> <select id="getLevelEvaluate" resultType="java.util.Map"> @@ -890,7 +868,7 @@ source_name as source from t_charging_order where 1=1 - del_flag = 0 + AND del_flag = 0 AND recharge_payment_status = 2 <if test="siteIds != null and siteIds.size() > 0"> and site_id IN @@ -923,7 +901,7 @@ </if> - ), 2) AS total_days,co.charging_gun_id,tc.name,cp.name as siteName + ), 2) AS percent,co.charging_gun_id,tc.name,cp.name as siteName FROM `charging_pile_order`.`t_charging_order` co LEFT JOIN `charging_pile_service`.`t_charging_gun` tc on co.charging_gun_id = tc.id @@ -983,7 +961,7 @@ </if> - ), 2) AS total_days,co.charging_gun_id,tc.name,cp.name as siteName + ), 2) AS percent,co.charging_gun_id,tc.name,cp.name as siteName FROM `charging_pile_order`.`t_charging_order` co LEFT JOIN `charging_pile_service`.`t_charging_gun` tc on co.charging_gun_id = tc.id @@ -1040,7 +1018,7 @@ )) </if> - ), 2) AS total_days,co.charging_gun_id,tc.name,cp.name as name1 + ), 2) AS percent,co.charging_gun_id,tc.name,cp.name as name1 FROM `charging_pile_service`.`t_fault_message` co LEFT JOIN `charging_pile_service`.`t_charging_gun` tc on co.charging_gun_id = tc.id @@ -1097,7 +1075,7 @@ )) </if> - ), 2) AS total_days,co.charging_gun_id,tc.name,cp.name as name1 + ), 2) AS percent,co.charging_gun_id,tc.name,cp.name as name1 FROM `charging_pile_service`.`t_fault_message` co LEFT JOIN `charging_pile_service`.`t_charging_gun` tc on co.charging_gun_id = tc.id @@ -1154,7 +1132,7 @@ )) </if> - ), 2) AS total_days,co.charging_gun_id,tc.name,cp.name as name1 + ), 2) AS percent,co.charging_gun_id,tc.name,cp.name as name1 FROM `charging_pile_service`.`t_fault_message` co LEFT JOIN `charging_pile_service`.`t_charging_gun` tc on co.charging_gun_id = tc.id @@ -1209,7 +1187,7 @@ )) </if> - ), 2) AS total_days,co.charging_gun_id,tc.name,cp.name as name1 + ), 2) AS percent,co.charging_gun_id,tc.name,cp.name as name1 FROM `charging_pile_service`.`t_fault_message` co LEFT JOIN `charging_pile_service`.`t_charging_gun` tc on co.charging_gun_id = tc.id @@ -1249,13 +1227,14 @@ SELECT FORMAT((SUM(co.current) / SUM(co.need_elec)), 2) AS percent, co.charging_gun_id, - tc.name, - cp.name AS gun_name + tc.name as name, + cp.name AS siteName FROM `charging_pile_order`.`t_charging_order` co LEFT JOIN `charging_pile_service`.`t_charging_gun` tc ON co.charging_gun_id = tc.id LEFT JOIN `charging_pile_service`.`t_charging_pile` cp ON tc.charging_pile_id = cp.id <where> + cp.type = 1 <if test="siteIds != null and siteIds.size() > 0"> and co.site_id IN <foreach collection="siteIds" item="siteId" open="(" separator="," close=")"> @@ -1439,4 +1418,48 @@ </select> + <select id="needElec1" resultType="java.util.Map"> + SELECT + FORMAT((SUM(co.current) / SUM(co.need_elec)), 2) AS percent, + co.charging_gun_id, + tc.name as name, + cp.name AS siteName + FROM + `charging_pile_order`.`t_charging_order` co + LEFT JOIN `charging_pile_service`.`t_charging_gun` tc ON co.charging_gun_id = tc.id + LEFT JOIN `charging_pile_service`.`t_charging_pile` cp ON tc.charging_pile_id = cp.id + <where> + cp.type = 2 + <if test="siteIds != null and siteIds.size() > 0"> + and co.site_id IN + <foreach collection="siteIds" item="siteId" open="(" separator="," close=")"> + #{siteId} + </foreach> + </if> + <if test="statisticsQueryDto.dayType == 1"> + AND DATE( co.create_time ) = CURDATE() + </if> + <if test="statisticsQueryDto.dayType == 2"> + AND WEEKOFYEAR( co.create_time ) = WEEKOFYEAR( CURDATE() ) + </if> + <if test="statisticsQueryDto.dayType == 3"> + AND MONTH( co.create_time ) = MONTH(CURDATE()) + </if> + <if test="statisticsQueryDto.dayType == 4"> + AND YEAR( co.create_time ) = YEAR(CURDATE() ) + </if> + <if test="statisticsQueryDto.dayType == 5"> + <if test="statisticsQueryDto.startTime != null"> + AND co.create_time >= #{statisticsQueryDto.startTime} + </if> + <if test="statisticsQueryDto.endTime != null"> + AND co.create_time <= #{statisticsQueryDto.endTime} + </if> + </if> + </where> + GROUP BY + tc.name, + cp.name, + co.charging_gun_id; + </select> </mapper> diff --git a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderEvaluateMapper.xml b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderEvaluateMapper.xml index 472e744..67673b1 100644 --- a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderEvaluateMapper.xml +++ b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderEvaluateMapper.xml @@ -125,10 +125,15 @@ order by a.create_time desc </select> <select id="goodTop" resultType="java.util.Map"> - SELECT count(1) as counts ,ot.evaluation_tag_id - from t_order_evaluate_tag ot - left join t_order_evaluate te on ot.order_evaluate_id = te.id - left join t_charging_order co on te.order_id = co.id + SELECT + count( 1 ) AS counts, + + tt.`name` + FROM + t_order_evaluate_tag ot + LEFT JOIN t_order_evaluate te ON ot.order_evaluate_id = te.id + LEFT JOIN t_charging_order co ON te.order_id = co.id + LEFT JOIN `charging_pile_other`.`t_evaluation_tag` tt on ot.evaluation_tag_id = tt.id WHERE ot.evaluation_tag_id in ( SELECT id from `charging_pile_other`.`t_evaluation_tag` WHERE type = 1 ) <if test="null != siteIds"> @@ -137,18 +142,25 @@ #{item} </foreach> </if> - GROUP BY ot.evaluation_tag_id - ORDER BY counts desc - limit 5 + GROUP BY + tt.`name` + ORDER BY + counts DESC + LIMIT 5 </select> <select id="badTop" resultType="java.util.Map"> - SELECT count(1) as counts ,ot.evaluation_tag_id - from t_order_evaluate_tag ot - left join t_order_evaluate te on ot.order_evaluate_id = te.id - left join t_charging_order co on te.order_id = co.id + SELECT + count( 1 ) AS counts, + + tt.`name` + FROM + t_order_evaluate_tag ot + LEFT JOIN t_order_evaluate te ON ot.order_evaluate_id = te.id + LEFT JOIN t_charging_order co ON te.order_id = co.id + LEFT JOIN `charging_pile_other`.`t_evaluation_tag` tt on ot.evaluation_tag_id = tt.id WHERE ot.evaluation_tag_id in ( SELECT id from `charging_pile_other`.`t_evaluation_tag` WHERE type = 3 ) <if test="null != siteIds"> @@ -157,8 +169,10 @@ #{item} </foreach> </if> - GROUP BY ot.evaluation_tag_id - ORDER BY counts desc - limit 5 + GROUP BY + tt.`name` + ORDER BY + counts DESC + LIMIT 5 </select> </mapper> diff --git a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TShoppingOrderMapper.xml b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TShoppingOrderMapper.xml index 514f70e..6144472 100644 --- a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TShoppingOrderMapper.xml +++ b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TShoppingOrderMapper.xml @@ -272,19 +272,19 @@ payment_amount FROM t_shopping_order - <where> + WHERE del_flag = 0 and payment_status = 2 and ISNULL(refund_status) and status!=4 <if test="null != sixBefore"> - and DATE_FORMAT(create_time, '%Y-%m-%d') >= DATE_FORMAT(#{sixBefore}, '%Y-%m-%d') + and create_time >= #{sixBefore} </if> <if test="null != status"> and status = #{status} </if> - </where> + ) AS subquery GROUP BY - DATE_FORMAT( subquery.create_time, '%m' ); + DATE_FORMAT( subquery.create_time, '%m' ) </select> diff --git a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TVipOrderMapper.xml b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TVipOrderMapper.xml index 739d696..979c301 100644 --- a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TVipOrderMapper.xml +++ b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TVipOrderMapper.xml @@ -50,29 +50,29 @@ </select> <select id="sixBefore" resultType="com.ruoyi.order.dto.SixVipDto"> SELECT - DATE_FORMAT(subquery.create_time, '%Y-%m') AS MONTH, - subquery.vip_id, - COUNT(1) AS orderNum, - SUM(subquery.payment_amount) AS paymentAmount + DATE_FORMAT(subquery.create_time, '%Y-%m') AS MONTH, + COUNT(1) AS orderNum, + SUM(subquery.payment_amount) AS paymentAmount, + tp.`name` FROM ( - SELECT - vip_id, - create_time, - payment_amount - FROM - t_vip_order + SELECT + vip_id, + create_time, + payment_amount + FROM + t_vip_order <where> del_flag = 0 AND payment_status = 2 AND - refund_amount IS NULL <if test="sixBefore != null"> AND create_time > #{sixBefore} </if> </where> - ) AS subquery + ) AS subquery + LEFT JOIN `charging_pile_other`.`t_vip` tp on subquery.vip_id = tp.id GROUP BY - DATE_FORMAT(subquery.create_time, '%Y-%m'), - subquery.vip_id; + DATE_FORMAT(subquery.create_time, '%Y-%m'), + tp.`name`; </select> diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TEnterpriseUserApplicationController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TEnterpriseUserApplicationController.java index f050fa6..6e3ae1c 100644 --- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TEnterpriseUserApplicationController.java +++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TEnterpriseUserApplicationController.java @@ -6,6 +6,7 @@ import com.ruoyi.account.api.feignClient.AppUserClient; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.domain.AjaxResult; +import com.ruoyi.common.core.web.domain.BasePojo; import com.ruoyi.common.log.annotation.Log; import com.ruoyi.common.log.enums.BusinessType; import com.ruoyi.common.security.service.TokenService; @@ -78,7 +79,7 @@ // Page<TEnterpriseUserApplication> page = enterpriseUserApplicationService.lambdaQuery().in(TEnterpriseUserApplication::getAppUserId, userIds).page(Page.of(enterpriseQuery.getPageCurr(), enterpriseQuery.getPageSize())); // return R.ok(page); // }else { - Page<TEnterpriseUserApplication> page = enterpriseUserApplicationService.lambdaQuery().eq(enterpriseQuery.getPhone()!=null&&enterpriseQuery.getPhone()!="",TEnterpriseUserApplication::getPhone,enterpriseQuery.getPhone()).page(Page.of(enterpriseQuery.getPageCurr(), enterpriseQuery.getPageSize())); + Page<TEnterpriseUserApplication> page = enterpriseUserApplicationService.lambdaQuery().eq(enterpriseQuery.getPhone()!=null&&enterpriseQuery.getPhone()!="",TEnterpriseUserApplication::getPhone,enterpriseQuery.getPhone()).orderByDesc(BasePojo::getCreateTime).page(Page.of(enterpriseQuery.getPageCurr(), enterpriseQuery.getPageSize())); return R.ok(page); // } } diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java index 1eb1e82..f9cda01 100644 --- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java +++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java @@ -125,13 +125,19 @@ @GetMapping("/getInfoByType") @ApiOperation(tags = {"小程序-兑换商城"},value = "商品查看详情") - public AjaxResult getInfoByType(Integer goodType,Integer id) { + public R getInfoByType(Integer goodType,Integer id) { if (goodType==1){ TGoods byId = goodsService.getById(id); - return AjaxResult.ok(byId);} + if (byId==null||byId.getStatus()==2){ + return R.fail(2,"内容不存在"); + } + return R.ok(byId);} else { TCoupon byId = couponService.getById(id); - return AjaxResult.ok(byId); + if (byId==null||byId.getStatus()==2){ + return R.fail(2,"内容不存在"); + } + return R.ok(byId); } } @@ -204,6 +210,7 @@ }else { //减少库存 good.setInventory(good.getInventory()-exchangeDto.getNum()); + goodsService.updateById(good); } if (user.getPoints()<good.getRedeemPoints()){ return AjaxResult.error("当前用户积分不足"); @@ -219,7 +226,8 @@ if (coupon.getInventoryQuantity() != -1 && count >= coupon.getInventoryQuantity()) { return AjaxResult.error("当前用户已到达兑换"+coupon+"次"); }else { - coupon.setInventoryQuantity(coupon.getInventoryQuantity()-exchangeDto.getNum()); + coupon.setInventoryQuantity(coupon.getInventoryQuantity()-1); + couponService.updateById(coupon); } @@ -252,11 +260,11 @@ PointChangeDto pointChangeDto = new PointChangeDto(); pointChangeDto.setUserId(userId); pointChangeDto.setPoints(point); - pointChangeDto.setRemark(longR.getData().toString()); + pointChangeDto.setRemark(String.valueOf(longR.getData().getId())); pointChangeDto.setType(6); pointChangeDto.setCode(longR.getData().getCode()); appUserClient.changeDown(pointChangeDto); - return AjaxResult.success(); + return AjaxResult.success(longR.getData().getId()); } @@ -277,6 +285,9 @@ BigDecimal vipDiscount = new BigDecimal(0); if (exchangeDto.getGoodType()==1){ TGoods good = goodsService.getById(exchangeDto.getGoodId()); + if (good.getStatus()==2){ + return R.fail("当前商品已下架"); + } BigDecimal originalPrice = good.getPreferentialPrice(); exchangeDto.setTitle("【商品购买】"+good.getName()); if (isVip){ @@ -289,6 +300,9 @@ }else { TCoupon coupon = couponService.getById(exchangeDto.getGoodId()); + if (coupon.getStatus()==2){ + return R.fail("当前商品已下架"); + } exchangeDto.setTitle("【优惠卷购买】"+coupon.getName()); BigDecimal originalPrice = coupon.getPaymentAmount(); if (isVip){ diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java index a6a0e64..d27cac8 100644 --- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java +++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java @@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.account.api.dto.SendCouponDto; +import com.ruoyi.account.api.feignClient.AppUserClient; +import com.ruoyi.account.api.model.TAppUser; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.BasePage; @@ -217,6 +219,77 @@ } + @Resource + private AppUserClient appUserClient; + + @ApiOperation(value = "当前生效会员信息", tags = {"小程序-个人中心"}) + @GetMapping("/recent/vipInfo") + public R<List<VipInfoDto>> recentVipInfo() { + Long userId = tokenService.getLoginUserApplet().getUserId(); + TAppUser data = appUserClient.getUserById(userId).getData(); + if (data.getVipEndTime()!=null&&data.getVipEndTime().isAfter(LocalDateTime.now())) { + + List<VipInfoDto> vipInfoDtos = new ArrayList<>(); + List<TVip> vips = vipService.lambdaQuery().eq(TVip::getId, data.getVipId()).list(); + LocalDateTime now = LocalDateTime.now(); + for (TVip vip : vips) { + VipInfoDto vipInfoDto = new VipInfoDto(); + vipInfoDto.setMonthlyCard(vip.getMonthlyCardReveal() == 1 ? vip.getMonthlyCard() : null); + vipInfoDto.setSeasonCard(vip.getSeasonCardReveal() == 1 ? vip.getSeasonCard() : null); + vipInfoDto.setAnnualCard(vip.getAnnualCardReveal() == 1 ? vip.getAnnualCard() : null); + //判断是否在折扣时间内,然后设置折扣价格 + if (vip.getMonthlyCardDiscountStart() != null && (now.isAfter(vip.getMonthlyCardDiscountStart()) && now.isBefore(vip.getMonthlyCardDiscountEnd()))) { + vipInfoDto.setMonthlyCardDiscount(vip.getMonthlyCardDiscount()); + } + if (vip.getSeasonCardDiscountStart() != null && (now.isAfter(vip.getSeasonCardDiscountStart()) && now.isBefore(vip.getSeasonCardDiscountEnd()))) { + vipInfoDto.setSeasonCardDiscount(vip.getSeasonCardDiscount()); + } + if (vip.getAnnualCardDiscountStart() != null && (now.isAfter(vip.getAnnualCardDiscountStart()) && now.isBefore(vip.getAnnualCardDiscountEnd()))) { + vipInfoDto.setAnnualCardDiscount(vip.getAnnualCardDiscount()); + } + + + vipInfoDto.setMaximumDeduction(vip.getMaximumDeduction()); + vipInfoDto.setDiscountTimes(vip.getDiscountTimes()); + vipInfoDto.setDoubleIntegration(vip.getDoubleIntegration()); + vipInfoDto.setMallExclusivePrice(vip.getMallExclusivePrice()); + vipInfoDto.setName(vip.getName()); + vipInfoDto.setId(vip.getId()); + List<SendCouponDto> javaList = JSON.parseArray(vip.getCoupon()).toJavaList(SendCouponDto.class); + List<VipCouponDto> vipCouponDtos = new ArrayList<>(); + if (!javaList.isEmpty()) { + for (SendCouponDto sendCouponDto : javaList) { + VipCouponDto vipCouponDto = new VipCouponDto(); + TCoupon byId = couponService.getById(sendCouponDto.getId()); + vipCouponDto.setNum(sendCouponDto.getNumber()); + vipCouponDto.setTCoupon(byId); + vipCouponDtos.add(vipCouponDto); + } + } + + vipInfoDto.setVipCouponDtos(vipCouponDtos); + + //计算总折扣 + BigDecimal total = BigDecimal.ZERO; + total = total.add(vip.getMaximumDeduction().multiply(BigDecimal.valueOf(vip.getDiscountTimes()))); + for (VipCouponDto vipCouponDto : vipCouponDtos) { + TCoupon tCoupon = vipCouponDto.getTCoupon(); + if (tCoupon.getPreferentialMode() == 2) { + total.add(tCoupon.getMaximumDiscountAmount()); + } else { + total.add(tCoupon.getDiscountAmount()); + } + } + vipInfoDto.setTotalDiscount(total); + vipInfoDto.setTimeAmount(vip.getMaximumDeduction().multiply(BigDecimal.valueOf(vip.getDiscountTimes()))); + vipInfoDtos.add(vipInfoDto); + } + return R.ok(vipInfoDtos); + + } + return R.ok(); + } + @ApiOperation(value = "购买会员", tags = {"小程序-个人中心"}) @@ -226,6 +299,9 @@ ) { TVip byId = vipService.getById(vipId); + if (byId==null){ + return R.ok("当前会员不存在,请刷新后重试。"); + } BigDecimal payMoney = BigDecimal.ZERO; BigDecimal discountMoney = BigDecimal.ZERO; BigDecimal discount = BigDecimal.ZERO; diff --git a/ruoyi-service/ruoyi-other/src/main/resources/bootstrap.yml b/ruoyi-service/ruoyi-other/src/main/resources/bootstrap.yml index 2c4088c..fc51ae5 100644 --- a/ruoyi-service/ruoyi-other/src/main/resources/bootstrap.yml +++ b/ruoyi-service/ruoyi-other/src/main/resources/bootstrap.yml @@ -13,6 +13,7 @@ profiles: # 环境配置 active: dev +# active: prod --- spring: config: diff --git a/ruoyi-service/ruoyi-payment/src/main/resources/bootstrap.yml b/ruoyi-service/ruoyi-payment/src/main/resources/bootstrap.yml index c1e6944..0c4c5ce 100644 --- a/ruoyi-service/ruoyi-payment/src/main/resources/bootstrap.yml +++ b/ruoyi-service/ruoyi-payment/src/main/resources/bootstrap.yml @@ -13,6 +13,7 @@ profiles: # 环境配置 active: dev +# active: prod --- spring: config: -- Gitblit v1.7.1