ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ChargingGunFallbackFactory.java
@@ -12,6 +12,7 @@ import org.slf4j.LoggerFactory; import org.springframework.cloud.openfeign.FallbackFactory; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.RequestParam; import java.util.List; @@ -84,6 +85,11 @@ public R<TChargingGun> getChargingGunByFullNumber(String fullNumber) { return R.fail("根据枪唯一码查询信息失败:" + throwable.getMessage()); } @Override public R<List<Integer>> getGunIdsBySiteIdsAndChargeModels(List<Integer> siteIds, List<Integer> chargeModels){ return R.fail("根据站点ids和充电模式集合查询充电枪集合失败:" + throwable.getMessage()); } }; } } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ChargingGunClient.java
@@ -111,4 +111,10 @@ */ @PostMapping("/t-charging-gun/getChargingGunByFullNumber") R<TChargingGun> getChargingGunByFullNumber(@RequestParam("fullNumber") String fullNumber); /** * 大屏 根据站点ids和充电模式集合查询充电枪集合 */ @GetMapping("/t-charging-gun/getGunIdsBySiteIdsAndChargeModels") R<List<Integer>> getGunIdsBySiteIdsAndChargeModels(@RequestParam("siteIds") List<Integer> siteIds ,@RequestParam("chargeModels") List<Integer> chargeModels); } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java
@@ -16,8 +16,11 @@ import org.slf4j.LoggerFactory; import org.springframework.cloud.openfeign.FallbackFactory; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestParam; import java.math.BigDecimal; import java.util.List; /** @@ -211,6 +214,10 @@ public R tripartitePlatformStopCharge(String startChargeSeq) { return R.fail("三方平台请求停止充电失败:" + throwable.getMessage()); } @Override public R<BigDecimal> getSumDegreeBySiteIds(@RequestParam("siteIds") List<Integer> SiteIds){ return R.fail("获取站点集合中总的充电量失败:" + throwable.getMessage()); } }; } } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java
@@ -20,6 +20,7 @@ import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.*; import java.math.BigDecimal; import java.util.List; /** @@ -307,4 +308,11 @@ */ @PostMapping("/t-charging-order/tripartitePlatformStopCharge") R tripartitePlatformStopCharge(@RequestParam("startChargeSeq") String startChargeSeq); /** * 充电桩大屏 获取站点集合中总的充电量 */ @GetMapping("/t-charging-order/getSumDegreeBySiteIds") R<BigDecimal> getSumDegreeBySiteIds(@RequestParam("siteIds") List<Integer> SiteIds); } ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TScreenContent.java
New file @@ -0,0 +1,97 @@ package com.ruoyi.other.api.domain; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.core.web.domain.BasePojo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Date; @Data @TableName("t_screen_content") @ApiModel("大屏设置对象") public class TScreenContent { @TableId(value = "id", type = IdType.AUTO) @ApiModelProperty("主键ID") private Integer id; @TableField("site_id") @ApiModelProperty("站点id") private Integer siteId; @TableField("green_electricity_today") @ApiModelProperty("今日绿电消纳值") private BigDecimal greenElectricityToday; @TableField("car_discharge") @ApiModelProperty("累计汽车放电量") private BigDecimal carDischarge; @TableField("green_electricity") @ApiModelProperty("累计绿电消纳电量") private BigDecimal greenElectricity; @TableField("title") @ApiModelProperty("标题") private String title; @TableField("title_one") @ApiModelProperty("标题1") private String titleOne; @TableField("value_one") @ApiModelProperty("值1") private BigDecimal valueOne; @TableField("unit_one") @ApiModelProperty("计量单位1") private String unitOne; @TableField("title_two") @ApiModelProperty("标题2") private String titleTwo; @TableField("value_two") @ApiModelProperty("值2") private BigDecimal valueTwo; @TableField("unit_two") @ApiModelProperty("计量单位2") private String unitTwo; @TableField("title_three") @ApiModelProperty("标题3") private String titleThree; @TableField("value_three") @ApiModelProperty("值3") private BigDecimal valueThree; @TableField("unit_three") @ApiModelProperty("计量单位3") private String unitThree; @TableField("statistical_deadline") @ApiModelProperty("截止统计日期") @JsonFormat(pattern = "yyyy-MM-dd") private LocalDateTime statisticalDeadline; @TableField("create_time") @ApiModelProperty("创建时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime createTime; @TableField("update_time") @ApiModelProperty("更新时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime updateTime; } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java
@@ -42,6 +42,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; /** * <p> @@ -348,5 +349,17 @@ TChargingGun chargingGun = chargingGunService.getOne(new LambdaQueryWrapper<TChargingGun>().eq(TChargingGun::getDelFlag, 0).eq(TChargingGun::getFullNumber, fullNumber)); return R.ok(chargingGun); } /** * 大屏 根据站点ids和充电模式集合查询充电枪集合 没有过滤del_flag */ @GetMapping("/getGunIdsBySiteIdsAndChargeModels") public R<List<Integer>> getGunIdsBySiteIdsAndChargeModels(@RequestParam("siteIds") List<Integer> siteIds ,@RequestParam("chargeModels") List<Integer> chargeModels){ List<TChargingGun> list = chargingGunService.list(new LambdaQueryWrapper<TChargingGun>() .select(TChargingGun::getId).in(TChargingGun::getSiteId, siteIds) .in(TChargingGun::getChargeMode, chargeModels)); return R.ok(list.stream().map(TChargingGun::getId).collect(Collectors.toList())); } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChargingBillController.java
@@ -26,6 +26,7 @@ import com.ruoyi.order.api.vo.TOrderInvoiceVO; import com.ruoyi.order.export.*; import com.ruoyi.order.service.*; import com.ruoyi.order.vo.StatisticsOfBatteryVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.poi.ss.usermodel.Workbook; ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -1,5 +1,6 @@ package com.ruoyi.order.controller; import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import java.math.BigDecimal; @@ -58,6 +59,7 @@ import com.ruoyi.order.service.*; import com.ruoyi.order.util.PreviousSixMonths; import com.ruoyi.order.vo.EndOfChargePageInfo; import com.ruoyi.order.vo.StatisticsOfBatteryVO; import com.ruoyi.order.vo.WatchChargingOrderVo; import com.ruoyi.other.api.feignClient.RoleSiteClient; import com.ruoyi.other.api.feignClient.UserSiteClient; @@ -2359,4 +2361,24 @@ public R addChargingOrderSummaryData(){ return chargingOrderService.addChargingOrderSummaryData(); } /** * 充电桩数据大屏 新能源汽车电池安全检测次数统计 */ @ResponseBody @GetMapping(value = "/getStatisticsOfBattery") @ApiOperation(value = "新能源汽车电池安全检测次数统计", tags = {"充电桩数据大屏"}) public R<StatisticsOfBatteryVO> getStatisticsOfBattery(){ return chargingOrderService.getStatisticsOfBattery(); } /** * 充电桩数据大屏 获取站点集合中总的充电量 */ @GetMapping("/getSumDegreeBySiteIds") public R<BigDecimal> getSumDegreeBySiteIds(@RequestParam("siteIds") List<Integer> SiteIds){ return R.ok(chargingOrderService.getSumDegreeBySiteIds(SiteIds)); } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java
@@ -11,6 +11,7 @@ import com.ruoyi.order.api.vo.ChargingOrderListVO; import com.ruoyi.order.api.vo.ChargingOrderVO; import com.ruoyi.order.dto.*; import com.ruoyi.order.vo.OrderCountByDate; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -142,4 +143,8 @@ Long countNoTag(); Long countCar(@Param("brands") List<String> brands); List<OrderCountByDate> countOrdersByDate(@Param("startTime")LocalDateTime startTime, @Param("endTime")LocalDateTime endTime,@Param("gunIds")List<Integer> gunIds); BigDecimal getSumDegreeBySiteIds(@Param("siteIds") List<Integer> siteIds); } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java
@@ -15,6 +15,7 @@ import com.ruoyi.order.dto.*; import com.ruoyi.order.vo.ChargingOrderListInfoVO; import com.ruoyi.order.vo.EndOfChargePageInfo; import com.ruoyi.order.vo.StatisticsOfBatteryVO; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; @@ -322,4 +323,11 @@ R addChargingOrderSummaryData(); /** * 大屏-新能源汽车电池安全检测次数统计 */ R<StatisticsOfBatteryVO> getStatisticsOfBattery(); BigDecimal getSumDegreeBySiteIds(List<Integer> siteIds); } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -17,6 +17,7 @@ import com.ruoyi.common.core.dto.ChargingOrderGroup; import com.ruoyi.common.core.dto.ChargingPercentProvinceDto; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.domain.BasePojo; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.common.security.service.TokenService; @@ -51,6 +52,8 @@ import com.ruoyi.order.service.TOrderEvaluateService; import com.ruoyi.order.service.*; import com.ruoyi.order.vo.EndOfChargePageInfo; import com.ruoyi.order.vo.OrderCountByDate; import com.ruoyi.order.vo.StatisticsOfBatteryVO; import com.ruoyi.other.api.domain.*; import com.ruoyi.order.vo.ChargingOrderListInfoVO; import com.ruoyi.other.api.domain.TVip; @@ -4064,4 +4067,66 @@ } return R.ok(); } /** * 大屏-新能源汽车电池安全检测次数统计 */ @Override public R<StatisticsOfBatteryVO> getStatisticsOfBattery() { StatisticsOfBatteryVO vo = new StatisticsOfBatteryVO(); //1.计算累计次数 //查询该俩站点的快充和超充的充电枪id集合 site_id 25 26 charge_model 1 2 R<List<Integer>> r = chargingGunClient.getGunIdsBySiteIdsAndChargeModels(Arrays.asList(25,26),Arrays.asList(1,2)); if (r.getCode()!=200){ return R.ok(vo); } List<Integer> gunIds=r.getData(); //统计 Long total= 0L; if(gunIds!=null && !gunIds.isEmpty()) { total = this.baseMapper.selectCount(new LambdaQueryWrapper<TChargingOrder>() .eq(TChargingOrder::getDelFlag, 0)//未删除 .in(TChargingOrder::getStatus, Arrays.asList(3, 5))//充电中、已结束 .in(TChargingOrder::getChargingGunId, gunIds));//符合条件的充电枪 } vo.setTotal(total.intValue()); //2.折线图 /* // 计算日期范围:前七天(不含今日)直接查找数据量太大,内存报错 LocalDate today = LocalDate.now(); LocalDateTime startDate = today.minusDays(7).atStartOfDay(); LocalDateTime endDate = today.minusDays(1).atTime(LocalTime.MAX); // 查询数据库 List<OrderCountByDate> orderCounts = this.baseMapper.countOrdersByDate(startDate, endDate, gunIds);*/ // 转换结果 List<LocalDate> dates = new ArrayList<>(); List<Integer> counts = new ArrayList<>(); LocalDate today = LocalDate.now(); // 直接查找数据量太大,内存报错,分每天查找 for (int i = 7; i >= 1; i--) {//升序 LocalDate day = today.minusDays(i); LocalDateTime startOfDay = day.atStartOfDay(); LocalDateTime endOfDay = day.atTime(LocalTime.MAX); //统计 Long count=0L; if(gunIds!=null && !gunIds.isEmpty()){ count = this.baseMapper.selectCount(new LambdaQueryWrapper<TChargingOrder>() .eq(TChargingOrder::getDelFlag,0)//未删除 .in(TChargingOrder::getStatus,Arrays.asList(3,5))//充电中、已结束 .in(TChargingOrder::getChargingGunId,gunIds)//符合条件的充电枪 站点 超充快充 .between(BasePojo::getCreateTime,startOfDay,endOfDay));//每天 } dates.add(day); counts.add(count.intValue()); } vo.setDates(dates); vo.setCounts(counts); return R.ok(vo); } @Override public BigDecimal getSumDegreeBySiteIds(List<Integer> siteIds) { return this.baseMapper.getSumDegreeBySiteIds(siteIds); } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderCountByDate.java
New file @@ -0,0 +1,12 @@ package com.ruoyi.order.vo; import lombok.Data; import java.time.LocalDate; @Data public class OrderCountByDate { private LocalDate date; private Long count; } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/StatisticsOfBatteryVO.java
New file @@ -0,0 +1,19 @@ package com.ruoyi.order.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.time.LocalDate; import java.util.Date; import java.util.List; @Data public class StatisticsOfBatteryVO { @ApiModelProperty("累计检测") private Integer total; @ApiModelProperty("日期") private List<LocalDate> dates; @ApiModelProperty("次数") private List<Integer> counts; } ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
@@ -1748,4 +1748,29 @@ and t1.del_flag = 0 ) </select> <select id="countOrdersByDate" resultType="com.ruoyi.order.vo.OrderCountByDate"> SELECT DATE_FORMAT(create_time, '%m/%d') AS `date`, COUNT(*) AS `count` FROM t_charging_order WHERE del_flag = 0 and status in (3,5) and charging_gun_id in <foreach item="item" index="index" collection="gunIds" open="(" separator="," close=")"> #{item} </foreach> and create_time BETWEEN #{startTime} AND #{endTime} GROUP BY DATE(create_time, '%m/%d') ORDER BY DATE(create_time, '%m/%d') ASC </select> <select id="getSumDegreeBySiteIds" resultType="java.math.BigDecimal"> select sum(charging_capacity) from t_charging_order where del_flag=0 and site_id in <foreach item="item" index="index" collection="siteIds" open="(" separator="," close=")"> #{item} </foreach> </select> </mapper> ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TScreenContentController.java
New file @@ -0,0 +1,142 @@ package com.ruoyi.other.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.log.annotation.Log; import com.ruoyi.common.log.enums.BusinessType; import com.ruoyi.common.security.annotation.Logical; import com.ruoyi.common.security.annotation.RequiresPermissions; import com.ruoyi.other.api.domain.TNotice; import com.ruoyi.other.api.domain.TScreenContent; import com.ruoyi.other.api.dto.NoticeQueryDto; import com.ruoyi.other.service.TNoticeService; import com.ruoyi.other.service.TScreenContentService; import com.ruoyi.other.util.EnergyRefreshService; import com.ruoyi.other.vo.*; import io.swagger.annotations.ApiOperation; import org.springframework.beans.BeanUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; /** * <p> * 前端控制器 * </p> * * @author huliguo * @since 2025/5/23 */ @RestController @RequestMapping("/t_screen_content") public class TScreenContentController { @Resource private TScreenContentService screenContentService; @Resource private EnergyRefreshService energyRefreshService; /** * 顶部-累计电量 */ @ApiOperation(tags = {"顶部-累计电量"},value = "充电桩数据大屏") @GetMapping(value = "/top") public AjaxResult<ScreenTopVO> top(@RequestParam("siteIds") List<Integer> siteIds) { return AjaxResult.success(screenContentService.top(siteIds)); } /** * 光伏发电和消纳 这里的绿电是调后台大屏内容管理的 */ @ApiOperation(tags = {"光伏发电和消纳"},value = "充电桩数据大屏") @GetMapping(value = "/photovoltaicAndConsumption") public AjaxResult<PhotovoltaicAndConsumptionVO> photovoltaicAndConsumption() { //需调用接口 获取光伏发电量 return AjaxResult.success(new PhotovoltaicAndConsumptionVO()); } /** * 累计减排数据 */ @ApiOperation(tags = {"减排数据"},value = "充电桩数据大屏") @GetMapping(value = "/emissionReduction") public AjaxResult<EmissionReductionVO> emissionReduction (@RequestParam("siteIds") List<Integer> siteIds) { return AjaxResult.success( screenContentService.emissionReduction(siteIds)); } /** * 光伏发电实时情况 */ @ApiOperation(tags = {"光伏发电实时情况"},value = "充电桩数据大屏") @GetMapping(value = "/photovoltaicPowerGeneration") public AjaxResult<PhotovoltaicPowerGenerationVO> photovoltaicPowerGeneration (@RequestParam("siteIds") List<Integer> siteIds) { return AjaxResult.success( screenContentService.photovoltaicPowerGeneration(siteIds)); } /** * 储能放电情况 */ @ApiOperation(tags = {"储能放电情况"},value = "充电桩数据大屏") @GetMapping(value = "/energyStorageDischarge") public AjaxResult<EnergyStorageDischargeVO> energyStorageDischarge() { //需调用接口 获取光伏发电量 EnergyStorageDischargeVO vo = new EnergyStorageDischargeVO(); vo.setTodayDischarge(energyRefreshService.getCurrentValue()); return AjaxResult.success(vo); } /** * 停车场共享情况及相关数据 */ @ApiOperation(tags = {"停车场共享情况及相关数据"},value = "充电桩数据大屏") @GetMapping(value = "/screen") public AjaxResult<TScreenContent> screen(@RequestParam("siteIds") List<Integer> siteIds) { List<TScreenContent> list = screenContentService.list(new LambdaQueryWrapper<TScreenContent>().in(TScreenContent::getSiteId, siteIds)); TScreenContent tScreenContent = new TScreenContent(); if(list==null|| list.isEmpty()){ return AjaxResult.success(tScreenContent); } BeanUtils.copyProperties( list.get(0),tScreenContent); list.remove(0); list.forEach(x->{ tScreenContent.setCarDischarge(tScreenContent.getCarDischarge().add(x.getCarDischarge())); tScreenContent.setGreenElectricity(tScreenContent.getGreenElectricity().add(x.getGreenElectricity())); tScreenContent.setGreenElectricityToday(tScreenContent.getGreenElectricityToday().add(x.getGreenElectricityToday())); tScreenContent.setValueOne(tScreenContent.getValueOne().add(x.getValueOne())); tScreenContent.setValueTwo(tScreenContent.getValueTwo().add(x.getValueTwo())); tScreenContent.setValueThree(tScreenContent.getValueThree().add(x.getValueThree())); if(tScreenContent.getStatisticalDeadline().isBefore(x.getStatisticalDeadline())) tScreenContent.setStatisticalDeadline(x.getStatisticalDeadline()); }); return AjaxResult.success(tScreenContent); } /** * 数据回显 站点id */ //todo 鉴权 @RequiresPermissions(value = {"/publicAnnouncementManagement"}, logical = Logical.OR) @ApiOperation(tags = {"后台-大屏内容设置-基础信息"},value = "查询") @GetMapping(value = "/{siteId}") public AjaxResult<TScreenContent> detail(@PathVariable("siteId") Integer siteId) { TScreenContent one = screenContentService.getOne(new LambdaQueryWrapper<TScreenContent>().eq(TScreenContent::getSiteId, siteId)); return AjaxResult.success(one); } /** * 新增修改 */ //todo 鉴权 @RequiresPermissions(value = {"",""}, logical = Logical.OR) @ApiOperation(tags = {"后台-大屏内容设置-基础信息"},value = "新增修改") @PostMapping(value = "/saveOrUpdate") @Log(title = "【大屏管理】新增修改内容", businessType = BusinessType.INSERT) public AjaxResult saveOrUpdate(@RequestBody TScreenContent screenContent) { screenContentService.saveOrUpdate(screenContent); return AjaxResult.success(); } } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/TScreenContentMapper.java
New file @@ -0,0 +1,25 @@ package com.ruoyi.other.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.other.api.domain.TNotice; import com.ruoyi.other.api.domain.TScreenContent; import org.apache.ibatis.annotations.Mapper; import java.math.BigDecimal; import java.util.List; /** * <p> * 服务实现类 * </p> * * @author huliguo * @since 2025/5/23 */ @Mapper public interface TScreenContentMapper extends BaseMapper<TScreenContent> { BigDecimal getCarDisCharge(List<Integer> siteIds); BigDecimal getGreenElectricity(List<Integer> siteIds); } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/TScreenContentService.java
New file @@ -0,0 +1,27 @@ package com.ruoyi.other.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.other.api.domain.TNotice; import com.ruoyi.other.api.domain.TScreenContent; import com.ruoyi.other.vo.EmissionReductionVO; import com.ruoyi.other.vo.PhotovoltaicPowerGenerationVO; import com.ruoyi.other.vo.ScreenTopVO; import java.util.List; /** * <p> * 服务实现类 * </p> * * @author huliguo * @since 2025/5/23 */ public interface TScreenContentService extends IService<TScreenContent> { EmissionReductionVO emissionReduction(List<Integer> siteIds); PhotovoltaicPowerGenerationVO photovoltaicPowerGeneration(List<Integer> siteIds); ScreenTopVO top(List<Integer> siteIds); } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TScreenContentServiceImpl.java
New file @@ -0,0 +1,166 @@ package com.ruoyi.other.service.impl; import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.domain.BasePojo; import com.ruoyi.order.api.feignClient.ChargingOrderClient; import com.ruoyi.order.api.model.TChargingOrder; import com.ruoyi.other.api.domain.TScreenContent; import com.ruoyi.other.api.domain.TSystemConfiguration; import com.ruoyi.other.mapper.TScreenContentMapper; import com.ruoyi.other.mapper.TSystemConfigurationMapper; import com.ruoyi.other.service.TScreenContentService; import com.ruoyi.other.service.TSystemConfigurationService; import com.ruoyi.other.vo.EmissionReductionVO; import com.ruoyi.other.vo.PhotovoltaicPowerGenerationVO; import com.ruoyi.other.vo.ScreenStorageConfigVO; import com.ruoyi.other.vo.ScreenTopVO; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.json.Json; import javax.json.JsonObject; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Random; import java.util.concurrent.ThreadLocalRandom; /** * <p> * 服务实现类 * </p> * * @author huliguo * @since 2025/5/23 */ @Service public class TScreenContentServiceImpl extends ServiceImpl<TScreenContentMapper, TScreenContent> implements TScreenContentService { @Resource private ChargingOrderClient chargingOrderClient; @Resource private TSystemConfigurationMapper systemConfigurationMapper; @Override public EmissionReductionVO emissionReduction(List<Integer> siteIds) { //需调用接口 计算光伏减排 EmissionReductionVO vo = new EmissionReductionVO(); //获取总电量 计算电量 BigDecimal charge=new BigDecimal("0.00"); if (siteIds!=null && !siteIds.isEmpty()){ R<BigDecimal> r = chargingOrderClient.getSumDegreeBySiteIds(siteIds); if (r.getCode()==200){ charge=r.getData(); } } //计算电量占比率 if (charge.compareTo(BigDecimal.ZERO) != 0) { // 定义乘数和除数 BigDecimal multiplier = new BigDecimal("0.1404"); // 0.1404 BigDecimal divisor = new BigDecimal("1000"); // 1000 // 计算:charge × 0.1404 ÷ 1000 charge = charge .multiply(multiplier) // 乘以 0.1404 .divide(divisor, 2, RoundingMode.HALF_UP); // 除以 1000,保留6位小数,四舍五入 } vo.setCharge(charge); return vo; } @Override public PhotovoltaicPowerGenerationVO photovoltaicPowerGeneration(List<Integer> siteIds) { //需调用接口 //假数据 PhotovoltaicPowerGenerationVO vo = new PhotovoltaicPowerGenerationVO(); List<LocalDate> dates = new ArrayList<>(); List<Integer> values = new ArrayList<>(); LocalDate today = LocalDate.now(); // 生成每天数据 for (int i = 7; i >= 1; i--) {//升序 LocalDate day = today.minusDays(i); //统计 dates.add(day); int value = new Random().nextInt(151) + 100; // 100-250 values.add(value); } vo.setDates(dates); vo.setValues(values); return vo; } @Override public ScreenTopVO top(List<Integer> siteIds) { ScreenTopVO vo = new ScreenTopVO(); BigDecimal charge=new BigDecimal("0.00"); BigDecimal carCharge=new BigDecimal("0.00"); BigDecimal greenElectricity=new BigDecimal("0.00"); if (siteIds!=null && !siteIds.isEmpty()){ //获取充电量 R<BigDecimal> r = chargingOrderClient.getSumDegreeBySiteIds(siteIds); if (r.getCode()==200){ charge=r.getData(); } //汽车放电量 carCharge = this.baseMapper.getCarDisCharge(siteIds); //累计绿电消纳电量 greenElectricity = this.baseMapper.getGreenElectricity(siteIds); } vo.setCarCharge(charge); vo.setCarDisCharge(carCharge); vo.setGreenElectricity(greenElectricity); //获取系统建设日期和累计储能放电量 TSystemConfiguration sysConfig = systemConfigurationMapper.selectOne(new LambdaQueryWrapper<TSystemConfiguration>() .eq(TSystemConfiguration::getType,3)); //解析 ScreenStorageConfigVO configVO = JSON.parseObject(sysConfig.getContent(), ScreenStorageConfigVO.class); //计算储能充电量 LocalDate systemCreateTime = configVO.getSystemCreateTime(); LocalDate today = LocalDate.now(); int days = (int) ChronoUnit.DAYS.between(systemCreateTime, today) +1;//包括今天 BigDecimal dailyRate = new BigDecimal("100"); BigDecimal totalCharge = dailyRate.multiply(BigDecimal.valueOf(days)) .divide(BigDecimal.valueOf(10000), 2, RoundingMode.HALF_UP); vo.setStorageCharge(totalCharge); //获取储能放电量 // 判断是否等于今天 if (configVO.getLastUpdated().equals(today)) { vo.setStorageDisCharge(configVO.getStorageDisCharge()); return vo; } //判断离今天还有几天 int count = (int) ChronoUnit.DAYS.between(configVO.getLastUpdated(), today) +1;//包括今天 BigDecimal storageDisCharge = configVO.getStorageDisCharge(); // 每天生成一个随机值(不超过100)并累加 for (int i = 0; i < count; i++) { int dailyCharge = ThreadLocalRandom.current().nextInt(0, 101); // 0-100的随机数 storageDisCharge = storageDisCharge.add(new BigDecimal(dailyCharge)); } // 更新回对象 configVO.setStorageDisCharge(storageDisCharge); configVO.setLastUpdated(today); String json = JSON.toJSONString(configVO); sysConfig.setContent(json); systemConfigurationMapper.updateById(sysConfig); vo.setStorageDisCharge(storageDisCharge); return vo; } } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/EnergyRefreshService.java
New file @@ -0,0 +1,73 @@ package com.ruoyi.other.util; import lombok.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalTime; import java.util.Random; @Service public class EnergyRefreshService { private final Random random = new Random(); private BigDecimal currentValue; private final BigDecimal targetLow = new BigDecimal("85"); private final BigDecimal targetHigh = new BigDecimal("87"); private final int maxIncrement = 10; private boolean isRunning = true; // 控制任务是否继续执行 public EnergyRefreshService() { this.currentValue = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP); } // 定时任务方法 @Scheduled(cron = "${0 */15 * * * ?}")//15分钟执行一次 public synchronized void refreshValue() { // 检查是否已停止或达到目标范围 if (!isRunning || isWithinTargetRange(currentValue)) { isRunning = false; return; } // 检查当前时间是否在允许的时间段内 LocalTime now = LocalTime.now(); boolean isInMorning = now.isAfter(LocalTime.of(10, 0)) && now.isBefore(LocalTime.of(12, 0)); boolean isInAfternoon = now.isAfter(LocalTime.of(15, 0)) && now.isBefore(LocalTime.of(21, 0)); if (!isInMorning && !isInAfternoon) { return; } // 生成随机增量并更新值 int increment = random.nextInt(maxIncrement + 1); currentValue = currentValue.add(BigDecimal.valueOf(increment)) .setScale(2, RoundingMode.HALF_UP); System.out.printf("定时刷新:当前时间 %s,当前值:%.2f%n", now, currentValue); } private boolean isWithinTargetRange(BigDecimal value) { return value.compareTo(targetLow) >= 0 && value.compareTo(targetHigh) <= 0; } // 提供获取当前值的方法 public BigDecimal getCurrentValue() { return currentValue; } // 重置任务 public void reset() { this.currentValue = BigDecimal.ZERO; this.isRunning = true; } } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/EmissionReductionVO.java
New file @@ -0,0 +1,27 @@ package com.ruoyi.other.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; @Data public class EmissionReductionVO { @ApiModelProperty("累计光伏发电二氧化碳减排量(吨)") private BigDecimal photovoltaic = new BigDecimal("63.00"); @ApiModelProperty("累计光伏发电二氧化碳减排量(占比率)") private BigDecimal photovoltaicRate = new BigDecimal("48.8"); @ApiModelProperty("累计储能二氧化碳减排量(吨)") private BigDecimal energyStorage = new BigDecimal("20.00"); @ApiModelProperty("累计储能二氧化碳减排量(占比率)") private BigDecimal energyStorageRate = new BigDecimal("48.8"); @ApiModelProperty("累计充电二氧化碳减排量(吨)") private BigDecimal charge; @ApiModelProperty("累计充电二氧化碳减排量(占比率)") private BigDecimal chargeRate = new BigDecimal("4.8"); @ApiModelProperty("总计二氧化碳减排量(吨)") private BigDecimal total = new BigDecimal("48000"); } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/EnergyStorageDischargeVO.java
New file @@ -0,0 +1,18 @@ package com.ruoyi.other.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; @Data public class EnergyStorageDischargeVO { @ApiModelProperty("储能配置") private Integer config=100; @ApiModelProperty("今日储能") private Integer todayStorage=100; @ApiModelProperty("今日放能") private BigDecimal todayDischarge; } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/PhotovoltaicAndConsumptionVO.java
New file @@ -0,0 +1,18 @@ package com.ruoyi.other.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; @Data public class PhotovoltaicAndConsumptionVO { @ApiModelProperty("光伏面积") private Integer area = 3593; @ApiModelProperty("装机容量") private BigDecimal capacity = new BigDecimal("759.52"); @ApiModelProperty("今日已发电") private BigDecimal todayGenerateElectricity=new BigDecimal("71.29"); } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/PhotovoltaicPowerGenerationVO.java
New file @@ -0,0 +1,15 @@ package com.ruoyi.other.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.time.LocalDate; import java.util.List; @Data public class PhotovoltaicPowerGenerationVO { @ApiModelProperty("日期") private List<LocalDate> dates; @ApiModelProperty("数据") private List<Integer> values; } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ScreenStorageConfigVO.java
New file @@ -0,0 +1,28 @@ package com.ruoyi.other.vo; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; @Data public class ScreenStorageConfigVO { /** * 系统建设日期 */ @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate systemCreateTime; /** * 储能放电量 随机增长,每日不超过100度 */ private BigDecimal storageDisCharge; /** * 最后一次更改时间 */ @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate lastUpdated; } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ScreenTopVO.java
New file @@ -0,0 +1,24 @@ package com.ruoyi.other.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; @Data public class ScreenTopVO { @ApiModelProperty("汽车充电量") private BigDecimal carCharge; @ApiModelProperty("汽车放电量") private BigDecimal carDisCharge; @ApiModelProperty("光伏发电量") private BigDecimal photovoltaic=new BigDecimal("0.00"); @ApiModelProperty("光伏用电量") private BigDecimal greenElectricity; @ApiModelProperty("储能充电量") private BigDecimal storageCharge; @ApiModelProperty("储能放电量") private BigDecimal storageDisCharge; } ruoyi-service/ruoyi-other/src/main/resources/mapper/other/TScreenContentMapper.xml
New file @@ -0,0 +1,25 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.other.mapper.TScreenContentMapper"> <select id="getCarDisCharge" resultType="java.math.BigDecimal"> select sum(car_discharge) FROM t_screen_content WHERE site_id in <foreach item="item" index="index" collection="siteIds" open="(" separator="," close=")"> #{item} </foreach> </select> <select id="getGreenElectricity" resultType="java.math.BigDecimal"> select sum(green_electricity) FROM t_screen_content WHERE site_id in <foreach item="item" index="index" collection="siteIds" open="(" separator="," close=")"> #{item} </foreach> </select> </mapper>