diff --git a/authorization-server/src/main/java/com/evotech/hd/authorization/service/impl/LoginServiceImpl.java b/authorization-server/src/main/java/com/evotech/hd/authorization/service/impl/LoginServiceImpl.java index 51824f9..2fe40a8 100644 --- a/authorization-server/src/main/java/com/evotech/hd/authorization/service/impl/LoginServiceImpl.java +++ b/authorization-server/src/main/java/com/evotech/hd/authorization/service/impl/LoginServiceImpl.java @@ -43,7 +43,6 @@ import org.springframework.util.StringUtils; import java.util.Date; import java.util.List; import java.util.Map; -import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; @Slf4j @@ -231,13 +230,13 @@ public class LoginServiceImpl implements LoginService { } private void asyncIndexTask(){ - CompletableFuture asyncTask = CompletableFuture.runAsync(()->{ - try { - cloudService.loadIndexData(); - } catch (Exception e) { - log.error("异步处理首页数据异常:{}", e.getMessage()); - } - }); +// CompletableFuture asyncTask = CompletableFuture.runAsync(()->{ +// try { +// cloudService.loadIndexData(); +// } catch (Exception e) { +// log.error("异步处理首页数据异常:{}", e.getMessage()); +// } +// }); } diff --git a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/Dto/request/template/StopServerTemplateDto.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/Dto/request/template/StopServerTemplateDto.java new file mode 100644 index 0000000..cefa43f --- /dev/null +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/Dto/request/template/StopServerTemplateDto.java @@ -0,0 +1,34 @@ +package com.evotech.hd.common.core.Dto.request.template; + +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * 类 + * + * @ClassName:AlarmTemplateDto + * @date: 2025年05月05日 16:29 + * @author: andy.shi + * @contact: 17330188597 + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ + +@Data +public class StopServerTemplateDto { + + /*** + * key 为 用户的wuid, value为用户的车牌号信息 + */ + Map plateNum; + + /*** + * 站管理员的wuid + */ + List adminWuId; + + String stationName; + + String reason; +} diff --git a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/Dto/result/home/HomeOrderInfo.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/Dto/result/home/HomeOrderInfo.java new file mode 100644 index 0000000..b7fde0e --- /dev/null +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/Dto/result/home/HomeOrderInfo.java @@ -0,0 +1,35 @@ +package com.evotech.hd.common.core.Dto.result.home; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +/** + * 类 + * + * @ClassName:HomeOrderInfo + * @date: 2025年05月08日 17:34 + * @author: andy.shi + * @contact: 17330188597 + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ +@Data +@Schema(name = "首页换电订单信息") +public class HomeOrderInfo { + + @Schema(description = "换电时间") + @JsonFormat( pattern = "yyyy-MM-dd HH:mm:ss") + private Date swapTime; + + @Schema(description = "换电车辆") + private String swapCar; + + @Schema(description = "换电人") + private String swapUserName; + + @Schema(description = "换电金额") + private Double swapAmount; + +} diff --git a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/Dto/result/home/HomeOrderSwapBatteryAmountDto.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/Dto/result/home/HomeOrderSwapBatteryAmountDto.java index dc53fe6..98f03d9 100644 --- a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/Dto/result/home/HomeOrderSwapBatteryAmountDto.java +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/Dto/result/home/HomeOrderSwapBatteryAmountDto.java @@ -16,6 +16,8 @@ public class HomeOrderSwapBatteryAmountDto { Double amount; + Long dataCount; + Integer status; } diff --git a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/Dto/result/home/HomeOrderSwapBatteryHalfYearAmountDto.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/Dto/result/home/HomeOrderSwapBatteryHalfYearAmountDto.java index 169fdce..0c078d8 100644 --- a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/Dto/result/home/HomeOrderSwapBatteryHalfYearAmountDto.java +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/Dto/result/home/HomeOrderSwapBatteryHalfYearAmountDto.java @@ -24,9 +24,9 @@ public class HomeOrderSwapBatteryHalfYearAmountDto { @Schema(description = "交易金额") private Double totalMoney; - @Schema(description = "类型") - private Integer status; - - @Schema(description = "支付类型") - private Integer payType; +// @Schema(description = "类型") +// private Integer status; +// +// @Schema(description = "支付类型") +// private Integer payType; } diff --git a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/Dto/result/home/HomeOrderSwapBatteryProportionDto.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/Dto/result/home/HomeOrderSwapBatteryProportionDto.java index 19c9d45..c7ac509 100644 --- a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/Dto/result/home/HomeOrderSwapBatteryProportionDto.java +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/Dto/result/home/HomeOrderSwapBatteryProportionDto.java @@ -22,7 +22,8 @@ public class HomeOrderSwapBatteryProportionDto { String stationCode; @Schema(description = "换电站订单数量") Long quantity; - @Schema(description = "订单类型") - Integer orderType; + +// @Schema(description = "订单类型") +// Integer orderType; } diff --git a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/dao/cloud/OrderSwapBatteryDao.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/dao/cloud/OrderSwapBatteryDao.java index 74d271e..e9c2064 100644 --- a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/dao/cloud/OrderSwapBatteryDao.java +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/dao/cloud/OrderSwapBatteryDao.java @@ -2,14 +2,10 @@ package com.evotech.hd.common.core.dao.cloud; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.evotech.hd.common.core.Dto.request.HomeRequestDto; -import com.evotech.hd.common.core.Dto.result.home.HomeOrderSwapBatteryAmountDto; -import com.evotech.hd.common.core.Dto.result.home.HomeOrderSwapBatteryHalfYearAmountDto; -import com.evotech.hd.common.core.Dto.result.home.HomeOrderSwapBatteryHalfYearDto; -import com.evotech.hd.common.core.Dto.result.home.HomeOrderSwapBatteryProportionDto; +import com.evotech.hd.common.core.Dto.result.home.*; import com.evotech.hd.common.core.constant.HDConstant; import com.evotech.hd.common.core.entity.cloud.OrderSwapBattery; import com.evotech.hd.common.core.permission.DataScope; -import com.evotech.hd.common.core.permission.DataScopeOpenMethod; import com.evotech.hd.common.core.permission.DataScopes; import org.apache.ibatis.annotations.Param; @@ -24,7 +20,7 @@ import java.util.List; @DataScope(permissionObject = HDConstant.OPERATOR_ROLE_CODE, permissionScopeName = "station_code", permissionScopeRedisKey = HDConstant.PermissionConstant.PERMISSION_STATION_CODE), @DataScope(permissionObject = HDConstant.COMPANY_ROLE_CODE, permissionScopeName = "plate_num", permissionScopeRedisKey = HDConstant.PermissionConstant.PERMISSION_CAR_CODE), }) -@DataScopeOpenMethod(openMethod = true, methodName = {"homeFindHalfYearAmountData"}) +//@DataScopeOpenMethod(openMethod = true, methodName = {"homeFindHalfYearAmountData"}) public interface OrderSwapBatteryDao extends BaseMapper { @@ -34,10 +30,14 @@ public interface OrderSwapBatteryDao extends BaseMapper { List homeFindHalfYearOrderData(@Param("params") HomeRequestDto params); - @DataScope(permissionObject = HDConstant.OPERATOR_ROLE_CODE, tableAlias = "osb", permissionScopeName = "station_code", permissionScopeRedisKey = HDConstant.PermissionConstant.PERMISSION_STATION_CODE) +// @DataScope(permissionObject = HDConstant.OPERATOR_ROLE_CODE, tableAlias = "osb", permissionScopeName = "station_code", permissionScopeRedisKey = HDConstant.PermissionConstant.PERMISSION_STATION_CODE) List homeFindHalfYearAmountData(@Param("params") HomeRequestDto params); + //因为站端不需要显示金额, 所有重新写一个 + List homeFindHalfYearStationAmountData(@Param("params") HomeRequestDto params); Long homeFindOrderCountData(@Param("date") Date date); Double homeFindOrderAmountData(@Param("date") Date date); + + List findOrderListByStatus(@Param("status") Integer status); } diff --git a/base-commons/common-mongodb/src/main/java/com/evotech/hd/common/constant/MongoConstant.java b/base-commons/common-mongodb/src/main/java/com/evotech/hd/common/constant/MongoConstant.java index e4ac5b0..3be50a9 100644 --- a/base-commons/common-mongodb/src/main/java/com/evotech/hd/common/constant/MongoConstant.java +++ b/base-commons/common-mongodb/src/main/java/com/evotech/hd/common/constant/MongoConstant.java @@ -10,6 +10,12 @@ package com.evotech.hd.common.constant; */ public class MongoConstant { + + public class ErrorCode{ + //站端告警标识 + public static final Integer STATION_ALARM_CODE= 2; + + } //电池实时信息数据库 public static final String BATTERY_DATA_BASE="battery_info"; //电池箱实时信息数据库 @@ -27,7 +33,7 @@ public class MongoConstant { * 条件查询, 示例 * put(查询类型+"条件名称","条件值") */ - public static final String AND = "and"; + public static final String EQ = "and"; public static final String IN = "in"; public static final String NOT_IN = "not_in"; public static final String GT = "gt"; diff --git a/base-commons/common-mongodb/src/main/java/com/evotech/hd/common/service/MongoDBService.java b/base-commons/common-mongodb/src/main/java/com/evotech/hd/common/service/MongoDBService.java index c5863ae..968abfe 100644 --- a/base-commons/common-mongodb/src/main/java/com/evotech/hd/common/service/MongoDBService.java +++ b/base-commons/common-mongodb/src/main/java/com/evotech/hd/common/service/MongoDBService.java @@ -177,7 +177,7 @@ public class MongoDBService { String[] keyAndQueryType = key.split(MongoConstant.SEPARATION); //根据类型做查询 switch (keyAndQueryType[0]){ - case MongoConstant.AND: + case MongoConstant.EQ: query.addCriteria(Criteria.where(keyAndQueryType[1]).is(params.get(key))); break; case MongoConstant.IN: diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/HomeController.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/HomeController.java index ed253fc..f77af12 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/HomeController.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/HomeController.java @@ -1,6 +1,5 @@ package com.evotech.hd.cloud.controller; -import com.evotech.hd.cloud.entity.request.HomeDataRequest; import com.evotech.hd.cloud.entity.vo.*; import com.evotech.hd.cloud.service.HomeService; import com.evotech.hd.common.core.Dto.Result; @@ -9,7 +8,6 @@ import com.github.xiaoymin.knife4j.annotations.ApiSupport; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springdoc.core.annotations.ParameterObject; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -25,58 +23,133 @@ public class HomeController { @Resource private HomeService homeService; - - @Operation(summary = "数据1-运营商,换电站,电池,机器人") - @GetMapping("/data1") + + @Operation(summary = "平台首页===> 数据1-运营商,换电站,认证公司, 机器人 电池") + @GetMapping("/platform/data1") @ApiOperationSupport(order = 1) - public Result homeData1(@ParameterObject HomeDataRequest hd) { - return homeService.homeData1(hd); + public Result platformData1() { + return homeService.platformData1(); } - - @Operation(summary = "数据2-公司、用户、车辆") - @GetMapping("/data2") + + @Operation(summary = "平台首页===> 数据2-金额 占比, 半年交易情况等") + @GetMapping("/platform/data2") @ApiOperationSupport(order = 2) - public Result homeData2() { - return homeService.homeData2(); + public Result platformData2() { + return homeService.platformData2(); } - - @Operation(summary = "数据3-订单总数 订单占比") - @GetMapping("/data3") + + + @Operation(summary = "运营商首页===> 换电站 机器人 电池") + @GetMapping("/roxy/data1") @ApiOperationSupport(order = 3) - public Result homeData3(@ParameterObject HomeDataRequest hd) { - return homeService.homeData3(hd); + public Result roxyData1() { + return homeService.roxyData1(); } - - @Operation(summary = "数据4-收入/支出金额") - @GetMapping("/data4") + + @Operation(summary = "运营商首页===> 当月订单情况, 和近半年情况 ") + @GetMapping("/roxy/data2") @ApiOperationSupport(order = 4) - public Result homeData4(@ParameterObject HomeDataRequest hd) { - return homeService.homeData4(hd); + public Result roxyData2() { + return homeService.roxyData2(); } - - @Operation(summary = "数据5-近6个月订单统计") - @GetMapping("/data5") + + + @Operation(summary = "站端首页===> 机器人 电池 , 订单") + @GetMapping("/station/data1") @ApiOperationSupport(order = 5) - public Result> homeData5(@ParameterObject HomeDataRequest hd) { - return homeService.homeData5(hd); + public Result stationData1() { + return homeService.stationData1(); } - - @Operation(summary = "数据6-近6个月交易统计") - @GetMapping("/data6") + + + @Operation(summary = "公司首页") + @GetMapping("/company/data") @ApiOperationSupport(order = 6) - public Result> homeData6(@ParameterObject HomeDataRequest hd) { - return homeService.homeData6(hd); + public Result company() { + return homeService.company(); } - - - @Operation(summary = "数据7-同比、环比") - @GetMapping("/data7") + + + @Operation(summary = "告警信息") + @GetMapping("/alarm/data") @ApiOperationSupport(order = 7) - public Result homeData7(Integer type) { - return homeService.homeData7(type); + public Result> alarmData() { + return homeService.alarmData(); } +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// @Operation(summary = "数据1-运营商,换电站,电池,机器人") +// @GetMapping("/data1") +// @ApiOperationSupport(order = 1) +// public Result homeData1(@ParameterObject HomeDataRequest hd) { +// return homeService.homeData1(hd); +// } +// +// @Operation(summary = "数据2-公司、用户、车辆") +// @GetMapping("/data2") +// @ApiOperationSupport(order = 2) +// public Result homeData2() { +// return homeService.homeData2(); +// } +// +// @Operation(summary = "数据3-订单总数 订单占比") +// @GetMapping("/data3") +// @ApiOperationSupport(order = 3) +// public Result homeData3(@ParameterObject HomeDataRequest hd) { +// return homeService.homeData3(hd); +// } +// +// @Operation(summary = "数据4-收入/支出金额") +// @GetMapping("/data4") +// @ApiOperationSupport(order = 4) +// public Result homeData4(@ParameterObject HomeDataRequest hd) { +// return homeService.homeData4(hd); +// } +// +// @Operation(summary = "数据5-近6个月订单统计") +// @GetMapping("/data5") +// @ApiOperationSupport(order = 5) +// public Result> homeData5(@ParameterObject HomeDataRequest hd) { +// return homeService.homeData5(hd); +// } +// +// @Operation(summary = "数据6-近6个月交易统计") +// @GetMapping("/data6") +// @ApiOperationSupport(order = 6) +// public Result> homeData6(@ParameterObject HomeDataRequest hd) { +// return homeService.homeData6(hd); +// } +// +// +// @Operation(summary = "数据7-同比、环比") +// @GetMapping("/data7") +// @ApiOperationSupport(order = 7) +// public Result homeData7(Integer type) { +// return homeService.homeData7(type); +// } + + + @Operation(hidden = true) @GetMapping("/login/data") public void loginData() { homeService.loginData(); diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/test/TestController.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/test/TestController.java index b4acd2e..b8716f7 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/test/TestController.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/test/TestController.java @@ -13,8 +13,8 @@ import com.evotech.hd.cloud.dao.VehicleWechatUserRelationDao; import com.evotech.hd.cloud.device.dh.DHRequestUtil; import com.evotech.hd.cloud.mqtt.message.MessageTopic; import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader; -import com.evotech.hd.cloud.mqtt.message.processor.MqttRequestExchangeProcessor; -import com.evotech.hd.cloud.mqtt.message.processor.impl.state.MqttStateChargingDataExchangeProcessor; +import com.evotech.hd.cloud.mqtt.message.processor.strategy.MqttStrategyExchangeProcessor; +import com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.state.MqttStateChargingDataExchangeProcessor; import com.evotech.hd.cloud.utils.components.SwapOrderBasicFeeComponent; import com.evotech.hd.common.core.entity.Result; import com.evotech.hd.common.core.entity.cloud.BatteryStation; @@ -81,8 +81,8 @@ public class TestController { header.setFunction(json.getString("function")); cn.hutool.json.JSONObject dataBody = JSONUtil.parseObj(json.getJSONObject("dataBoy")); - Map mqttMessageRequestExchangeProcessorMap = applicationContext.getBeansOfType(MqttRequestExchangeProcessor.class); - for (MqttRequestExchangeProcessor processor : mqttMessageRequestExchangeProcessorMap.values()) { + Map mqttMessageRequestExchangeProcessorMap = applicationContext.getBeansOfType(MqttStrategyExchangeProcessor.class); + for (MqttStrategyExchangeProcessor processor : mqttMessageRequestExchangeProcessorMap.values()) { if(processor.accept(header.getFunction())){ processor.exchange(topic, header, dataBody); } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomeAlarmData.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomeAlarmData.java new file mode 100644 index 0000000..53cc337 --- /dev/null +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomeAlarmData.java @@ -0,0 +1,45 @@ +package com.evotech.hd.cloud.entity.vo; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 首页报警信息类 + * + * @ClassName:HomeAlarmData + * @date: 2025年05月08日 14:41 + * @author: andy.shi + * @contact: 17330188597 + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ +@Data +@Schema(name = "报警信息") +public class HomeAlarmData { + +// @Schema(description = "设备名称") +// String deviceName; +// +// @Schema(description = "设备类型") +// String deviceType; + + @Schema(description = "站点名称") + String stationName; + + @JsonIgnore + String stationCode; + + @Schema(description = "报警类型") + String alarmType; + + @Schema(description = "报警时间") + String alarmTime; + + public HomeAlarmData() { + } + + public HomeAlarmData(String stationName, String stationCode) { + this.stationName = stationName; + this.stationCode = stationCode; + } +} diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomeCompanyData.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomeCompanyData.java new file mode 100644 index 0000000..b4873f6 --- /dev/null +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomeCompanyData.java @@ -0,0 +1,36 @@ +package com.evotech.hd.cloud.entity.vo; + +import com.evotech.hd.common.core.Dto.result.home.HomeOrderInfo; +import com.evotech.hd.common.core.utils.Collections; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +/** + * 公司首页类 + * @ClassName:HomeCompanyData + * @date: 2025年05月08日 17:31 + * @author: andy.shi + * @contact: 17330188597 + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ +@Data +@Schema(name = "公司首页") +public class HomeCompanyData { + + @Schema(description = "车辆") + private Long carNum; + + @Schema(description = "员工") + private Long userNum; + + @Schema(description = "待结算订单") + private Long PendingOrderNum; + + @Schema(description = "待结算金额") + private Double PendingOrderAmount; + + @Schema(description = "换电订单信息") + private List orderList = Collections.emptyList(); +} diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomePlatformData1.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomePlatformData1.java new file mode 100644 index 0000000..5333646 --- /dev/null +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomePlatformData1.java @@ -0,0 +1,32 @@ +package com.evotech.hd.cloud.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 平台首页信息统计类类 + * + * @ClassName:HomePlatformData1 + * @date: 2025年05月08日 8:54 + * @author: andy.shi + * @contact: 17330188597 + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ + +@Data +@Schema(name = "运营商,换电站,公司, 机器人, 电池") +public class HomePlatformData1 extends HomePoxyData{ + + @Schema(description = "代理商数") + private Long proxyNum; + + @Schema(description = "公司数") + private Long totalCompanyNum; + + @Schema(description = "用户数") + private Long totalUserNum; + + @Schema(description = "车辆数") + private Long totalCarNum; + +} diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomePlatformData2.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomePlatformData2.java new file mode 100644 index 0000000..09a4d7a --- /dev/null +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomePlatformData2.java @@ -0,0 +1,44 @@ +package com.evotech.hd.cloud.entity.vo; + +import com.evotech.hd.common.core.Dto.result.home.HomeOrderSwapBatteryHalfYearAmountDto; +import com.evotech.hd.common.core.utils.Collections; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +/** + * 订单相关类 + * @ClassName:HomePlatformData2 + * @date: 2025年05月08日 11:53 + * @author: andy.shi + * @contact: 17330188597 + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ + +@Data +@Schema(name = "近半年订单金额, 占比, 运营情况") +public class HomePlatformData2 { + + @Schema(description = "完成订单数量") + private Long totalFinishOrderNum; + + @Schema(description = "完成金额") + private Double totalFinishAmount; + + @Schema(description = "待结算订单数量") + private Long totalPendingOrderNum; + + @Schema(description = "待结算金额") + private Double totalPendingOrderAmount; + + @Schema(description = "订单总数") + private Long totalOrderNum; + + @Schema(description = "各运营商近半年订单占比") + List countList = Collections.emptyList(); + + @Schema(description = "近半年订单走势") + List trendList = Collections.emptyList(); +} + diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomePlatformDataDetailDto.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomePlatformDataDetailDto.java new file mode 100644 index 0000000..b502a4e --- /dev/null +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomePlatformDataDetailDto.java @@ -0,0 +1,23 @@ +package com.evotech.hd.cloud.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 换电站订单占比类 + * + * @ClassName:HomeOrderSwapBatteryDto + * @date: 2025年04月24日 10:06 + * @author: andy.shi + * @contact: 17330188597 + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ +@Data +@Schema(name = "首页占比相关数据") +public class HomePlatformDataDetailDto { + + @Schema(description = "运营商 or 站点 名称") + String proxyName; + @Schema(description = "运营商 or 站点 订单数量") + Long quantity; +} diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomePoxyData.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomePoxyData.java new file mode 100644 index 0000000..5e66d3e --- /dev/null +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomePoxyData.java @@ -0,0 +1,43 @@ +package com.evotech.hd.cloud.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 运营商首页信息统计类类 + * + * @ClassName:HomePlatformData1 + * @date: 2025年05月08日 8:54 + * @author: andy.shi + * @contact: 17330188597 + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ + +@Data +@Schema(name = "换电站, 机器人, 电池") +public class HomePoxyData { + + + @Schema(description = "总换电站数") + private Long totalStation; + + @Schema(description = "营业换电站数") + private Long workStation; + + @Schema(description = "总机器人数") + private Long totalRobot; + + @Schema(description = "可用机器人数") + private Long availableRobot; + + @Schema(description = "总电池数") + private Long totalDC; + + @Schema(description = "充电电池数") + private Long chargeDC; + + @Schema(description = "可用电池数") + private Long availableDC; + + +} diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomePoxyData2.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomePoxyData2.java new file mode 100644 index 0000000..5f3244d --- /dev/null +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomePoxyData2.java @@ -0,0 +1,48 @@ +package com.evotech.hd.cloud.entity.vo; + +import com.evotech.hd.common.core.Dto.result.home.HomeOrderSwapBatteryHalfYearAmountDto; +import com.evotech.hd.common.core.Dto.result.home.HomeOrderSwapBatteryProportionDto; +import com.evotech.hd.common.core.utils.Collections; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +/** + * 订单相关类 + * @ClassName:HomePlatformData2 + * @date: 2025年05月08日 11:53 + * @author: andy.shi + * @contact: 17330188597 + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ + +@Data +@Schema(name = "订单情况, 近半年订单金额, 占比, 运营情况") +public class HomePoxyData2 { + + @Schema(description = "当月完成订单数量") + private Long currentTotalFinishOrderNum; + + @Schema(description = "当月完成金额") + private Double currentTotalFinishAmount; + + @Schema(description = "当月待结算订单数量") + private Long currentTotalPendingOrderNum; + + @Schema(description = "当月待结算金额") + private Double currentTotalPendingOrderAmount; + + @Schema(description = "当月订单总数") + private Long currentTotalOrderNum; + + @Schema(description = "近半年订单总数") + private Long halfYearTotalOrderNum; + + @Schema(description = "各站点近半年订单占比") + List countList = Collections.emptyList(); + + @Schema(description = "近半年订单走势") + List trendList = Collections.emptyList(); + +} diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomeStationData.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomeStationData.java new file mode 100644 index 0000000..21797e4 --- /dev/null +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/vo/HomeStationData.java @@ -0,0 +1,50 @@ +package com.evotech.hd.cloud.entity.vo; + +import com.evotech.hd.common.core.Dto.result.home.HomeOrderSwapBatteryHalfYearAmountDto; +import com.evotech.hd.common.core.utils.Collections; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +/** + * 类 + * + * @ClassName:HomeStationData + * @date: 2025年05月08日 16:51 + * @author: andy.shi + * @contact: 17330188597 + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ +@Data +@Schema(name = "站端首页占比相关数据") +public class HomeStationData { + + @Schema(description = "总机器人数") + private Long totalRobot; + + @Schema(description = "可用机器人数") + private Long availableRobot; + + @Schema(description = "总电池数") + private Long totalDC; + + @Schema(description = "充电电池数") + private Long chargeDC; + + @Schema(description = "可用电池数") + private Long availableDC; + + @Schema(description = "总订单数") + private Long totalOrderNum; + + @Schema(description = "已结算订单数") + private Long totalFinishOrderNum = 0l; + + @Schema(description = "带结算订单数") + private Long totalPendingOrderNum = 0l; + + @Schema(description = "近半年订单走势") + List trendList = Collections.emptyList(); + +} diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/config/MqttConnectInit.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/config/MqttConnectInit.java index e7a57fa..14998bf 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/config/MqttConnectInit.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/config/MqttConnectInit.java @@ -12,14 +12,13 @@ import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Date; import java.util.concurrent.ConcurrentHashMap; -@Component +//@Component @Order(value = 20) @Slf4j public class MqttConnectInit implements ApplicationRunner { diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/RequestMessageService.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/RequestMessageService.java index c68f249..5d1d0fe 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/RequestMessageService.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/RequestMessageService.java @@ -22,7 +22,7 @@ import com.evotech.hd.cloud.mqtt.message.dto.newer.req.carinfo.CarInfoReq; import com.evotech.hd.cloud.mqtt.message.dto.newer.req.carinfo.CarInfoResponse; import com.evotech.hd.cloud.mqtt.message.dto.newer.req.carinfo.VehicleData; import com.evotech.hd.cloud.mqtt.message.dto.newer.req.order.*; -import com.evotech.hd.cloud.mqtt.message.processor.MqttRequestExchangeProcessor; +import com.evotech.hd.cloud.mqtt.message.processor.strategy.MqttStrategyExchangeProcessor; import com.evotech.hd.cloud.service.OrderSwapBatteryService; import com.evotech.hd.cloud.service.WechatUserService; import com.evotech.hd.cloud.utils.CommonUtil; @@ -102,11 +102,11 @@ public class RequestMessageService { handlStartSwap(topic,header,battery); break; default: - Map mqttMessageRequestExchangeProcessorMap = applicationContext.getBeansOfType(MqttRequestExchangeProcessor.class); + Map mqttMessageRequestExchangeProcessorMap = applicationContext.getBeansOfType(MqttStrategyExchangeProcessor.class); if(CollectionUtils.isEmpty(mqttMessageRequestExchangeProcessorMap)){ log.error("mqttRequestExchangeProcessorMap is empty, 没有找到当前的请求信息, 请求接口{}, 请求参数{}", JSONUtil.toJsonStr(header), JSONUtil.toJsonStr(dataBody)); } - for (MqttRequestExchangeProcessor processor : mqttMessageRequestExchangeProcessorMap.values()) { + for (MqttStrategyExchangeProcessor processor : mqttMessageRequestExchangeProcessorMap.values()) { if(processor.accept(header.getFunction())){ processor.exchange(topic, header, dataBody); } @@ -258,6 +258,8 @@ public class RequestMessageService { log.info("\r\n=====>>>生成订单信息--MQTT发送到消息主题:{},订单编码:{}", topic,CommonUtil.swapBatteryOrderNo(orderByPlateNumReq.getStationCode())); orderSwapBatteryService.add(osb); } + //走到此处, 证明上面逻辑没有问题, 需要删除预约单过期标识 + redisUtil.del("preorder:expire:"+osbp.getPkId()); // 返回数据 OrderData od = new OrderData(); BeanUtils.copyProperties(osb, od); diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/StateMessageService.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/StateMessageService.java index 8c18688..02b314b 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/StateMessageService.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/StateMessageService.java @@ -11,7 +11,7 @@ import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader; import com.evotech.hd.cloud.mqtt.message.dto.newer.state.OrderStatus; import com.evotech.hd.cloud.mqtt.message.dto.newer.state.OrderStatusData; import com.evotech.hd.cloud.mqtt.message.dto.newer.state.SwapStep; -import com.evotech.hd.cloud.mqtt.message.processor.MqttRequestExchangeProcessor; +import com.evotech.hd.cloud.mqtt.message.processor.strategy.MqttStrategyExchangeProcessor; import com.evotech.hd.cloud.service.BatteryStationDcService; import com.evotech.hd.cloud.utils.components.HDStepDictComponent; import com.evotech.hd.common.core.dao.cloud.OrderSwapBatteryDao; @@ -78,11 +78,11 @@ public class StateMessageService { case FUN_TEST: break; default: - Map mqttRequestExchangeProcessorMap = applicationContext.getBeansOfType(MqttRequestExchangeProcessor.class); + Map mqttRequestExchangeProcessorMap = applicationContext.getBeansOfType(MqttStrategyExchangeProcessor.class); if(CollectionUtils.isEmpty(mqttRequestExchangeProcessorMap)){ log.error("mqttRequestExchangeProcessorMap is empty, 没有找到当前的请求信息, 请求接口{}, 请求参数{}", JSONUtil.toJsonStr(header), JSONUtil.toJsonStr(dataBody)); } - for (MqttRequestExchangeProcessor processor : mqttRequestExchangeProcessorMap.values()) { + for (MqttStrategyExchangeProcessor processor : mqttRequestExchangeProcessorMap.values()) { if(processor.accept(header.getFunction())){ processor.exchange(topic, header, dataBody); } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/observer/event/BatteryStationStopServerEvent.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/observer/event/BatteryStationStopServerEvent.java new file mode 100644 index 0000000..d778925 --- /dev/null +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/observer/event/BatteryStationStopServerEvent.java @@ -0,0 +1,27 @@ +package com.evotech.hd.cloud.mqtt.message.processor.observer.event; + +import com.evotech.hd.common.core.entity.cloud.BatteryStation; +import org.springframework.context.ApplicationEvent; + +/** + * 站点停止服务事件 + * @ClassName:AlarmEvent + * @date: 2025年05月15日 13:51 + * @author: andy.shi + * @contact: 17330188597 + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ + +public class BatteryStationStopServerEvent extends ApplicationEvent { + + private BatteryStation batteryStation; + + public BatteryStationStopServerEvent(Object source, BatteryStation batteryStation) { + super(source); + this.batteryStation = batteryStation; + } + + public BatteryStation getBatteryStation() { + return batteryStation; + } +} diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/observer/listener/BatteryStationStopServerListener.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/observer/listener/BatteryStationStopServerListener.java new file mode 100644 index 0000000..814c0c1 --- /dev/null +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/observer/listener/BatteryStationStopServerListener.java @@ -0,0 +1,68 @@ +package com.evotech.hd.cloud.mqtt.message.processor.observer.listener; + +import com.evotech.hd.cloud.mqtt.message.processor.observer.event.BatteryStationStopServerEvent; +import com.evotech.hd.cloud.service.OrderSwapBatteryService; +import com.evotech.hd.cloud.service.newthread.GZHTemplateMessageService; +import com.evotech.hd.cloud.service.rpc.ResourceService; +import com.evotech.hd.common.core.Dto.ResultUtil; +import com.evotech.hd.common.core.Dto.request.template.StopServerTemplateDto; +import com.evotech.hd.common.core.entity.cloud.BatteryStation; +import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre; +import com.evotech.hd.common.core.utils.Collections; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 站点停止服务监听器 + * + * @ClassName:AlarmListener + * @date: 2025年05月15日 13:58 + * @author: andy.shi + * @contact: 17330188597 + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ +@Component +@Slf4j +public class BatteryStationStopServerListener { + + @Resource + OrderSwapBatteryService orderSwapBatteryService; + @Resource + private GZHTemplateMessageService templateMessageService; + @Resource + private ResourceService resourceService; + + @EventListener + public void handleStationStopEvent(BatteryStationStopServerEvent event){ + BatteryStation batteryStation = event.getBatteryStation(); + //监听站端运营状态状态, 如果不为运营状态 + if(!Integer.valueOf(1).equals(batteryStation.getStatus())){ + //不是营运状态, 获取当前站点是否存在预约单 + List preList = orderSwapBatteryService.findOrderSwapBatteryPreList(batteryStation.getCode()); + Map plateNum = new LinkedHashMap<>(); + //查询站点是否存在预约单, 存在的话. 通知客户, + if(Collections.isNotEmpty(preList)){ + //直接关闭预约单 + orderSwapBatteryService.clearOrderSwapBatteryPre(preList.stream().map(OrderSwapBatteryPre::getPkId).collect(Collectors.toList())); + plateNum = preList.stream().collect(Collectors.toMap(OrderSwapBatteryPre::getUcode, OrderSwapBatteryPre::getPlateNum, (k1, k2) -> k1)); + } + + + StopServerTemplateDto stopServerTemplateDto = new StopServerTemplateDto(); + stopServerTemplateDto.setStationName(batteryStation.getName()); + stopServerTemplateDto.setPlateNum(plateNum); + //同步推送站管理员, 和 运营商 + //站信息查找站管理员和运营商信息, 根据运营商信息, 查对应的负责人信息 + stopServerTemplateDto.setAdminWuId(ResultUtil.getValue(resourceService.alarmUserList(batteryStation.getCode(), batteryStation.getProxyId()))); + stopServerTemplateDto.setReason(String.format("因%s原因站点暂停运营,请预约其他站点", (Integer.valueOf(2).equals(batteryStation.getStatus()) ? "调试" : "检修"))); + templateMessageService.serviceStopMessageSend(stopServerTemplateDto); + } + } +} diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/observer/publisher/CommonEventPublisher.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/observer/publisher/CommonEventPublisher.java new file mode 100644 index 0000000..ab4bf63 --- /dev/null +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/observer/publisher/CommonEventPublisher.java @@ -0,0 +1,28 @@ +package com.evotech.hd.cloud.mqtt.message.processor.observer.publisher; + +import org.springframework.context.ApplicationEvent; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.stereotype.Component; + +/** + * 公共事件发布类 + * @ClassName:CommonEventPublisher + * @date: 2025年05月15日 13:59 + * @author: andy.shi + * @contact: 17330188597 + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ + +@Component +public class CommonEventPublisher { + + private final ApplicationEventPublisher publisher; + + public CommonEventPublisher(ApplicationEventPublisher publisher) { + this.publisher = publisher; + } + + public void publishEvent(T event) { + publisher.publishEvent(event); // 发布自定义事件 + } +} diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/MqttRequestExchangeProcessor.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/MqttStrategyExchangeProcessor.java similarity index 93% rename from cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/MqttRequestExchangeProcessor.java rename to cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/MqttStrategyExchangeProcessor.java index 6e5be77..5cf2a5c 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/MqttRequestExchangeProcessor.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/MqttStrategyExchangeProcessor.java @@ -1,4 +1,4 @@ -package com.evotech.hd.cloud.mqtt.message.processor; +package com.evotech.hd.cloud.mqtt.message.processor.strategy; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; @@ -29,9 +29,9 @@ import java.util.Date; * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 */ -public interface MqttRequestExchangeProcessor { +public interface MqttStrategyExchangeProcessor { - Logger logger = LoggerFactory.getLogger(MqttRequestExchangeProcessor.class); + Logger logger = LoggerFactory.getLogger(MqttStrategyExchangeProcessor.class); boolean accept(String functionName); diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/impl/request/MqttRequestPushCarInfoExchangeProcessorImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestPushCarInfoExchangeProcessorImpl.java similarity index 95% rename from cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/impl/request/MqttRequestPushCarInfoExchangeProcessorImpl.java rename to cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestPushCarInfoExchangeProcessorImpl.java index fe6aa78..57dc0f5 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/impl/request/MqttRequestPushCarInfoExchangeProcessorImpl.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestPushCarInfoExchangeProcessorImpl.java @@ -1,4 +1,4 @@ -package com.evotech.hd.cloud.mqtt.message.processor.impl.request; +package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.request; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; @@ -6,7 +6,7 @@ import com.evotech.hd.cloud.mqtt.enums.RequestFunctionTypesEnum; import com.evotech.hd.cloud.mqtt.message.MessageTopic; import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader; import com.evotech.hd.cloud.mqtt.message.dto.newer.req.MqttResponse; -import com.evotech.hd.cloud.mqtt.message.processor.MqttRequestExchangeProcessor; +import com.evotech.hd.cloud.mqtt.message.processor.strategy.MqttStrategyExchangeProcessor; import com.evotech.hd.cloud.service.OrderSwapBatteryService; import com.evotech.hd.cloud.service.VehicleService; import jakarta.annotation.Resource; @@ -27,7 +27,7 @@ import org.springframework.util.Assert; @Slf4j @Service -public class MqttRequestPushCarInfoExchangeProcessorImpl implements MqttRequestExchangeProcessor { +public class MqttRequestPushCarInfoExchangeProcessorImpl implements MqttStrategyExchangeProcessor { @Resource VehicleService vehicleService; diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/impl/request/MqttRequestStrategyExchangeProcessorImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestStrategyExchangeProcessorImpl.java similarity index 91% rename from cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/impl/request/MqttRequestStrategyExchangeProcessorImpl.java rename to cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestStrategyExchangeProcessorImpl.java index 5b480de..628e2a1 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/impl/request/MqttRequestStrategyExchangeProcessorImpl.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestStrategyExchangeProcessorImpl.java @@ -1,4 +1,4 @@ -package com.evotech.hd.cloud.mqtt.message.processor.impl.request; +package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.request; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; @@ -6,7 +6,7 @@ import com.evotech.hd.cloud.mqtt.enums.RequestFunctionTypesEnum; import com.evotech.hd.cloud.mqtt.message.MessageTopic; import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader; import com.evotech.hd.cloud.mqtt.message.dto.newer.req.MqttResponse; -import com.evotech.hd.cloud.mqtt.message.processor.MqttRequestExchangeProcessor; +import com.evotech.hd.cloud.mqtt.message.processor.strategy.MqttStrategyExchangeProcessor; import com.evotech.hd.cloud.service.BatteryStationCdStrategyService; import com.evotech.hd.common.core.entity.cloud.BatteryStationCdStrategy; import jakarta.annotation.Resource; @@ -26,7 +26,7 @@ import java.util.List; */ @Slf4j @Service -public class MqttRequestStrategyExchangeProcessorImpl implements MqttRequestExchangeProcessor { +public class MqttRequestStrategyExchangeProcessorImpl implements MqttStrategyExchangeProcessor { @Resource BatteryStationCdStrategyService batteryStationCdStrategyService; diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/impl/state/MqttStateBatDataDataExchangeProcessor.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/state/MqttStateBatDataDataExchangeProcessor.java similarity index 91% rename from cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/impl/state/MqttStateBatDataDataExchangeProcessor.java rename to cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/state/MqttStateBatDataDataExchangeProcessor.java index c58a970..c9718f6 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/impl/state/MqttStateBatDataDataExchangeProcessor.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/state/MqttStateBatDataDataExchangeProcessor.java @@ -1,11 +1,11 @@ -package com.evotech.hd.cloud.mqtt.message.processor.impl.state; +package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.state; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.evotech.hd.cloud.mqtt.enums.StateFunctionTypesEnum; import com.evotech.hd.cloud.mqtt.message.MessageTopic; import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader; -import com.evotech.hd.cloud.mqtt.message.processor.MqttRequestExchangeProcessor; +import com.evotech.hd.cloud.mqtt.message.processor.strategy.MqttStrategyExchangeProcessor; import com.evotech.hd.common.constant.MongoConstant; import com.evotech.hd.common.documnet.BatData; import lombok.extern.slf4j.Slf4j; @@ -23,7 +23,7 @@ import org.springframework.util.StringUtils; */ @Slf4j @Service -public class MqttStateBatDataDataExchangeProcessor implements MqttRequestExchangeProcessor { +public class MqttStateBatDataDataExchangeProcessor implements MqttStrategyExchangeProcessor { @Override public boolean accept(String functionName) { diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/impl/state/MqttStateChargingDataExchangeProcessor.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/state/MqttStateChargingDataExchangeProcessor.java similarity index 90% rename from cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/impl/state/MqttStateChargingDataExchangeProcessor.java rename to cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/state/MqttStateChargingDataExchangeProcessor.java index 644bcc2..c736ccf 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/impl/state/MqttStateChargingDataExchangeProcessor.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/state/MqttStateChargingDataExchangeProcessor.java @@ -1,11 +1,11 @@ -package com.evotech.hd.cloud.mqtt.message.processor.impl.state; +package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.state; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.evotech.hd.cloud.mqtt.enums.StateFunctionTypesEnum; import com.evotech.hd.cloud.mqtt.message.MessageTopic; import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader; -import com.evotech.hd.cloud.mqtt.message.processor.MqttRequestExchangeProcessor; +import com.evotech.hd.cloud.mqtt.message.processor.strategy.MqttStrategyExchangeProcessor; import com.evotech.hd.common.constant.MongoConstant; import com.evotech.hd.common.documnet.ChargingData; import lombok.extern.slf4j.Slf4j; @@ -23,7 +23,7 @@ import org.springframework.util.StringUtils; */ @Slf4j @Service -public class MqttStateChargingDataExchangeProcessor implements MqttRequestExchangeProcessor { +public class MqttStateChargingDataExchangeProcessor implements MqttStrategyExchangeProcessor { @Override public boolean accept(String functionName) { diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/impl/state/MqttStateStationStateExchangeProcessor.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/state/MqttStateStationStateExchangeProcessor.java similarity index 90% rename from cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/impl/state/MqttStateStationStateExchangeProcessor.java rename to cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/state/MqttStateStationStateExchangeProcessor.java index 36884a4..0e78984 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/impl/state/MqttStateStationStateExchangeProcessor.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/state/MqttStateStationStateExchangeProcessor.java @@ -1,11 +1,11 @@ -package com.evotech.hd.cloud.mqtt.message.processor.impl.state; +package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.state; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.evotech.hd.cloud.mqtt.enums.StateFunctionTypesEnum; import com.evotech.hd.cloud.mqtt.message.MessageTopic; import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader; -import com.evotech.hd.cloud.mqtt.message.processor.MqttRequestExchangeProcessor; +import com.evotech.hd.cloud.mqtt.message.processor.strategy.MqttStrategyExchangeProcessor; import com.evotech.hd.cloud.service.BatteryStationService; import com.evotech.hd.common.constant.MongoConstant; import com.evotech.hd.common.documnet.StationState; @@ -24,7 +24,7 @@ import org.springframework.stereotype.Service; */ @Slf4j @Service -public class MqttStateStationStateExchangeProcessor implements MqttRequestExchangeProcessor { +public class MqttStateStationStateExchangeProcessor implements MqttStrategyExchangeProcessor { @Resource BatteryStationService batteryStationService; diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/HomeService.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/HomeService.java index 0c18c80..d5c71c7 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/HomeService.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/HomeService.java @@ -7,6 +7,42 @@ import com.evotech.hd.common.core.Dto.Result; import java.util.List; public interface HomeService { + + /*** + * 运营商, 换电站, 公司, 机器人 电池相关统计 + * @return + */ + public Result platformData1(); + /*** + * 金额 占比, 交易情况 + * @return + */ + public Result platformData2(); + + + /*** + * 换电站, 机器人 电池相关统计 + * @return + */ + public Result roxyData1(); + + + /*** + * 金额 占比, 交易情况 + * @return + */ + public Result roxyData2(); + + + public Result stationData1(); + + public Result company(); + + /*** + * 报警信息 + * @return + */ + Result> alarmData(); public Result homeData1(HomeDataRequest hd); diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/BatteryStationServiceImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/BatteryStationServiceImpl.java index a0fb14f..5d12289 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/BatteryStationServiceImpl.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/BatteryStationServiceImpl.java @@ -16,16 +16,17 @@ import com.evotech.hd.cloud.device.dh.DHRequestUtil; import com.evotech.hd.cloud.entity.BatteryStationSecretKey; import com.evotech.hd.cloud.entity.request.PageListBatteryStationRequest; import com.evotech.hd.cloud.exception.DHException; +import com.evotech.hd.cloud.mqtt.message.processor.observer.event.BatteryStationStopServerEvent; +import com.evotech.hd.cloud.mqtt.message.processor.observer.publisher.CommonEventPublisher; import com.evotech.hd.cloud.service.BatteryStationService; -import com.evotech.hd.cloud.service.OrderSwapBatteryService; import com.evotech.hd.cloud.service.newthread.GZHTemplateMessageService; import com.evotech.hd.cloud.service.rpc.ResourceService; import com.evotech.hd.cloud.service.rpc.WechatService; +import com.evotech.hd.common.constant.MongoConstant; import com.evotech.hd.common.core.Dto.Result; import com.evotech.hd.common.core.Dto.ResultUtil; import com.evotech.hd.common.core.Dto.request.template.AlarmTemplateDto; import com.evotech.hd.common.core.entity.cloud.BatteryStation; -import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre; import com.evotech.hd.common.core.entity.cloud.VehicleInfo; import com.evotech.hd.common.core.entity.cloud.vo.BatteryStationVO; import com.evotech.hd.common.core.enums.CodeMsg; @@ -46,7 +47,6 @@ import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.security.KeyPair; import java.util.*; -import java.util.stream.Collectors; @Service @Slf4j @@ -64,9 +64,9 @@ public class BatteryStationServiceImpl implements BatteryStationService { private ResourceService resourceService; @Resource private GZHTemplateMessageService templateMessageService; - @Resource - OrderSwapBatteryService orderSwapBatteryService; + @Resource + CommonEventPublisher eventPublisher; @Override public com.evotech.hd.common.core.entity.Result add(BatteryStation bs) { bs.setCtime(new Date()); @@ -131,6 +131,7 @@ public class BatteryStationServiceImpl implements BatteryStationService { public com.evotech.hd.common.core.entity.Result update(BatteryStation bs) { int n = batteryStationDao.updateById(bs); if (n == 1) { + eventPublisher.publishEvent(new BatteryStationStopServerEvent(this,bs)); return new com.evotech.hd.common.core.entity.Result().success(n); } return new com.evotech.hd.common.core.entity.Result().error("更新换电站失败!"); @@ -348,7 +349,7 @@ public class BatteryStationServiceImpl implements BatteryStationService { //报警信息 StringBuilder alarmMsg = new StringBuilder(""); //0-未知;1-正常;2-告警 沟通 只有2才算告警,未知不算告警 - isAlarm = Integer.valueOf(2).equals(fire); + isAlarm = MongoConstant.ErrorCode.STATION_ALARM_CODE.equals(fire); //如果消防告警存在信息 if(isAlarm){ alarmMsg.append("消防报警"); @@ -356,7 +357,7 @@ public class BatteryStationServiceImpl implements BatteryStationService { //如果消防没有报警, 检查烟感 if(!isAlarm){ //因为烟感有多个, 所以一个烟感报警,及存在报警信息 - isAlarm = Collections.asList(smoke.split(",")).contains(Integer.valueOf(2)); + isAlarm = Collections.asList(smoke.split(",")).contains(MongoConstant.ErrorCode.STATION_ALARM_CODE); if(isAlarm){ alarmMsg.append("烟感报警"); } @@ -365,17 +366,8 @@ public class BatteryStationServiceImpl implements BatteryStationService { batteryStation.setAlarm(isAlarm); int n = 0; if((n = batteryStationDao.updateById(batteryStation)) > 0){ - //更新成功, 如果推送状态是运营状态, 则不需要做任何处理, 如果推送的状态非运营状态, 则需要同步推送预约单用户信息 - if(!Integer.valueOf(1).equals(batteryStation.getStatus())){ - //不是营运状态, 推送服务号通知 - List preList = orderSwapBatteryService.findOrderSwapBatteryPreList(batteryStation.getCode()); - if(Collections.isNotEmpty(preList)){ - //直接关闭预约单 - orderSwapBatteryService.clearOrderSwapBatteryPre(preList.stream().map(OrderSwapBatteryPre::getPkId).collect(Collectors.toList())); - //查询站点是否存在预约单, 存在的话. 通知客户, - templateMessageService.serviceStopMessageSend(preList.stream().map(OrderSwapBatteryPre::getUcode).collect(Collectors.toList()), (Integer.valueOf(2).equals(batteryStation.getStatus()) ? "调试" : "检修")); - } - } + //更新成功, 发布站端数据变更事件, 用于数据解耦 + eventPublisher.publishEvent(new BatteryStationStopServerEvent(this,batteryStation)); //存在报警信息 if(batteryStation.getAlarm()){ //同步推送站管理员, 和 运营商 diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/HomeServiceImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/HomeServiceImpl.java index cba883a..461fec1 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/HomeServiceImpl.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/HomeServiceImpl.java @@ -3,13 +3,18 @@ package com.evotech.hd.cloud.service.impl; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.evotech.hd.cloud.dao.*; import com.evotech.hd.cloud.entity.request.HomeDataRequest; import com.evotech.hd.cloud.entity.vo.*; +import com.evotech.hd.cloud.mqtt.enums.StateFunctionTypesEnum; import com.evotech.hd.cloud.service.HomeService; +import com.evotech.hd.common.constant.MongoConstant; import com.evotech.hd.common.core.Dto.Result; +import com.evotech.hd.common.core.Dto.ResultUtil; import com.evotech.hd.common.core.Dto.request.HomeRequestDto; +import com.evotech.hd.common.core.Dto.result.home.HomeOrderInfo; import com.evotech.hd.common.core.Dto.result.home.HomeOrderSwapBatteryAmountDto; import com.evotech.hd.common.core.Dto.result.home.HomeOrderSwapBatteryHalfYearAmountDto; import com.evotech.hd.common.core.Dto.result.home.HomeOrderSwapBatteryProportionDto; @@ -24,8 +29,10 @@ import com.evotech.hd.common.core.entity.resource.ProxyOperater; import com.evotech.hd.common.core.entity.wechat.WechatUser; import com.evotech.hd.common.core.enums.CodeMsg; import com.evotech.hd.common.core.utils.Collections; +import com.evotech.hd.common.documnet.StationState; import com.evotech.hd.common.permission.util.RedisPermissionUtils; import com.evotech.hd.common.redis.utils.RedisUtil; +import com.evotech.hd.common.service.MongoDBService; import jakarta.annotation.Resource; import org.apache.commons.lang3.ObjectUtils; import org.springframework.beans.BeanUtils; @@ -68,6 +75,233 @@ public class HomeServiceImpl implements HomeService { @Resource private RedisUtil redisUtil; + @Override + public Result platformData1() { + HomePlatformData1 data = new HomePlatformData1(); + BeanUtils.copyProperties(ResultUtil.getValue(roxyData1()), data); + // 1. 运营商 + data.setProxyNum(proxyOperaterDao.selectCount(new LambdaQueryWrapper().eq(ProxyOperater::getDelFlag, 0).select(ProxyOperater::getPkId))); + // 1. 公司 + data.setTotalCompanyNum(companyDao.selectCount(new LambdaQueryWrapper().eq(Company::getDelFlag, 0).select(Company::getPkId))); + // 2. 用户 + data.setTotalUserNum(wechatUserDao.selectCount(new LambdaQueryWrapper().select(WechatUser::getPkId))); + // 3. 车辆 + data.setTotalCarNum(vehicleInfoDao.selectCount(new LambdaQueryWrapper().eq(VehicleInfo::getDelFlag, 0).select(VehicleInfo::getPkId))); + + return new Result().success(data); + } + + @Override + public Result platformData2() { + HomePlatformData2 data = new HomePlatformData2(); + Date d = new Date(); + HomeRequestDto homeRequestDto = new HomeRequestDto(DateUtil.offsetMonth(d, -5), d); + //订单数量 or 订单金额 + List orderAmountlist = orderSwapBatteryDao.homeFindAmountData(homeRequestDto); + if(Collections.isNotEmpty(orderAmountlist)){ + HomeOrderSwapBatteryAmountDto totalFinishOrder = orderAmountlist.stream().filter(i -> Integer.valueOf(7).equals(i.getStatus())).findFirst().orElse(null); + if(totalFinishOrder != null){ + data.setTotalFinishOrderNum(totalFinishOrder.getDataCount()); + data.setTotalFinishAmount(totalFinishOrder.getAmount()); + } + HomeOrderSwapBatteryAmountDto totalPendingOrder = orderAmountlist.stream().filter(i -> Integer.valueOf(6).equals(i.getStatus())).findFirst().orElse(null); + if(totalPendingOrder != null){ + data.setTotalPendingOrderNum(totalPendingOrder.getDataCount()); + data.setTotalPendingOrderAmount(totalPendingOrder.getAmount()); + } + } + + //计算占比 + Map countMap = Collections.emptyMap(); + List list = orderSwapBatteryDao.homeFindProportionData(homeRequestDto); + if(Collections.isNotEmpty(list)){ + //总订单数 + data.setTotalOrderNum(list.stream().collect(Collectors.summingLong(i -> i.getQuantity()))); + countMap = list.stream().collect(Collectors.toMap(HomeOrderSwapBatteryProportionDto::getStationCode, HomeOrderSwapBatteryProportionDto::getQuantity, (k1,k2)-> k1)); + } + Map> batteryStationMap = batteryStationDao.selectList(new LambdaQueryWrapper().eq(BatteryStation::getDelFlag, 0).select(BatteryStation::getCode, BatteryStation::getProxyId)).stream().collect(Collectors.groupingBy(BatteryStation::getProxyId, Collectors.mapping(station -> station.getCode(), Collectors.toList()))); + + List countList = Collections.emptyList(); + Map finalCountMap = countMap; + proxyOperaterDao.selectList(new LambdaQueryWrapper().eq(ProxyOperater::getDelFlag, 0).select(ProxyOperater::getPoname, ProxyOperater::getPocode)) + .forEach(proxy ->{ + HomePlatformDataDetailDto detailDto = new HomePlatformDataDetailDto(); + detailDto.setProxyName(proxy.getPoname()); + final Long[] totalCount = {0l}; + batteryStationMap.get(proxy.getPocode()).forEach(stationCode ->{ + Long stationQuantity = finalCountMap.get(stationCode); + totalCount[0] = defaultValue(totalCount[0],0l) + defaultValue(stationQuantity,0l); + }); + detailDto.setQuantity(totalCount[0]); + countList.add(detailDto); + }); + data.setCountList(countList); + //近半年走势情况 + data.setTrendList(orderSwapBatteryDao.homeFindHalfYearAmountData(homeRequestDto).stream().sorted((o1,o2) ->{ + return o1.getMonth().compareTo(o2.getMonth()); + }).collect(Collectors.toList())); + return new Result().success(data); + } + + @Override + public Result roxyData1() { + HomePoxyData data = new HomePoxyData(); + // 2. 换电站 + data.setTotalStation(batteryStationDao.selectCount(new LambdaQueryWrapper().eq(BatteryStation::getDelFlag, 0).select(BatteryStation::getPkId))); + //可用换电站 + data.setWorkStation(batteryStationDao.selectCount(new LambdaQueryWrapper().eq(BatteryStation::getDelFlag, 0).eq(BatteryStation::getStatus, 1).select(BatteryStation::getPkId))); + // 机器人 + data.setTotalRobot(batteryStationRobotDao.selectCount(new LambdaQueryWrapper().select(BatteryStationRobot::getPkId))); + //可用机器人 + data.setAvailableRobot(batteryStationRobotDao.selectCount(new LambdaQueryWrapper().eq(BatteryStationRobot::getStatus, 1).select(BatteryStationRobot::getPkId))); + // 电池 + data.setTotalDC(batteryStationDcDao.selectCount(new LambdaQueryWrapper().eq(BatteryStationDc::getDelFlag, 0).select(BatteryStationDc::getPkId))); + //充电电池 + data.setChargeDC(batteryStationDcDao.selectCount(new LambdaQueryWrapper().eq(BatteryStationDc::getDelFlag, 0).eq(BatteryStationDc::getStatus, 2).select(BatteryStationDc::getPkId))); + //可用电池 + data.setAvailableDC(batteryStationDcDao.selectCount(new LambdaQueryWrapper().eq(BatteryStationDc::getDelFlag, 0).eq(BatteryStationDc::getStatus, 3).select(BatteryStationDc::getPkId))); + + return new Result().success(data); + } + + @Override + public Result roxyData2() { + HomePoxyData2 data = new HomePoxyData2(); + Date d = new Date(); + HomeRequestDto homeRequestDto = new HomeRequestDto(DateUtil.beginOfMonth(d), d); + //订单数量 or 订单金额 + List orderAmountlist = orderSwapBatteryDao.homeFindAmountData(homeRequestDto); + if(Collections.isNotEmpty(orderAmountlist)){ + HomeOrderSwapBatteryAmountDto totalFinishOrder = orderAmountlist.stream().filter(i -> Integer.valueOf(7).equals(i.getStatus())).findFirst().orElse(null); + if(totalFinishOrder != null){ + data.setCurrentTotalFinishOrderNum(totalFinishOrder.getDataCount()); + data.setCurrentTotalFinishAmount(totalFinishOrder.getAmount()); + } + HomeOrderSwapBatteryAmountDto totalPendingOrder = orderAmountlist.stream().filter(i -> Integer.valueOf(6).equals(i.getStatus())).findFirst().orElse(null); + if(totalPendingOrder != null){ + data.setCurrentTotalPendingOrderNum(totalPendingOrder.getDataCount()); + data.setCurrentTotalPendingOrderAmount(totalPendingOrder.getAmount()); + } + data.setCurrentTotalOrderNum(defaultValue(data.getCurrentTotalFinishOrderNum(), 0l)+defaultValue(data.getCurrentTotalPendingOrderNum(), 0l)); + } + + homeRequestDto = new HomeRequestDto(DateUtil.offsetMonth(d, -5), d); + //订单数量 or 订单金额 + //计算占比 + List list = orderSwapBatteryDao.homeFindProportionData(homeRequestDto); + if(Collections.isNotEmpty(list)){ + //总订单数 + data.setHalfYearTotalOrderNum(list.stream().collect(Collectors.summingLong(i -> i.getQuantity()))); + data.setCountList(list); + } + + //近半年走势情况 + data.setTrendList(orderSwapBatteryDao.homeFindHalfYearAmountData(homeRequestDto).stream().sorted((o1,o2) ->{ + return o1.getMonth().compareTo(o2.getMonth()); + }).collect(Collectors.toList())); + return new Result().success(data); + } + + public T defaultValue(T t, T defVal){ + return ObjectUtils.isNotEmpty(t) ? t : defVal; + } + + @Override + public Result stationData1() { + HomeStationData data = new HomeStationData(); + // 机器人 + data.setTotalRobot(batteryStationRobotDao.selectCount(new LambdaQueryWrapper().select(BatteryStationRobot::getPkId))); + //可用机器人 + data.setAvailableRobot(batteryStationRobotDao.selectCount(new LambdaQueryWrapper().eq(BatteryStationRobot::getStatus, 1).select(BatteryStationRobot::getPkId))); + // 电池 + data.setTotalDC(batteryStationDcDao.selectCount(new LambdaQueryWrapper().eq(BatteryStationDc::getDelFlag, 0).select(BatteryStationDc::getPkId))); + //充电电池 + data.setChargeDC(batteryStationDcDao.selectCount(new LambdaQueryWrapper().eq(BatteryStationDc::getDelFlag, 0).eq(BatteryStationDc::getStatus, 2).select(BatteryStationDc::getPkId))); + //可用电池 + data.setAvailableDC(batteryStationDcDao.selectCount(new LambdaQueryWrapper().eq(BatteryStationDc::getDelFlag, 0).eq(BatteryStationDc::getStatus, 3).select(BatteryStationDc::getPkId))); + + //订单数量 or 订单金额 + Date d = new Date(); + List orderAmountlist = orderSwapBatteryDao.homeFindAmountData(new HomeRequestDto(DateUtil.beginOfMonth(d), d)); + if(Collections.isNotEmpty(orderAmountlist)){ + HomeOrderSwapBatteryAmountDto totalFinishOrder = orderAmountlist.stream().filter(i -> Integer.valueOf(7).equals(i.getStatus())).findFirst().orElse(null); + if(totalFinishOrder != null){ + data.setTotalFinishOrderNum(totalFinishOrder.getDataCount()); + } + HomeOrderSwapBatteryAmountDto totalPendingOrder = orderAmountlist.stream().filter(i -> Integer.valueOf(6).equals(i.getStatus())).findFirst().orElse(null); + if(totalPendingOrder != null){ + data.setTotalPendingOrderNum(totalPendingOrder.getDataCount()); + } + data.setTotalOrderNum(defaultValue(data.getTotalFinishOrderNum(),0l)+defaultValue(data.getTotalPendingOrderNum(), 0l)); + } + //近半年走势情况 + data.setTrendList(orderSwapBatteryDao.homeFindHalfYearStationAmountData(new HomeRequestDto(DateUtil.offsetMonth(d, -5), d)).stream().sorted((o1,o2) ->{ + return o1.getMonth().compareTo(o2.getMonth()); + }).collect(Collectors.toList())); + return new Result().success(data); + } + + @Override + public Result company() { + HomeCompanyData data = new HomeCompanyData(); + // 1. 车辆 + data.setCarNum(vehicleInfoDao.selectCount(new LambdaQueryWrapper().eq(VehicleInfo::getDelFlag, 0).select(VehicleInfo::getPkId))); + //2 人员 + data.setUserNum(wechatUserDao.selectCount(new LambdaQueryWrapper().select(WechatUser::getPkId))); + //获取待结算订单 + List orderInfo = orderSwapBatteryDao.findOrderListByStatus(6); + //待结算订单数量 + data.setPendingOrderNum(Long.valueOf(orderInfo.size())); + //待结算订单金额 + data.setPendingOrderAmount(orderInfo.stream().collect(Collectors.summingDouble( i-> i.getSwapAmount()))); + //待结算订单信息 + data.setOrderList(orderInfo); + + return new Result().success(data); + } + + @Resource + MongoDBService mongoDBService; + + @Override + public Result> alarmData() { + List list = batteryStationDao.selectList(new LambdaQueryWrapper().eq(BatteryStation::getDelFlag, 0).eq(BatteryStation::getAlarm, true).select(BatteryStation::getCode, BatteryStation::getName)).stream().map(data -> new HomeAlarmData(data.getName(), data.getCode())).collect(Collectors.toList()); + list.stream().forEach(alarm ->{ + List alarmList = mongoDBService.find(MongoConstant.STATION_INFO_BASE, StateFunctionTypesEnum.FUN_STATION_STATE.getFunction(), StationState.class, Collections.asMap(MongoConstant.EQ+ MongoConstant.SEPARATION+"stationCode",alarm.getStationCode(), MongoConstant.SORT+ MongoConstant.SEPARATION+MongoConstant.SORT_DESC, "id", MongoConstant.PAGE, "1"+MongoConstant.SEPARATION+"1")); + if(Collections.isNotEmpty(alarmList)){ + StationState stationState= alarmList.get(0); + //报警信息 + JSONObject alarmJSONObject = JSONObject.parseObject(alarmList.get(0).getValue()); + Integer fire = alarmJSONObject.getInteger("fire"); + if(MongoConstant.ErrorCode.STATION_ALARM_CODE.equals(fire)){ + alarm.setAlarmType("消防告警"); + }else{ + String smoke = alarmJSONObject.getString("smoke"); + if(Collections.asList(smoke.split(",")).contains(String.valueOf(MongoConstant.ErrorCode.STATION_ALARM_CODE))){ + alarm.setAlarmType("烟感告警"); + } + } + alarm.setAlarmTime(DateUtil.format(new Date(Long.valueOf(stationState.getId())), "yyyy-MM-dd HH:mm:ss")); + } + }); + return new Result>().success(list); + } + + + + + + + + + + + + + + + + @Override public Result homeData1(HomeDataRequest hd) { // 1. 运营商 @@ -190,24 +424,24 @@ public class HomeServiceImpl implements HomeService { String month = it.next(); HomeData6 homeData6 = new HomeData6(); homeData6.setMonth(month); - List values = mapList.get(month); - HomeOrderSwapBatteryHalfYearAmountDto wechat = values.stream().filter(f -> Integer.valueOf(7).equals(f.getStatus()) && Integer.valueOf(2).equals(f.getPayType())).findFirst().orElse(null); - if(ObjectUtils.isNotEmpty(wechat)){ - homeData6.setInQuantity(wechat.getQuantity()); - homeData6.setInMoney(wechat.getTotalMoney()); - } - - HomeOrderSwapBatteryHalfYearAmountDto account = values.stream().filter(f -> Integer.valueOf(7).equals(f.getStatus()) && Integer.valueOf(1).equals(f.getPayType())).findFirst().orElse(null); - if(ObjectUtils.isNotEmpty(account)){ - homeData6.setWalletQuantity(account.getQuantity()); - homeData6.setWalletMoney(account.getTotalMoney()); - } - - List refund = values.stream().filter(f -> Integer.valueOf(-1).equals(f.getStatus())).collect(Collectors.toList()); - if(Collections.isNotEmpty(refund)){ - homeData6.setRefundQuantity(refund.stream().collect(Collectors.summingLong(i -> i.getQuantity()))); - homeData6.setRefundMoney(refund.stream().collect(Collectors.summingDouble(i -> i.getTotalMoney()))); - } +// List values = mapList.get(month); +// HomeOrderSwapBatteryHalfYearAmountDto wechat = values.stream().filter(f -> Integer.valueOf(7).equals(f.getStatus()) && Integer.valueOf(2).equals(f.getPayType())).findFirst().orElse(null); +// if(ObjectUtils.isNotEmpty(wechat)){ +// homeData6.setInQuantity(wechat.getQuantity()); +// homeData6.setInMoney(wechat.getTotalMoney()); +// } +// +// HomeOrderSwapBatteryHalfYearAmountDto account = values.stream().filter(f -> Integer.valueOf(7).equals(f.getStatus()) && Integer.valueOf(1).equals(f.getPayType())).findFirst().orElse(null); +// if(ObjectUtils.isNotEmpty(account)){ +// homeData6.setWalletQuantity(account.getQuantity()); +// homeData6.setWalletMoney(account.getTotalMoney()); +// } +// +// List refund = values.stream().filter(f -> Integer.valueOf(-1).equals(f.getStatus())).collect(Collectors.toList()); +// if(Collections.isNotEmpty(refund)){ +// homeData6.setRefundQuantity(refund.stream().collect(Collectors.summingLong(i -> i.getQuantity()))); +// homeData6.setRefundMoney(refund.stream().collect(Collectors.summingDouble(i -> i.getTotalMoney()))); +// } list.add(homeData6); } list = list.stream().sorted((o1,o2) ->{ diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/OrderSwapBatteryServiceImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/OrderSwapBatteryServiceImpl.java index 5b81c0d..4da8c32 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/OrderSwapBatteryServiceImpl.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/OrderSwapBatteryServiceImpl.java @@ -385,11 +385,11 @@ public class OrderSwapBatteryServiceImpl implements OrderSwapBatteryService { fee = order.getServiceFee().add(order.getBasicFee().multiply(order.getElectAmount())).setScale(0, RoundingMode.HALF_UP); } else if (order.getFeeType() == 2) { // TODO 按SOC - if (order.getReturnBatRentSoc() == null || order.getRentBatSoc() == null) { + if (order.getReturnBatSoc() == null || order.getRentBatSoc() == null) { return new Result().error("充电订单 SOC 异常!"); } // 计算 SOC - BigDecimal socDifference = new BigDecimal(order.getRentBatSoc() - order.getReturnBatRentSoc()); + BigDecimal socDifference = new BigDecimal(order.getRentBatSoc() - order.getReturnBatSoc()); fee = order.getServiceFee().add(order.getBasicFee().multiply(socDifference)).setScale(0, RoundingMode.HALF_UP); } else if (order.getFeeType() == 1) { @@ -713,10 +713,9 @@ public class OrderSwapBatteryServiceImpl implements OrderSwapBatteryService { public List findOrderSwapBatteryPreList(String stationCode) { return orderSwapBatteryPreDao.selectList(new LambdaQueryWrapper() .eq(OrderSwapBatteryPre::getStationCode, stationCode) - .ne(OrderSwapBatteryPre::getUcode,"hp_station_push") +// .ne(OrderSwapBatteryPre::getUcode,"hp_station_push") .eq(OrderSwapBatteryPre::getStatus, 1) - .select(OrderSwapBatteryPre::getUcode) - .select(OrderSwapBatteryPre::getPkId) + .select(OrderSwapBatteryPre::getUcode,OrderSwapBatteryPre::getPkId,OrderSwapBatteryPre::getPlateNum) ); } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/newthread/GZHTemplateMessageService.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/newthread/GZHTemplateMessageService.java index eca924c..3b50e96 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/newthread/GZHTemplateMessageService.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/newthread/GZHTemplateMessageService.java @@ -2,6 +2,7 @@ package com.evotech.hd.cloud.service.newthread; import com.evotech.hd.cloud.service.rpc.WechatService; import com.evotech.hd.common.core.Dto.request.template.AlarmTemplateDto; +import com.evotech.hd.common.core.Dto.request.template.StopServerTemplateDto; import com.evotech.hd.common.core.entity.cloud.OrderSwapBattery; import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre; import com.evotech.hd.common.core.entity.cloud.TradeDetail; @@ -9,8 +10,6 @@ import jakarta.annotation.Resource; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; -import java.util.List; - @Service public class GZHTemplateMessageService { @@ -59,8 +58,8 @@ public class GZHTemplateMessageService { * @param money */ @Async("taskExecutor") - public void serviceStopMessageSend(ListwuIds, String reason) { - wechatService.serviceStopMessageSend(wuIds, reason); + public void serviceStopMessageSend(StopServerTemplateDto stopServerTemplateDto) { + wechatService.serviceStopMessageSend(stopServerTemplateDto); } } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/rpc/WechatService.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/rpc/WechatService.java index 51d57d9..c1c95c3 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/rpc/WechatService.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/rpc/WechatService.java @@ -1,6 +1,12 @@ package com.evotech.hd.cloud.service.rpc; +import com.evotech.hd.cloud.entity.vo.NativePayVO; import com.evotech.hd.common.core.Dto.request.template.AlarmTemplateDto; +import com.evotech.hd.common.core.Dto.request.template.StopServerTemplateDto; +import com.evotech.hd.common.core.entity.Result; +import com.evotech.hd.common.core.entity.cloud.OrderSwapBattery; +import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre; +import com.evotech.hd.common.core.entity.cloud.TradeDetail; import org.springdoc.core.annotations.ParameterObject; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.http.MediaType; @@ -9,14 +15,6 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; -import com.evotech.hd.cloud.entity.vo.NativePayVO; -import com.evotech.hd.common.core.entity.Result; -import com.evotech.hd.common.core.entity.cloud.OrderSwapBattery; -import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre; -import com.evotech.hd.common.core.entity.cloud.TradeDetail; - -import java.util.List; - @FeignClient(name = "${WECHAT-SERVER-API-NAME}", path = "${WECHAT-SERVER-API-PATH}") public interface WechatService { @@ -61,6 +59,6 @@ public interface WechatService { public com.evotech.hd.common.core.Dto.Result alarmMessageSend(@RequestBody AlarmTemplateDto alarmTemplate); @PostMapping(value = "/gzh/msg/send/service", consumes = {MediaType.APPLICATION_JSON_VALUE}) - public com.evotech.hd.common.core.Dto.Result serviceStopMessageSend(@RequestParam List wuIds, @RequestParam String reason); + public com.evotech.hd.common.core.Dto.Result serviceStopMessageSend(@RequestBody StopServerTemplateDto stopServerTemplateDto); } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/task/OrderCostCalculateTask.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/task/OrderCostCalculateTask.java index 7c478d1..b4673b5 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/task/OrderCostCalculateTask.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/task/OrderCostCalculateTask.java @@ -34,21 +34,20 @@ public class OrderCostCalculateTask { public void calculateOrder() { log.info("\r\n===>>>开始查找订单计算费用"); // 查询状态为5的订单 -// Boolean flag = true; + Boolean flag = true; int n = 0; -// while (flag) { + while (flag) { List list = orderSwapBatteryDao.selectList(new QueryWrapper() .eq("status", 5).ne("del_flag", 1) .ge("order_time", DateUtil.beginOfYear(new Date())) .last("limit 20")); if (!list.isEmpty()) { n = orderCalculate(n, list); -// flag = false; } -// else { -// flag = false; -// } -// } + else { + flag = false; + } + } log.info("\r\n===>>>订单计算费用完成:{} 条数据", n); @@ -63,6 +62,8 @@ public class OrderCostCalculateTask { n += 1; // 发送微信消息 gzhTemplateMessageService.orderMessageSend2(list.get(i).getPkId(), 2); + }else{ + throw new RuntimeException(res.getMsg()); } } return n; diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/task/OrderSwapBatteryTask.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/task/OrderSwapBatteryTask.java index d95fb1c..0576023 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/task/OrderSwapBatteryTask.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/task/OrderSwapBatteryTask.java @@ -4,22 +4,16 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.evotech.hd.cloud.dao.OrderSwapBatteryPreDao; -import com.evotech.hd.cloud.service.OrderSwapBatteryService; import com.evotech.hd.cloud.service.newthread.GZHTemplateMessageService; -import com.evotech.hd.common.core.dao.cloud.OrderSwapBatteryDao; -import com.evotech.hd.common.core.entity.cloud.OrderSwapBattery; import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre; import com.evotech.hd.common.redis.utils.RedisUtil; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; -import org.springframework.data.redis.core.RedisTemplate; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Set; @@ -119,19 +113,19 @@ public class OrderSwapBatteryTask { } for (String key : keys) { try { - String id = key.substring(key.lastIndexOf(":") + 1); - OrderSwapBatteryPre order = orderSwapBatteryPreDao.selectById(id); - if (order != null && order.getStatus() == 1) { // 只处理状态为1的预约单 - // 获取过期时间 - Date expireTime = (Date) redisUtil.get(key); - // 如果当前时间接近过期时间(5分钟内) - if (expireTime != null && DateUtil.between(currentTime, expireTime, DateUnit.MINUTE) <= 5) { - // 发送微信公众号提醒 - templateMessageService.preOrderMessageSend(order); - reminderCount++; - // 从Redis中删除该预约单 - redisUtil.del(key); - log.info("发送微信公众号即将过期提醒,预约人:{},订单ID: {}", order.getUname(), order.getPkId()); + // 获取过期时间 + Date expireTime = (Date) redisUtil.get(key); + // 如果当前时间接近过期时间(5分钟内) + if (expireTime != null && DateUtil.between(currentTime, expireTime, DateUnit.MINUTE) <= 5) { + String id = key.substring(key.lastIndexOf(":") + 1); + OrderSwapBatteryPre order = orderSwapBatteryPreDao.selectById(id); + if (order != null && order.getStatus() == 1) { // 只处理状态为1的预约单 + // 发送微信公众号提醒 + templateMessageService.preOrderMessageSend(order); + reminderCount++; + // 从Redis中删除该预约单 + redisUtil.del(key); + log.info("发送微信公众号即将过期提醒,预约人:{},订单ID: {}", order.getUname(), order.getPkId()); } } } catch (Exception e) { diff --git a/cloud-manage-server/src/main/resources/mapper/OrderSwapBatteryMapper.xml b/cloud-manage-server/src/main/resources/mapper/OrderSwapBatteryMapper.xml index dfb6da3..bbbeb7f 100644 --- a/cloud-manage-server/src/main/resources/mapper/OrderSwapBatteryMapper.xml +++ b/cloud-manage-server/src/main/resources/mapper/OrderSwapBatteryMapper.xml @@ -7,10 +7,12 @@ + + @@ -28,6 +30,28 @@ + + + + + + + + + + + + + +