cc 3 mesi fa
parent
commit
2484f48e00

BIN
QingJian/conf/基站导入模板.xls


+ 1 - 0
src/main/java/com/qingjian/common/constants/PathConst.java

@@ -75,6 +75,7 @@ public class PathConst {
     public static final Path AGENT_CONF_PATH = RUN_QINGJIAN_PATH.resolve("conf").resolve("a4961dbp.json");
 
     public static final Path AGENT_CONF_PATH_YML = RUN_QINGJIAN_PATH.resolve("conf").resolve("config.yml");
+    public static final Path COV_TMP_PATH = RUN_QINGJIAN_PATH.resolve("conf").resolve("基站导入模板.xls");
     public static final Path LOCK_FILE = ROOT_PATH.resolve("lock.lck");
     /**
      * 临时文件路径

+ 4 - 0
src/main/java/com/qingjian/common/model/plat/dto/CovFileDTO.java

@@ -0,0 +1,4 @@
+package com.qingjian.common.model.plat.dto;
+
+public class CovFileDTO {
+}

+ 31 - 0
src/main/java/com/qingjian/common/model/plat/dto/TowerConvertDTO.java

@@ -0,0 +1,31 @@
+package com.qingjian.common.model.plat.dto;
+
+
+import lombok.Data;
+import org.apache.fesod.sheet.annotation.ExcelProperty;
+import org.apache.fesod.sheet.annotation.format.DateTimeFormat;
+
+
+@Data
+public class TowerConvertDTO {
+    @ExcelProperty("本方号码")
+    private String field1;
+    @ExcelProperty("LAC")
+    private String lac;
+    @ExcelProperty("CID")
+    private String cid;
+    @ExcelProperty("运营商")
+    private String oprt;
+    @ExcelProperty("通信时间")
+    @DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")
+    private String field2;
+    @ExcelProperty("基站地址")
+    private String field3;
+    @ExcelProperty("经度")
+    private String field4;
+    @ExcelProperty("纬度")
+    private String field5;
+    @ExcelProperty("转换结果")
+    private String field6;
+
+}

+ 36 - 0
src/main/java/com/qingjian/module/plat/controller/TowerController.java

@@ -0,0 +1,36 @@
+package com.qingjian.module.plat.controller;
+
+import com.qingjian.module.plat.service.TowerService;
+import org.noear.solon.annotation.Controller;
+import org.noear.solon.annotation.Get;
+import org.noear.solon.annotation.Inject;
+import org.noear.solon.annotation.Mapping;
+
+import java.util.List;
+
+@Controller
+@Mapping("/tower")
+public class TowerController {
+
+    @Inject
+    private TowerService towerService;
+
+    @Get
+    @Mapping("/qry")
+    public List<String> qry(String mnc, String lac, String ci) {
+        return towerService.qry(mnc, lac, ci);
+    }
+
+    @Get
+    @Mapping("/covFile")
+    public String covFile(String file){
+        return towerService.covFile(file);
+    }
+
+    @Get
+    @Mapping("/tmpFile")
+    public String tmpFile(){
+       return towerService.tmpFile();
+    }
+
+}

+ 83 - 0
src/main/java/com/qingjian/module/plat/service/TowerListener.java

@@ -0,0 +1,83 @@
+package com.qingjian.module.plat.service;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.qingjian.common.model.plat.dto.TowerConvertDTO;
+import com.qingjian.common.utils.TowerUtils;
+import lombok.Data;
+import org.apache.fesod.common.util.ListUtils;
+import org.apache.fesod.sheet.FesodSheet;
+import org.apache.fesod.sheet.context.AnalysisContext;
+import org.apache.fesod.sheet.read.listener.ReadListener;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+@Data
+public final class TowerListener implements ReadListener<TowerConvertDTO> {
+
+    public static final String lacCellReg = ".*[A-Fa-f].*";
+    private final Map<String, Integer> oprtMap = new HashMap<>();
+
+    private final String exportPath;
+    private List<TowerConvertDTO> cachedDataList = ListUtils.newArrayListWithExpectedSize(50000);
+    private boolean hex16 = false;
+
+    public TowerListener(String exportPath) {
+        this.exportPath = exportPath;
+        oprtMap.put("中国移动", 0);
+        oprtMap.put("中国联通", 1);
+        oprtMap.put("中国电信", 11);
+    }
+
+    @Override
+    public void invoke(TowerConvertDTO dto, AnalysisContext context) {
+        String lac = dto.getLac();
+        String cid = dto.getCid();
+        String yys = dto.getOprt();
+        lac = StrUtil.replace(lac, "'", "");
+        cid = StrUtil.replace(cid, "'", "");
+        if (StrUtil.isEmpty(lac) || StrUtil.isEmpty(cid) || StrUtil.isEmpty(yys)) {
+            dto.setField6("请检查lac、cid、运营商是否为空");
+            cachedDataList.add(dto);
+            return;
+        }
+        getCell(dto, yys, lac, cid);
+
+    }
+
+    private void getCell(TowerConvertDTO dto, String yys, String lac, String cid) {
+        int mncInt = oprtMap.getOrDefault(yys, 0);
+
+        Object[] cells = TowerUtils.getCells(460, mncInt, lac, cid);
+        // 纬度
+        Object lat = cells[0];
+        // 经度
+        Object lng = cells[1];
+        // 地址
+        Object address = cells[3];
+        if (ObjectUtil.isNull(lat) || ObjectUtil.isNull(lng) || ObjectUtil.isNull(address)) {
+            dto.setField6("无基站数据");
+            cachedDataList.add(dto);
+            return;
+        }
+        String addressStr = address.toString();
+        String[] addrArray = addressStr.split(";");
+        dto.setField3(addrArray[0]);
+        dto.setField4(lng.toString());
+        dto.setField5(lat.toString());
+        dto.setField6("转换成功");
+        cachedDataList.add(dto);
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext context) {
+        String sheetName = context.readSheetHolder().getSheetName();
+        FesodSheet.write(exportPath, TowerConvertDTO.class)
+                 .sheet(sheetName)
+                 .doWrite(() -> cachedDataList);
+        cachedDataList = null;
+    }
+}

+ 79 - 0
src/main/java/com/qingjian/module/plat/service/TowerService.java

@@ -0,0 +1,79 @@
+package com.qingjian.module.plat.service;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.qingjian.common.constants.PathConst;
+import com.qingjian.common.exception.ServerException;
+import com.qingjian.common.model.plat.dto.TowerConvertDTO;
+import com.qingjian.common.utils.TowerUtils;
+import lombok.extern.slf4j.Slf4j;
+import net.harawata.appdirs.AppDirsFactory;
+import org.apache.commons.io.FileUtils;
+import org.apache.fesod.sheet.FesodSheet;
+import org.noear.solon.annotation.Managed;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+
+@Slf4j
+@Managed
+public class TowerService {
+    public List<String> qry(String mnc, String lac, String ci) {
+        if (StrUtil.isNotEmpty(lac) && StrUtil.isNotEmpty(ci)) {
+            return List.of();
+        }
+        Object[] cells = TowerUtils.getCells(460, Integer.parseInt(mnc), lac, ci);
+        // 纬度
+        Object lat = cells[0];
+        // 经度
+        Object lng = cells[1];
+        // 覆盖范围
+        //Object prec = cells[2];
+        // 地址
+        Object address = cells[3];
+        List<String> record = new ArrayList<>();
+        if (ObjectUtil.isNotNull(lat)) {
+            record.add(lat.toString());
+        }
+        if (ObjectUtil.isNotNull(lng)) {
+            record.add(lng.toString());
+        }
+        if (ObjectUtil.isNotNull(address)) {
+            String addressStr = address.toString();
+            String[] addrArray = addressStr.split(";");
+            record.add(addrArray[0]);
+        }
+        return record;
+    }
+
+    public String covFile(String file) {
+        Path path = Paths.get(file);
+        if (Files.notExists(path)) {
+            throw new ServerException("文件不存在!");
+        }
+        String userDownloadsDir = AppDirsFactory.getInstance().getUserDownloadsDir(null, null, null);
+        String fileName = "基站转换结果" + System.currentTimeMillis() + ".xlsx";
+        Path exportPath = Paths.get(userDownloadsDir, fileName);
+        String exportPathStr = exportPath.toAbsolutePath().normalize().toString();
+        TowerListener towerListener = new TowerListener(exportPathStr);
+        FesodSheet.read(path.toFile(), TowerConvertDTO.class, towerListener).sheet().headRowNumber(2).numRows(50000).doRead();
+        return exportPathStr;
+    }
+
+    public String tmpFile() {
+        String userDownloadsDir = AppDirsFactory.getInstance().getUserDownloadsDir(null, null, null);
+        String fileName = "基站导入模板" + System.currentTimeMillis() + ".xls";
+        Path exportPath = Paths.get(userDownloadsDir, fileName);
+        try {
+            FileUtils.copyFile(PathConst.COV_TMP_PATH.toFile(), exportPath.toFile());
+        } catch (IOException e) {
+            log.error("复制基站导入模板文件失败!", e);
+            throw new ServerException("获取基站导入模板文件失败!");
+        }
+        return exportPath.toAbsolutePath().normalize().toString();
+    }
+}