huliguo
21 小时以前 a432ff3c95923f9929236de9f7a9224e8517bb70
大屏
11个文件已修改
15个文件已添加
882 ■■■■■ 已修改文件
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ChargingGunFallbackFactory.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ChargingGunClient.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TScreenContent.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChargingBillController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderCountByDate.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/StatisticsOfBatteryVO.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TScreenContentController.java 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/TScreenContentMapper.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/TScreenContentService.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TScreenContentServiceImpl.java 166 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/EnergyRefreshService.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/EmissionReductionVO.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/EnergyStorageDischargeVO.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/PhotovoltaicAndConsumptionVO.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/PhotovoltaicPowerGenerationVO.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ScreenStorageConfigVO.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ScreenTopVO.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/TScreenContentMapper.xml 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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>