Pu Zhibing
7 天以前 7a4f9541331bef779a506b38a27ed5c3373c0bec
开发二级等保功能及心跳消息队列修改
10个文件已修改
2个文件已删除
5个文件已添加
489 ■■■■■ 已修改文件
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrderSummaryData.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/resources/banner.txt 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/RuoYiSystemApplication.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/TaskUtil.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderSummaryDataMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/ITChargingOrderSummaryDataService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java 153 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderSummaryDataServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderSummaryDataMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrderSummaryData.java
New file
@@ -0,0 +1,55 @@
package com.ruoyi.order.api.model;
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 lombok.Data;
import java.math.BigDecimal;
/**
 * @author zhibing.pu
 * @Date 2025/5/9 11:35
 */
@Data
@TableName("t_charging_order_summary_data")
public class TChargingOrderSummaryData {
    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.NONE)
    private Long id;
    /**
     * 充电订单id
     */
    @TableField("charging_order_id")
    private Long chargingOrderId;
    /**
     * 充电时长(s)
     */
    @TableField("charging_duration")
    private Long chargingDuration;
    /**
     * 充电度数
     */
    @TableField("charging_capacity")
    private BigDecimal chargingCapacity;
    /**
     * 收入
     */
    @TableField("income")
    private BigDecimal income;
    /**
     * 电费
     */
    @TableField("electric_price")
    private BigDecimal electricPrice;
    /**
     * 服务费
     */
    @TableField("service_price")
    private BigDecimal servicePrice;
}
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java
@@ -61,13 +61,9 @@
        claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId);
        claimsMap.put(SecurityConstants.USER_TYPE, "system");
        claimsMap.put(SecurityConstants.DETAILS_USERNAME, userName);
        String token1 = JwtUtils.createToken(claimsMap);
        String userKey = getUserKey(loginUser.getUserid());
        redisService.setCacheObject(userKey, token1, expireTime, TimeUnit.MINUTES);
        // 接口返回信息
        Map<String, Object> rspMap = new HashMap<String, Object>();
        rspMap.put("access_token", token1);
        rspMap.put("access_token", JwtUtils.createToken(claimsMap));
        rspMap.put("expires_in", expireTime);
        return rspMap;
    }
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java
@@ -87,11 +87,6 @@
        addHeader(mutate, SecurityConstants.DETAILS_USER_ID, userid);
        addHeader(mutate, SecurityConstants.DETAILS_USERNAME, username);
        addHeader(mutate, SecurityConstants.USER_TYPE, userType);
        //管理后台记录用户最后一次的操作时间,用于判定30分钟无操作后删除token,退出登录
        if("system".equals(userType)){
            addLastTime(userid, url);
        }
        // 内部请求来源参数清除
        removeHeader(mutate, SecurityConstants.FROM_SOURCE);
        return chain.filter(exchange.mutate().request(mutate.build()).build());
@@ -113,25 +108,6 @@
    private Mono<Void> unauthorizedResponse(ServerWebExchange exchange, String msg) {
        log.error("[鉴权异常处理]请求路径:{}", exchange.getRequest().getPath() + "\n" + msg);
        return ServletUtils.webFluxResponseWriter(exchange.getResponse(), msg, HttpStatus.UNAUTHORIZED);
    }
    /**
     * 记录用户最后一次操作的时间
     * @param userid
     * @param url
     */
    private void addLastTime(String userid, String url){
        Object lastTime = redisService.getCacheObject("lastTime:" + userid);
        if(null == lastTime){
            redisService.setCacheObject("lastTime:" + userid, System.currentTimeMillis());
        }else{
            Long last = Long.valueOf(lastTime.toString());
            //操作登录或者时间差值小于30分钟,写入新的数据到缓存中
            if("/auth/login".equals(url) || System.currentTimeMillis() - last < 1800000L){
                redisService.setCacheObject("lastTime:" + userid, System.currentTimeMillis());
            }
        }
    }
    
    
ruoyi-gateway/src/main/resources/banner.txt
File was deleted
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/RuoYiSystemApplication.java
@@ -19,7 +19,6 @@
@MapperScan({"com.ruoyi.system.mapper"})
@EnableCustomSwagger2
@EnableRyFeignClients
@EnableScheduling//开启定时任务
@SpringBootApplication
@EnableTransactionManagement
public class RuoYiSystemApplication
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/TaskUtil.java
File was deleted
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -24,6 +24,7 @@
        <result property="updateTime"   column="update_time"  />
        <result property="forbiddenRemark"           column="forbidden_remark"/>
        <result property="remark"       column="remark"       />
        <result property="passWordUpdate"       column="passWordUpdate"       />
        <result property="roleType"       column="roleType"       />
        <result property="objectId"       column="objectId"       />
        <association property="dept"    column="dept_id" javaType="com.ruoyi.system.api.domain.SysDept" resultMap="deptResult" />
@@ -49,7 +50,7 @@
    </resultMap>
    
    <sql id="selectUserVo">
        select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
        select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,u.passWordUpdate,
        d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status,
        r.role_id, r.role_name, r.role_key, r.data_scope, r.status as role_status ,u.roleType as roleType,u.objectId AS objectId
        from sys_user u
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java
@@ -4,7 +4,9 @@
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.chargingPile.api.dto.CheckChargingStrategyDTO;
import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyDetailClient;
import com.ruoyi.chargingPile.api.feignClient.ChargingPileClient;
import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
import com.ruoyi.chargingPile.api.vo.UpdateChargingPileStatusVo;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.integration.api.model.*;
@@ -21,6 +23,7 @@
import org.apache.rocketmq.client.producer.SendResult;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@@ -30,6 +33,7 @@
import java.io.IOException;
import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
 * iotda消息监听
@@ -47,6 +51,12 @@
    private IotMessageProduce iotMessageProduce;
    @Resource
    private AccountingStrategyDetailClient accountingStrategyDetailClient;
    @Resource
    private RedisTemplate redisTemplate;
    @Resource
    private ChargingPileClient chargingPileClient;
    
    
    
@@ -99,7 +109,10 @@
                break;
            case SendTagConstant.PING:
                PingMessage pingMessage = JSON.parseObject(content.toJSONString(),PingMessage.class);
                sendResult = enhanceProduce.pingMessage(pingMessage);
                //存储缓存中,5分钟有效
                redisTemplate.opsForValue().set("ping:" + pingMessage.getCharging_pile_code() + pingMessage.getCharging_gun_code(), pingMessage, 5, TimeUnit.MINUTES);
                sendResult = null;
//                sendResult = enhanceProduce.pingMessage(pingMessage);
//                chargingMessage.setPingMessage(pingMessage);
//                chargingMessageUtil.handleMessage(chargingMessage);
                // 响应硬件
@@ -108,6 +121,22 @@
                pong.setCharging_gun_code(pingMessage.getCharging_gun_code());
                pong.setCharging_gun_status(0);
                iotMessageProduce.sendMessage(pong.getCharging_pile_code(), ServiceIdMenu.PONG.getKey(), messageUtil.pong(pong));
                UpdateChargingPileStatusVo vo1 = new UpdateChargingPileStatusVo();
                vo1.setGun_code(pingMessage.getCharging_gun_code());
                vo1.setPile_code(pingMessage.getCharging_pile_code());
                vo1.setStatus(pingMessage.getCharging_gun_status());
                chargingPileClient.updateChargingPileStatus(vo1);
                // 监管平台推送充电设备状态
                String gunCode = pingMessage.getCharging_pile_code() + pingMessage.getCharging_gun_code();
                ChargingMessage chargingMessage1 = new ChargingMessage();
                chargingMessage1.setServiceId(SendTagConstant.GUN_STATUS);
                GunStatusMessage gunStatusMessage = new GunStatusMessage();
                gunStatusMessage.setFullNumber(gunCode);
                chargingMessage1.setGunStatusMessage(gunStatusMessage);
                sendResult = enhanceProduce.gunStatusMessage(chargingMessage1);
//                sendResult = enhanceProduce.chargingMessage(chargingMessage);
                break;
            case SendTagConstant.END_CHARGE:
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -1943,6 +1943,7 @@
    @PostMapping(value = "/work/chargeDetail")
    @ApiOperation(value = "运营情况", tags = {"管理后台-工作台"})
    public R workCharge(@RequestBody ChargingDetailQueryDto statisticsQueryDto) {
        try {
        List<Integer> siteIds = new ArrayList<>();
        if (statisticsQueryDto.getSiteId() == null) {
            Long userId = tokenService.getLoginUser().getUserid();
@@ -2037,6 +2038,9 @@
            }
            return R.ok(dateRangeStatistics);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return R.ok();
@@ -2345,4 +2349,14 @@
        return chargingOrderService.pushOrderInfo(code);
    }
    
    /**
     * 添加汇总数据(临时)
     * @return
     */
    @ResponseBody
    @GetMapping(value = "/addChargingOrderSummaryData")
    public R addChargingOrderSummaryData(){
        return chargingOrderService.addChargingOrderSummaryData();
    }
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java
@@ -55,7 +55,7 @@
                                            @Param("pageCurr") Integer pageCurr, @Param("pageSize") Integer pageSize);
    List<ChargingOrderVO> chargingOrder(@Param("pageInfo") PageInfo<ChargingOrderVO> pageInfo, @Param("req") ChargingOrderQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2,@Param("endTime1") String endTime1,@Param("endTime2") String endTime11);
    List<ChargingOrderVO> chargingOrderNolimit( @Param("req") ChargingOrderQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2,@Param("endTime1") String endTime1,@Param("endTime2") String endTime11);
    Map<String, Object> chargingOrderNolimit( @Param("req") ChargingOrderQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2,@Param("endTime1") String endTime1,@Param("endTime2") String endTime11);
    List<PayOrderDto> payOrderQuery(@Param("pageInfo")PageInfo<PayOrderDto> pageInfo,@Param("data") PayOrderQueryDto payOrderQueryDto);
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderSummaryDataMapper.java
New file
@@ -0,0 +1,11 @@
package com.ruoyi.order.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.order.api.model.TChargingOrderSummaryData;
/**
 * @author zhibing.pu
 * @Date 2025/5/9 11:39
 */
public interface TChargingOrderSummaryDataMapper extends BaseMapper<TChargingOrderSummaryData> {
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/ITChargingOrderSummaryDataService.java
New file
@@ -0,0 +1,11 @@
package com.ruoyi.order.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.order.api.model.TChargingOrderSummaryData;
/**
 * @author zhibing.pu
 * @Date 2025/5/9 11:39
 */
public interface ITChargingOrderSummaryDataService extends IService<TChargingOrderSummaryData> {
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java
@@ -319,4 +319,7 @@
     * @return
     */
    R pushOrderInfo(String code);
    R addChargingOrderSummaryData();
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -211,6 +211,9 @@
    @Resource
    private TransactionRecordClient transactionRecordClient;
    @Resource
    private ITChargingOrderSummaryDataService chargingOrderSummaryDataService;
@@ -1476,42 +1479,50 @@
//                .eq(TChargingOrderRefund::getRefundStatus,2).list();
    
    
        List<ChargingOrderVO> list1 = this.baseMapper.chargingOrderNolimit(dto,startTime1,startTime2,endTime1,endTime2);
        for (ChargingOrderVO chargingOrderVO : list1) {
            if(null == chargingOrderVO.getStatus() || 5 != chargingOrderVO.getStatus()){
                continue;
            }
            List<TChargingOrderAccountingStrategy> list4 = list3.stream().filter(e -> e.getChargingOrderId().equals(chargingOrderVO.getId())).collect(Collectors.toList());
            BigDecimal electronic_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal service_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal chargingCapacity = list4.stream().map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
            electronicMoney = electronicMoney.add(electronic_reduce);
            total = total.add(chargingCapacity);
            if (!chargingOrderVO.getOrderSource().equals(2)) {
                serviceMoney = serviceMoney.add(service_reduce);
                paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce);
            }else{
                serviceMoney = serviceMoney.add(service_reduce.multiply(new BigDecimal("0.8")));
                paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce.multiply(new BigDecimal("0.8")));
            }
            if (chargingOrderVO.getStartTime()!=null && chargingOrderVO.getEndTime()!=null){
                LocalDateTime startTime = chargingOrderVO.getStartTime();
                LocalDateTime endTime = chargingOrderVO.getEndTime();
                // 计算时间差 单位秒
                long between = ChronoUnit.SECONDS.between(startTime, endTime);
                time+=between;
            }
//            List<TChargingOrderRefund> list2 = chargingOrderRefunds.stream().filter(e -> e.getChargingOrderId() != null && e.getChargingOrderId().equals(chargingOrderVO.getId()))
//                    .collect(Collectors.toList());
//            for (TChargingOrderRefund tChargingOrderRefund : list2) {
//                refundMoney = refundMoney.add(tChargingOrderRefund.getRefundTotalAmount());
        Map<String, Object> map = this.baseMapper.chargingOrderNolimit(dto,startTime1,startTime2,endTime1,endTime2);
//        for (ChargingOrderVO chargingOrderVO : list1) {
//            if(null == chargingOrderVO.getStatus() || 5 != chargingOrderVO.getStatus()){
//                continue;
//            }
//            List<TChargingOrderAccountingStrategy> list4 = list3.stream().filter(e -> e.getChargingOrderId().equals(chargingOrderVO.getId())).collect(Collectors.toList());
//            BigDecimal electronic_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
//            BigDecimal service_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
//            BigDecimal chargingCapacity = list4.stream().map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
//            electronicMoney = electronicMoney.add(electronic_reduce);
//            total = total.add(chargingCapacity);
//            if (!chargingOrderVO.getOrderSource().equals(2)) {
//                serviceMoney = serviceMoney.add(service_reduce);
//                paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce);
//            }else{
//                serviceMoney = serviceMoney.add(service_reduce.multiply(new BigDecimal("0.8")));
//                paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce.multiply(new BigDecimal("0.8")));
//            }
//            if (chargingOrderVO.getStartTime()!=null && chargingOrderVO.getEndTime()!=null){
//                LocalDateTime startTime = chargingOrderVO.getStartTime();
//                LocalDateTime endTime = chargingOrderVO.getEndTime();
//                // 计算时间差 单位秒
//                long between = ChronoUnit.SECONDS.between(startTime, endTime);
//                time+=between;
//            }
////            List<TChargingOrderRefund> list2 = chargingOrderRefunds.stream().filter(e -> e.getChargingOrderId() != null && e.getChargingOrderId().equals(chargingOrderVO.getId()))
////                    .collect(Collectors.toList());
////            for (TChargingOrderRefund tChargingOrderRefund : list2) {
////                refundMoney = refundMoney.add(tChargingOrderRefund.getRefundTotalAmount());
////            }
//        }
        if(null != map){
            tCharingOrderVO.setTotal(map.get("total")==null?BigDecimal.ZERO:(BigDecimal) map.get("total"));
            tCharingOrderVO.setTime(map.get("time")==null?0L:(Long) map.get("time"));
            tCharingOrderVO.setIncome((map.get("paymentMoney")==null?BigDecimal.ZERO:(BigDecimal) map.get("paymentMoney")).setScale(2, BigDecimal.ROUND_HALF_EVEN));
            tCharingOrderVO.setElectronicMoney((map.get("electronicMoney")==null?BigDecimal.ZERO:(BigDecimal) map.get("electronicMoney")).setScale(2, BigDecimal.ROUND_HALF_EVEN));
            tCharingOrderVO.setServiceMoney((map.get("serviceMoney")==null?BigDecimal.ZERO:(BigDecimal) map.get("serviceMoney")).setScale(2, BigDecimal.ROUND_HALF_EVEN));
        }else{
            tCharingOrderVO.setTotal(BigDecimal.ZERO);
            tCharingOrderVO.setTime(0L);
            tCharingOrderVO.setIncome(BigDecimal.ZERO);
            tCharingOrderVO.setElectronicMoney(BigDecimal.ZERO);
            tCharingOrderVO.setServiceMoney(BigDecimal.ZERO);
        }
        tCharingOrderVO.setTotal(total);
        tCharingOrderVO.setTime(time);
        tCharingOrderVO.setIncome(paymentMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN));
        tCharingOrderVO.setElectronicMoney(electronicMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN));
        tCharingOrderVO.setServiceMoney(serviceMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN));
        pageInfo.setRecords(list);
        tCharingOrderVO.setList(pageInfo);
        return tCharingOrderVO;
@@ -2614,6 +2625,36 @@
                
            }
        }
        //添加汇总统计数据
        List<TChargingOrderAccountingStrategy> list4 = chargingOrderAccountingStrategyService.list(new QueryWrapper<TChargingOrderAccountingStrategy>().eq("charging_order_id", chargingOrder.getId()));
        BigDecimal electronic_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
        BigDecimal service_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
        BigDecimal chargingCapacity = list4.stream().map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
        BigDecimal serviceMoney = BigDecimal.ZERO;
        BigDecimal paymentMoney = BigDecimal.ZERO;
        long time = 0;
        if (!chargingOrder.getOrderSource().equals(2)) {
            serviceMoney = serviceMoney.add(service_reduce);
            paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce);
        }else{
            serviceMoney = serviceMoney.add(service_reduce.multiply(new BigDecimal("0.8")));
            paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce.multiply(new BigDecimal("0.8")));
        }
        if (chargingOrder.getStartTime()!=null && chargingOrder.getEndTime()!=null){
            LocalDateTime startTime = chargingOrder.getStartTime();
            LocalDateTime endTime = chargingOrder.getEndTime();
            // 计算时间差 单位秒
            time = ChronoUnit.SECONDS.between(startTime, endTime);
        }
        TChargingOrderSummaryData summaryData = new TChargingOrderSummaryData();
        summaryData.setChargingOrderId(chargingOrder.getId());
        summaryData.setChargingCapacity(chargingCapacity);
        summaryData.setChargingDuration(time);
        summaryData.setIncome(paymentMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN));
        summaryData.setElectricPrice(electronic_reduce.setScale(2, BigDecimal.ROUND_HALF_EVEN));
        summaryData.setServicePrice(serviceMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN));
        chargingOrderSummaryDataService.save(summaryData);
        return R.ok();
    }
    
@@ -3979,4 +4020,48 @@
        tcecClient.notificationChargeOrderInfo(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
        return R.ok();
    }
    public R addChargingOrderSummaryData(){
        List<TChargingOrderAccountingStrategy> list3 = chargingOrderAccountingStrategyService.list();
        List<TChargingOrder> list1 = this.list(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getDelFlag, 0));
        for (TChargingOrder chargingOrderVO : list1) {
            if(null == chargingOrderVO.getStatus() || 5 != chargingOrderVO.getStatus()){
                continue;
            }
            List<TChargingOrderAccountingStrategy> list4 = list3.stream().filter(e -> e.getChargingOrderId().equals(chargingOrderVO.getId())).collect(Collectors.toList());
            BigDecimal electronic_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal service_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal chargingCapacity = list4.stream().map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal serviceMoney = new BigDecimal("0");
            BigDecimal paymentMoney = new BigDecimal("0");
            if (!chargingOrderVO.getOrderSource().equals(2)) {
                serviceMoney = serviceMoney.add(service_reduce);
                paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce);
            }else{
                serviceMoney = serviceMoney.add(service_reduce.multiply(new BigDecimal("0.8")));
                paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce.multiply(new BigDecimal("0.8")));
            }
            Long time = 0L;
            if (chargingOrderVO.getStartTime()!=null && chargingOrderVO.getEndTime()!=null){
                LocalDateTime startTime = chargingOrderVO.getStartTime();
                LocalDateTime endTime = chargingOrderVO.getEndTime();
                // 计算时间差 单位秒
                long between = ChronoUnit.SECONDS.between(startTime, endTime);
                time+=between;
            }
            TChargingOrderSummaryData summaryData = new TChargingOrderSummaryData();
            summaryData.setChargingOrderId(chargingOrderVO.getId());
            summaryData.setChargingCapacity(chargingCapacity);
            summaryData.setChargingDuration(time);
            summaryData.setIncome(paymentMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN));
            summaryData.setElectricPrice(electronic_reduce.setScale(2, BigDecimal.ROUND_HALF_EVEN));
            summaryData.setServicePrice(serviceMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN));
            chargingOrderSummaryDataService.save(summaryData);
        }
        return R.ok();
    }
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderSummaryDataServiceImpl.java
New file
@@ -0,0 +1,15 @@
package com.ruoyi.order.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.order.api.model.TChargingOrderSummaryData;
import com.ruoyi.order.mapper.TChargingOrderSummaryDataMapper;
import com.ruoyi.order.service.ITChargingOrderSummaryDataService;
import org.springframework.stereotype.Service;
/**
 * @author zhibing.pu
 * @Date 2025/5/9 11:40
 */
@Service
public class TChargingOrderSummaryDataServiceImpl extends ServiceImpl<TChargingOrderSummaryDataMapper, TChargingOrderSummaryData> implements ITChargingOrderSummaryDataService {
}
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
@@ -1446,6 +1446,13 @@
    </select>
    <select id="getHourType" resultType="java.util.Map">
        select
        aa.time,
        sum(aa.servicecharge) as servicecharge,
        sum(aa.electrovalence) as electrovalence,
        sum(aa.electricity) as electricity,
        count(1) as orderCount
        from (
        SELECT
            DATE_FORMAT(
        <if test="statisticsQueryDto.type == 1">
@@ -1455,37 +1462,40 @@
            a.end_time
        </if>
        , '%H:00' ) as time,
        SUM(CASE
        (CASE
        WHEN a.order_source = 0 THEN b.period_service_price
        WHEN a.order_source = 1 THEN b.period_service_price
        ELSE b.period_service_price * 0.8
        END) as servicecharge,
        SUM(b.period_electric_price) as electrovalence,
        SUM(b.charging_capacity) as electricity,
        count(1) as orderCount
        (b.period_electric_price) as electrovalence,
        (b.charging_capacity) as electricity
        FROM
            t_charging_order a
        left join (select charging_order_id, sum(period_electric_price) as period_electric_price, sum(period_service_price) as period_service_price, sum(charging_capacity) as charging_capacity, sum(period_electric_price + period_service_price) as money from t_charging_order_accounting_strategy group by charging_order_id) b on (a.id = b.charging_order_id)
        WHERE a.del_flag = 0 and a.status = 5 and a.recharge_payment_status = 2  and DATE(
        WHERE a.del_flag = 0 and a.status = 5 and a.recharge_payment_status = 2  and DATE_FORMAT(
        <if test="statisticsQueryDto.type == 1">
            a.create_time
        </if>
        <if test="statisticsQueryDto.type == 2">
            a.end_time
        </if>
        ) = #{statisticsQueryDto.hourDate}
        , '%Y-%m-%d') = #{statisticsQueryDto.hourDate}
        <if test="siteIds != null and siteIds.size() > 0">
            and a.site_id IN
            <foreach collection="siteIds" item="siteId" open="(" separator="," close=")">
                #{siteId}
            </foreach>
        </if>
        GROUP BY
            time
        ORDER BY
            time
        ) as aa GROUP BY aa.time ORDER BY aa.time
    </select>
    <select id="getDateType" resultType="java.util.Map">
        select
        aa.time,
        sum(aa.servicecharge) as servicecharge,
        sum(aa.electrovalence) as electrovalence,
        sum(aa.electricity) as electricity,
        count(1) as orderCount
        from (
        SELECT
        DATE_FORMAT(
        <if test="statisticsQueryDto.type == 1">
@@ -1495,37 +1505,40 @@
            a.end_time
        </if>
        , '%Y-%m-%d' ) as time,
        SUM(CASE
        (CASE
        WHEN a.order_source = 0 THEN b.period_service_price
        WHEN a.order_source = 1 THEN b.period_service_price
        ELSE b.period_service_price * 0.8
        END) as servicecharge,
        SUM(b.period_electric_price) as electrovalence,
        SUM(b.charging_capacity) as electricity,
        count(1) as orderCount
        (b.period_electric_price) as electrovalence,
        (b.charging_capacity) as electricity
        FROM
        t_charging_order a
        left join (select charging_order_id, sum(period_electric_price) as period_electric_price, sum(period_service_price) as period_service_price, sum(charging_capacity) as charging_capacity, sum(period_electric_price + period_service_price) as money from t_charging_order_accounting_strategy group by charging_order_id) b on (a.id = b.charging_order_id)
        WHERE a.del_flag = 0 and a.status = 5 and a.recharge_payment_status = 2  and DATE(
        WHERE a.del_flag = 0 and a.status = 5 and a.recharge_payment_status = 2  and DATE_FORMAT(
        <if test="statisticsQueryDto.type == 1">
            a.start_time
        </if>
        <if test="statisticsQueryDto.type == 2">
            a.end_time
        </if>
        ) between #{statisticsQueryDto.startTime} and #{statisticsQueryDto.endTime}
        , '%Y-%m-%d') between #{statisticsQueryDto.startTime} and #{statisticsQueryDto.endTime}
        <if test="siteIds != null and siteIds.size() > 0">
            and a.site_id IN
            <foreach collection="siteIds" item="siteId" open="(" separator="," close=")">
                #{siteId}
            </foreach>
        </if>
        GROUP BY
        time
        ORDER BY
        time
        ) as aa GROUP BY aa.time ORDER BY aa.time
    </select>
    <select id="getMonthType" resultType="java.util.Map">
        select
        aa.time,
        sum(aa.servicecharge) as servicecharge,
        sum(aa.electrovalence) as electrovalence,
        sum(aa.electricity) as electricity,
        count(1) as orderCount
        from (
        SELECT
        DATE_FORMAT(
        <if test="statisticsQueryDto.type == 1">
@@ -1535,37 +1548,31 @@
            a.end_time
        </if>
        , '%Y-%m' ) as time,
        SUM(CASE
        (CASE
        WHEN a.order_source = 0 THEN b.period_service_price
        WHEN a.order_source = 1 THEN b.period_service_price
        ELSE b.period_service_price * 0.8
        END) as servicecharge,
        SUM(b.period_electric_price) as electrovalence,
        SUM(b.charging_capacity) as electricity,
        count(1) as orderCount
        (b.period_electric_price) as electrovalence,
        (b.charging_capacity) as electricity
        FROM
        t_charging_order a
        left join (select charging_order_id, sum(period_electric_price) as period_electric_price, sum(period_service_price) as period_service_price, sum(charging_capacity) as charging_capacity, sum(period_electric_price + period_service_price) as money from t_charging_order_accounting_strategy group by charging_order_id) b on (a.id = b.charging_order_id)
        WHERE a.del_flag = 0 and a.status = 5 and a.recharge_payment_status = 2  and DATE(
        WHERE a.del_flag = 0 and a.status = 5 and a.recharge_payment_status = 2  and DATE_FORMAT(
        <if test="statisticsQueryDto.type == 1">
            a.start_time
        </if>
        <if test="statisticsQueryDto.type == 2">
            a.end_time
        </if>
        ) between #{statisticsQueryDto.startTime} and #{statisticsQueryDto.endTime}
        , '%Y-%m-%d') between #{statisticsQueryDto.startTime} and #{statisticsQueryDto.endTime}
        <if test="siteIds != null and siteIds.size() > 0">
            and a.site_id IN
            <foreach collection="siteIds" item="siteId" open="(" separator="," close=")">
                #{siteId}
            </foreach>
        </if>
        GROUP BY
        time
        ORDER BY
        time
        ) as aa GROUP BY aa.time ORDER BY aa.time
    </select>
    <select id="getchargingCapacity" resultType="java.util.Map">
        SELECT
@@ -1680,8 +1687,16 @@
        </foreach>
        </if>
    </select>
    <select id="chargingOrderNolimit" resultType="com.ruoyi.order.api.vo.ChargingOrderVO">
        select t1.*
    <select id="chargingOrderNolimit" resultType="map">
        select
        sum(charging_capacity) as total,
        sum(charging_duration) as `time`,
        sum(electric_price) as electronicMoney,
        sum(income) as paymentMoney,
        sum(service_price) as serviceMoney
        from t_charging_order_summary_data
        where charging_order_id in (
        select t1.id
        from t_charging_order t1
        where 1=1
        <if test="null != req.code and req.code!=''">
@@ -1730,6 +1745,6 @@
            and (t1.end_time between #{endTime1} and #{endTime2})
        </if>
        and t1.del_flag = 0
        order by t1.create_time desc
        )
    </select>
</mapper>
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderSummaryDataMapper.xml
New file
@@ -0,0 +1,5 @@
<?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.order.mapper.TChargingOrderSummaryDataMapper">
</mapper>