Pu Zhibing
2 天以前 9bc378e6bb9b4563a0dec222e1c2d5d3278632cb
修改bug
19个文件已修改
2217 ■■■■ 已修改文件
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ChargingGunFallbackFactory.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ChargingGunClient.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingPileController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/TCECCJianGuanontroller.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/TaskUtil.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/produce/IotMessageProduce.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/ChargingMessageUtil.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java 495 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml 922 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/RuoYiOrderApplicationTests.java 528 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ChargingGunFallbackFactory.java
@@ -5,6 +5,7 @@
import com.ruoyi.chargingPile.api.model.TChargingGun;
import com.ruoyi.chargingPile.api.model.TChargingPile;
import com.ruoyi.chargingPile.api.model.TFaultMessage;
import com.ruoyi.chargingPile.api.vo.GetChargingGunByChargingPileIdsVo;
import com.ruoyi.chargingPile.api.vo.GetChargingGunByCode;
import com.ruoyi.chargingPile.api.vo.SiteNameVO;
import com.ruoyi.common.core.domain.R;
@@ -72,7 +73,7 @@
            }
    
            @Override
            public R<List<TChargingGun>> getChargingGunByChargingPileIds(List<Integer> chargingPileIds) {
            public R<List<TChargingGun>> getChargingGunByChargingPileIds(GetChargingGunByChargingPileIdsVo vo) {
                return R.fail("根据充电桩ids获取枪失败:" + throwable.getMessage());
            }
    
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ChargingGunClient.java
@@ -3,6 +3,7 @@
import com.ruoyi.chargingPile.api.factory.ChargingGunFallbackFactory;
import com.ruoyi.chargingPile.api.model.TChargingGun;
import com.ruoyi.chargingPile.api.model.TChargingPile;
import com.ruoyi.chargingPile.api.vo.GetChargingGunByChargingPileIdsVo;
import com.ruoyi.chargingPile.api.vo.GetChargingGunByCode;
import com.ruoyi.chargingPile.api.vo.SiteNameVO;
import com.ruoyi.common.core.constant.ServiceNameConstants;
@@ -83,11 +84,10 @@
    
    /**
     * 根据充电桩ids获取枪
     * @param chargingPileIds
     * @return
     */
    @PostMapping("/t-charging-gun/getChargingGunByChargingPileIds")
    R<List<TChargingGun>> getChargingGunByChargingPileIds(@RequestParam("chargingPileIds") List<Integer> chargingPileIds);
    R<List<TChargingGun>> getChargingGunByChargingPileIds(@RequestBody GetChargingGunByChargingPileIdsVo vo);
    
    
    
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
@@ -190,7 +190,7 @@
            Address[] allRecipients = {toMail, toMail2};
            message.setRecipients(Message.RecipientType.TO, allRecipients);
            // Set Subject: 邮件主体
            message.setSubject("明星电力");
            message.setSubject("明星新能源充电开票");
            // 设置消息体
            message.setSentDate(new Date());
            javax.mail.internet.MimeMultipart msgMultipart = new MimeMultipart("mixed");
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java
@@ -326,12 +326,14 @@
    
    /**
     * 根据充电桩ids获取枪
     * @param chargingPileIds
     * @return
     */
    @PostMapping("/getChargingGunByChargingPileIds")
    public R<List<TChargingGun>> getChargingGunByChargingPileIds(@RequestParam("chargingPileIds") List<Integer> chargingPileIds){
        List<TChargingGun> list = chargingGunService.list(new LambdaQueryWrapper<TChargingGun>().in(TChargingGun::getChargingPileId, chargingPileIds)
    public R<List<TChargingGun>> getChargingGunByChargingPileIds(@RequestBody GetChargingGunByChargingPileIdsVo vo){
        if(vo.getChargingPileIds().isEmpty()){
            return R.ok(new ArrayList<>());
        }
        List<TChargingGun> list = chargingGunService.list(new LambdaQueryWrapper<TChargingGun>().in(TChargingGun::getChargingPileId, vo.getChargingPileIds())
                .eq(TChargingGun::getDelFlag, 0));
        return R.ok(list);
    }
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingPileController.java
@@ -267,7 +267,7 @@
                    @Override
                    public void run() {
                        //推送状态给三方平台
                        tcecClient.pushChargingGunStatus(tChargingGun.getFullNumber(), tChargingGun1.getStatus());
                        tcecClient.pushChargingGunStatus(tChargingGun.getFullNumber(), 2);
                    }
                }).start();
                
@@ -295,7 +295,7 @@
                    @Override
                    public void run() {
                        //推送状态给三方平台
                        tcecClient.pushChargingGunStatus(tChargingGun.getFullNumber(), tChargingGun1.getStatus());
                        tcecClient.pushChargingGunStatus(tChargingGun.getFullNumber(), 7);
                    }
                }).start();
                
@@ -348,7 +348,7 @@
                        @Override
                        public void run() {
                            //推送状态给三方平台
                            tcecClient.pushChargingGunStatus(tChargingGun.getFullNumber(), tChargingGun1.getStatus());
                            tcecClient.pushChargingGunStatus(tChargingGun.getFullNumber(), 5);
                        }
                    }).start();
                }else{
@@ -360,7 +360,7 @@
                        @Override
                        public void run() {
                            //推送状态给三方平台
                            tcecClient.pushChargingGunStatus(tChargingGun.getFullNumber(), tChargingGun1.getStatus());
                            tcecClient.pushChargingGunStatus(tChargingGun.getFullNumber(), 3);
                        }
                    }).start();
                }
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java
@@ -733,7 +733,7 @@
                @Override
                public void run() {
                    //推送状态给三方平台
                    tcecClient.pushChargingGunStatus(chargingGun1.getFullNumber(), chargingGun1.getStatus());
                    tcecClient.pushChargingGunStatus(chargingGun.getFullNumber(), 1);
                }
            }).start();
            
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java
@@ -5,6 +5,7 @@
import com.alibaba.nacos.common.utils.JacksonUtils;
import com.ruoyi.chargingPile.api.feignClient.*;
import com.ruoyi.chargingPile.api.model.*;
import com.ruoyi.chargingPile.api.vo.GetChargingGunByChargingPileIdsVo;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.dto.ChargingPercentProvinceDto;
import com.ruoyi.common.core.utils.StringUtils;
@@ -150,31 +151,7 @@
        }
        return baseResult;
    }
    public BaseResult requestCheckJianGuan(Boolean tokenCheck, BaseRequest baseRequest, HttpServletRequest request){
        Operator operator = new Operator();
        BaseResult baseResult = new BaseResult();
        baseResult.setRet(0);
        baseResult.setMsg("成功");
        baseResult.setOperatorID(baseRequest.getOperatorID());
        operator.setOperatorId(baseRequest.getOperatorID());
        Long mapKey = Long.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
        baseResult.setTimeStamp(mapKey);
        baseResult.setSeq("0001");
        //校验token和签名
        String operatorID = baseRequest.getOperatorID();
        String sig = baseRequest.getSig();
        Long timeStamp = baseRequest.getTimeStamp();
        String data = baseRequest.getData();
        String seq = baseRequest.getSeq();
        baseResult.setOperator(operator);
        if(StringUtils.isEmpty(operatorID) || StringUtils.isEmpty(sig) || StringUtils.isEmpty(data) || StringUtils.isEmpty(seq) || null == timeStamp){
            baseResult.setRet(4003);
            baseResult.setMsg("参数异常");
            return baseResult;
        }
        return baseResult;
    }
    
    
    
@@ -348,7 +325,9 @@
        List<Integer> siteIds = sites.stream().map(Site::getId).collect(Collectors.toList());
        List<TChargingPile> tChargingPiles = chargingPileClient.getChargingPileBySiteIds(siteIds).getData();
        List<Integer> collect1 = tChargingPiles.stream().map(TChargingPile::getId).collect(Collectors.toList());
        List<TChargingGun> chargingGunList = chargingGunClient.getChargingGunByChargingPileIds(collect1).getData();
        GetChargingGunByChargingPileIdsVo vo = new GetChargingGunByChargingPileIdsVo();
        vo.setChargingPileIds(collect1);
        List<TChargingGun> chargingGunList = chargingGunClient.getChargingGunByChargingPileIds(vo).getData();
        String serviceTel = systemConfigurationClient.getServerPhone().getData();
        List<StationInfo> StationInfos = new ArrayList<>();
        for (Site datum : sites) {
@@ -651,7 +630,9 @@
        List<Integer> siteIds = data.stream().map(Site::getId).collect(Collectors.toList());
        List<TChargingPile> tChargingPiles = chargingPileClient.getChargingPileBySiteIds(siteIds).getData();
        List<Integer> collect1 = tChargingPiles.stream().map(TChargingPile::getId).collect(Collectors.toList());
        List<TChargingGun> chargingGunList = chargingGunClient.getChargingGunByChargingPileIds(collect1).getData();
        GetChargingGunByChargingPileIdsVo vo = new GetChargingGunByChargingPileIdsVo();
        vo.setChargingPileIds(collect1);
        List<TChargingGun> chargingGunList = chargingGunClient.getChargingGunByChargingPileIds(vo).getData();
        
        QueryStationStatusResult result = new QueryStationStatusResult();
        result.setTotal(data.size());
@@ -1896,7 +1877,9 @@
        List<TChargingPile> chargingPiles = chargingPileClient.getChargingPileBySiteIds(stationIDList).getData();
        if(!CollectionUtils.isEmpty(chargingPiles)){
            List<Integer> pileIds = chargingPiles.stream().map(TChargingPile::getId).collect(Collectors.toList());
            List<TChargingGun> chargingGuns = chargingGunClient.getChargingGunByChargingPileIds(pileIds).getData();
            GetChargingGunByChargingPileIdsVo vo = new GetChargingGunByChargingPileIdsVo();
            vo.setChargingPileIds(pileIds);
            List<TChargingGun> chargingGuns = chargingGunClient.getChargingGunByChargingPileIds(vo).getData();
            if(!CollectionUtils.isEmpty(chargingGuns)){
                for (Integer stationID : stationIDList) {
                    StationStatusInfo stationStatusInfo = new StationStatusInfo();
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/TCECCJianGuanontroller.java
@@ -8,6 +8,7 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ruoyi.chargingPile.api.feignClient.*;
import com.ruoyi.chargingPile.api.model.*;
import com.ruoyi.chargingPile.api.vo.GetChargingGunByChargingPileIdsVo;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.dto.ChargingPercentProvinceDto;
import com.ruoyi.common.core.utils.StringUtils;
@@ -287,7 +288,9 @@
        List<Integer> siteIds = sites.stream().map(Site::getId).collect(Collectors.toList());
        List<TChargingPile> tChargingPiles = chargingPileClient.getChargingPileBySiteIds(siteIds).getData();
        List<Integer> collect1 = tChargingPiles.stream().map(TChargingPile::getId).collect(Collectors.toList());
        List<TChargingGun> chargingGunList = chargingGunClient.getChargingGunByChargingPileIds(collect1).getData();
        GetChargingGunByChargingPileIdsVo vo = new GetChargingGunByChargingPileIdsVo();
        vo.setChargingPileIds(collect1);
        List<TChargingGun> chargingGunList = chargingGunClient.getChargingGunByChargingPileIds(vo).getData();
        String serviceTel = systemConfigurationClient.getServerPhone().getData();
        List<StationInfo> StationInfos = new ArrayList<>();
        for (Site datum : sites) {
@@ -595,7 +598,9 @@
        List<Integer> siteIds = data.stream().map(Site::getId).collect(Collectors.toList());
        List<TChargingPile> tChargingPiles = chargingPileClient.getChargingPileBySiteIds(siteIds).getData();
        List<Integer> collect1 = tChargingPiles.stream().map(TChargingPile::getId).collect(Collectors.toList());
        List<TChargingGun> chargingGunList = chargingGunClient.getChargingGunByChargingPileIds(collect1).getData();
        GetChargingGunByChargingPileIdsVo vo = new GetChargingGunByChargingPileIdsVo();
        vo.setChargingPileIds(collect1);
        List<TChargingGun> chargingGunList = chargingGunClient.getChargingGunByChargingPileIds(vo).getData();
        
        QueryStationStatusResult result = new QueryStationStatusResult();
        result.setTotal(data.size());
@@ -1929,7 +1934,9 @@
        List<TChargingPile> chargingPiles = chargingPileClient.getChargingPileBySiteIds(stationIDList).getData();
        if(!CollectionUtils.isEmpty(chargingPiles)){
            List<Integer> pileIds = chargingPiles.stream().map(TChargingPile::getId).collect(Collectors.toList());
            List<TChargingGun> chargingGuns = chargingGunClient.getChargingGunByChargingPileIds(pileIds).getData();
            GetChargingGunByChargingPileIdsVo vo = new GetChargingGunByChargingPileIdsVo();
            vo.setChargingPileIds(pileIds);
            List<TChargingGun> chargingGuns = chargingGunClient.getChargingGunByChargingPileIds(vo).getData();
            if(!CollectionUtils.isEmpty(chargingGuns)){
                for (Integer stationID : stationIDList) {
                    StationStatusInfo stationStatusInfo = new StationStatusInfo();
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/TaskUtil.java
@@ -5,6 +5,7 @@
import com.ruoyi.chargingPile.api.model.Site;
import com.ruoyi.chargingPile.api.model.TChargingGun;
import com.ruoyi.chargingPile.api.model.TChargingPile;
import com.ruoyi.chargingPile.api.vo.GetChargingGunByChargingPileIdsVo;
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.integration.drainage.TCECSuperviseUtil;
import com.ruoyi.integration.drainage.TokenUtil;
@@ -158,7 +159,9 @@
            List<Integer> siteIds = data.stream().filter(s->s.getStatus() == 1).map(Site::getId).collect(Collectors.toList());
            List<TChargingPile> tChargingPiles = chargingPileClient.getChargingPileBySiteIds(siteIds).getData();
            List<Integer> collect1 = tChargingPiles.stream().map(TChargingPile::getId).collect(Collectors.toList());
            List<TChargingGun> chargingGunList = chargingGunClient.getChargingGunByChargingPileIds(collect1).getData();
            GetChargingGunByChargingPileIdsVo vo = new GetChargingGunByChargingPileIdsVo();
            vo.setChargingPileIds(collect1);
            List<TChargingGun> chargingGunList = chargingGunClient.getChargingGunByChargingPileIds(vo).getData();
            SupStationPowerInfoResult supStationPowerInfoResult = new SupStationPowerInfoResult();
            List<SupStationPowerInfo> stationStatsInfos = new ArrayList<>();
            LocalDateTime now = LocalDateTime.now();
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java
@@ -66,7 +66,6 @@
     */
    @PostMapping(value = "/message")
    public AjaxResult<String> message(@RequestBody JSONObject jsonObject) throws IOException {
        log.info("接收到消息中转:{}",jsonObject.toJSONString());
        JSONObject body = jsonObject.getJSONObject("notify_data").getJSONObject("body");
        JSONObject content = null;
        try {
@@ -85,6 +84,9 @@
        String nodeId = header.getString("node_id"); // 设备编号
        String productId = header.getString("product_id"); // 产品id
        String service_id = content.getString("service_id");
        if(!SendTagConstant.PING.equals(service_id)){
            log.info("收到IOT发送的消息:{}",jsonObject.toJSONString());
        }
//        log.info("服务id:{}",service_id);
        ChargingMessage chargingMessage = new ChargingMessage();
        chargingMessage.setServiceId(service_id);
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/produce/IotMessageProduce.java
@@ -40,7 +40,6 @@
     */
    @PostMapping("/sendMessage")
    public String sendMessage(String code, String name, JSONObject message){
//        log.info("消息下发至设备:code={},name={},message={}", code, name, message);
        CreateMessageRequest request = new CreateMessageRequest();
        request.withDeviceId(code);
        DeviceMessageRequest body = new DeviceMessageRequest();
@@ -50,11 +49,9 @@
        request.withBody(body);
        try {
            CreateMessageResponse response = iotBuilder.buildIot().createMessage(request);
//            log.info("消息下发至设备结果:{}", JSON.toJSONString(response));
            return JSON.toJSONString(response);
        } catch (Exception e) {
            e.printStackTrace();
//            log.error("消息下发至设备异常:code---{},msg---{}", code, e.getMessage());
            return e.getMessage();
        }
    }
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/ChargingMessageUtil.java
@@ -107,7 +107,6 @@
    public void handleMessage(ChargingMessage message){
        log.info("收到的消息内容:{}",message);
        String serviceId = message.getServiceId();
        if(!StringUtils.hasLength(serviceId)){
            return;
@@ -115,7 +114,6 @@
        switch (serviceId){
            case SendTagConstant.ONLINE:
                OnlineMessage onlineMessage = message.getOnlineMessage();
                log.info("充电桩登录认证业务消息处理:{}",onlineMessage);
                // 持久化消息
                Online online = new Online();
                BeanUtils.copyProperties(onlineMessage,online);
@@ -123,7 +121,6 @@
                break;
            case SendTagConstant.PING:
                PingMessage pingMessage = message.getPingMessage();
                log.info("充电桩心跳包-业务消息处理:{}",pingMessage);
                // 持久化消息
                Ping ping = new Ping();
                BeanUtils.copyProperties(pingMessage,ping);
@@ -139,7 +136,6 @@
                break;
            case SendTagConstant.END_CHARGE:
                EndChargeMessage endChargeMessage = message.getEndChargeMessage();
                log.info("充电结束-业务消息处理:{}",endChargeMessage);
                // 持久化消息
                EndCharge endCharge = new EndCharge();
                BeanUtils.copyProperties(endChargeMessage,endCharge);
@@ -149,7 +145,6 @@
                break;
            case SendTagConstant.ERROR_MESSAGE:
                ErrorMessageMessage errorMessageMessage1 = message.getErrorMessageMessage();
                log.info("错误报文-业务消息处理:{}",errorMessageMessage1);
                // 持久化消息
//                ErrorMessageMessage errorMessageMessage = new ErrorMessageMessage();
//                BeanUtils.copyProperties(errorMessageMessage1,errorMessageMessage);
@@ -157,7 +152,6 @@
                break;
            case SendTagConstant.BILLING_MODE_VERIFY:
                BillingModeVerifyMessage billingModeVerifyMessage = message.getBillingModeVerifyMessage();
                log.info("计费模型验证请求-业务消息处理:{}",billingModeVerifyMessage);
                // 持久化消息
//                BillingModeVerify billingModeVerify = new BillingModeVerify();
//                BeanUtils.copyProperties(billingModeVerifyMessage,billingModeVerify);
@@ -165,7 +159,6 @@
                break;
            case SendTagConstant.ACQUISITION_BILLING_MODE:
                AcquisitionBillingModeMessage acquisitionBillingModeMessage = message.getAcquisitionBillingModeMessage();
                log.info("充电桩计费模型请求-业务消息处理:{}",acquisitionBillingModeMessage);
                // 持久化消息
                AcquisitionBillingMode acquisitionBillingMode = new AcquisitionBillingMode();
                BeanUtils.copyProperties(acquisitionBillingModeMessage,acquisitionBillingMode);
@@ -184,7 +177,6 @@
                }
                redisTemplate.opsForValue().set("upload_real_time_monitoring_data:" + transaction_serial_number, System.currentTimeMillis(), 1, TimeUnit.MINUTES);
                try {
                    log.info("上传实时监测数据-业务消息处理:{}",uploadRealTimeMonitoringDataMessage);
                    // 持久化消息
                    UploadRealTimeMonitoringData uploadRealTimeMonitoringData = new UploadRealTimeMonitoringData();
                    BeanUtils.copyProperties(uploadRealTimeMonitoringDataMessage,uploadRealTimeMonitoringData);
@@ -202,7 +194,6 @@
                        uploadRealTimeMonitoringData.setPeriod_charging_degree(uploadRealTimeMonitoringDataMessage.getCharging_degree().subtract(data.getCharging_degree()));
                        uploadRealTimeMonitoringData.setPeriod_service_price(uploadRealTimeMonitoringDataMessage.getCharging_degree().multiply(accountingStrategyDetail.getServiceCharge()).setScale(4, RoundingMode.HALF_UP));
                    }else {
                        log.info("首次上传实时监测数据");
                        uploadRealTimeMonitoringData.setPeriod_electric_price(uploadRealTimeMonitoringDataMessage.getPaid_amount());
                        uploadRealTimeMonitoringData.setPeriod_charging_degree(uploadRealTimeMonitoringDataMessage.getCharging_degree());
                        uploadRealTimeMonitoringData.setPeriod_service_price(uploadRealTimeMonitoringDataMessage.getCharging_degree().multiply(accountingStrategyDetail.getServiceCharge()).setScale(4, RoundingMode.HALF_UP));
@@ -225,7 +216,6 @@
                break;
            case SendTagConstant.CHARGING_HANDSHAKE:
                ChargingHandshakeMessage chargingHandshakeMessage = message.getChargingHandshakeMessage();
                log.info("充电握手-业务消息处理:{}",chargingHandshakeMessage);
                // 持久化消息
                ChargingHandshake chargingHandshake = new ChargingHandshake();
                BeanUtils.copyProperties(chargingHandshakeMessage,chargingHandshake);
@@ -233,7 +223,6 @@
                break;
            case SendTagConstant.PARAMETER_SETTING:
                ParameterSettingMessage parameterSettingMessage = message.getParameterSettingMessage();
                log.info("参数配置-业务消息处理:{}",parameterSettingMessage);
                // 持久化消息
//                ParameterSetting parameterSetting = new ParameterSetting();
//                BeanUtils.copyProperties(parameterSettingMessage,parameterSetting);
@@ -241,7 +230,6 @@
                break;
            case SendTagConstant.BMS_ABORT:
                BmsAbortMessage bmsAbortMessage = message.getBmsAbortMessage();
                log.info("充电阶段BMS中止-业务消息处理:{}",bmsAbortMessage);
                // 持久化消息
                BmsAbort bmsAbort = new BmsAbort();
                BeanUtils.copyProperties(bmsAbortMessage,bmsAbort);
@@ -251,7 +239,6 @@
                break;
            case SendTagConstant.MOTOR_ABORT:
                MotorAbortMessage motorAbortMessage = message.getMotorAbortMessage();
                log.info("充电阶段充电机中止-业务消息处理:{}",motorAbortMessage);
                // 持久化消息
                MotorAbort motorAbort = new MotorAbort();
                BeanUtils.copyProperties(motorAbortMessage,motorAbort);
@@ -261,7 +248,6 @@
                break;
            case SendTagConstant.BMS_DEMAND_AND_CHARGER_EXPORTATION:
                BmsDemandAndChargerExportationMessage bmsDemandAndChargerExportationMessage = message.getBmsDemandAndChargerExportationMessage();
                log.info("充电过程BMS需求、充电机输出-业务消息处理:{}",bmsDemandAndChargerExportationMessage);
                String transaction_serial_number1 = bmsDemandAndChargerExportationMessage.getTransaction_serial_number();
                Object o1 = redisTemplate.opsForValue().get("bms_demand_and_charger_exportation:" + transaction_serial_number1);
                if(null != o1){
@@ -286,7 +272,6 @@
                break;
            case SendTagConstant.BMS_INFORMATION:
                BmsInformationMessage bmsInformationMessage = message.getBmsInformationMessage();
                log.info("充电过程BMS信息-业务消息处理:{}",bmsInformationMessage);
                String transaction_serial_number2 = bmsInformationMessage.getTransaction_serial_number();
                Object o2 = redisTemplate.opsForValue().get("bms_information:" + transaction_serial_number2);
                if(null != o2){
@@ -304,7 +289,6 @@
                break;
            case SendTagConstant.CHARGING_PILE_STARTS_CHARGING:
                ChargingPileStartsChargingMessage chargingPileStartsChargingMessage = message.getChargingPileStartsChargingMessage();
                log.info("充电桩主动申请启动充电-业务消息处理:{}",chargingPileStartsChargingMessage);
                // 持久化消息
                ChargingPileStartsCharging chargingPileStartsCharging = new ChargingPileStartsCharging();
                BeanUtils.copyProperties(chargingPileStartsChargingMessage,chargingPileStartsCharging);
@@ -312,7 +296,6 @@
                break;
            case SendTagConstant.PLATFORM_START_CHARGING_REPLY:
                PlatformStartChargingReplyMessage platformStartChargingReplyMessage = message.getPlatformStartChargingReplyMessage();
                log.info("远程启机命令回复-业务消息处理:{}",platformStartChargingReplyMessage);
                // 持久化消息
                PlatformStartChargingReply platformStartChargingReply = new PlatformStartChargingReply();
                BeanUtils.copyProperties(platformStartChargingReplyMessage,platformStartChargingReply);
@@ -325,7 +308,6 @@
                break;
            case SendTagConstant.PLATFORM_STOP_CHARGING_REPLY:
                PlatformStopChargingReplyMessage platformStopChargingReplyMessage = message.getPlatformStopChargingReplyMessage();
                log.info("远程停机命令回复-业务消息处理:{}",platformStopChargingReplyMessage);
                // 持久化消息
                PlatformStopChargingReply platformStopChargingReply = new PlatformStopChargingReply();
                BeanUtils.copyProperties(platformStopChargingReplyMessage,platformStopChargingReply);
@@ -337,7 +319,6 @@
                break;
            case SendTagConstant.TRANSACTION_RECORD:
                TransactionRecordMessage transactionRecordMessage = message.getTransactionRecordMessage();
                log.info("交易记录-业务消息处理:{}",transactionRecordMessage);
                transactionRecordMessage.setResult(JSONObject.toJSONString(transactionRecordMessage));
                // 持久化消息
                TransactionRecord transactionRecord = new TransactionRecord();
@@ -368,7 +349,6 @@
                break;
            case SendTagConstant.UPDATE_BALANCE_REPLY:
                UpdateBalanceReplyMessage updateBalanceReplyMessage = message.getUpdateBalanceReplyMessage();
                log.info("余额更新应答-业务消息处理:{}",updateBalanceReplyMessage);
                // 持久化消息
                UpdateBalanceReply updateBalanceReply = new UpdateBalanceReply();
                BeanUtils.copyProperties(updateBalanceReplyMessage,updateBalanceReply);
@@ -376,7 +356,6 @@
                break;
            case SendTagConstant.SYNCHRONIZE_OFFLINE_CARD_REPLY:
                SynchronizeOfflineCardReplyMessage synchronizeOfflineCardReplyMessage = message.getSynchronizeOfflineCardReplyMessage();
                log.info("卡数据同步应答-业务消息处理:{}",synchronizeOfflineCardReplyMessage);
                // 持久化消息
                SynchronizeOfflineCardReply synchronizeOfflineCardReply = new SynchronizeOfflineCardReply();
                BeanUtils.copyProperties(synchronizeOfflineCardReplyMessage,synchronizeOfflineCardReply);
@@ -384,7 +363,6 @@
                break;
            case SendTagConstant.CLEAR_OFFLINE_CARD_REPLY:
                ClearOfflineCardReplyMessage clearOfflineCardReplyMessage = message.getClearOfflineCardReplyMessage();
                log.info("离线卡数据清除应答-业务消息处理:{}",clearOfflineCardReplyMessage);
                // 持久化消息
                ClearOfflineCardReply clearOfflineCardReply = new ClearOfflineCardReply();
                BeanUtils.copyProperties(clearOfflineCardReplyMessage,clearOfflineCardReply);
@@ -392,7 +370,6 @@
                break;
            case SendTagConstant.WORKING_PARAMETER_SETTING_REPLY:
                WorkingParameterSettingReplyMessage workingParameterSettingReplyMessage = message.getWorkingParameterSettingReplyMessage();
                log.info("充电桩工作参数设置应答-业务消息处理:{}",workingParameterSettingReplyMessage);
                // 持久化消息
                WorkingParameterSettingReply workingParameterSettingReply = new WorkingParameterSettingReply();
                BeanUtils.copyProperties(workingParameterSettingReplyMessage,workingParameterSettingReply);
@@ -400,7 +377,6 @@
                break;
            case SendTagConstant.TIMING_SETTING:
                TimingSettingMessage timingSettingMessage = message.getTimingSettingMessage();
                log.info("对时设置-业务消息处理:{}",timingSettingMessage);
                // 持久化消息
//                TimingSetting timingSetting = new TimingSetting();
//                BeanUtils.copyProperties(timingSettingMessage,timingSetting);
@@ -408,7 +384,6 @@
                break;
            case SendTagConstant.SETUP_BILLING_MODEL_REPLY:
                SetupBillingModelReplyMessage setupBillingModelReplyMessage = message.getSetupBillingModelReplyMessage();
                log.info("计费模型应答-业务消息处理:{}",setupBillingModelReplyMessage);
                // 持久化消息
                SetupBillingModelReply setupBillingModelReply = new SetupBillingModelReply();
                BeanUtils.copyProperties(setupBillingModelReplyMessage,setupBillingModelReply);
@@ -416,7 +391,6 @@
                break;
            case SendTagConstant.GROUND_LOCK_REAL_TIME_DATA:
                GroundLockRealTimeDataMessage groundLockRealTimeDataMessage = message.getGroundLockRealTimeDataMessage();
                log.info("地锁数据上送(充电桩上送)-业务消息处理:{}",groundLockRealTimeDataMessage);
                // 持久化消息
                GroundLockRealTimeData groundLockRealTimeData = new GroundLockRealTimeData();
                BeanUtils.copyProperties(groundLockRealTimeDataMessage,groundLockRealTimeData);
@@ -424,7 +398,6 @@
                break;
            case SendTagConstant.CHARGING_PILE_RETURNS_GROUND_LOCK_DATA:
                ChargingPileReturnsGroundLockDataMessage chargingPileReturnsGroundLockDataMessage = message.getChargingPileReturnsGroundLockDataMessage();
                log.info("充电桩返回数据(上行)-业务消息处理:{}",chargingPileReturnsGroundLockDataMessage);
                // 持久化消息
                ChargingPileReturnsGroundLockData chargingPileReturnsGroundLockData = new ChargingPileReturnsGroundLockData();
                BeanUtils.copyProperties(chargingPileReturnsGroundLockDataMessage,chargingPileReturnsGroundLockData);
@@ -432,7 +405,6 @@
                break;
            case SendTagConstant.PLATFORM_RESTART_REPLY:
                PlatformRestartReplyMessage platformRestartReplyMessage = message.getPlatformRestartReplyMessage();
                log.info("远程重启应答-业务消息处理:{}",platformRestartReplyMessage);
                // 持久化消息
                PlatformRestartReply platformRestartReply = new PlatformRestartReply();
                BeanUtils.copyProperties(platformRestartReplyMessage,platformRestartReply);
@@ -440,14 +412,12 @@
                break;
            case SendTagConstant.QR_CODE_DELIVERY_REPLY:
                QrCodeDeliveryReplyMessage qrCodeDeliveryReplyMessage = message.getQrCodeDeliveryReplyMessage();
                log.info("二维码下发应答-业务消息处理:{}",qrCodeDeliveryReplyMessage);
                QrCodeDeliveryReply qrCodeDeliveryReply = new QrCodeDeliveryReply();
                BeanUtils.copyProperties(qrCodeDeliveryReplyMessage,qrCodeDeliveryReply);
                qrCodeDeliveryReplyService.create(qrCodeDeliveryReply);
                break;
            case SendTagConstant.SECURITY_DETECTION:
                SecurityDetectionMessage securityDetectionMessage = message.getSecurityDetectionMessage();
                log.info("安全监测-业务消息处理:{}",securityDetectionMessage);
                SecurityDetection securityDetection = new SecurityDetection();
                BeanUtils.copyProperties(securityDetectionMessage,securityDetection);
                securityDetectionService.create(securityDetection);
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -222,55 +222,36 @@
    @PostMapping(value = "/pay/order/list")
    @ApiOperation(value = "列表", tags = {"管理后台-支付订单-订单信息"})
    public R<PageInfo<PayOrderDto>> payOrderList(@RequestBody PayOrderQueryDto payOrderQueryDto) {
        Integer pageCurr = payOrderQueryDto.getPageCurr();
        Integer pageSize = payOrderQueryDto.getPageSize();
        payOrderQueryDto.setPageCurr(1);
        payOrderQueryDto.setPageSize(10000999);
        PageInfo<PayOrderDto> data = chargingOrderService.payOrderQuery(payOrderQueryDto).getData();
        List<PayOrderDto> res = new ArrayList<>();
        // 查询当前登陆人按钮权限
        SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData();
        Integer roleType = sysUser.getRoleType();
        Long userId = tokenService.getLoginUser().getUserid();
        //如果没传siteId,获取当前登陆人所有的siteIds
        List<Integer> siteIds = new ArrayList<>();
        if (userId != null){
            List<GetSiteListDTO> data2 = siteClient.getSiteListByUserId(userId).getData();
            for (GetSiteListDTO datum : data2) {
                siteIds.add(datum.getId());
            }
        }
        if (siteIds.isEmpty()){
            siteIds.add(-1);
        }
        List<TChargingOrder> list = chargingOrderService.list();
        List<TParkingRecord> parkingRecord = parkingLotClient.getSiteIdAll().getData();
        for (PayOrderDto record : data.getRecords()) {
            if (record.getType() == 1){
                TChargingOrder chargingOrder = list.stream().filter(e -> e.getId().equals(Long.valueOf(record.getId()))).findFirst().orElse(null);
                if (chargingOrder!=null){
                    record.setSiteId(chargingOrder.getSiteId());
                }
            }
            if (record.getType()==4){
                TParkingRecord tParkingRecord = parkingRecord.stream().filter(e -> e.getId().equals(Long.valueOf(record.getId()))).findFirst().orElse(null);
                if (tParkingRecord!=null){
                    record.setSiteId(tParkingRecord.getSiteId());
                }
            }
            if (roleType==1||(record.getType()!=1&&record.getType()!=4)){
                res.add(record);
                continue;
            }
            if (roleType==2 && (record.getType()==1||record.getType()==4) && siteIds.contains(record.getSiteId())){
                res.add(record);
            }
        return chargingOrderService.payOrderQuery(payOrderQueryDto);
        }
        List<PayOrderDto> res1 = testing5(res.size(), pageCurr, pageSize, res);
        data.setTotal(res.size());
        data.setRecords(res1);
        return R.ok(data);
//        List<TChargingOrder> list = chargingOrderService.list();
//        List<TParkingRecord> parkingRecord = parkingLotClient.getSiteIdAll().getData();
//        for (PayOrderDto record : data.getRecords()) {
//            if (record.getType() == 1){
//                TChargingOrder chargingOrder = list.stream().filter(e -> e.getId().equals(Long.valueOf(record.getId()))).findFirst().orElse(null);
//                if (chargingOrder!=null){
//                    record.setSiteId(chargingOrder.getSiteId());
//                }
//            }
//            if (record.getType()==4){
//                TParkingRecord tParkingRecord = parkingRecord.stream().filter(e -> e.getId().equals(Long.valueOf(record.getId()))).findFirst().orElse(null);
//                if (tParkingRecord!=null){
//                    record.setSiteId(tParkingRecord.getSiteId());
//                }
//            }
//            if (roleType==1||(record.getType()!=1&&record.getType()!=4)){
//                res.add(record);
//                continue;
//            }
//            if (roleType==2 && (record.getType()==1||record.getType()==4) && siteIds.contains(record.getSiteId())){
//                res.add(record);
//            }
//
//        }
//        List<PayOrderDto> res1 = testing5(res.size(), pageCurr, pageSize, res);
//        data.setTotal(res.size());
//        data.setRecords(res1);
//        return R.ok(data);
    }
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java
@@ -169,4 +169,11 @@
     * @return
     */
    List<TChargingOrder> findChargingOrder();
    /**
     * 获取已结束的数据
     * @return
     */
    List<TChargingOrder> findEndChargingOrder();
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java
@@ -128,8 +128,12 @@
     * @return
     */
    AjaxResult stopCharging(String id);
    void editUserTag(TChargingOrder chargingOrder);
    void referralReward(TChargingOrder chargingOrder);
    /**
     * 停止充电应答结果处理
     * @param platformStopChargingReply
@@ -349,4 +353,10 @@
     * @return
     */
    List<TChargingOrder> findChargingOrder();
    /**
     * 获取已结束的数据
     * @return
     */
    List<TChargingOrder> findEndChargingOrder();
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -583,6 +583,8 @@
            AccountingStrategyDetailOrder accountingStrategyDetailOrder = new AccountingStrategyDetailOrder();
            BeanUtils.copyProperties(tAccountingStrategyDetail, accountingStrategyDetailOrder);
            accountingStrategyDetailOrder.setChargingOrderId(chargingOrder.getId());
            accountingStrategyDetailOrder.setCreateTime(LocalDateTime.now());
            accountingStrategyDetailOrder.setDelFlag(false);
            list1.add(accountingStrategyDetailOrder);
        }
        accountingStrategyDetailOrderService.saveBatch(list1);
@@ -939,7 +941,7 @@
            chargingGun.setStatus(4);
            chargingGunClient.updateChargingGunById(chargingGun);
            //推送状态给三方平台
            tcecClient.pushChargingGunStatus(chargingGun.getFullNumber(), chargingGun.getStatus());
            tcecClient.pushChargingGunStatus(chargingGun.getFullNumber(), 4);
        }
        redisService.setCacheObject("AQJC_" + order.getChargingGunId(), preChargeCheck1, 24L, TimeUnit.HOURS);
        this.updateById(order);
@@ -1602,42 +1604,7 @@
                
            }
        }
//        List<TChargingOrderRefund> chargingOrderRefunds = chargingOrderRefundService.lambdaQuery()
//                .eq(TChargingOrderRefund::getRefundStatus,2).list();
        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"));
@@ -2662,9 +2629,10 @@
            chargingGun.setStatus(2);
            chargingGun.setChargingPower(BigDecimal.ZERO);
            chargingGunClient.updateChargingGunById(chargingGun);
            chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
            //推送状态给三方平台
            if (2 == chargingOrder.getOrderSource()) {
                tcecClient.pushChargingGunStatus(chargingGun.getFullNumber(), chargingGun.getStatus());
                tcecClient.pushChargingGunStatus(chargingGun.getFullNumber(), 2);
            }
            
            //添加积分
@@ -4104,6 +4072,8 @@
            AccountingStrategyDetailOrder accountingStrategyDetailOrder = new AccountingStrategyDetailOrder();
            BeanUtils.copyProperties(tAccountingStrategyDetail, accountingStrategyDetailOrder);
            accountingStrategyDetailOrder.setChargingOrderId(chargingOrder.getId());
            accountingStrategyDetailOrder.setCreateTime(LocalDateTime.now());
            accountingStrategyDetailOrder.setDelFlag(false);
            list1.add(accountingStrategyDetailOrder);
        }
        accountingStrategyDetailOrderService.saveBatch(list1);
@@ -4363,4 +4333,13 @@
    public List<TChargingOrder> findChargingOrder() {
        return this.baseMapper.findChargingOrder();
    }
    /**
     * 获取已结束的数据
     * @return
     */
    @Override
    public List<TChargingOrder> findEndChargingOrder() {
        return this.baseMapper.findEndChargingOrder();
    }
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java
@@ -4,24 +4,44 @@
import com.alibaba.fastjson2.util.UUIDUtils;
import com.alibaba.nacos.common.utils.UuidUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ruoyi.account.api.feignClient.AppCouponClient;
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.account.api.feignClient.AppUserIntegralChangeClient;
import com.ruoyi.account.api.feignClient.AppUserVipDetailClient;
import com.ruoyi.account.api.model.TAppCoupon;
import com.ruoyi.account.api.model.TAppUser;
import com.ruoyi.account.api.model.TAppUserIntegralChange;
import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient;
import com.ruoyi.chargingPile.api.feignClient.SiteClient;
import com.ruoyi.chargingPile.api.model.Site;
import com.ruoyi.chargingPile.api.model.TChargingGun;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.integration.api.feignClient.ChargingMessageClient;
import com.ruoyi.integration.api.feignClient.TCECClient;
import com.ruoyi.integration.api.feignClient.UploadRealTimeMonitoringDataClient;
import com.ruoyi.integration.api.model.TransactionRecord;
import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData;
import com.ruoyi.integration.api.vo.ChargingOrderVo;
import com.ruoyi.order.api.model.TChargingBill;
import com.ruoyi.order.api.model.TChargingOrder;
import com.ruoyi.order.api.model.TChargingOrderRefund;
import com.ruoyi.order.api.model.*;
import com.ruoyi.order.api.vo.AccountingStrategyDetailOrderVo;
import com.ruoyi.order.api.vo.TransactionRecordMessageVO;
import com.ruoyi.order.service.TChargingBillService;
import com.ruoyi.order.service.TChargingOrderRefundService;
import com.ruoyi.order.service.TChargingOrderService;
import com.ruoyi.order.service.*;
import com.ruoyi.order.util.mongodb.service.TransactionRecordService;
import com.ruoyi.order.util.mongodb.service.UploadRealTimeMonitoringDataService;
import com.ruoyi.other.api.domain.TCoupon;
import com.ruoyi.other.api.domain.TIntegralRule;
import com.ruoyi.other.api.domain.TVip;
import com.ruoyi.other.api.feignClient.IntegralRuleClient;
import com.ruoyi.other.api.feignClient.VipClient;
import com.ruoyi.payment.api.feignClient.AliPaymentClient;
import com.ruoyi.payment.api.feignClient.H5AliPaymentClient;
import com.ruoyi.payment.api.feignClient.WxPaymentClient;
import com.ruoyi.payment.api.model.RefundReq;
import com.ruoyi.payment.api.model.RefundResp;
import com.ruoyi.payment.api.model.WxPaymentRefundModel;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.core.util.UuidUtil;
import org.apache.poi.util.StringUtil;
@@ -33,14 +53,16 @@
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -71,6 +93,42 @@
    private ChargingMessageClient chargingMessageClient;
    
    private Integer port = null;
    @Resource
    private AccountingStrategyDetailOrderService accountingStrategyDetailOrderService;
    @Resource
    private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService;
    @Resource
    private AppCouponClient appCouponClient;
    @Resource
    private TCECClient tcecClient;
    @Resource
    private VipClient vipClient;
    @Resource
    private ChargingGunClient chargingGunClient;
    @Resource
    private IntegralRuleClient integralRuleClient;
    @Resource
    private AppUserClient appUserClient;
    @Resource
    private AppUserIntegralChangeClient appUserIntegralChangeClient;
    @Resource
    private WxPaymentClient wxPaymentClient;
    @Resource
    private AliPaymentClient aliPaymentClient;
    @Resource
    private H5AliPaymentClient h5AliPaymentClient;
    @Resource
    private ITChargingOrderSummaryDataService chargingOrderSummaryDataService;
    //十分钟循环执行的定时任务
@@ -132,6 +190,8 @@
                    BeanUtils.copyProperties(one, vo);
                    R r = chargingOrderService.endChargeBillingCharge(vo);
                    log.info("定时任务执行,停止中的订单处理结果:{}", JSON.toJSONString(r));
                }else{
//                    endOrder(order);
                }
            }
            //处理状态为充电中,但硬件已完成的订单
@@ -155,6 +215,19 @@
                    log.info("定时任务执行,充电中的订单处理结果:{}", JSON.toJSONString(r));
                }
            }
            //处理还未退款,但是订单状态已结束的数据
            List<TChargingOrder> endChargingOrder = chargingOrderService.findEndChargingOrder();
            log.info("定时任务执行,查询到已结束未退款的订单数量:{}", endChargingOrder.size());
            for (TChargingOrder order : endChargingOrder) {
                if(-1 == order.getStatus()){
                    order.setStatus(2);
                }
                if(5 == order.getStatus()){
                    order.setStatus(4);
                }
                chargingOrderService.updateById(order);
            }
        }
    }
    
@@ -285,4 +358,406 @@
        port = event.getWebServer().getPort();
        System.out.println("端口号:" + port);
    }
    public void endOrder(TChargingOrder order){
        List<UploadRealTimeMonitoringData> dataList = uploadRealTimeMonitoringDataService.getDataByOrderCode(order.getCode());
        if(!dataList.isEmpty()){
            //获取当前订单的计费规则,然后分段计算总的度数和充电金额
            List<AccountingStrategyDetailOrder> detailOrders = accountingStrategyDetailOrderService.list(new LambdaQueryWrapper<AccountingStrategyDetailOrder>()
                    .eq(AccountingStrategyDetailOrder::getChargingOrderId, order.getId()).last(" order by start_time"));
            detailOrders.get(detailOrders.size() - 1).setEndTime("23:59");
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
            //开始解析每个时段的充电度数
            BigDecimal decimal = BigDecimal.ZERO;
            //如果使用优惠券需要判断优惠券是否满足使用条件
            //退款金额=优惠券金额+剩余充电金额
            BigDecimal periodElectricPrice_total = BigDecimal.ZERO;
            BigDecimal periodServicePrice_total = BigDecimal.ZERO;
            BigDecimal vipDiscountAmount_total = BigDecimal.ZERO;
            BigDecimal serviceCharge_total = BigDecimal.ZERO;
            BigDecimal total = BigDecimal.ZERO;
            //判断实时数据是否跨天
            SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
            Date end_time = dataList.get(0).getCreate_time();
            String end = sdf2.format(end_time);
            Date start_time = dataList.get(dataList.size() - 1).getCreate_time();
            String start = sdf2.format(start_time);
            if(!end.equals(start)){
                List<AccountingStrategyDetailOrder> list = detailOrders.stream().map(s->{
                    AccountingStrategyDetailOrder accountingStrategyDetailOrder = new AccountingStrategyDetailOrder();
                    BeanUtils.copyProperties(s, accountingStrategyDetailOrder);
                    return accountingStrategyDetailOrder;
                }).collect(Collectors.toList());
                for (AccountingStrategyDetailOrder detailOrder : detailOrders) {
                    detailOrder.setStartTime(start + " " + detailOrder.getStartTime());
                    detailOrder.setEndTime(start + " " + detailOrder.getEndTime());
                }
                for (AccountingStrategyDetailOrder detailOrder : list) {
                    detailOrder.setStartTime(end + " " + detailOrder.getStartTime());
                    detailOrder.setEndTime(end + " " + detailOrder.getEndTime());
                }
                detailOrders.addAll(list);
            }else{
                for (AccountingStrategyDetailOrder detailOrder : detailOrders) {
                    detailOrder.setStartTime(start + " " + detailOrder.getStartTime());
                    detailOrder.setEndTime(start + " " + detailOrder.getEndTime());
                }
            }
            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMddHHmm");
            List<TChargingOrderAccountingStrategy> list = new ArrayList<>();
            for (AccountingStrategyDetailOrder detailOrder : detailOrders) {
                long startTime = Long.parseLong(detailOrder.getStartTime().replaceAll("-", "").replaceAll(" ", "").replaceAll(":", ""));
                long endTime = Long.parseLong(detailOrder.getEndTime().replaceAll("-", "").replaceAll(" ", "").replaceAll(":", ""));
                List<UploadRealTimeMonitoringData> collect = dataList.stream().filter(s -> Long.parseLong(sdf1.format(s.getCreate_time())) > startTime && Long.parseLong(sdf1.format(s.getCreate_time())) <= endTime).collect(Collectors.toList());
                if(!collect.isEmpty()){
                    //升序排序
                    collect.sort(new Comparator<UploadRealTimeMonitoringData>(){
                        @Override
                        public int compare(UploadRealTimeMonitoringData o1, UploadRealTimeMonitoringData o2) {
                            return o1.getCharging_degree().compareTo(o2.getCharging_degree());
                        }
                    });
                    UploadRealTimeMonitoringData uploadRealTimeMonitoringData = collect.get(collect.size() - 1);
                    BigDecimal chargingDegree = uploadRealTimeMonitoringData.getCharging_degree();
                    BigDecimal subtract = chargingDegree.subtract(decimal);
                    decimal = chargingDegree;
                    if(subtract.compareTo(BigDecimal.ZERO) > 0){
                        //组装充电明细数据
                        TChargingOrderAccountingStrategy chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy();
                        chargingOrderAccountingStrategy.setChargingOrderId(order.getId());
                        chargingOrderAccountingStrategy.setAccountingStrategyDetailId(detailOrder.getId());
                        chargingOrderAccountingStrategy.setType(detailOrder.getType());
                        chargingOrderAccountingStrategy.setElectrovalence(detailOrder.getElectrovalence());
                        chargingOrderAccountingStrategy.setServiceCharge(detailOrder.getServiceCharge());
                        chargingOrderAccountingStrategy.setCostServiceCharge(detailOrder.getCostServiceCharge());
                        chargingOrderAccountingStrategy.setChargingCapacity(subtract);
                        chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now());
                        if (list.size() == 0) {
                            String time = sdf.format(collect.get(0).getCreate_time());
                            chargingOrderAccountingStrategy.setStartTime(time);
                        } else {
                            chargingOrderAccountingStrategy.setStartTime(detailOrder.getStartTime().split(" ")[1]);
                        }
                        chargingOrderAccountingStrategy.setEndTime(detailOrder.getEndTime().split(" ")[1]);
                        //已充电总度数
                        BigDecimal electrovalenc = detailOrder.getElectrovalence().multiply(subtract);
                        BigDecimal originalServicePrice = detailOrder.getServiceCharge().multiply(subtract);
                        BigDecimal serviceCharge = originalServicePrice;
                        BigDecimal vipDiscountAmount = BigDecimal.ZERO;
                        //计算优惠金额
                        if (null != order.getVipDiscount()) {
                            //0.58折
                            vipDiscountAmount = serviceCharge.multiply(new BigDecimal(1).subtract(order.getVipDiscount()));
                            serviceCharge = serviceCharge.multiply(order.getVipDiscount());
                        }
                        chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc.setScale(4, RoundingMode.HALF_EVEN));
                        chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge.setScale(4, RoundingMode.HALF_EVEN));
                        chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice.setScale(4, RoundingMode.HALF_EVEN));
                        chargingOrderAccountingStrategy.setVipDiscountAmount(vipDiscountAmount.setScale(4, RoundingMode.HALF_EVEN));
                        chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now());
                        list.add(chargingOrderAccountingStrategy);
                        //电费
                        periodElectricPrice_total = periodElectricPrice_total.add(electrovalenc);
                        //服务费(含折扣)
                        serviceCharge_total = serviceCharge_total.add(serviceCharge);
                        //服务费(不含折扣)
                        periodServicePrice_total = periodServicePrice_total.add(originalServicePrice);
                        //会员折扣优惠金额
                        vipDiscountAmount_total = vipDiscountAmount_total.add(vipDiscountAmount);
                        //原始总金额(不含折扣)
                        total = total.add(electrovalenc.add(originalServicePrice));
                    }
                }
            }
            list.get(list.size() - 1).setEndTime(sdf.format(dataList.get(0).getCreate_time()));
            chargingOrderAccountingStrategyService.saveBatch(list);
            BigDecimal orderAmount = BigDecimal.valueOf(total.doubleValue());
            //原金额
            BigDecimal rechargeAmount = order.getRechargeAmount();
            //支付金额
            BigDecimal payAmount = periodElectricPrice_total.add(serviceCharge_total);
            //退款金额=充值金额-实际支付金额
            BigDecimal refundAmount = rechargeAmount.subtract(payAmount);
            UploadRealTimeMonitoringData uploadRealTimeMonitoringData = uploadRealTimeMonitoringDataService.getLastDataById(order.getCode());
            if (null != uploadRealTimeMonitoringData && null == order.getEndMode()) {
                Integer soc = uploadRealTimeMonitoringData.getSoc();
                if (soc >= 98) {
                    order.setEndMode(2);
                } else if (null != order.getResidualAmount() && order.getResidualAmount().compareTo(new BigDecimal(1)) <= 0) {
                    order.setEndMode(3);
                } else {
                    order.setEndMode(1);
                }
            }
            order.setResidualAmount(rechargeAmount.subtract(total).setScale(2, RoundingMode.HALF_EVEN));
            order.setStartTime(list.get(0).getCreateTime());
            order.setEndTime(list.get(list.size() - 1).getCreateTime());
            order.setStatus(5);
            order.setOrderAmount(orderAmount.setScale(2, RoundingMode.HALF_EVEN));
            order.setElectrovalence(periodElectricPrice_total.setScale(2, RoundingMode.HALF_EVEN));
            order.setChargingCapacity(list.get(list.size() - 1).getChargingCapacity());
            order.setElectricity(list.get(list.size() - 1).getChargingCapacity());
            order.setVipDiscountAmount(vipDiscountAmount_total);
            if (vipDiscountAmount_total.compareTo(BigDecimal.ZERO) == 0) {
                order.setVipDiscount(BigDecimal.valueOf(1));
            }
            //计算优惠券
            BigDecimal couponDiscount = BigDecimal.ZERO;
            if (null != order.getAppCouponId()) {
                //判断实际充电金额是否满足优惠券使用条件,如果不满足则不适用优惠券。
                TAppCoupon appCoupon = appCouponClient.getAppCouponById(order.getAppCouponId()).getData();
                String couponJson = appCoupon.getCouponJson();
                TCoupon tCoupon = com.alibaba.fastjson2.JSON.parseObject(couponJson, TCoupon.class);
                Integer preferentialMode = tCoupon.getPreferentialMode();
                if (1 == preferentialMode) {
                    //满减
                    if (payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0) {
                        BigDecimal couponDiscountAmount = tCoupon.getDiscountAmount();
                        //如果优惠金额大于服务费金额,以服务费作为最大限制
                        if (serviceCharge_total.compareTo(couponDiscountAmount) < 0) {
                            couponDiscount = serviceCharge_total;
                            serviceCharge_total = BigDecimal.ZERO;
                        } else {
                            couponDiscount = couponDiscountAmount;
                        }
                        appCoupon.setStatus(2);
                        appCouponClient.updateAppCoupon(appCoupon);
                    } else {
                        appCouponClient.refund(order.getAppCouponId().toString());
                        order.setAppCouponId(null);
                        order.setCouponDiscountAmount(BigDecimal.ZERO);
                    }
                }
                if (2 == preferentialMode) {
                    //抵扣
                    if (payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0) {
                        //折扣金额
                        BigDecimal divide = payAmount.multiply(new BigDecimal(10).subtract(tCoupon.getDiscount())).divide(new BigDecimal(10));
                        divide = divide.compareTo(tCoupon.getMaximumDiscountAmount()) > 0 ? tCoupon.getMaximumDiscountAmount() : divide;
                        //如果优惠金额大于服务费金额,以服务费作为最大限制
                        if (serviceCharge_total.compareTo(divide) < 0) {
                            couponDiscount = serviceCharge_total;
                            serviceCharge_total = BigDecimal.ZERO;
                        } else {
                            couponDiscount = divide;
                        }
                        appCoupon.setStatus(2);
                        appCouponClient.updateAppCoupon(appCoupon);
                    } else {
                        order.setAppCouponId(null);
                        order.setCouponDiscountAmount(BigDecimal.ZERO);
                        appCouponClient.refund(order.getAppCouponId().toString());
                    }
                }
            }
            //优惠券优惠金额
            couponDiscount = couponDiscount.setScale(4, RoundingMode.HALF_EVEN);
            //退款金额+优惠券
            refundAmount = refundAmount.add(couponDiscount);
            //实际支付金额-优惠券
            payAmount = payAmount.subtract(couponDiscount);
            if (serviceCharge_total.compareTo(BigDecimal.ZERO) > 0) {
                serviceCharge_total = serviceCharge_total.subtract(couponDiscount);
            }
            order.setCouponDiscountAmount(couponDiscount.setScale(2, RoundingMode.HALF_EVEN));
            order.setServiceCharge(serviceCharge_total.setScale(2, RoundingMode.HALF_EVEN));
            order.setPaymentAmount(payAmount.setScale(2, RoundingMode.HALF_EVEN));
            order.setRefundAmount(refundAmount.setScale(2, RoundingMode.HALF_EVEN));
            order.setRefundStatus(1);
            chargingOrderService.updateById(order);
            order = chargingOrderService.getById(order.getId());
            //推送三方平台
            if (2 == order.getOrderSource()) {
                TChargingOrder finalChargingOrder = order;
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        tcecClient.notificationEquipChargeStatus(finalChargingOrder.getStartChargeSeq(), finalChargingOrder.getOperatorId());
                        tcecClient.notificationStopChargeResult(finalChargingOrder.getStartChargeSeq(), finalChargingOrder.getChargingGunId().toString(),
                                finalChargingOrder.getOperatorId());
                        tcecClient.notificationChargeOrderInfo(finalChargingOrder.getStartChargeSeq(), finalChargingOrder.getOperatorId());
                    }
                }).start();
            }
            //开始将优惠券优惠的金额添加到明细中
            BigDecimal couponDiscountAmount = order.getCouponDiscountAmount();
            if (null != couponDiscountAmount && couponDiscountAmount.compareTo(BigDecimal.ZERO) > 0) {
                List<TChargingOrderAccountingStrategy> list1 = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, order.getId()));
                BigDecimal reduce = list1.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
                for (TChargingOrderAccountingStrategy chargingOrderAccountingStrategy : list1) {
                    BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodServicePrice();
                    BigDecimal multiply = couponDiscountAmount.multiply(periodServicePrice.divide(reduce, new MathContext(4, RoundingMode.HALF_EVEN)));
                    periodServicePrice = periodServicePrice.subtract(multiply);
                    chargingOrderAccountingStrategy.setPeriodServicePrice(periodServicePrice.setScale(2, RoundingMode.HALF_EVEN));
                    chargingOrderAccountingStrategy.setCouponDiscountAmount(multiply.setScale(2, RoundingMode.HALF_EVEN));
                }
                chargingOrderAccountingStrategyService.updateBatchById(list1);
            }
            // 将枪状态重置为空闲
            TChargingGun chargingGun = new TChargingGun();
            chargingGun.setId(order.getChargingGunId());
            chargingGun.setStatus(2);
            chargingGun.setChargingPower(BigDecimal.ZERO);
            chargingGunClient.updateChargingGunById(chargingGun);
            chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData();
            //推送状态给三方平台
            if (2 == order.getOrderSource()) {
                tcecClient.pushChargingGunStatus(chargingGun.getFullNumber(), 2);
            }
            //添加积分
            if (1 == order.getOrderSource()) {
                TIntegralRule integralRule = integralRuleClient.getSet().getData();
                if (null != integralRule) {
                    TAppUser appUser = appUserClient.getUserById(order.getAppUserId()).getData();
                    Integer num1 = com.alibaba.fastjson2.JSON.parseObject(integralRule.getChargeCredit()).getInteger("num1");
                    Integer integral = order.getServiceCharge().intValue() * num1;
                    if (null != appUser.getVipId()) {
                        TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
                        Integer doubleIntegration = vip.getDoubleIntegration();
                        //双倍积分
                        if (1 == doubleIntegration) {
                            integral *= 2;
                        }
                    }
                    if (integral > 0) {
                        TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange();
                        appUserIntegralChange.setAppUserId(appUser.getId());
                        appUserIntegralChange.setChangeType(2);
                        appUserIntegralChange.setHistoricalIntegral(appUser.getPoints());
                        appUser.setPoints(appUser.getPoints() + integral);
                        appUserIntegralChange.setCurrentIntegral(appUser.getPoints());
                        appUserIntegralChange.setCreateTime(LocalDateTime.now());
                        appUserIntegralChange.setOrderCode(order.getCode());
                        appUserIntegralChange.setExtension(order.getId().toString());
                        appUserClient.updateAppUser(appUser);
                        appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange);
                    }
                }
                //计算用户标签
                chargingOrderService.editUserTag(order);
                //用户推荐奖励
                chargingOrderService.referralReward(order);
                //开始构建退款费用
                refundAmount = refundAmount.setScale(2, RoundingMode.HALF_EVEN);
                if (refundAmount.compareTo(BigDecimal.ZERO) > 0) {
                    Integer rechargePaymentType = order.getRechargePaymentType();
                    //构建退款明细
                    TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
                    chargingOrderRefund.setChargingOrderId(order.getId());
                    SimpleDateFormat sdfaa = new SimpleDateFormat("yyyyMMddHHmmssSSS");
                    chargingOrderRefund.setRefundCode("CDF" + sdfaa.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
                    chargingOrderRefund.setRefundAmount(refundAmount);
                    chargingOrderRefund.setRefundStatus(1);
                    chargingOrderRefund.setPayType(rechargePaymentType);
                    chargingOrderRefund.setRefundStatus(1);
                    chargingOrderRefund.setCode(order.getCode());
                    chargingOrderRefund.setRefundTitle("充电完成退款");
                    chargingOrderRefund.setRefundContent("充电完成退款");
                    chargingOrderRefund.setRefundReason("充电完成退款");
                    chargingOrderRefund.setRefundRemark("实际充电消费金额:" + order.getPaymentAmount());
                    chargingOrderRefund.setRefundTotalAmount(refundAmount);
                    chargingOrderRefund.setPayAmount(rechargeAmount);
                    if (1 == rechargePaymentType) {
                        WxPaymentRefundModel model = new WxPaymentRefundModel();
                        model.setOut_trade_no(order.getCode());
                        model.setOut_refund_no(chargingOrderRefund.getRefundCode());
                        model.setReason("充电完成退款");
                        model.setNotify_url("/payment/wx/refund/notify");
                        WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
                        amount.setRefund(refundAmount.multiply(new BigDecimal(100)).intValue());
                        amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue());
                        amount.setCurrency("CNY");
                        model.setAmount(amount);
                        R<Map<String, Object>> result = wxPaymentClient.refundOrderR(model);
                        if (200 == result.getCode()) {
                            chargingOrderRefundService.save(chargingOrderRefund);
                            //手续费
                            Map<String, Object> amount1 = (Map<String, Object>) result.getData().get("amount");
                            Object refund_fee1 = amount1.get("refund_fee");
                            BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100));
                            chargingOrderRefund.setRefundFee(refund_fee);
                            chargingOrderRefundService.updateById(chargingOrderRefund);
                        }
                    }
                    if (2 == rechargePaymentType) {
                        RefundReq dto = new RefundReq();
                        dto.setOutTradeNo(order.getCode());
                        dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
                        dto.setRefundAmount(refundAmount.toString());
                        dto.setRefundReason("充电完成退款");
                        RefundResp resp = aliPaymentClient.refund(dto).getData();
                        if (null != resp) {
                            chargingOrderRefundService.save(chargingOrderRefund);
                            chargingOrderService.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
                        }
                    }
                    if (3 == rechargePaymentType) {
                        RefundReq dto = new RefundReq();
                        dto.setOutTradeNo(order.getRechargeSerialNumber());
                        dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
                        dto.setRefundAmount(refundAmount.toString());
                        dto.setRefundReason("充电完成退款");
                        RefundResp resp = h5AliPaymentClient.refund(dto).getData();
                        if (null != resp && "10000".equals(resp.getCode())) {
                            chargingOrderRefundService.save(chargingOrderRefund);
                            chargingOrderService.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
                        }
                    }
                }
            }
            //添加汇总统计数据
            List<TChargingOrderAccountingStrategy> list4 = chargingOrderAccountingStrategyService.list(new QueryWrapper<TChargingOrderAccountingStrategy>().eq("charging_order_id", order.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 (!order.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 (order.getStartTime() != null && order.getEndTime() != null) {
                time = ChronoUnit.SECONDS.between(order.getStartTime(), order.getEndTime());
            }
            TChargingOrderSummaryData summaryData = new TChargingOrderSummaryData();
            summaryData.setChargingOrderId(order.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);
            //推送监管平台订单状态和订单详情
            ChargingOrderVo chargingOrderVo = new ChargingOrderVo();
            BeanUtils.copyProperties(order, chargingOrderVo);
            chargingMessageClient.pushOrderInfo(chargingOrderVo);
            chargingMessageClient.pushOrderStatus(chargingOrderVo);
        }
    }
}
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
@@ -4,57 +4,62 @@
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.order.api.model.TChargingOrder">
        <id column="id" property="id" />
        <result column="code" property="code" />
        <result column="order_type" property="orderType" />
        <result column="order_classification" property="orderClassification" />
        <result column="app_user_id" property="appUserId" />
        <result column="app_user_car_id" property="appUserCarId" />
        <result column="site_id" property="siteId" />
        <result column="parking_lot_id" property="parkingLotId" />
        <result column="charging_pile_id" property="chargingPileId" />
        <result column="charging_gun_id" property="chargingGunId" />
        <id column="id" property="id"/>
        <result column="code" property="code"/>
        <result column="order_type" property="orderType"/>
        <result column="order_classification" property="orderClassification"/>
        <result column="app_user_id" property="appUserId"/>
        <result column="app_user_car_id" property="appUserCarId"/>
        <result column="site_id" property="siteId"/>
        <result column="parking_lot_id" property="parkingLotId"/>
        <result column="charging_pile_id" property="chargingPileId"/>
        <result column="charging_gun_id" property="chargingGunId"/>
        <result column="charging_capacity" property="chargingCapacity"/>
        <result column="charging_power" property="chargingPower"/>
        <result column="start_time" property="startTime" />
        <result column="end_time" property="endTime" />
        <result column="status" property="status" />
        <result column="start_time" property="startTime"/>
        <result column="end_time" property="endTime"/>
        <result column="status" property="status"/>
        <result column="end_mode" property="endMode"/>
        <result column="recharge_amount" property="rechargeAmount" />
        <result column="recharge_payment_type" property="rechargePaymentType" />
        <result column="recharge_payment_status" property="rechargePaymentStatus" />
        <result column="recharge_serial_number" property="rechargeSerialNumber" />
        <result column="residual_amount" property="residualAmount" />
        <result column="order_amount" property="orderAmount" />
        <result column="app_coupon_id" property="appCouponId" />
        <result column="coupon_discount_amount" property="couponDiscountAmount" />
        <result column="vip_discount" property="vipDiscount" />
        <result column="vip_discount_amount" property="vipDiscountAmount" />
        <result column="payment_amount" property="paymentAmount" />
        <result column="refund_code" property="refundCode" />
        <result column="refund_amount" property="refundAmount" />
        <result column="refund_status" property="refundStatus" />
        <result column="refund_serial_number" property="refundSerialNumber" />
        <result column="refund_time" property="refundTime" />
        <result column="need_elec" property="needElec" />
        <result column="create_time" property="createTime" />
        <result column="del_flag" property="delFlag" />
        <result column="total_electricity" property="totalElectricity" />
        <result column="recharge_amount" property="rechargeAmount"/>
        <result column="recharge_payment_type" property="rechargePaymentType"/>
        <result column="recharge_payment_status" property="rechargePaymentStatus"/>
        <result column="recharge_serial_number" property="rechargeSerialNumber"/>
        <result column="residual_amount" property="residualAmount"/>
        <result column="order_amount" property="orderAmount"/>
        <result column="app_coupon_id" property="appCouponId"/>
        <result column="coupon_discount_amount" property="couponDiscountAmount"/>
        <result column="vip_discount" property="vipDiscount"/>
        <result column="vip_discount_amount" property="vipDiscountAmount"/>
        <result column="payment_amount" property="paymentAmount"/>
        <result column="refund_code" property="refundCode"/>
        <result column="refund_amount" property="refundAmount"/>
        <result column="refund_status" property="refundStatus"/>
        <result column="refund_serial_number" property="refundSerialNumber"/>
        <result column="refund_time" property="refundTime"/>
        <result column="need_elec" property="needElec"/>
        <result column="create_time" property="createTime"/>
        <result column="del_flag" property="delFlag"/>
        <result column="total_electricity" property="totalElectricity"/>
    </resultMap>
    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        id, code, order_type, order_classification, app_user_id, app_user_car_id,site_id, parking_lot_id, charging_pile_id, charging_gun_id,
            start_time, end_time, status, recharge_amount, recharge_payment_type, recharge_payment_status, recharge_serial_number,
            order_amount, app_coupon_id, coupon_discount_amount, vip_discount, vip_discount_amount, payment_amount, refund_code,
            refund_amount, refund_status, refund_serial_number, refund_time, create_time, del_flag,need_elec,total_electricity
        id, code, order_type, order_classification, app_user_id, app_user_car_id,site_id, parking_lot_id,
        charging_pile_id, charging_gun_id,
        start_time, end_time, status, recharge_amount, recharge_payment_type, recharge_payment_status,
        recharge_serial_number,
        order_amount, app_coupon_id, coupon_discount_amount, vip_discount, vip_discount_amount, payment_amount,
        refund_code,
        refund_amount, refund_status, refund_serial_number, refund_time, create_time,
        del_flag,need_elec,total_electricity
    </sql>
    <select id="getMyChargingOrderList" resultMap="BaseResultMap">
        select * from t_charging_order where del_flag = 0 and app_user_id = #{appUserId} and recharge_payment_status = 2
        <if test="1 == type">
            and id not in (select order_id from t_order_evaluate where order_type = 1 and app_user_id = #{appUserId} and del_flag = 0)
            and id not in (select order_id from t_order_evaluate where order_type = 1 and app_user_id = #{appUserId} and
            del_flag = 0)
        </if>
        order by create_time desc
        <if test="null != pageCurr and null != pageSize">
@@ -62,7 +67,8 @@
        </if>
    </select>
    <select id="getNoInvoicedOrder" resultMap="BaseResultMap">
        select * from t_charging_order where del_flag = 0 and status = 5 and recharge_payment_status = 2 and payment_amount is not null and app_user_id = #{appUserId}
        select * from t_charging_order where del_flag = 0 and status = 5 and recharge_payment_status = 2 and
        payment_amount is not null and app_user_id = #{appUserId}
        <if test="null != month and '' != month">
            and DATE_FORMAT(end_time, '%Y-%m') = #{month}
        </if>
@@ -78,15 +84,15 @@
        from t_charging_order t1
        where t1.del_flag = 0
        <if test="null != req.code and req.code!=''">
            and t1.code  LIKE CONCAT('%',#{req.code},'%')
            and t1.code LIKE CONCAT('%',#{req.code},'%')
        </if>
        <if test="null != req.userIds and req.userIds.size()>0" >
        <if test="null != req.userIds and req.userIds.size()>0">
            and t1.app_user_id in
            <foreach collection="req.userIds" item="item" index="index" separator="," open="(" close=")">
                #{item}
            </foreach>
        </if>
        <if test="null != req.siteIds and req.siteIds.size()>0" >
        <if test="null != req.siteIds and req.siteIds.size()>0">
            and t1.site_id in
            <foreach collection="req.siteIds" item="item" index="index" separator="," open="(" close=")">
                #{item}
@@ -126,7 +132,8 @@
        order by t1.create_time desc
    </select>
    <select id="payOrderQuery" resultType="com.ruoyi.order.dto.PayOrderDto">
        SELECT o.*,i.phone FROM (SELECT
        SELECT o.*,i.phone FROM (
        SELECT
        a.id,
        a.`code`,
        1 as type,
@@ -145,7 +152,9 @@
        charging_pile_order.t_charging_order a
        left join charging_pile_order.t_charging_order_refund b on (b.charging_order_id = a.id)
        where a.recharge_payment_status = 2
        UNION ALL
        SELECT
        a.id,
        a.`code`,
@@ -165,7 +174,9 @@
        charging_pile_order.t_shopping_order a
        left join charging_pile_order.t_shopping_order_refund b on (b.shopping_order_id = a.id)
        where a.payment_status = 2
        UNION ALL
        SELECT
        a.id,
        a.`code`,
@@ -185,7 +196,9 @@
        charging_pile_order.t_vip_order a
        left join charging_pile_order.t_vip_order_refund b on (a.id = b.vip_order_id)
        where a.payment_status = 2
        UNION ALL
        SELECT
        id,
        `code`,
@@ -202,105 +215,105 @@
        0 as del_flag,
        app_user_id
        FROM
        charging_pile_service.t_parking_record ) o
        LEFT JOIN  `charging_pile_account`.`t_app_user` i on o.app_user_id = i.id
                <where>
                    o.del_flag = 0
        charging_pile_service.t_parking_record
        ) o
        LEFT JOIN `charging_pile_account`.`t_app_user` i on o.app_user_id = i.id
        <where>
            o.del_flag = 0
            <if test="data.code != null and data.code != ''">
                AND o.code LIKE CONCAT('%',#{data.code},'%')
            </if>
            <if test="data.phone != null and data.phone != ''">
                AND i.phone LIKE CONCAT('%',#{data.phone},'%')
            </if>
            <if test="data.type != null">
                AND o.type = #{data.type}
            </if>
            <if test="data.createTime1 != null">
                AND o.create_time &gt;= #{data.createTime1}
            </if>
            <if test="data.createTime2 != null">
                AND o.create_time &lt;= #{data.createTime2}
            </if>
            <if test="data.ids != null and data.ids.size() > 0">
                AND o.id IN
                <foreach collection="data.ids" item="id" open="(" separator="," close=")">
                    #{id}
                </foreach>
            </if>
            <if test="data.isRefund == 1">
                AND o.refund_status is not null
            </if>
            <if test="data.isRefund == 2">
                AND o.refund_status is null
            </if>
                    <if test="data.code != null and data.code != ''">
                        AND o.code LIKE CONCAT('%',#{data.code},'%')
                    </if>
                    <if test="data.phone != null and data.phone != ''">
                        AND i.phone LIKE CONCAT('%',#{data.phone},'%')
                    </if>
                    <if test="data.type != null">
                        AND o.type = #{data.type}
                    </if>
                    <if test="data.createTime1 != null">
                        AND o.create_time &gt;= #{data.createTime1}
                    </if>
                    <if test="data.createTime2 != null">
                        AND o.create_time &lt;= #{data.createTime2}
                    </if>
                    <if test="data.ids != null and data.ids.size() > 0">
                        AND o.id IN
                        <foreach collection="data.ids" item="id" open="(" separator="," close=")">
                            #{id}
                        </foreach>
                    </if>
                    <if test="data.isRefund == 1">
                        AND o.refund_status is not null
                    </if>
                    <if test="data.isRefund == 2">
                        AND o.refund_status is null
                    </if>
                </where>
        </where>
        ORDER BY o.create_time desc
    </select>
    <select id="getRefundList" resultType="com.ruoyi.order.api.model.TChargingOrderRefund">
        select * from (
        SELECT
            re.id,
            re.`code`,
            re.refund_code,
            re.refund_title,
            re.refund_reason,
            re.refund_amount,
            re.refund_total_amount,
            re.refund_time,
            re.pay_type,
            re.pay_amount,
            re.refund_remark,
            co.recharge_serial_number as serail_number,
            co.payment_amount,
            co.create_time as pay_time,
            co.id as order_id,
            co.app_user_id as user_id,
            1 as type
        re.id,
        re.`code`,
        re.refund_code,
        re.refund_title,
        re.refund_reason,
        re.refund_amount,
        re.refund_total_amount,
        re.refund_time,
        re.pay_type,
        re.pay_amount,
        re.refund_remark,
        co.recharge_serial_number as serail_number,
        co.payment_amount,
        co.create_time as pay_time,
        co.id as order_id,
        co.app_user_id as user_id,
        1 as type
        FROM t_charging_order_refund re
        LEFT JOIN t_charging_order  co ON re.charging_order_id = co.id
        LEFT JOIN t_charging_order co ON re.charging_order_id = co.id
        UNION ALL
        SELECT
            re.id,
            re.`code`,
            re.refund_code,
            re.refund_title,
            re.refund_reason,
            re.refund_amount,
            re.refund_total_amount,
            re.refund_time,
            re.pay_type,
            re.pay_amount,
            re.refund_remark,
            so.serial_number,
            so.payment_amount,
            so.create_time as pay_time,
            so.id as order_id,
            so.app_user_id as user_id,
            2 as type
        re.id,
        re.`code`,
        re.refund_code,
        re.refund_title,
        re.refund_reason,
        re.refund_amount,
        re.refund_total_amount,
        re.refund_time,
        re.pay_type,
        re.pay_amount,
        re.refund_remark,
        so.serial_number,
        so.payment_amount,
        so.create_time as pay_time,
        so.id as order_id,
        so.app_user_id as user_id,
        2 as type
        FROM t_shopping_order_refund re
        LEFT JOIN t_shopping_order so on re.shopping_order_id = so.id
        UNION ALL
        SELECT
            vr.id,
            vr.`code`,
            vr.refund_code,
            vr.refund_title,
            vr.refund_reason,
            vr.refund_amount,
            vr.refund_total_amount,
            vr.refund_time,
            vr.pay_type,
            vr.pay_amount,
            vr.refund_remark,
            vo.serial_number,
            vo.payment_amount,
            vo.create_time as pay_time,
            vo.id as order_id,
            vo.app_user_id as user_id,
            3 as type
        vr.id,
        vr.`code`,
        vr.refund_code,
        vr.refund_title,
        vr.refund_reason,
        vr.refund_amount,
        vr.refund_total_amount,
        vr.refund_time,
        vr.pay_type,
        vr.pay_amount,
        vr.refund_remark,
        vo.serial_number,
        vo.payment_amount,
        vo.create_time as pay_time,
        vo.id as order_id,
        vo.app_user_id as user_id,
        3 as type
        FROM t_vip_order_refund vr
        LEFT JOIN t_vip_order vo on vr.vip_order_id = vo.id
        ) o
@@ -316,7 +329,7 @@
    </select>
    <select id="chargingOrderGroup" resultType="com.ruoyi.common.core.dto.ChargingOrderGroup">
        SELECT SUM(tc.charging_capacity) as  charging_capacity,tc.site_id
        SELECT SUM(tc.charging_capacity) as charging_capacity,tc.site_id
        FROM t_charging_order tc
        left join `charging_pile_service`.`t_site` ts on tc.site_id = ts.id
        <where>
@@ -339,12 +352,11 @@
        GROUP BY site_id
    </select>
    <select id="charge" resultType="com.ruoyi.order.dto.SixChargingDto">
        SELECT
        DATE_FORMAT( subquery.create_time, '%m' ) AS MONTH,
        SUM(electrovalence) AS electrovalence,
        SUM(electrovalence) AS electrovalence,
        SUM(
        CASE
        WHEN subquery.order_source = 0 THEN subquery.service_charge
@@ -354,30 +366,32 @@
        ) AS service_charge
        FROM
            (
            SELECT
            a.create_time,
            b.period_electric_price as electrovalence,
            b.period_service_price as service_charge,
            a.order_source
            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(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.recharge_payment_status = 2 and a.status = 5
                <if test="sixBefore != null">
                    AND a.create_time &gt;= #{sixBefore}
                </if>
                <if test="siteIds != null and siteIds.size() > 0">
                    AND a.site_id IN
                    <foreach collection="siteIds" item="siteId" open="(" separator="," close=")">
                        #{siteId}
                    </foreach>
                </if>
            </where>
            ) AS subquery
        (
        SELECT
        a.create_time,
        b.period_electric_price as electrovalence,
        b.period_service_price as service_charge,
        a.order_source
        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(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.recharge_payment_status = 2 and a.status = 5
            <if test="sixBefore != null">
                AND a.create_time &gt;= #{sixBefore}
            </if>
            <if test="siteIds != null and siteIds.size() > 0">
                AND a.site_id IN
                <foreach collection="siteIds" item="siteId" open="(" separator="," close=")">
                    #{siteId}
                </foreach>
            </if>
        </where>
        ) AS subquery
        GROUP BY
            DATE_FORMAT( subquery.create_time, '%m' )
        DATE_FORMAT( subquery.create_time, '%m' )
    </select>
@@ -391,7 +405,9 @@
        END), 2) AS paymentAmount
        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(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)
        left join (select charging_order_id, sum(period_electric_price) as period_electric_price,
        sum(period_service_price) as period_service_price, 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.recharge_payment_status = 2 and a.status = 5
            <if test="siteIds != null and siteIds.size() > 0">
@@ -409,7 +425,9 @@
    </select>
    <select id="countAll" resultType="java.util.Map">
        select sum(electrovalence) as electrovalence,sum(service_charge) as service_charge,ROUND(sum(electrovalence+service_charge) * 0.006, 2) as commission_amount,sum(sharing_amount) as sharing_amount
        select sum(electrovalence) as electrovalence,sum(service_charge) as
        service_charge,ROUND(sum(electrovalence+service_charge) * 0.006, 2) as commission_amount,sum(sharing_amount) as
        sharing_amount
        from t_charging_order
        where del_flag = 0 and recharge_payment_status = 2 and status = 5
        <if test="siteIds != null and siteIds.size() > 0">
@@ -440,7 +458,8 @@
        FROM
        t_charging_order_accounting_strategy t1
        LEFT JOIN t_charging_order t2 on t1.charging_order_id = t2.id
        where t2.del_flag = 0 and t2.status = 5 and t2.recharge_payment_status = 2 and t2.create_time between #{start} and #{end}
        where t2.del_flag = 0 and t2.status = 5 and t2.recharge_payment_status = 2 and t2.create_time between #{start}
        and #{end}
        <if test="null != siteIds and siteIds.size() > 0">
            and t2.site_id in
            <foreach collection="siteIds" separator="," open="(" close=")" item="item" index="index">
@@ -468,9 +487,11 @@
        count(1) as orderCount
        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(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)
        left join (select charging_order_id, sum(period_electric_price) as period_electric_price,
        sum(period_service_price) as period_service_price, 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(a.create_time) = CURDATE()
            a.del_flag = 0 and a.status = 5 and a.recharge_payment_status = 2 and DATE(a.create_time) = CURDATE()
            and a.create_time between #{start} and #{end}
            <if test="null != siteIds and siteIds.size() > 0">
                and a.site_id in
@@ -480,9 +501,9 @@
            </if>
        </where>
        GROUP BY
            time
        time
        ORDER BY
            time
        time
    </select>
    <select id="getWeekData" resultType="java.util.Map">
@@ -503,9 +524,12 @@
        count(1) as orderCount
        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(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)
        left join (select charging_order_id, sum(period_electric_price) as period_electric_price,
        sum(period_service_price) as period_service_price, 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 YEARWEEK(DATE_FORMAT(a.create_time, '%Y-%m-%d'), 1) = YEARWEEK(NOW(), 1)
            a.del_flag = 0 and a.status = 5 and a.recharge_payment_status = 2 and YEARWEEK(DATE_FORMAT(a.create_time,
            '%Y-%m-%d'), 1) = YEARWEEK(NOW(), 1)
            and a.create_time between #{start} and #{end}
            <if test="null != siteIds and siteIds.size() > 0">
                and a.site_id in
@@ -538,9 +562,12 @@
        count(1) as orderCount
        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(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)
        left join (select charging_order_id, sum(period_electric_price) as period_electric_price,
        sum(period_service_price) as period_service_price, 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 MONTH(a.create_time) = MONTH(NOW())  AND YEAR(a.create_time) = YEAR(NOW())
            a.del_flag = 0 and a.status = 5 and a.recharge_payment_status = 2 and MONTH(a.create_time) = MONTH(NOW())
            AND YEAR(a.create_time) = YEAR(NOW())
            and a.create_time between #{start} and #{end}
            <if test="null != siteIds and siteIds.size() > 0">
                and a.site_id in
@@ -573,9 +600,11 @@
        count(1) as orderCount
        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(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)
        left join (select charging_order_id, sum(period_electric_price) as period_electric_price,
        sum(period_service_price) as period_service_price, 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 YEAR(a.create_time) = YEAR(NOW())
            a.del_flag = 0 and a.status = 5 and a.recharge_payment_status = 2 and YEAR(a.create_time) = YEAR(NOW())
            and a.create_time between #{start} and #{end}
            <if test="null != siteIds and siteIds.size() > 0">
                and a.site_id in
@@ -607,9 +636,11 @@
        count(1) as orderCount
        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(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)
        left join (select charging_order_id, sum(period_electric_price) as period_electric_price,
        sum(period_service_price) as period_service_price, 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
            a.del_flag = 0 and a.status = 5 and a.recharge_payment_status = 2
            and a.create_time between #{start} and #{end}
            <if test="null != siteIds and siteIds.size() > 0">
                and a.site_id in
@@ -626,15 +657,15 @@
    </select>
    <select id="queryPower" resultType="java.util.Map">
        SELECT
            'today' AS data_type,
            DATE_FORMAT(create_time, '%H') AS TIME,
    SUM(power) AS power
        'today' AS data_type,
        DATE_FORMAT(create_time, '%H') AS TIME,
        SUM(power) AS power
        FROM
            t_charging_order
        t_charging_order
        WHERE
            del_flag = 0
          AND recharge_payment_status = 2
          AND DATE(create_time) = CURDATE()
        del_flag = 0
        AND recharge_payment_status = 2
        AND DATE(create_time) = CURDATE()
        <if test="siteIds != null and siteIds.size() > 0">
            AND site_id IN
            <foreach collection="siteIds" item="siteId" open="(" separator="," close=")">
@@ -642,20 +673,20 @@
            </foreach>
        </if>
        GROUP BY
            TIME
        TIME
        UNION ALL
        SELECT
            'yesterday' AS data_type,
            DATE_FORMAT(create_time, '%H') AS TIME,
    SUM(power) AS power
        'yesterday' AS data_type,
        DATE_FORMAT(create_time, '%H') AS TIME,
        SUM(power) AS power
        FROM
            t_charging_order
        t_charging_order
        WHERE
            del_flag = 0
          AND recharge_payment_status = 2
          AND DATE(create_time) = CURDATE() - INTERVAL 1 DAY
        del_flag = 0
        AND recharge_payment_status = 2
        AND DATE(create_time) = CURDATE() - INTERVAL 1 DAY
        <if test="siteIds != null and siteIds.size() > 0">
            AND site_id IN
            <foreach collection="siteIds" item="siteId" open="(" separator="," close=")">
@@ -663,10 +694,10 @@
            </foreach>
        </if>
        GROUP BY
            TIME
        TIME
        ORDER BY
            TIME;
        TIME;
    </select>
@@ -678,10 +709,10 @@
        SUM(CASE WHEN power BETWEEN 121 AND 300 THEN 1 ELSE 0 END) AS count_121_300,
        SUM(CASE WHEN power > 300 THEN 1 ELSE 0 END) AS count_above_300
        FROM
            t_charging_order
        t_charging_order
        WHERE
            del_flag = 0
          AND recharge_payment_status = 2
        del_flag = 0
        AND recharge_payment_status = 2
        <if test="siteIds != null and siteIds.size() > 0">
            AND site_id IN
            <foreach collection="siteIds" item="siteId" open="(" separator="," close=")">
@@ -698,7 +729,7 @@
            AND MONTH(create_time) = MONTH(CURDATE())
        </if>
        <if test="statisticsQueryDto.dayType ==4">
           AND YEAR(create_time) = YEAR(CURDATE())
            AND YEAR(create_time) = YEAR(CURDATE())
        </if>
        <if test="statisticsQueryDto.dayType ==5">
@@ -714,31 +745,31 @@
        SELECT
            DATE_FORMAT( create_time, '%H:00' ) AS time,
    count(1) AS counts
        DATE_FORMAT( create_time, '%H:00' ) AS time,
        count(1) AS counts
        FROM
            charging_pile_account.t_app_user
        charging_pile_account.t_app_user
        WHERE
            del_flag = 0
          AND DATE ( create_time ) = CURDATE()
        del_flag = 0
        AND DATE ( create_time ) = CURDATE()
        GROUP BY
            time
        time
    </select>
    <select id="usersDay1" resultType="java.util.Map">
        SELECT
            'today' AS data_type,
            '1' as type,
            DATE_FORMAT( create_time, '%H:00' ) AS time,
        count(DISTINCT  app_user_id) AS counts
        'today' AS data_type,
        '1' as type,
        DATE_FORMAT( create_time, '%H:00' ) AS time,
        count(DISTINCT app_user_id) AS counts
        FROM
            t_charging_order
        t_charging_order
        WHERE
            del_flag = 0
          AND DATE ( create_time ) = CURDATE()
        del_flag = 0
        AND DATE ( create_time ) = CURDATE()
        GROUP BY
            time
        time
    </select>
    <select id="usersByQuery1" resultType="java.util.Map">
@@ -747,7 +778,7 @@
        'today' AS data_type,
        '1' as type,
        DATE_FORMAT( create_time, '%Y-%m-%d' ) AS time,
        count(DISTINCT  app_user_id) AS counts
        count(DISTINCT app_user_id) AS counts
        FROM
        t_charging_order
        WHERE
@@ -783,12 +814,12 @@
        SELECT
            DATE_FORMAT( create_time, '%Y-%m-%d' ) AS time,
    count(1) AS counts
        DATE_FORMAT( create_time, '%Y-%m-%d' ) AS time,
        count(1) AS counts
        FROM
            charging_pile_account.t_app_user
        charging_pile_account.t_app_user
        WHERE
            del_flag = 0
        del_flag = 0
        <if test="statisticsQueryDto.dayType ==1 ">
            AND DATE(create_time) = CURDATE()
        </if>
@@ -810,51 +841,52 @@
            </if>
        </if>
        GROUP BY
            time
        time
    </select>
    <select id="getUserTagCount" resultType="java.util.Map">
        SELECT
            tt.`name`,
            COUNT( 1 ) AS count
        tt.`name`,
        COUNT( 1 ) AS count
        FROM
            (
            SELECT
            a.app_user_id,
            a.user_tag_id,
            a.create_time
            FROM
            charging_pile_account.t_app_user_tag a
            JOIN ( SELECT app_user_id, MAX( create_time ) AS max_create_time FROM charging_pile_account.t_app_user_tag GROUP BY app_user_id ) b ON a.app_user_id = b.app_user_id
            AND a.create_time = b.max_create_time
            LEFT JOIN `charging_pile_other`.`t_user_tag` ct on a.user_tag_id = ct.id
            WHERE ct.del_flag = 0
            ) o
            LEFT JOIN `charging_pile_other`.`t_user_tag` tt on o.user_tag_id = tt.id
        (
        SELECT
        a.app_user_id,
        a.user_tag_id,
        a.create_time
        FROM
        charging_pile_account.t_app_user_tag a
        JOIN ( SELECT app_user_id, MAX( create_time ) AS max_create_time FROM charging_pile_account.t_app_user_tag GROUP
        BY app_user_id ) b ON a.app_user_id = b.app_user_id
        AND a.create_time = b.max_create_time
        LEFT JOIN `charging_pile_other`.`t_user_tag` ct on a.user_tag_id = ct.id
        WHERE ct.del_flag = 0
        ) o
        LEFT JOIN `charging_pile_other`.`t_user_tag` tt on o.user_tag_id = tt.id
        GROUP BY
            tt.name
        tt.name
    </select>
    <select id="getVipCount" resultType="java.util.Map">
        SELECT
            tv.`name`,
            count(1) AS Counts
        tv.`name`,
        count(1) AS Counts
        FROM
            charging_pile_account.t_app_user  ta
                LEFT JOIN `charging_pile_other`.`t_vip` tv on ta.vip_id = tv.id
        charging_pile_account.t_app_user ta
        LEFT JOIN `charging_pile_other`.`t_vip` tv on ta.vip_id = tv.id
        WHERE
            ta.del_flag = 0
        ta.del_flag = 0
        GROUP BY
            tv.`name`
        tv.`name`
    </select>
    <select id="unitConsumption" resultType="java.util.Map">
        SELECT
        tc.`name`,
            au.company_id as companyId,
            SUM( co.charging_capacity )  as chargingCapacity
        au.company_id as companyId,
        SUM( co.charging_capacity ) as chargingCapacity
        FROM
            charging_pile_order.t_charging_order co
                LEFT JOIN charging_pile_account.t_app_user au ON co.app_user_id = au.id
        charging_pile_order.t_charging_order co
        LEFT JOIN charging_pile_account.t_app_user au ON co.app_user_id = au.id
        LEFT JOIN `charging_pile_other`.`t_company` tc on au.company_id = tc.id
        <where>
@@ -866,7 +898,7 @@
                AND WEEKOFYEAR( co.create_time ) = WEEKOFYEAR( CURDATE() )
            </if>
            <if test="statisticsQueryDto.dayType == 3">
               AND MONTH( co.create_time ) = MONTH(CURDATE())
                AND MONTH( co.create_time ) = MONTH(CURDATE())
            </if>
            <if test="statisticsQueryDto.dayType == 4">
                AND YEAR( co.create_time ) = YEAR(CURDATE() )
@@ -876,7 +908,7 @@
                    and DATE(co.create_time) >= #{statisticsQueryDto.startTime}
                </if>
                <if test="statisticsQueryDto.endTime != null">
                    and DATE(co.create_time)  &lt;= #{statisticsQueryDto.endTime}
                    and DATE(co.create_time) &lt;= #{statisticsQueryDto.endTime}
                </if>
            </if>
        </where>
@@ -885,61 +917,61 @@
    </select>
    <select id="carUserMethod" resultType="java.util.Map">
        SELECT
            count(1) as counts,vehicle_use
        count(1) as counts,vehicle_use
        from charging_pile_account.t_app_user_car
        where  del_flag = 0
        where del_flag = 0
        GROUP BY vehicle_use
    </select>
    <select id="carUserBrand" resultType="java.util.Map">
        SELECT
            count(1) as counts,vehicle_brand
        count(1) as counts,vehicle_brand
        from charging_pile_account.t_app_user_car
        where  del_flag = 0
        where del_flag = 0
        GROUP BY vehicle_brand
        ORDER BY counts DESC
            limit 5
        limit 5
    </select>
    <select id="countLocalCar" resultType="java.util.Map">
        SELECT
            SUM(CASE WHEN license_plate LIKE '%川J%' THEN 1 ELSE 0 END) AS localCar,
            SUM(CASE WHEN license_plate NOT LIKE '%川J%' THEN 1 ELSE 0 END) AS  notLocalCar
        SUM(CASE WHEN license_plate LIKE '%川J%' THEN 1 ELSE 0 END) AS localCar,
        SUM(CASE WHEN license_plate NOT LIKE '%川J%' THEN 1 ELSE 0 END) AS notLocalCar
        FROM
            `charging_pile_account`.`t_app_user_car`
        `charging_pile_account`.`t_app_user_car`
        WHERE
            del_flag = 0
        del_flag = 0
    </select>
    <select id="getAver" resultType="java.lang.Double">
        SELECT
            ROUND(AVG(te.mark), 2) AS average_mark
        ROUND(AVG(te.mark), 2) AS average_mark
        FROM
            `t_order_evaluate` te
                LEFT JOIN t_charging_order  co on te.order_id = co.id
        `t_order_evaluate` te
        LEFT JOIN t_charging_order co on te.order_id = co.id
        WHERE
             1 = 1
        1 = 1
        <if test="siteIds != null and siteIds.size() > 0">
            AND co.site_id IN
            <foreach collection="siteIds" item="siteId" open="(" separator="," close=")">
                #{siteId}
            </foreach>
        </if>
           AND  te.del_flag = 0
        AND te.del_flag = 0
    </select>
    <select id="getLevelEvaluate" resultType="java.util.Map">
        SELECT
            CASE
                WHEN te.mark BETWEEN 1 AND 2 THEN '1-2'
                WHEN te.mark = 3 THEN '3'
                WHEN te.mark BETWEEN 4 AND 5 THEN '4-5'
                ELSE 'Other'
                END AS score_range,
            COUNT(*) AS count
        CASE
        WHEN te.mark BETWEEN 1 AND 2 THEN '1-2'
        WHEN te.mark = 3 THEN '3'
        WHEN te.mark BETWEEN 4 AND 5 THEN '4-5'
        ELSE 'Other'
        END AS score_range,
        COUNT(*) AS count
        FROM
            `t_order_evaluate` te
            LEFT JOIN t_charging_order  co on te.order_id = co.id
        `t_order_evaluate` te
        LEFT JOIN t_charging_order co on te.order_id = co.id
        WHERE
            te.del_flag = 0
        te.del_flag = 0
        <if test="siteIds != null and siteIds.size() > 0">
            AND co.site_id IN
            <foreach collection="siteIds" item="siteId" open="(" separator="," close=")">
@@ -947,34 +979,34 @@
            </foreach>
        </if>
        GROUP BY
            score_range
        score_range
    </select>
    <select id="chargingList" resultType="com.ruoyi.order.api.vo.ChargingOrderListVO">
        select t1.*,
               t1.current as chargingCapacity,
               t1.payment_amount as paymentAmount,
               t1.electricity as chargingCapacity,
               ifnull(t2.refund_amount, 0) as refundAmount
        t1.current as chargingCapacity,
        t1.payment_amount as paymentAmount,
        t1.electricity as chargingCapacity,
        ifnull(t2.refund_amount, 0) as refundAmount
        from t_charging_order t1
        left join t_charging_order_refund t2 on t1.id = t2.charging_order_id
        where t1.del_flag = 0 and t1.status = 5  and t1.recharge_payment_status = 2
        where t1.del_flag = 0 and t1.status = 5 and t1.recharge_payment_status = 2
        <if test="null != req.code and req.code!=''">
            and t1.code  LIKE CONCAT('%',#{req.code},'%')
            and t1.code LIKE CONCAT('%',#{req.code},'%')
        </if>
        <if test="null != req.carIds and req.carIds.size()>0" >
        <if test="null != req.carIds and req.carIds.size()>0">
            and t1.app_user_car_id in
            <foreach collection="req.carIds" item="item" index="index" separator="," open="(" close=")">
                #{item}
            </foreach>
        </if>
        <if test="null != req.userIds and req.userIds.size()>0" >
        <if test="null != req.userIds and req.userIds.size()>0">
            and t1.app_user_id in
            <foreach collection="req.userIds" item="item" index="index" separator="," open="(" close=")">
                #{item}
            </foreach>
        </if>
        <if test="null != req.siteIds and req.siteIds.size()>0" >
        <if test="null != req.siteIds and req.siteIds.size()>0">
            and t1.site_id in
            <foreach collection="req.siteIds" item="item" index="index" separator="," open="(" close=")">
                #{item}
@@ -1005,15 +1037,15 @@
        select t1.* from t_charging_order t1
        where 1=1
        <if test="null != req.code and req.code!=''">
            and t1.code  LIKE CONCAT('%',#{req.code},'%')
            and t1.code LIKE CONCAT('%',#{req.code},'%')
        </if>
        <if test="null != req.carIds and req.carIds.size()>0" >
        <if test="null != req.carIds and req.carIds.size()>0">
            and t1.app_user_car_id in
            <foreach collection="req.carIds" item="item" index="index" separator="," open="(" close=")">
                #{item}
            </foreach>
        </if>
        <if test="null != req.userIds and req.userIds.size()>0" >
        <if test="null != req.userIds and req.userIds.size()>0">
            and t1.app_user_id in
            <foreach collection="req.userIds" item="item" index="index" separator="," open="(" close=")">
                #{item}
@@ -1049,53 +1081,54 @@
        end as source
        from t_charging_order
        where 1=1
        AND  del_flag = 0
        AND del_flag = 0
        AND recharge_payment_status = 2 and status = 5
            <if test="siteIds != null and siteIds.size() > 0">
                and site_id IN
                <foreach collection="siteIds" item="siteId" open="(" separator="," close=")">
                    #{siteId}
                </foreach>
            </if>
            <if test="statisticsQueryDto.dayType == 1">
                AND DATE(create_time ) = CURDATE()
            </if>
            <if test="statisticsQueryDto.dayType != 1">
                and DATE(create_time) >= #{statisticsQueryDto.startTime}
                and DATE(create_time)  &lt;= #{statisticsQueryDto.endTime}
            </if>
        <if test="siteIds != null and siteIds.size() > 0">
            and site_id IN
            <foreach collection="siteIds" item="siteId" open="(" separator="," close=")">
                #{siteId}
            </foreach>
        </if>
        <if test="statisticsQueryDto.dayType == 1">
            AND DATE(create_time ) = CURDATE()
        </if>
        <if test="statisticsQueryDto.dayType != 1">
            and DATE(create_time) >= #{statisticsQueryDto.startTime}
            and DATE(create_time) &lt;= #{statisticsQueryDto.endTime}
        </if>
        group by tripartite_platform_name
    </select>
    <select id="equipmentUserType1" resultType="java.util.Map">
        SELECT
            FORMAT(SUM(TIME_TO_SEC(TIMEDIFF(co.end_time, co.start_time)) /
                       <if test="statisticsQueryDto.dayType == 1">
                           864
                       </if>
                   <if test="statisticsQueryDto.dayType == 2">
                       6048
                   </if>
                   <if test="statisticsQueryDto.dayType == 3">
                       25920
                   </if>
                   <if test="statisticsQueryDto.dayType == 4">
                       315360
                   </if>
                   <if test="statisticsQueryDto.dayType == 5">
                       (864*(SELECT TIMESTAMPDIFF(DAY, #{statisticsQueryDto.startTime}, #{statisticsQueryDto.endTime}) +1 AS days_difference
                       ))
                   </if>
        FORMAT(SUM(TIME_TO_SEC(TIMEDIFF(co.end_time, co.start_time)) /
        <if test="statisticsQueryDto.dayType == 1">
            864
        </if>
        <if test="statisticsQueryDto.dayType == 2">
            6048
        </if>
        <if test="statisticsQueryDto.dayType == 3">
            25920
        </if>
        <if test="statisticsQueryDto.dayType == 4">
            315360
        </if>
        <if test="statisticsQueryDto.dayType == 5">
            (864*(SELECT TIMESTAMPDIFF(DAY, #{statisticsQueryDto.startTime}, #{statisticsQueryDto.endTime}) +1 AS
            days_difference
            ))
        </if>
                   ), 2) AS percent,co.charging_gun_id,tc.name,cp.name as siteName
        ), 2) AS percent,co.charging_gun_id,tc.name,cp.name as siteName
        FROM
            `charging_pile_order`.`t_charging_order` co
                LEFT JOIN  `charging_pile_service`.`t_charging_gun` tc on co.charging_gun_id = tc.id
                LEFT JOIN  `charging_pile_service`.`t_charging_pile` cp on tc.charging_pile_id = cp.id
        `charging_pile_order`.`t_charging_order` co
        LEFT JOIN `charging_pile_service`.`t_charging_gun` tc on co.charging_gun_id = tc.id
        LEFT JOIN `charging_pile_service`.`t_charging_pile` cp on tc.charging_pile_id = cp.id
        WHERE co.del_flag = 0 and
            co.start_time IS NOT NULL AND co.end_time IS NOT NULL and tc.type = 4
        co.start_time IS NOT NULL AND co.end_time IS NOT NULL and tc.type = 4
        <if test="siteIds != null and siteIds.size() > 0">
            and co.site_id IN
            <foreach collection="siteIds" item="siteId" open="(" separator="," close=")">
@@ -1116,15 +1149,13 @@
        </if>
        <if test="statisticsQueryDto.dayType == 5">
                and DATE(co.create_time) >= #{statisticsQueryDto.startTime}
            and DATE(co.create_time) >= #{statisticsQueryDto.startTime}
                and DATE(co.create_time)  &lt;= #{statisticsQueryDto.endTime}
            and DATE(co.create_time) &lt;= #{statisticsQueryDto.endTime}
        </if>
        GROUP BY tc.name,cp.name,co.charging_gun_id
    </select>
@@ -1144,7 +1175,8 @@
            315360
        </if>
        <if test="statisticsQueryDto.dayType == 5">
            (864*(SELECT TIMESTAMPDIFF(DAY, #{statisticsQueryDto.startTime}, #{statisticsQueryDto.endTime}) +1 AS days_difference
            (864*(SELECT TIMESTAMPDIFF(DAY, #{statisticsQueryDto.startTime}, #{statisticsQueryDto.endTime}) +1 AS
            days_difference
            ))
        </if>
@@ -1152,8 +1184,8 @@
        ), 2) AS percent,co.charging_gun_id,tc.name,cp.name as siteName
        FROM
        `charging_pile_order`.`t_charging_order` co
        LEFT JOIN  `charging_pile_service`.`t_charging_gun` tc on co.charging_gun_id = tc.id
        LEFT JOIN  `charging_pile_service`.`t_charging_pile` cp on tc.charging_pile_id = cp.id
        LEFT JOIN `charging_pile_service`.`t_charging_gun` tc on co.charging_gun_id = tc.id
        LEFT JOIN `charging_pile_service`.`t_charging_pile` cp on tc.charging_pile_id = cp.id
        WHERE co.del_flag = 0 and
        co.start_time IS NOT NULL AND co.end_time IS NOT NULL and tc.type in (2,3)
        <if test="siteIds != null and siteIds.size() > 0">
@@ -1179,7 +1211,7 @@
                and DATE(co.create_time) >= #{statisticsQueryDto.startTime}
            </if>
            <if test="statisticsQueryDto.endTime != null">
                and DATE(co.create_time)  &lt;= #{statisticsQueryDto.endTime}
                and DATE(co.create_time) &lt;= #{statisticsQueryDto.endTime}
            </if>
        </if>
        GROUP BY tc.name,cp.name,co.charging_gun_id
@@ -1188,7 +1220,7 @@
    </select>
    <select id="equipmentMapbroke1" resultType="java.util.Map">
        SELECT
            FORMAT(SUM(TIME_TO_SEC(TIMEDIFF(co.end_time, co.down_time)) /
        FORMAT(SUM(TIME_TO_SEC(TIMEDIFF(co.end_time, co.down_time)) /
        <if test="statisticsQueryDto.dayType == 1">
            864
        </if>
@@ -1202,14 +1234,15 @@
            315360
        </if>
        <if test="statisticsQueryDto.dayType == 5">
            (864*(SELECT TIMESTAMPDIFF(DAY, #{statisticsQueryDto.startTime}, #{statisticsQueryDto.endTime}) +1 AS days_difference
            (864*(SELECT TIMESTAMPDIFF(DAY, #{statisticsQueryDto.startTime}, #{statisticsQueryDto.endTime}) +1 AS
            days_difference
            ))
        </if>
                   ), 2) AS percent,cp.name
        ), 2) AS percent,cp.name
        FROM
        `charging_pile_service`.`t_fault_message` co
        LEFT JOIN  `charging_pile_service`.`t_charging_pile` cp on co.charging_pile_id = cp.id
        LEFT JOIN `charging_pile_service`.`t_charging_pile` cp on co.charging_pile_id = cp.id
        WHERE
        co.down_time IS NOT NULL AND co.end_time IS NOT NULL and cp.type = 1 and co.status =2
        <if test="siteIds != null and siteIds.size() > 0">
@@ -1232,10 +1265,10 @@
        </if>
        <if test="statisticsQueryDto.dayType == 5">
                and DATE(co.create_time) >= #{statisticsQueryDto.startTime}
            and DATE(co.create_time) >= #{statisticsQueryDto.startTime}
                and DATE(co.create_time)  &lt;= #{statisticsQueryDto.endTime}
            and DATE(co.create_time) &lt;= #{statisticsQueryDto.endTime}
        </if>
        GROUP BY cp.name
@@ -1258,14 +1291,15 @@
            315360
        </if>
        <if test="statisticsQueryDto.dayType == 5">
            (864*(SELECT TIMESTAMPDIFF(DAY, #{statisticsQueryDto.startTime}, #{statisticsQueryDto.endTime}) +1 AS days_difference
            (864*(SELECT TIMESTAMPDIFF(DAY, #{statisticsQueryDto.startTime}, #{statisticsQueryDto.endTime}) +1 AS
            days_difference
            ))
        </if>
        ), 2) AS percent,cp.name
        FROM
        `charging_pile_service`.`t_fault_message` co
        LEFT JOIN  `charging_pile_service`.`t_charging_pile` cp on co.charging_pile_id = cp.id
        LEFT JOIN `charging_pile_service`.`t_charging_pile` cp on co.charging_pile_id = cp.id
        WHERE
        co.down_time IS NOT NULL AND co.end_time IS NOT NULL and cp.type in (2,3) and co.status =2
        <if test="siteIds != null and siteIds.size() > 0">
@@ -1288,9 +1322,9 @@
        </if>
        <if test="statisticsQueryDto.dayType == 5">
                and DATE(co.create_time) >= #{statisticsQueryDto.startTime}
            and DATE(co.create_time) >= #{statisticsQueryDto.startTime}
                and DATE(co.create_time)  &lt;= #{statisticsQueryDto.endTime}
            and DATE(co.create_time) &lt;= #{statisticsQueryDto.endTime}
        </if>
        GROUP BY cp.name
@@ -1313,14 +1347,15 @@
            315360
        </if>
        <if test="statisticsQueryDto.dayType == 5">
            (864*(SELECT TIMESTAMPDIFF(DAY, #{statisticsQueryDto.startTime}, #{statisticsQueryDto.endTime}) +1 AS days_difference
            (864*(SELECT TIMESTAMPDIFF(DAY, #{statisticsQueryDto.startTime}, #{statisticsQueryDto.endTime}) +1 AS
            days_difference
            ))
        </if>
        ), 2)  AS percent,cp.name
        ), 2) AS percent,cp.name
        FROM
        `charging_pile_service`.`t_fault_message` co
        LEFT JOIN  `charging_pile_service`.`t_charging_pile` cp on co.charging_pile_id = cp.id
        LEFT JOIN `charging_pile_service`.`t_charging_pile` cp on co.charging_pile_id = cp.id
        WHERE
        co.down_time IS NOT NULL AND co.end_time IS NOT NULL and cp.type = 1 and co.status =1
        <if test="siteIds != null and siteIds.size() > 0">
@@ -1346,7 +1381,7 @@
                and DATE(co.create_time) >= #{statisticsQueryDto.startTime}
            </if>
            <if test="statisticsQueryDto.endTime != null">
                and DATE(co.create_time)  &lt;= #{statisticsQueryDto.endTime}
                and DATE(co.create_time) &lt;= #{statisticsQueryDto.endTime}
            </if>
        </if>
        GROUP BY cp.name
@@ -1367,14 +1402,15 @@
            315360
        </if>
        <if test="statisticsQueryDto.dayType == 5">
            (864*(SELECT TIMESTAMPDIFF(DAY, #{statisticsQueryDto.startTime}, #{statisticsQueryDto.endTime}) +1 AS days_difference
            (864*(SELECT TIMESTAMPDIFF(DAY, #{statisticsQueryDto.startTime}, #{statisticsQueryDto.endTime}) +1 AS
            days_difference
            ))
        </if>
        ), 2) AS percent,cp.name
        FROM
        `charging_pile_service`.`t_fault_message` co
        LEFT JOIN  `charging_pile_service`.`t_charging_pile` cp on co.charging_pile_id = cp.id
        LEFT JOIN `charging_pile_service`.`t_charging_pile` cp on co.charging_pile_id = cp.id
        WHERE
        co.down_time IS NOT NULL AND co.end_time IS NOT NULL and cp.type = 2 and co.status =1
        <if test="siteIds != null and siteIds.size() > 0">
@@ -1400,7 +1436,7 @@
                and DATE(co.create_time) >= #{statisticsQueryDto.startTime}
            </if>
            <if test="statisticsQueryDto.endTime != null">
                and DATE(co.create_time)  &lt;= #{statisticsQueryDto.endTime}
                and DATE(co.create_time) &lt;= #{statisticsQueryDto.endTime}
            </if>
        </if>
        GROUP BY cp.name
@@ -1408,14 +1444,14 @@
    </select>
    <select id="needElec" resultType="java.util.Map">
        SELECT
            FORMAT((SUM(co.current)*100 / SUM(co.need_elec)), 2) AS percent,
            co.charging_gun_id,
            tc.name as name,
            cp.name AS siteName
        FORMAT((SUM(co.current)*100 / SUM(co.need_elec)), 2) AS percent,
        co.charging_gun_id,
        tc.name as name,
        cp.name AS siteName
        FROM
            `charging_pile_order`.`t_charging_order` co
                LEFT JOIN `charging_pile_service`.`t_charging_gun` tc ON co.charging_gun_id = tc.id
                LEFT JOIN `charging_pile_service`.`t_charging_pile` cp ON tc.charging_pile_id = cp.id
        `charging_pile_order`.`t_charging_order` co
        LEFT JOIN `charging_pile_service`.`t_charging_gun` tc ON co.charging_gun_id = tc.id
        LEFT JOIN `charging_pile_service`.`t_charging_pile` cp ON tc.charging_pile_id = cp.id
        <where>
            tc.type = 4 and co.need_elec != 0
            <if test="siteIds != null and siteIds.size() > 0">
@@ -1438,16 +1474,16 @@
            </if>
            <if test="statisticsQueryDto.dayType == 5">
                    and DATE(co.create_time) >= #{statisticsQueryDto.startTime}
                and DATE(co.create_time) >= #{statisticsQueryDto.startTime}
                    and DATE(co.create_time)  &lt;= #{statisticsQueryDto.endTime}
                and DATE(co.create_time) &lt;= #{statisticsQueryDto.endTime}
            </if>
        </where>
        GROUP BY
            tc.name,
            cp.name,
            co.charging_gun_id;
        tc.name,
        cp.name,
        co.charging_gun_id;
    </select>
@@ -1477,8 +1513,11 @@
        (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_FORMAT(
        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_FORMAT(
        <if test="statisticsQueryDto.type == 1">
            a.create_time
        </if>
@@ -1520,8 +1559,11 @@
        (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_FORMAT(
        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_FORMAT(
        <if test="statisticsQueryDto.type == 1">
            a.start_time
        </if>
@@ -1563,8 +1605,11 @@
        (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_FORMAT(
        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_FORMAT(
        <if test="statisticsQueryDto.type == 1">
            a.start_time
        </if>
@@ -1582,11 +1627,11 @@
    </select>
    <select id="getchargingCapacity" resultType="java.util.Map">
        SELECT
            DATE_FORMAT( create_time, '%Y-%m-%d' ) as time,
    SUM(charging_capacity) as chargingCapacity
        DATE_FORMAT( create_time, '%Y-%m-%d' ) as time,
        SUM(charging_capacity) as chargingCapacity
        FROM
            t_charging_order
        WHERE     del_flag = 0 and recharge_payment_status = 2
        t_charging_order
        WHERE del_flag = 0 and recharge_payment_status = 2
        <if test="statisticsQueryDto.dayType == 1">
            AND DATE( create_time ) between #{statisticsQueryDto.startTime} and #{statisticsQueryDto.endTime}
        </if>
@@ -1598,30 +1643,30 @@
            </foreach>
        </if>
        GROUP BY
            time
        time
    </select>
    <select id="countAllUserData" resultType="java.util.Map">
        SELECT
            COUNT( DISTINCT app_user_id ) AS counts,
            '1' AS type
        COUNT( DISTINCT app_user_id ) AS counts,
        '1' AS type
        FROM
            `charging_pile_order`.`t_charging_order` UNION ALL
        `charging_pile_order`.`t_charging_order` UNION ALL
        SELECT
            COUNT(*) AS counts,
            '2' AS type
        COUNT(*) AS counts,
        '2' AS type
        FROM
            `charging_pile_account`.`t_app_user`
        `charging_pile_account`.`t_app_user`
        WHERE
            `vip_end_time` > NOW()
        `vip_end_time` > NOW()
        UNION ALL
        SELECT
            COUNT(*) AS counts,
            '3' AS type
        COUNT(*) AS counts,
        '3' AS type
        FROM
            `charging_pile_account`.`t_app_user`
        `charging_pile_account`.`t_app_user`
        WHERE
            del_flag = 0
        del_flag = 0
    </select>
@@ -1632,7 +1677,8 @@
        tc.name as name,
        cp.name AS siteName
        FROM
        (select site_id,create_time,charging_gun_id, charging_pile_id, current, (CASE WHEN need_elec = 0 THEN `current` ELSE need_elec END) as need_elec from `charging_pile_order`.`t_charging_order`) co
        (select site_id,create_time,charging_gun_id, charging_pile_id, current, (CASE WHEN need_elec = 0 THEN `current`
        ELSE need_elec END) as need_elec from `charging_pile_order`.`t_charging_order`) co
        LEFT JOIN `charging_pile_service`.`t_charging_gun` tc ON co.charging_gun_id = tc.id
        LEFT JOIN `charging_pile_service`.`t_charging_pile` cp ON tc.charging_pile_id = cp.id
        <where>
@@ -1660,7 +1706,7 @@
                    and DATE(co.create_time) >= #{statisticsQueryDto.startTime}
                </if>
                <if test="statisticsQueryDto.endTime != null">
                    and DATE(co.create_time)  &lt;= #{statisticsQueryDto.endTime}
                    and DATE(co.create_time) &lt;= #{statisticsQueryDto.endTime}
                </if>
            </if>
        </where>
@@ -1673,24 +1719,24 @@
        SELECT count(1)
        from `charging_pile_account`.`t_app_user` au
        WHERE au.id not IN (
            SELECT app_user_id
            from `charging_pile_account`.`t_app_user_tag`
            GROUP BY app_user_id
        SELECT app_user_id
        from `charging_pile_account`.`t_app_user_tag`
        GROUP BY app_user_id
        )  and au.del_flag = 0
        ) and au.del_flag = 0
    </select>
    <select id="countCar" resultType="java.lang.Long">
        select count(1)
        from
            charging_pile_account.t_app_user_car
        charging_pile_account.t_app_user_car
        where del_flag = 0
        <if test="brands != null and brands.size() > 0">
          and vehicle_brand  not in
        <foreach collection="brands" item="brand" open="(" separator="," close=")">
            #{brand}
        </foreach>
            and vehicle_brand not in
            <foreach collection="brands" item="brand" open="(" separator="," close=")">
                #{brand}
            </foreach>
        </if>
    </select>
    <select id="chargingOrderNolimit" resultType="map">
@@ -1706,15 +1752,15 @@
        from t_charging_order t1
        where 1=1
        <if test="null != req.code and req.code!=''">
            and t1.code  LIKE CONCAT('%',#{req.code},'%')
            and t1.code LIKE CONCAT('%',#{req.code},'%')
        </if>
        <if test="null != req.userIds and req.userIds.size()>0" >
        <if test="null != req.userIds and req.userIds.size()>0">
            and t1.app_user_id in
            <foreach collection="req.userIds" item="item" index="index" separator="," open="(" close=")">
                #{item}
            </foreach>
        </if>
        <if test="null != req.siteIds and req.siteIds.size()>0" >
        <if test="null != req.siteIds and req.siteIds.size()>0">
            and t1.site_id in
            <foreach collection="req.siteIds" item="item" index="index" separator="," open="(" close=")">
                #{item}
@@ -1754,84 +1800,96 @@
        )
    </select>
    <select id="countOrdersByDate" resultType="com.ruoyi.order.vo.OrderCountByDate">
        SELECT  DATE_FORMAT(create_time, '%m/%d') AS `date`,  COUNT(*) AS `count`
        SELECT DATE_FORMAT(create_time, '%m/%d') AS `date`, COUNT(*) AS `count`
        FROM t_charging_order
        WHERE
            del_flag = 0
        del_flag = 0
        and
            status in (3,5)
        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}
        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="findFailedStartupOrder" resultType="com.ruoyi.order.api.model.TChargingOrder">
        SELECT
            *
        *
        FROM
            t_charging_order
        t_charging_order
        WHERE
            `status` = 2
          AND recharge_payment_status = 2
          AND NOW() >= ADDDATE(pay_time, INTERVAL 15 MINUTE )
          AND del_flag = 0
          AND id NOT IN (
            SELECT
                charging_order_id
            FROM
                t_charging_order_refund)
        `status` = 2 and order_source = 1
        AND recharge_payment_status = 2
        AND NOW() >= ADDDATE(pay_time, INTERVAL 15 MINUTE )
        AND del_flag = 0
        AND id NOT IN (
        SELECT
        charging_order_id
        FROM
        t_charging_order_refund)
    </select>
    <select id="findStoppedOrder" resultType="com.ruoyi.order.api.model.TChargingOrder">
        SELECT
            *
        *
        FROM
            t_charging_order
        t_charging_order
        WHERE
            `status` = 4
          AND NOW() >= ADDDATE(end_time, INTERVAL 10 MINUTE )
          AND del_flag = 0
          AND id NOT IN (
            SELECT
                charging_order_id
            FROM
                t_charging_order_refund)
        `status` = 4 and order_source = 1
        AND NOW() >= ADDDATE(end_time, INTERVAL 10 MINUTE )
        AND del_flag = 0
        AND id NOT IN (
        SELECT
        charging_order_id
        FROM
        t_charging_order_refund)
    </select>
    <select id="findChargingOrder" resultType="com.ruoyi.order.api.model.TChargingOrder">
        SELECT
            *
        *
        FROM
            t_charging_order
        t_charging_order
        WHERE
            `status` = 3
          AND del_flag = 0
          AND id NOT IN (
            SELECT
                charging_order_id
            FROM
                t_charging_order_refund)
        `status` = 3
        AND del_flag = 0 and order_source = 1
        AND id NOT IN (
        SELECT
        charging_order_id
        FROM
        t_charging_order_refund)
    </select>
    <select id="getSumDegreeBySiteIds" resultType="java.lang.Double">
        SELECT IFNULL(SUM(t2.charging_capacity), 0.0) AS sumDegreeBySiteIds
        FROM t_charging_order t1
                 LEFT JOIN t_charging_order_summary_data t2 ON t1.id = t2.charging_order_id
        LEFT JOIN t_charging_order_summary_data t2 ON t1.id = t2.charging_order_id
        WHERE t1.del_flag = 0
          <if test="siteIds != null and siteIds.size() > 0">
        <if test="siteIds != null and siteIds.size() > 0">
            AND t1.site_id IN
            <foreach collection="siteIds" item="item" open="(" separator="," close=")">
                #{item}
            </foreach>
          </if>
     </select>
        </if>
    </select>
    <select id="findEndChargingOrder" resultType="com.ruoyi.order.api.model.TChargingOrder">
        SELECT
        *
        FROM
        t_charging_order
        WHERE `status` in (-1, 5) AND del_flag = 0 and create_time > '2025-08-01 00:00:00' and order_source = 1 AND id NOT IN (
        SELECT
        charging_order_id
        FROM
        t_charging_order_refund)
    </select>
</mapper>
ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/RuoYiOrderApplicationTests.java
@@ -1,71 +1,511 @@
//package com.ruoyi.order;
//
//import com.alibaba.fastjson2.JSON;
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import com.ruoyi.account.api.feignClient.*;
//import com.ruoyi.account.api.model.TAppUserCar;
//import com.ruoyi.chargingPile.api.feignClient.*;
//import com.ruoyi.chargingPile.api.model.Site;
//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
//import com.ruoyi.account.api.feignClient.AppCouponClient;
//import com.ruoyi.account.api.feignClient.AppUserClient;
//import com.ruoyi.account.api.feignClient.AppUserIntegralChangeClient;
//import com.ruoyi.account.api.model.TAppCoupon;
//import com.ruoyi.account.api.model.TAppUser;
//import com.ruoyi.account.api.model.TAppUserIntegralChange;
//import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient;
//import com.ruoyi.chargingPile.api.feignClient.SiteClient;
//import com.ruoyi.chargingPile.api.model.TChargingGun;
//import com.ruoyi.chargingPile.api.model.TChargingPile;
//import com.ruoyi.common.core.domain.R;
//import com.ruoyi.common.core.web.domain.AjaxResult;
//import com.ruoyi.common.core.web.page.PageInfo;
//import com.ruoyi.common.redis.service.RedisService;
//import com.ruoyi.common.security.service.TokenService;
//import com.ruoyi.integration.api.feignClient.*;
//import com.ruoyi.integration.api.model.ChargingHandshake;
//import com.ruoyi.integration.api.feignClient.ChargingMessageClient;
//import com.ruoyi.integration.api.feignClient.TCECClient;
//import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData;
//import com.ruoyi.order.api.feignClient.AccountingStrategyDetailOrderClient;
//import com.ruoyi.order.api.model.TChargingOrder;
//import com.ruoyi.order.api.model.TChargingOrderAccountingStrategy;
//import com.ruoyi.order.api.vo.AccountingStrategyDetailOrderVo;
//import com.ruoyi.order.api.vo.ChargingOrderInfoVO;
//import com.ruoyi.order.api.vo.TransactionRecordMessageVO;
//import com.ruoyi.order.dto.ChargingDetails;
//import com.ruoyi.order.dto.MyChargingOrderInfo;
//import com.ruoyi.order.dto.PayOrderDto;
//import com.ruoyi.order.dto.PayOrderQueryDto;
//import com.ruoyi.order.mapper.TSettlementConfirmMapper;
//import com.ruoyi.integration.api.vo.ChargingOrderVo;
//import com.ruoyi.order.api.model.*;
//import com.ruoyi.order.service.*;
//import com.ruoyi.order.vo.EndOfChargePageInfo;
//import com.ruoyi.order.util.mongodb.service.TransactionRecordService;
//import com.ruoyi.order.util.mongodb.service.UploadRealTimeMonitoringDataService;
//import com.ruoyi.order.util.task.TaskUtil;
//import com.ruoyi.other.api.domain.TCoupon;
//import com.ruoyi.other.api.domain.TIntegralRule;
//import com.ruoyi.other.api.domain.TVip;
//import com.ruoyi.other.api.feignClient.IntegralRuleClient;
//import com.ruoyi.other.api.feignClient.UserTagClient;
//import com.ruoyi.other.api.feignClient.VipClient;
//import com.ruoyi.payment.api.feignClient.AliPaymentClient;
//import com.ruoyi.payment.api.feignClient.H5AliPaymentClient;
//import com.ruoyi.payment.api.feignClient.WxPaymentClient;
//import com.ruoyi.payment.api.model.RefundReq;
//import com.ruoyi.payment.api.model.RefundResp;
//import com.ruoyi.payment.api.model.WxPaymentRefundModel;
//import org.junit.jupiter.api.Test;
//import org.redisson.api.RLock;
//import org.redisson.api.RedissonClient;
//import org.springframework.beans.BeanUtils;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.boot.test.context.SpringBootTest;
//
//import javax.annotation.Resource;
//import java.io.PrintWriter;
//import java.math.BigDecimal;
//import java.math.MathContext;
//import java.math.RoundingMode;
//import java.text.SimpleDateFormat;
//import java.time.LocalDateTime;
//import java.time.format.DateTimeFormatter;
//import java.time.temporal.ChronoUnit;
//import java.util.*;
//import java.util.concurrent.TimeUnit;
//import java.util.stream.Collectors;
//
//@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = RuoYiOrderApplication.class)
//public class RuoYiOrderApplicationTests {
//
//    @Autowired
//    private RedissonClient redissonClient;
//    @Resource
//    private TChargingBillService chargingBillService;
//    @Resource
//    private SiteClient siteClient;
//    @Resource
//    private TChargingOrderService chargingOrderService;
//
//    @Resource
//    private TChargingOrderRefundService chargingOrderRefundService;
//
//    @Resource
//    private UploadRealTimeMonitoringDataService uploadRealTimeMonitoringDataService;
//
//    @Resource
//    private TransactionRecordService transactionRecordService;
//
//    @Resource
//    private ChargingMessageClient chargingMessageClient;
//
//    @Resource
//    private AccountingStrategyDetailOrderService accountingStrategyDetailOrderService;
//
//    @Resource
//    private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService;
//
//    @Resource
//    private AppCouponClient appCouponClient;
//
//    @Resource
//    private TCECClient tcecClient;
//
//    @Resource
//    private VipClient vipClient;
//
//    @Resource
//    private ChargingGunClient chargingGunClient;
//
//    @Resource
//    private IntegralRuleClient integralRuleClient;
//    @Resource
//    private AppUserClient appUserClient;
//
//    @Resource
//    private AppUserIntegralChangeClient appUserIntegralChangeClient;
//
//    @Resource
//    private WxPaymentClient wxPaymentClient;
//
//    @Resource
//    private AliPaymentClient aliPaymentClient;
//    @Resource
//    private H5AliPaymentClient h5AliPaymentClient;
//
//    @Resource
//    private ITChargingOrderSummaryDataService chargingOrderSummaryDataService;
//
//
//    @Test
//    public void test(){
//        RLock lock = redissonClient.getLock("endOrder:1234565");
//        boolean tryLock = false;
//        try {
//            tryLock = lock.tryLock(100, TimeUnit.SECONDS);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//            lock.unlock();
//        }
//        if(!tryLock){
//            System.out.println("获取锁失败");
//        }
//        System.out.println("获取锁成功");
//    }
//        TChargingOrder order = chargingOrderService.getOne(new QueryWrapper<TChargingOrder>().eq("code", "CD61220250714235257688"));
//        List<UploadRealTimeMonitoringData> dataList = uploadRealTimeMonitoringDataService.getDataByOrderCode(order.getCode());
//        if(!dataList.isEmpty()){
//            //获取当前订单的计费规则,然后分段计算总的度数和充电金额
//            List<AccountingStrategyDetailOrder> detailOrders = accountingStrategyDetailOrderService.list(new LambdaQueryWrapper<AccountingStrategyDetailOrder>()
//                    .eq(AccountingStrategyDetailOrder::getChargingOrderId, order.getId()).last(" order by start_time"));
//            detailOrders.get(detailOrders.size() - 1).setEndTime("23:59");
//            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
//            //开始解析每个时段的充电度数
//            BigDecimal decimal = BigDecimal.ZERO;
//            //如果使用优惠券需要判断优惠券是否满足使用条件
//            //退款金额=优惠券金额+剩余充电金额
//            BigDecimal periodElectricPrice_total = BigDecimal.ZERO;
//            BigDecimal periodServicePrice_total = BigDecimal.ZERO;
//            BigDecimal vipDiscountAmount_total = BigDecimal.ZERO;
//            BigDecimal serviceCharge_total = BigDecimal.ZERO;
//            BigDecimal total = BigDecimal.ZERO;
//            //判断实时数据是否跨天
//            SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
//            Date end_time = dataList.get(0).getCreate_time();
//            String end = sdf2.format(end_time);
//            Date start_time = dataList.get(dataList.size() - 1).getCreate_time();
//            String start = sdf2.format(start_time);
//            if(!end.equals(start)){
//                List<AccountingStrategyDetailOrder> list = detailOrders.stream().map(s->{
//                    AccountingStrategyDetailOrder accountingStrategyDetailOrder = new AccountingStrategyDetailOrder();
//                    BeanUtils.copyProperties(s, accountingStrategyDetailOrder);
//                    return accountingStrategyDetailOrder;
//                }).collect(Collectors.toList());
//                for (AccountingStrategyDetailOrder detailOrder : detailOrders) {
//                    detailOrder.setStartTime(start + " " + detailOrder.getStartTime());
//                    detailOrder.setEndTime(start + " " + detailOrder.getEndTime());
//                }
//                for (AccountingStrategyDetailOrder detailOrder : list) {
//                    detailOrder.setStartTime(end + " " + detailOrder.getStartTime());
//                    detailOrder.setEndTime(end + " " + detailOrder.getEndTime());
//                }
//                detailOrders.addAll(list);
//            }else{
//                for (AccountingStrategyDetailOrder detailOrder : detailOrders) {
//                    detailOrder.setStartTime(start + " " + detailOrder.getStartTime());
//                    detailOrder.setEndTime(start + " " + detailOrder.getEndTime());
//                }
//            }
//
//            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMddHHmm");
//            List<TChargingOrderAccountingStrategy> list = new ArrayList<>();
//            for (AccountingStrategyDetailOrder detailOrder : detailOrders) {
//                long startTime = Long.parseLong(detailOrder.getStartTime().replaceAll("-", "").replaceAll(" ", "").replaceAll(":", ""));
//                long endTime = Long.parseLong(detailOrder.getEndTime().replaceAll("-", "").replaceAll(" ", "").replaceAll(":", ""));
//                List<UploadRealTimeMonitoringData> collect = dataList.stream().filter(s -> Long.parseLong(sdf1.format(s.getCreate_time())) > startTime && Long.parseLong(sdf1.format(s.getCreate_time())) <= endTime).collect(Collectors.toList());
//
//                if(!collect.isEmpty()){
//                    //升序排序
//                    collect.sort(new Comparator<UploadRealTimeMonitoringData>(){
//                        @Override
//                        public int compare(UploadRealTimeMonitoringData o1, UploadRealTimeMonitoringData o2) {
//                            return o1.getCharging_degree().compareTo(o2.getCharging_degree());
//                        }
//                    });
//                    UploadRealTimeMonitoringData uploadRealTimeMonitoringData = collect.get(collect.size() - 1);
//                    BigDecimal chargingDegree = uploadRealTimeMonitoringData.getCharging_degree();
//                    BigDecimal subtract = chargingDegree.subtract(decimal);
//                    decimal = chargingDegree;
//                    if(subtract.compareTo(BigDecimal.ZERO) > 0){
//                        //组装充电明细数据
//                        TChargingOrderAccountingStrategy chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy();
//                        chargingOrderAccountingStrategy.setChargingOrderId(order.getId());
//                        chargingOrderAccountingStrategy.setAccountingStrategyDetailId(detailOrder.getId());
//                        chargingOrderAccountingStrategy.setType(detailOrder.getType());
//                        chargingOrderAccountingStrategy.setElectrovalence(detailOrder.getElectrovalence());
//                        chargingOrderAccountingStrategy.setServiceCharge(detailOrder.getServiceCharge());
//                        chargingOrderAccountingStrategy.setCostServiceCharge(detailOrder.getCostServiceCharge());
//                        chargingOrderAccountingStrategy.setChargingCapacity(subtract);
//                        chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now());
//
//                        if (list.size() == 0) {
//                            String time = sdf.format(collect.get(0).getCreate_time());
//                            chargingOrderAccountingStrategy.setStartTime(time);
//                        } else {
//                            chargingOrderAccountingStrategy.setStartTime(detailOrder.getStartTime().split(" ")[1]);
//                        }
//                        chargingOrderAccountingStrategy.setEndTime(detailOrder.getEndTime().split(" ")[1]);
//
//                        //已充电总度数
//                        BigDecimal electrovalenc = detailOrder.getElectrovalence().multiply(subtract);
//                        BigDecimal originalServicePrice = detailOrder.getServiceCharge().multiply(subtract);
//                        BigDecimal serviceCharge = originalServicePrice;
//                        BigDecimal vipDiscountAmount = BigDecimal.ZERO;
//                        //计算优惠金额
//                        if (null != order.getVipDiscount()) {
//                            //0.58折
//                            vipDiscountAmount = serviceCharge.multiply(new BigDecimal(1).subtract(order.getVipDiscount()));
//                            serviceCharge = serviceCharge.multiply(order.getVipDiscount());
//                        }
//                        chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc.setScale(4, RoundingMode.HALF_EVEN));
//                        chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge.setScale(4, RoundingMode.HALF_EVEN));
//                        chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice.setScale(4, RoundingMode.HALF_EVEN));
//                        chargingOrderAccountingStrategy.setVipDiscountAmount(vipDiscountAmount.setScale(4, RoundingMode.HALF_EVEN));
//                        chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now());
//                        list.add(chargingOrderAccountingStrategy);
//                        //电费
//                        periodElectricPrice_total = periodElectricPrice_total.add(electrovalenc);
//                        //服务费(含折扣)
//                        serviceCharge_total = serviceCharge_total.add(serviceCharge);
//                        //服务费(不含折扣)
//                        periodServicePrice_total = periodServicePrice_total.add(originalServicePrice);
//                        //会员折扣优惠金额
//                        vipDiscountAmount_total = vipDiscountAmount_total.add(vipDiscountAmount);
//                        //原始总金额(不含折扣)
//                        total = total.add(electrovalenc.add(originalServicePrice));
//                    }
//                }
//
//            }
//            list.get(list.size() - 1).setEndTime(sdf.format(dataList.get(0).getCreate_time()));
//            chargingOrderAccountingStrategyService.saveBatch(list);
//
//            BigDecimal orderAmount = BigDecimal.valueOf(total.doubleValue());
//            //原金额
//            BigDecimal rechargeAmount = order.getRechargeAmount();
//            //支付金额
//            BigDecimal payAmount = periodElectricPrice_total.add(serviceCharge_total);
//            //退款金额=充值金额-实际支付金额
//            BigDecimal refundAmount = rechargeAmount.subtract(payAmount);
//
//            UploadRealTimeMonitoringData uploadRealTimeMonitoringData = uploadRealTimeMonitoringDataService.getLastDataById(order.getCode());
//            if (null != uploadRealTimeMonitoringData && null == order.getEndMode()) {
//                Integer soc = uploadRealTimeMonitoringData.getSoc();
//                if (soc >= 98) {
//                    order.setEndMode(2);
//                } else if (null != order.getResidualAmount() && order.getResidualAmount().compareTo(new BigDecimal(1)) <= 0) {
//                    order.setEndMode(3);
//                } else {
//                    order.setEndMode(1);
//                }
//            }
//
//            order.setResidualAmount(rechargeAmount.subtract(total).setScale(2, RoundingMode.HALF_EVEN));
//            order.setStartTime(list.get(0).getCreateTime());
//            order.setEndTime(list.get(list.size() - 1).getCreateTime());
//            order.setStatus(5);
//            order.setOrderAmount(orderAmount.setScale(2, RoundingMode.HALF_EVEN));
//            order.setElectrovalence(periodElectricPrice_total.setScale(2, RoundingMode.HALF_EVEN));
//            order.setChargingCapacity(list.get(list.size() - 1).getChargingCapacity());
//            order.setElectricity(list.get(list.size() - 1).getChargingCapacity());
//            order.setVipDiscountAmount(vipDiscountAmount_total);
//            if (vipDiscountAmount_total.compareTo(BigDecimal.ZERO) == 0) {
//                order.setVipDiscount(BigDecimal.valueOf(1));
//            }
//
//            //计算优惠券
//            BigDecimal couponDiscount = BigDecimal.ZERO;
//            if (null != order.getAppCouponId()) {
//                //判断实际充电金额是否满足优惠券使用条件,如果不满足则不适用优惠券。
//                TAppCoupon appCoupon = appCouponClient.getAppCouponById(order.getAppCouponId()).getData();
//                String couponJson = appCoupon.getCouponJson();
//                TCoupon tCoupon = com.alibaba.fastjson2.JSON.parseObject(couponJson, TCoupon.class);
//                Integer preferentialMode = tCoupon.getPreferentialMode();
//                if (1 == preferentialMode) {
//                    //满减
//                    if (payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0) {
//                        BigDecimal couponDiscountAmount = tCoupon.getDiscountAmount();
//                        //如果优惠金额大于服务费金额,以服务费作为最大限制
//                        if (serviceCharge_total.compareTo(couponDiscountAmount) < 0) {
//                            couponDiscount = serviceCharge_total;
//                            serviceCharge_total = BigDecimal.ZERO;
//                        } else {
//                            couponDiscount = couponDiscountAmount;
//                        }
//                        appCoupon.setStatus(2);
//                        appCouponClient.updateAppCoupon(appCoupon);
//                    } else {
//                        appCouponClient.refund(order.getAppCouponId().toString());
//                        order.setAppCouponId(null);
//                        order.setCouponDiscountAmount(BigDecimal.ZERO);
//                    }
//                }
//                if (2 == preferentialMode) {
//                    //抵扣
//                    if (payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0) {
//                        //折扣金额
//                        BigDecimal divide = payAmount.multiply(new BigDecimal(10).subtract(tCoupon.getDiscount())).divide(new BigDecimal(10));
//                        divide = divide.compareTo(tCoupon.getMaximumDiscountAmount()) > 0 ? tCoupon.getMaximumDiscountAmount() : divide;
//                        //如果优惠金额大于服务费金额,以服务费作为最大限制
//                        if (serviceCharge_total.compareTo(divide) < 0) {
//                            couponDiscount = serviceCharge_total;
//                            serviceCharge_total = BigDecimal.ZERO;
//                        } else {
//                            couponDiscount = divide;
//                        }
//
//                        appCoupon.setStatus(2);
//                        appCouponClient.updateAppCoupon(appCoupon);
//                    } else {
//                        order.setAppCouponId(null);
//                        order.setCouponDiscountAmount(BigDecimal.ZERO);
//                        appCouponClient.refund(order.getAppCouponId().toString());
//                    }
//                }
//            }
//            //优惠券优惠金额
//            couponDiscount = couponDiscount.setScale(4, RoundingMode.HALF_EVEN);
//            //退款金额+优惠券
//            refundAmount = refundAmount.add(couponDiscount);
//            //实际支付金额-优惠券
//            payAmount = payAmount.subtract(couponDiscount);
//            if (serviceCharge_total.compareTo(BigDecimal.ZERO) > 0) {
//                serviceCharge_total = serviceCharge_total.subtract(couponDiscount);
//            }
//            order.setCouponDiscountAmount(couponDiscount.setScale(2, RoundingMode.HALF_EVEN));
//            order.setServiceCharge(serviceCharge_total.setScale(2, RoundingMode.HALF_EVEN));
//            order.setPaymentAmount(payAmount.setScale(2, RoundingMode.HALF_EVEN));
//            order.setRefundAmount(refundAmount.setScale(2, RoundingMode.HALF_EVEN));
//            order.setRefundStatus(1);
//            chargingOrderService.updateById(order);
//
//            order = chargingOrderService.getById(order.getId());
//
//            //推送三方平台
//            if (2 == order.getOrderSource()) {
//                TChargingOrder finalChargingOrder = order;
//                new Thread(new Runnable() {
//                    @Override
//                    public void run() {
//                        tcecClient.notificationEquipChargeStatus(finalChargingOrder.getStartChargeSeq(), finalChargingOrder.getOperatorId());
//                        tcecClient.notificationStopChargeResult(finalChargingOrder.getStartChargeSeq(), finalChargingOrder.getChargingGunId().toString(),
//                                finalChargingOrder.getOperatorId());
//                        tcecClient.notificationChargeOrderInfo(finalChargingOrder.getStartChargeSeq(), finalChargingOrder.getOperatorId());
//                    }
//                }).start();
//            }
//
//            //开始将优惠券优惠的金额添加到明细中
//            BigDecimal couponDiscountAmount = order.getCouponDiscountAmount();
//            if (null != couponDiscountAmount && couponDiscountAmount.compareTo(BigDecimal.ZERO) > 0) {
//                List<TChargingOrderAccountingStrategy> list1 = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, order.getId()));
//                BigDecimal reduce = list1.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
//                for (TChargingOrderAccountingStrategy chargingOrderAccountingStrategy : list1) {
//                    BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodServicePrice();
//                    BigDecimal multiply = couponDiscountAmount.multiply(periodServicePrice.divide(reduce, new MathContext(4, RoundingMode.HALF_EVEN)));
//                    periodServicePrice = periodServicePrice.subtract(multiply);
//                    chargingOrderAccountingStrategy.setPeriodServicePrice(periodServicePrice.setScale(2, RoundingMode.HALF_EVEN));
//                    chargingOrderAccountingStrategy.setCouponDiscountAmount(multiply.setScale(2, RoundingMode.HALF_EVEN));
//                }
//                chargingOrderAccountingStrategyService.updateBatchById(list1);
//            }
//
//            // 将枪状态重置为空闲
//            TChargingGun chargingGun = new TChargingGun();
//            chargingGun.setId(order.getChargingGunId());
//            chargingGun.setStatus(2);
//            chargingGun.setChargingPower(BigDecimal.ZERO);
//            chargingGunClient.updateChargingGunById(chargingGun);
//            //推送状态给三方平台
//            if (2 == order.getOrderSource()) {
//                tcecClient.pushChargingGunStatus(chargingGun.getFullNumber(), chargingGun.getStatus());
//            }
//
//            //添加积分
//            if (1 == order.getOrderSource()) {
//                TIntegralRule integralRule = integralRuleClient.getSet().getData();
//                if (null != integralRule) {
//                    TAppUser appUser = appUserClient.getUserById(order.getAppUserId()).getData();
//                    Integer num1 = com.alibaba.fastjson2.JSON.parseObject(integralRule.getChargeCredit()).getInteger("num1");
//                    Integer integral = order.getServiceCharge().intValue() * num1;
//                    if (null != appUser.getVipId()) {
//                        TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
//                        Integer doubleIntegration = vip.getDoubleIntegration();
//                        //双倍积分
//                        if (1 == doubleIntegration) {
//                            integral *= 2;
//                        }
//                    }
//
//                    if (integral > 0) {
//                        TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange();
//                        appUserIntegralChange.setAppUserId(appUser.getId());
//                        appUserIntegralChange.setChangeType(2);
//                        appUserIntegralChange.setHistoricalIntegral(appUser.getPoints());
//                        appUser.setPoints(appUser.getPoints() + integral);
//                        appUserIntegralChange.setCurrentIntegral(appUser.getPoints());
//                        appUserIntegralChange.setCreateTime(LocalDateTime.now());
//                        appUserIntegralChange.setOrderCode(order.getCode());
//                        appUserIntegralChange.setExtension(order.getId().toString());
//                        appUserClient.updateAppUser(appUser);
//                        appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange);
//                    }
//                }
//
//                //计算用户标签
//                chargingOrderService.editUserTag(order);
//                //用户推荐奖励
//                chargingOrderService.referralReward(order);
//
//                //开始构建退款费用
//                refundAmount = refundAmount.setScale(2, RoundingMode.HALF_EVEN);
//                if (refundAmount.compareTo(BigDecimal.ZERO) > 0) {
//                    Integer rechargePaymentType = order.getRechargePaymentType();
//                    //构建退款明细
//                    TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
//                    chargingOrderRefund.setChargingOrderId(order.getId());
//                    SimpleDateFormat sdfaa = new SimpleDateFormat("yyyyMMddHHmmssSSS");
//                    chargingOrderRefund.setRefundCode("CDF" + sdfaa.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
//                    chargingOrderRefund.setRefundAmount(refundAmount);
//                    chargingOrderRefund.setRefundStatus(1);
//                    chargingOrderRefund.setPayType(rechargePaymentType);
//                    chargingOrderRefund.setRefundStatus(1);
//                    chargingOrderRefund.setCode(order.getCode());
//                    chargingOrderRefund.setRefundTitle("充电完成退款");
//                    chargingOrderRefund.setRefundContent("充电完成退款");
//                    chargingOrderRefund.setRefundReason("充电完成退款");
//                    chargingOrderRefund.setRefundRemark("实际充电消费金额:" + order.getPaymentAmount());
//                    chargingOrderRefund.setRefundTotalAmount(refundAmount);
//                    chargingOrderRefund.setPayAmount(rechargeAmount);
//                    if (1 == rechargePaymentType) {
//                        WxPaymentRefundModel model = new WxPaymentRefundModel();
//                        model.setOut_trade_no(order.getCode());
//                        model.setOut_refund_no(chargingOrderRefund.getRefundCode());
//                        model.setReason("充电完成退款");
//                        model.setNotify_url("/payment/wx/refund/notify");
//                        WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
//                        amount.setRefund(refundAmount.multiply(new BigDecimal(100)).intValue());
//                        amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue());
//                        amount.setCurrency("CNY");
//                        model.setAmount(amount);
//                        R<Map<String, Object>> result = wxPaymentClient.refundOrderR(model);
//                        if (200 == result.getCode()) {
//                            chargingOrderRefundService.save(chargingOrderRefund);
//                            //手续费
//                            Map<String, Object> amount1 = (Map<String, Object>) result.getData().get("amount");
//                            Object refund_fee1 = amount1.get("refund_fee");
//                            BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100));
//                            chargingOrderRefund.setRefundFee(refund_fee);
//                            chargingOrderRefundService.updateById(chargingOrderRefund);
//                        }
//                    }
//                    if (2 == rechargePaymentType) {
//                        RefundReq dto = new RefundReq();
//                        dto.setOutTradeNo(order.getCode());
//                        dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
//                        dto.setRefundAmount(refundAmount.toString());
//                        dto.setRefundReason("充电完成退款");
//                        RefundResp resp = aliPaymentClient.refund(dto).getData();
//                        if (null != resp) {
//                            chargingOrderRefundService.save(chargingOrderRefund);
//                            chargingOrderService.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
//                        }
//                    }
//                    if (3 == rechargePaymentType) {
//                        RefundReq dto = new RefundReq();
//                        dto.setOutTradeNo(order.getRechargeSerialNumber());
//                        dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
//                        dto.setRefundAmount(refundAmount.toString());
//                        dto.setRefundReason("充电完成退款");
//                        RefundResp resp = h5AliPaymentClient.refund(dto).getData();
//                        if (null != resp && "10000".equals(resp.getCode())) {
//                            chargingOrderRefundService.save(chargingOrderRefund);
//                            chargingOrderService.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
//                        }
//                    }
//                }
//            }
//
//            //添加汇总统计数据
//            List<TChargingOrderAccountingStrategy> list4 = chargingOrderAccountingStrategyService.list(new QueryWrapper<TChargingOrderAccountingStrategy>().eq("charging_order_id", order.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 (!order.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 (order.getStartTime() != null && order.getEndTime() != null) {
//                time = ChronoUnit.SECONDS.between(order.getStartTime(), order.getEndTime());
//            }
//            TChargingOrderSummaryData summaryData = new TChargingOrderSummaryData();
//            summaryData.setChargingOrderId(order.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);
//
//            //推送监管平台订单状态和订单详情
//            ChargingOrderVo chargingOrderVo = new ChargingOrderVo();
//            BeanUtils.copyProperties(order, chargingOrderVo);
//            chargingMessageClient.pushOrderInfo(chargingOrderVo);
//            chargingMessageClient.pushOrderStatus(chargingOrderVo);
//        }
//    }
//}