2021与蓝度共同重构项目,服务端
liuhaonan
2022-03-22 55f49e493396d14689103f1912cb77fd653461cc
c3m预付款以及ip音柱完善
已修改11个文件
已添加6个文件
473 ■■■■■ 文件已修改
dao/src/main/java/com/sandu/ximon/dao/mapper/C3mChargingMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/resources/mapper/C3mChargingMapper.xml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/config/C3mRedisConfig.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/C3mChargingChargeController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/C3mOrderController.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/param/IpVolumeMissionParam.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/param/PayParam.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/security/order/C3mOrderQueryEvent.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/security/order/OrderQueryListener.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/security/order/OrderQueryTask.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/security/order/OrderScanType.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3ChargingService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3mChargingChargeService.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3mOrderService.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/IpVolumeMissionService.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleService.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/vo/TaskVO.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/mapper/C3mChargingMapper.java
@@ -10,6 +10,8 @@
@Mapper
public interface C3mChargingMapper extends BaseMapper<C3mCharging> {
    C3mCharging  getAllByC3Mac(String c3Mac);
}
dao/src/main/resources/mapper/C3mChargingMapper.xml
@@ -5,18 +5,24 @@
<mapper namespace="com.sandu.ximon.dao.mapper.C3mChargingMapper">
    <resultMap id="BaseResultMap" type="com.sandu.ximon.dao.domain.C3mCharging">
            <id property="c3Id" column="c3_id" jdbcType="BIGINT"/>
            <result property="mcuUdid" column="mcu_udid" jdbcType="VARCHAR"/>
            <result property="c3Name" column="c3_name" jdbcType="VARCHAR"/>
            <result property="c3Mac" column="c3_mac" jdbcType="VARCHAR"/>
            <result property="statusBit" column="status_bit" jdbcType="INTEGER"/>
            <result property="deviceTemperature" column="device_temperature" jdbcType="VARCHAR"/>
            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
        <id property="c3Id" column="c3_id" jdbcType="BIGINT"/>
        <result property="mcuUdid" column="mcu_udid" jdbcType="VARCHAR"/>
        <result property="c3Name" column="c3_name" jdbcType="VARCHAR"/>
        <result property="c3Mac" column="c3_mac" jdbcType="VARCHAR"/>
        <result property="statusBit" column="status_bit" jdbcType="INTEGER"/>
        <result property="deviceTemperature" column="device_temperature" jdbcType="VARCHAR"/>
        <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
    </resultMap>
    <sql id="Base_Column_List">
        c3_id,mcu_udid,c3_name,
        c3_id
        ,mcu_udid,c3_name,
        c3_mac,status_bit,device_temperature,
        update_time
    </sql>
    <select id="getAllByC3Mac" resultType="com.sandu.ximon.dao.domain.C3mCharging">
        select *
        from c3m_charging
        where c3_mac = #{c3Mac}
    </select>
</mapper>
ximon-admin/src/main/java/com/sandu/ximon/admin/config/C3mRedisConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.sandu.ximon.admin.config;
/**
 * @Author liuhaonan
 * @Version 1.0
 */
public class C3mRedisConfig {
    //  C3充电桩最长离线时间(s)
    public static Long OUTLINE_TIME = 60 * 3L;
    //  è®¾ç½®C3心跳包时间
    public static Long HEART_BEAT_TIME = 60L;
    //  C3订单超时时间
    public static Long ORDER_MAX_TIME = 60 * 5L;
    //  C3订单扫描间隔时间
    public static Long ORDER_QUERY_TIME = 20L;
    //  C3充电最大时长
    public static Long CHARGING_MAX_TIME = 60 * 60 * 24L * 2;
    //  C3故障码超时时间
    public static Long ERROR_REPORT_MAX_TIME = 60 * 60 * 24 * 7L;
    public static void reFlushTime(int onlineCount) {
        if(onlineCount > 60) {
            HEART_BEAT_TIME = Long.parseLong(onlineCount+"");
            OUTLINE_TIME = 3 * HEART_BEAT_TIME;
        }else if(onlineCount < 60){
            HEART_BEAT_TIME = 60L;
            OUTLINE_TIME = 3 * HEART_BEAT_TIME;
        }
    }
    public static Integer parseInt(Long l){
        return Integer.parseInt(l+"");
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/C3mChargingChargeController.java
@@ -23,6 +23,12 @@
    private final C3mChargingChargeService chargeService;
    /**
     * æ·»åŠ è´¹çŽ‡
     * @param charge
     * @return
     */
    @PostMapping("/addC3mCharging")
    public ResponseVO<Object> addC3mCharging(@RequestBody C3mChargingChargeParam charge) {
//        chargeService.save(charge);
@@ -35,9 +41,15 @@
        return ResponseUtil.success(chargeService.updateCharge(chargeEntities));
    }
    @GetMapping("/getChargeByC3Id/{c3mId}")
    @GetMapping("/getChargeByC3Id/{c3mId}")  //未同步文档
    public ResponseVO<Object> getChargeByC3Id(@PathVariable Integer c3mId) {
        return ResponseUtil.success(chargeService.getChargeByC3Id(c3mId));
    }
    @GetMapping("/getChargeByPoleId/{PoleId}") //为未同步文档
    public ResponseVO<Object> getChargeByPoleId(@PathVariable Long PoleId) {
        return ResponseUtil.success(chargeService.getChargeByPoleId(PoleId));
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/C3mOrderController.java
@@ -1,19 +1,24 @@
package com.sandu.ximon.admin.controller;
import com.sandu.common.domain.ResponseVO;
import com.sandu.common.execption.BusinessException;
import com.sandu.common.util.ResponseUtil;
import com.sandu.ximon.admin.param.PayParam;
import com.sandu.ximon.admin.service.C3ChargingService;
import com.sandu.ximon.admin.service.C3mOrderService;
import com.sandu.ximon.dao.domain.C3mCharging;
import com.sandu.ximon.dao.domain.C3mOrder;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
/**
 * @Author liuhaonan
 * @Date 2022/3/22 14:10
 * @Version 1.0
 */
@RestController
@@ -22,12 +27,11 @@
public class C3mOrderController {
    private final C3mOrderService c3mOrderService;
    private final C3ChargingService c3mService;
    /**
     * é€€æ¬¾
     *
     * @param params
     * @return
     */
    @PostMapping("/refond")
@@ -38,4 +42,38 @@
                (Double) params.get("refundAmount")));
    }
    /**
     * é¢„付款,生成订单(或直接从redis中获取当前未过期的订单)
     *
     * @return
     */
    @PostMapping("/advancePay")
    public ResponseVO<Object> advancePayOrder(@RequestBody PayParam param) {
        if (param.getTotalAmount() == 0d) {
            throw new BusinessException("金额不能为0");
        }
        //  C3充电桩实体
        C3mCharging c3m = c3mService.getC3mByPoleId(param.getPoleId());
        if (null == c3m) {
            throw new BusinessException("未找到当前充电桩");
        }
        C3mOrder c3mOrderEntity = c3mOrderService.advancePayOrder(param.getPoleId(), c3m, param.getOrderType()
                , param.getTotalAmount(), param.getSubscribeChargingCapacity());
        if (null == c3mOrderEntity) {
            throw new BusinessException("该充电桩正被使用!");
        }
//        return R.ok().put("outTradeNo",c3mOrderEntity.getOutTradeNo())
//                .put("totalAmount",totalAmount);
        Map map=new HashMap();
        map.put("outTradeNo",c3mOrderEntity.getOutTradeNo());
        map.put("totalAmount",param.getTotalAmount());
        return ResponseUtil.success(map);
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/param/IpVolumeMissionParam.java
@@ -53,10 +53,16 @@
    TaskTerminalVO[] terminals;
    private List<Integer> terminalIds;
    private List<Integer> fileIds;
    TaskRunTimeVO[] exec;
    //  ä»»åŠ¡æ‰§è¡Œè§„åˆ™ï¼ˆæ¯å¤©ä¸º 0,每周为 1,手动为 2)
    private Integer rule;
/*
    */
ximon-admin/src/main/java/com/sandu/ximon/admin/param/PayParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.sandu.ximon.admin.param;
import lombok.Data;
/**
 * @Author liuhaonan
 * @Date 2022/3/22 16:46
 * @Version 1.0
 */
@Data
public class PayParam {
    Long poleId;
    String orderType;
    Double totalAmount;
    Integer subscribeChargingCapacity;
}
ximon-admin/src/main/java/com/sandu/ximon/admin/security/order/C3mOrderQueryEvent.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.sandu.ximon.admin.security.order;
import com.sandu.ximon.dao.domain.C3mOrder;
import org.springframework.context.ApplicationEvent;
/**
 * @Author liuhaonan
 * @Version 1.0
 */
public class C3mOrderQueryEvent extends ApplicationEvent {
    private C3mOrder c3mOrderEntity;
    private Long startTime;
    public C3mOrderQueryEvent(Object source, C3mOrder c3mOrderEntity, Long startTime) {
        super(source);
        this.c3mOrderEntity = c3mOrderEntity;
        this.startTime = startTime;
    }
    public C3mOrder getC3mOrderEntity() {
        return c3mOrderEntity;
    }
    public Long getStartTime() {
        return startTime;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/security/order/OrderQueryListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
package com.sandu.ximon.admin.security.order;
import com.sandu.ximon.admin.utils.SpringContextUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@Component("OrderQueryListener")
public class OrderQueryListener {
    @Autowired
    public ApplicationEventPublisher publisher;
    private static final ExecutorService orderEventPool = Executors.newFixedThreadPool(5);
    public static OrderQueryListener getBean(){
        return (OrderQueryListener) SpringContextUtil.getBean("OrderQueryListener");
    }
    /**
     * å¯åŠ¨è®¢å•æ‰«æ
     * @param type  0:C3充电桩扫描启动
     */
    public void startScan (Integer type) {
        //  è½½å…¥è®¢å•扫描
        orderEventPool.submit(new OrderQueryTask(type));
    }
//    @Scheduled(cron = "0/10 * *  * * ? ")
//    public void orderScan () {
//        if(isQuery) {
//            /**
//             * èŽ·å–æ‰€æœ‰è®¢å•ï¼Œæ ¹æ®è®¢å•ç±»åž‹ä¸åŒè¿›è¡Œä¸åŒçš„Query
//             */
//            //  C3充电桩部分
//            Set<String> keys = redisUtils.keys(C3mRedisConstant.C3_NO_PAY_ORDER.getCode() + "*");
//            for (String key : keys) {
//                C3mOrderEntity c3mOrderEntity = JSON.parseObject(redisUtils.get(key), C3mOrderEntity.class);
//                LogUtils.error("查询订单:" + JSON.toJSONString(c3mOrderEntity));
//                publisher.publishEvent(new C3mOrderQueryEvent(this, c3mOrderEntity));
//            }
//        }
//    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/security/order/OrderQueryTask.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,107 @@
package com.sandu.ximon.admin.security.order;
import com.alibaba.fastjson.JSON;
import com.sandu.ximon.admin.config.C3mRedisConfig;
import com.sandu.ximon.admin.utils.LogUtils;
import com.sandu.ximon.admin.utils.RedisUtils;
import com.sandu.ximon.dao.domain.C3mOrder;
import com.sandu.ximon.dao.enums.C3mRedisConstant;
import lombok.Data;
import java.util.Date;
import java.util.Queue;
import java.util.Set;
import java.util.concurrent.ConcurrentLinkedQueue;
@Data
public class OrderQueryTask implements Runnable{
    private static Queue<OrderQueryTask> taskList = new ConcurrentLinkedQueue<>();
    //  ä»»åŠ¡ç±»åž‹:C3订单扫描(0)、
    private Integer type;
    //  æ˜¯å¦ç»§ç»­æ‰«æ
    private boolean isScanning = true;
    public void stopTask(){
        this.isScanning = false;
    }
    public OrderQueryTask(Integer type) {
        this.type = type;
    }
    @Override
    public void run() {
        /**
         * å¯åŠ¨åŽï¼Œç»ˆæ­¢æ‰€æœ‰ç›¸åŒç±»åž‹çš„æ‰«æä»»åŠ¡
         */
        stopAndAddTask(type, this);
        for(OrderQueryTask task :taskList) {
            if(task.getType().equals(0)){
                //  å¯åЍC3订单扫描
                c3mOrderTaskScan();
            }
        }
    }
    private void c3mOrderTaskScan() {
        LogUtils.error("启动C3m订单扫描任务");
        Long totalTime = 0L;
        //  ç»§ç»­æ‰«ææ—¶ï¼Œè¿›è¡Œå¾ªçŽ¯æ‰«æ
        while(isScanning) {
            totalTime = totalTime + C3mRedisConfig.ORDER_QUERY_TIME;
            //  åˆ¤æ–­æ‰«ææ—¶é•¿æ˜¯å¦å·²è¶…出订单超时时间
            if(totalTime > C3mRedisConfig.ORDER_MAX_TIME) {
                return;
            }
            //  ç­‰å¾…扫描间隔
            try {
                Thread.sleep(C3mRedisConfig.ORDER_QUERY_TIME * 1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //  åˆ¤æ–­æ˜¯å¦ç»§ç»­æ‰«æ
            if(isScanning) {
                /**
                 * èŽ·å–æ‰€æœ‰è®¢å•ï¼Œæ ¹æ®è®¢å•ç±»åž‹ä¸åŒè¿›è¡Œä¸åŒçš„Query
                 */
                //  C3充电桩部分
                RedisUtils redisUtils = RedisUtils.getBean();
                Set<String> keys = redisUtils.keys(C3mRedisConstant.C3_NO_PAY_ORDER.getCode() + "*");
                for (String key : keys) {
                    C3mOrder c3mOrderEntity = JSON.parseObject(redisUtils.get(key), C3mOrder.class);
                    LogUtils.error("当前订单总数:"+keys.size()+",推送查询订单("+c3mOrderEntity.getOutTradeNo()+")到事件处理:" + JSON.toJSONString(c3mOrderEntity));
                    OrderQueryListener.getBean().publisher.publishEvent(new C3mOrderQueryEvent(this, c3mOrderEntity, new Date().getTime()));
                }
            }else {
                return;
            }
        }
    }
    public void stopAndAddTask (Integer type, OrderQueryTask newTask) {
        synchronized (OrderQueryTask.class) {
            LogUtils.error("重置并清空订单扫描队列");
            boolean clear = true;
            Queue<OrderQueryTask> newTaskList = new ConcurrentLinkedQueue<>();
            newTaskList.offer(newTask);
            while (clear) {
                OrderQueryTask task = taskList.poll();
                if (null == task) {
                    clear = false;
                } else {
                    if (task.getType().equals(type)) {
                        task.stopTask();
                    } else {
                        newTaskList.offer(task);
                    }
                }
            }
            taskList = newTaskList;
        }
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/security/order/OrderScanType.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.sandu.ximon.admin.security.order;
public enum OrderScanType {
    C3M(0)
    ;
    private Integer type;
    OrderScanType(Integer type) {
        this.type = type;
    }
    public Integer getType() {
        return type;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3ChargingService.java
@@ -15,6 +15,7 @@
import com.sandu.ximon.admin.manager.iot.rrpc.mainboard.MainBoardInvokeSyncService;
import com.sandu.ximon.dao.domain.C3mCharging;
import com.sandu.ximon.dao.domain.C3mChargingCharge;
import com.sandu.ximon.dao.domain.PoleBinding;
import com.sandu.ximon.dao.mapper.C3mChargingMapper;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -33,6 +34,7 @@
public class C3ChargingService extends BaseServiceImpl<C3mChargingMapper, C3mCharging> {
    private final C3mChargingChargeService c3mChargingChargeService;
    private final PoleBindingService bindingService;
    /**
     * ä¿å­˜ä¸ŠæŠ¥C3充电设备心跳数据
@@ -478,4 +480,12 @@
            throw new BusinessException("数据校验错误,请重新请求");
        }
    }
    public C3mCharging getC3mByPoleId(Long poleId) {
        PoleBinding one = bindingService.getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getDeviceType, 2).eq(PoleBinding::getPoleId, poleId));
        if (one == null) {
            throw new BusinessException("未找到绑定关系");
        }
        return getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getC3Mac, one.getDeviceCode()));
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3mChargingChargeService.java
@@ -1,10 +1,14 @@
package com.sandu.ximon.admin.service;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.sandu.common.execption.BusinessException;
import com.sandu.common.service.impl.BaseServiceImpl;
import com.sandu.ximon.admin.param.C3mChargingChargeParam;
import com.sandu.ximon.dao.domain.C3mChargingCharge;
import com.sandu.ximon.dao.domain.PoleBinding;
import com.sandu.ximon.dao.mapper.C3mChargingChargeMapper;
import com.sandu.ximon.dao.mapper.C3mChargingMapper;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
@@ -23,6 +27,8 @@
@AllArgsConstructor
public class C3mChargingChargeService extends BaseServiceImpl<C3mChargingChargeMapper, C3mChargingCharge> {
    private final C3mChargingChargeMapper c3mChargingChargeMapper;
    private final PoleBindingService bindingService;
    private final C3mChargingMapper chargingMapper;
    /**
     * ä¿®æ”¹è´¹çއ
@@ -47,6 +53,7 @@
    /**
     * æ’入费率
     *
     * @param c3
     * @return
     */
@@ -60,6 +67,7 @@
    /**
     * è‡ªåŠ¨æ’å…¥é»˜è®¤è´¹çŽ‡
     *
     * @param c3Id
     */
    public void initCharge(Integer c3Id) {
@@ -130,4 +138,17 @@
    }
    /**
     * æ ¹æ®ç¯æ†id查找费率
     * @param poleId
     * @return
     */
    public List<C3mChargingCharge> getChargeByPoleId(Long poleId) {
        PoleBinding one = bindingService.getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getDeviceType, 2).eq(PoleBinding::getPoleId, poleId));
        if (one == null) {
            throw new BusinessException("未找到绑定关系");
        }
        Long c3Id = chargingMapper.getAllByC3Mac(one.getDeviceCode()).getC3Id();
        return getChargeByC3Id(c3Id.intValue());
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3mOrderService.java
@@ -1,11 +1,20 @@
package com.sandu.ximon.admin.service;
import com.alibaba.fastjson.JSON;
import com.sandu.common.execption.BusinessException;
import com.sandu.common.service.impl.BaseServiceImpl;
import com.sandu.ximon.admin.config.C3mRedisConfig;
import com.sandu.ximon.admin.pay.wx.WxFastPayService;
import com.sandu.ximon.admin.security.SecurityUtils;
import com.sandu.ximon.admin.security.order.OrderQueryListener;
import com.sandu.ximon.admin.security.order.OrderScanType;
import com.sandu.ximon.admin.utils.AliPayUtils;
import com.sandu.ximon.admin.utils.RedisUtils;
import com.sandu.ximon.admin.vo.C3mOrderVO;
import com.sandu.ximon.dao.domain.C3mCharging;
import com.sandu.ximon.dao.domain.C3mOrder;
import com.sandu.ximon.dao.domain.Pole;
import com.sandu.ximon.dao.enums.C3mRedisConstant;
import com.sandu.ximon.dao.enums.OrderStatus;
import com.sandu.ximon.dao.enums.OrderType;
import com.sandu.ximon.dao.mapper.C3mOrderMapper;
@@ -23,8 +32,11 @@
@AllArgsConstructor
public class C3mOrderService extends BaseServiceImpl<C3mOrderMapper, C3mOrder> {
    private final RedisUtils redisUtils;
    private final PoleService poleService;
    private final C3mOrderMapper c3mOrderMapper;
    private final WxFastPayService fastPayService;
    private final OrderQueryListener orderQueryListener;
    public boolean orderRefund(String outTradeNo, Double refundAmount/*, Long userId, String username*/) {
        Long userId = SecurityUtils.getUserId();
@@ -91,4 +103,38 @@
            return false;
        }
    }
    public C3mOrder advancePayOrder(Long streetlightId, C3mCharging c3m, String orderType, Double totalAmount,
                                    Integer subscribeChargingCapacity) {
        //  åˆ¤æ–­è¯¥å……电桩是否存在正在进行中的订单
        String chargingJson = redisUtils.get(C3mRedisConstant.C3_CHARGING_ORDER.getCode() + c3m.getC3Mac());
        if (null != chargingJson) {
            return null;
        }
        Pole pole = poleService.getById(streetlightId);
        if (null == pole) {
            return null;
        }
        //  ç”Ÿæˆè®¢å•,并加载到redis缓存,设置超时时间为5分钟
        C3mOrder c3mOrderEntity = new C3mOrderVO().generateOrder(
                streetlightId,
                pole.getDeviceCode(),
                c3m.getC3Mac(),
                OrderType.getOrderType(orderType),
                totalAmount,
                subscribeChargingCapacity
        );
        //  åŠ è½½åˆ°redis缓存中, æŸ¥è¯¢æ¨¡å—自动查询状态并处理
        boolean b = redisUtils.set(
                C3mRedisConstant.C3_NO_PAY_ORDER.getCode() + c3m.getC3Mac() + c3mOrderEntity.getOutTradeNo(),
                JSON.toJSONString(c3mOrderEntity),
                C3mRedisConfig.ORDER_MAX_TIME
        );
        //  æŽ¨é€åˆ°è‡ªåŠ¨æŸ¥è¯¢æ¨¡å—ï¼Œè¿›è¡Œæ‰«æå¯åŠ¨
        orderQueryListener.startScan(OrderScanType.C3M.getType());
        return b ? c3mOrderEntity : null;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/IpVolumeMissionService.java
@@ -14,7 +14,10 @@
import com.sandu.ximon.admin.vo.TaskTerminalVO;
import com.sandu.ximon.admin.vo.TaskVO;
import com.sandu.ximon.dao.bo.IpVolumeMissionBo;
import com.sandu.ximon.dao.domain.*;
import com.sandu.ximon.dao.domain.BroadcastV2TaskFile;
import com.sandu.ximon.dao.domain.BroadcastV2TaskTerminal;
import com.sandu.ximon.dao.domain.IpVolumeFile;
import com.sandu.ximon.dao.domain.IpVolumeMission;
import com.sandu.ximon.dao.mapper.IpVolumeMissionMapper;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
@@ -22,7 +25,6 @@
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
@@ -353,7 +355,7 @@
        //return new ArrayList<>();
    }
    public IpVolumeMission getByTaskId(Integer taskId) {
    public TaskVO getByTaskId(Integer taskId) {
        TaskVO task = TaskAPIUtils.getTask(taskId);
        if (task == null) {
            throw new BusinessException("服务器未找到该任务");
@@ -377,8 +379,8 @@
        }
        byId.setWeeks("0" + Integer.toBinaryString(byId.getWeek()));
        task.setWeeks("0" + Integer.toBinaryString(byId.getWeek()));
//        byId.setWeeks("0" + Integer.toBinaryString(byId.getWeek()));
//        IpVolumeMissionBo bo = new IpVolumeMissionBo();
        List<BroadcastV2TaskFile> taskFiles = broadcastV2TaskFileService.list(Wrappers.lambdaQuery(BroadcastV2TaskFile.class)
@@ -389,31 +391,33 @@
//        if(taskFiles.isEmpty()||taskTerminals.isEmpty()){
//            throw new BusinessException("");
//        }
        if(!taskFiles.isEmpty()){
               taskFiles.forEach(
                       fileId->{
        if (!taskFiles.isEmpty()) {
            taskFiles.forEach(
                    fileId -> {
//                           IpVolumeFile volumeFile = ipVolumeFileService.getById(fileId.getFileId());
//                           if(volumeFile==null){
//                               throw new BusinessException("任务文件不存在");
//                           }
                           byId.getFileIds().add(fileId.getFileId());
                       }
               );
                        task.getFileIds().add(fileId.getFileId());
//                           byId.getFileIds().add(fileId.getFileId());
                    }
            );
        }
        if(!taskTerminals.isEmpty()){
        if (!taskTerminals.isEmpty()) {
            taskTerminals.forEach(
                    terminalId->{
                    terminalId -> {
//                        BroadcastTerminalV2Entity v2Entity = ipVolumeService.getById(terminalId.getTerminalId());
//                        if(v2Entity==null){
//                            throw new BusinessException("该任务暂无设备使用");
//                        }
                        byId.getTerminalIds().add(terminalId.getTerminalId());
                        task.getTerminalIds().add(terminalId.getTerminalId());
//                        byId.getTerminalIds().add(terminalId.getTerminalId());
                    }
            );
        }
        return byId;
        return task;
    }
ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleService.java
@@ -641,7 +641,10 @@
            if (pole == null) {
                throw new BusinessException("灯杆不存在");
            }
            pole.setClientId(clientId);
            pole.setUserId(clientId);
            if(!clientService.findClientId(clientId)){
                pole.setClientId(clientService.getClientId(clientId));
            }
            r = updateById(pole);
            if (!r) {
ximon-admin/src/main/java/com/sandu/ximon/admin/vo/TaskVO.java
@@ -1,11 +1,15 @@
package com.sandu.ximon.admin.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.sandu.ximon.admin.dto.BroadcastTaskType;
import com.sandu.ximon.admin.param.IPTaskParam;
import com.sandu.ximon.admin.param.IpVolumeMissionParam;
import lombok.Data;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
@Data
public class TaskVO {
@@ -76,6 +80,7 @@
    //  ç³»ç»Ÿä¿ç•™
    private BigInteger btime;
    //  ä»»åŠ¡æ‰§è¡Œè§„åˆ™ï¼ˆæ¯å¤©ä¸º 0,每周为 1,手动为 2)
    @JsonIgnore
    private Integer rule;
    //  ä»»åŠ¡å¼€å§‹æ—¥æœŸï¼Œä¸€èˆ¬ä¸ºä»»åŠ¡åˆ›å»ºæ—¥æœŸ
    private BigInteger bdate;
@@ -110,10 +115,18 @@
    //  ä»»åŠ¡æ‰§è¡Œæ—¶é—´åˆ—è¡¨
    private TaskRunTimeVO[] exec;
    //  éŸ³é¢‘文件列表
    @JsonIgnore
    private TaskMediaFileVO[] files;
    //  æ’­æ”¾ç»ˆç«¯ ID åˆ—表
    @JsonIgnore
    private TaskTerminalVO[] terminals;
    @JsonIgnore
    private String userName;
    private String weeks;
    private List<Integer> fileIds=new ArrayList<>();
    private List<Integer> TerminalIds=new ArrayList<>();
}