Merge branches 'main' and 'main' of http://121.37.111.42:3000/ThbTech/FileManage into main
This commit is contained in:
commit
22bf89432c
6
data/common_items.json
Normal file
6
data/common_items.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"taskLocation" : [ "浙江横店", "陕西宝鸡", "甘肃兰州", "标签1", "标签2", "标签3", "标签4" ],
|
||||
"aircraftName" : [ "载机名称一", "载机名称二", "载机名称三" ],
|
||||
"sensorDescription" : [ "电阻式传感器", "电容式传感器", "电容式传感器二" ],
|
||||
"taskLabel" : [ "试验标签一", "试验标签二", "试验标签三", "试验标签四", "试验标签五" ]
|
||||
}
|
||||
10
java/pom.xml
10
java/pom.xml
@ -12,7 +12,7 @@
|
||||
<groupId>com.yfd</groupId>
|
||||
<artifactId>filesmanagesystem</artifactId>
|
||||
<version>1.0</version>
|
||||
<packaging>jar</packaging>
|
||||
<packaging>war</packaging>
|
||||
<name>filesmanagesystem</name>
|
||||
<description>文件管理系统</description>
|
||||
<properties>
|
||||
@ -26,6 +26,14 @@
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
<!-- 配置Tomcat依赖作用域为provided,支持war包部署到外部Tomcat容器,
|
||||
同时不影响jar包的内嵌Tomcat运行方式 -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-tomcat</artifactId>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
|
||||
<!-- 生成二维码 -->
|
||||
<dependency>
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package com.yfd.platform.component;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.catalina.connector.ClientAbortException;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
|
||||
|
||||
@ -65,10 +66,24 @@ public class ServerSendEventServer {
|
||||
}
|
||||
|
||||
} catch (IOException e) {
|
||||
log.error("user id:{}, send message error:{}", userId,
|
||||
e.getMessage());
|
||||
e.printStackTrace();
|
||||
// 处理客户端断开连接的情况
|
||||
if (e instanceof ClientAbortException ||
|
||||
(e.getCause() != null && e.getCause() instanceof ClientAbortException)) {
|
||||
log.warn("客户端已断开连接,移除SSE连接,user id: {}", userId);
|
||||
} else {
|
||||
log.error("发送消息失败,user id:{}, error:{}", userId, e.getMessage());
|
||||
}
|
||||
|
||||
// 移除已失效的emitter
|
||||
removeEmitter(userId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void removeEmitter(String userId) {
|
||||
SseEmitter emitter = sseEmitterMap.remove(userId);
|
||||
if (emitter != null) {
|
||||
emitter.complete(); // 确保资源释放
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -0,0 +1,12 @@
|
||||
package com.yfd.platform.modules.common.exception;
|
||||
|
||||
public class BizException extends RuntimeException {
|
||||
|
||||
public BizException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public BizException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,30 @@
|
||||
package com.yfd.platform.modules.experimentalData.config;
|
||||
|
||||
import lombok.Data;
|
||||
import java.util.Map;
|
||||
|
||||
@Data
|
||||
public class DownsampleConfig {
|
||||
|
||||
/** 是否启用 */
|
||||
private boolean enabled = false;
|
||||
|
||||
/** 当前仅支持 UNIFORM(等频) */
|
||||
//private String mode; // UNIFORM
|
||||
|
||||
/** 时间字段名(来自输入行) */
|
||||
//private String timeColumn;
|
||||
|
||||
/** 输入时间步长(秒) */
|
||||
private double inputDelta;
|
||||
|
||||
/** 输出频率(秒) */
|
||||
private double outputInterval;
|
||||
|
||||
/** 是否保留首行 */
|
||||
//private boolean keepFirst = true;
|
||||
|
||||
/** 是否保留末行 */
|
||||
//private boolean keepLast = true;
|
||||
}
|
||||
|
||||
@ -0,0 +1,10 @@
|
||||
package com.yfd.platform.modules.experimentalData.config;
|
||||
|
||||
import lombok.Data;
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class InsConvertConfig {
|
||||
private List<OutputConfig> outputs;
|
||||
}
|
||||
|
||||
@ -0,0 +1,16 @@
|
||||
package com.yfd.platform.modules.experimentalData.config;
|
||||
|
||||
import lombok.Data;
|
||||
import java.util.Map;
|
||||
|
||||
@Data
|
||||
public class OutputConfig {
|
||||
private String name; // 文件标识,如 vins/fvns
|
||||
private String templateResource; // 模板路径 classpath
|
||||
private String delimiter = ","; // 分隔符,默认逗号
|
||||
private String extension = ".txt"; // 文件扩展名,默认 .txt
|
||||
private Map<String, RuleConfig> rules; // 输出列规则
|
||||
|
||||
/** 行级处理策略:降采样 */
|
||||
private DownsampleConfig downsample;
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
package com.yfd.platform.modules.experimentalData.config;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class RuleConfig {
|
||||
private String type; // INPUT / CONST
|
||||
private String from; // INPUT 类型对应 INS 列
|
||||
private String value; // CONST 类型固定值
|
||||
}
|
||||
|
||||
@ -0,0 +1,191 @@
|
||||
package com.yfd.platform.modules.experimentalData.controller;
|
||||
|
||||
import com.yfd.platform.modules.experimentalData.dto.ItemReq;
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.web.bind.annotation.DeleteMapping;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
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.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/common-items")
|
||||
public class CommonItemController {
|
||||
@Value("${app.common-dir}")
|
||||
private String appDataDir;
|
||||
private static final String FILE_NAME = "common_items.json";
|
||||
//private static final String DATA_DIR = "data";
|
||||
|
||||
private final ObjectMapper objectMapper = new ObjectMapper();
|
||||
|
||||
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
|
||||
|
||||
/** 查询 */
|
||||
@GetMapping
|
||||
public Map<String, Object> get() throws IOException {
|
||||
return success(readData());
|
||||
}
|
||||
|
||||
/** 新增 */
|
||||
@PostMapping
|
||||
public Map<String, Object> add(@RequestBody ItemReq req) throws IOException {
|
||||
validate(req);
|
||||
|
||||
lock.writeLock().lock();
|
||||
try {
|
||||
Map<String, List<String>> data = readData();
|
||||
List<String> list = data.computeIfAbsent(req.getType(), k -> new ArrayList<>());
|
||||
if (!list.contains(req.getLabel())) {
|
||||
list.add(req.getLabel());
|
||||
}
|
||||
writeData(data);
|
||||
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
result.put(req.getType(), list);
|
||||
return success(result);
|
||||
} finally {
|
||||
lock.writeLock().unlock();
|
||||
}
|
||||
}
|
||||
|
||||
/** 新增多个标签 */
|
||||
@PostMapping("/batch")
|
||||
public Map<String, Object> addBatch(@RequestBody ItemReq req) throws IOException {
|
||||
validateForBatch(req);
|
||||
|
||||
lock.writeLock().lock();
|
||||
try {
|
||||
Map<String, List<String>> data = readData();
|
||||
List<String> list = data.computeIfAbsent(req.getType(), k -> new ArrayList<>());
|
||||
|
||||
// 批量添加不重复的标签
|
||||
for (String label : req.getLabels()) {
|
||||
if (!list.contains(label)) {
|
||||
list.add(label);
|
||||
}
|
||||
}
|
||||
|
||||
writeData(data);
|
||||
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
result.put(req.getType(), list);
|
||||
return success(result);
|
||||
} finally {
|
||||
lock.writeLock().unlock();
|
||||
}
|
||||
}
|
||||
|
||||
/** 删除 */
|
||||
@DeleteMapping
|
||||
public Map<String, Object> delete(@RequestBody ItemReq req) throws IOException {
|
||||
validate(req);
|
||||
|
||||
lock.writeLock().lock();
|
||||
try {
|
||||
Map<String, List<String>> data = readData();
|
||||
List<String> list = data.get(req.getType());
|
||||
if (list != null) {
|
||||
list.remove(req.getLabel());
|
||||
}
|
||||
|
||||
writeData(data);
|
||||
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
result.put(req.getType(), list != null ? list : Collections.emptyList());
|
||||
return success(result);
|
||||
} finally {
|
||||
lock.writeLock().unlock();
|
||||
}
|
||||
}
|
||||
|
||||
/* ================== 工具方法 ================== */
|
||||
|
||||
private void validate(ItemReq req) {
|
||||
if (req == null
|
||||
|| (!"taskLocation".equals(req.getType()) && !"aircraftName".equals(req.getType())
|
||||
&& !"sensorDescription".equals(req.getType()) && !"taskLabel".equals(req.getType()))
|
||||
|| req.getLabel() == null || req.getLabel().trim().isEmpty()) {
|
||||
throw new IllegalArgumentException("参数无效");
|
||||
}
|
||||
}
|
||||
|
||||
private void validateForBatch(ItemReq req) {
|
||||
if (req == null
|
||||
|| (!"taskLocation".equals(req.getType()) && !"aircraftName".equals(req.getType())
|
||||
&& !"sensorDescription".equals(req.getType()) && !"taskLabel".equals(req.getType()))
|
||||
|| req.getLabels() == null || req.getLabels().isEmpty()) {
|
||||
throw new IllegalArgumentException("参数无效");
|
||||
}
|
||||
}
|
||||
|
||||
private Map<String, List<String>> readData() throws IOException {
|
||||
// 获取项目根目录下的data文件夹路径
|
||||
Path dataDir = Paths.get(appDataDir);
|
||||
Path filePath = dataDir.resolve(FILE_NAME);
|
||||
|
||||
if (!Files.exists(filePath)) {
|
||||
// 如果项目根目录下没有文件,创建默认数据
|
||||
System.out.println("文件不存在,创建默认数据: " + filePath.toString());
|
||||
Files.createDirectories(dataDir);
|
||||
Map<String, List<String>> init = new HashMap<>();
|
||||
init.put("taskLocation", new ArrayList<>());
|
||||
init.put("aircraftName", new ArrayList<>());
|
||||
init.put("sensorDescription", new ArrayList<>());
|
||||
init.put("taskLabel", new ArrayList<>());
|
||||
writeData(init);
|
||||
return init;
|
||||
}
|
||||
|
||||
// 文件存在,读取数据
|
||||
try {
|
||||
System.out.println("正在读取文件: " + filePath.toString());
|
||||
Map<String, List<String>> data = objectMapper.readValue(
|
||||
filePath.toFile(),
|
||||
new TypeReference<Map<String, List<String>>>() {}
|
||||
);
|
||||
System.out.println("文件读取成功,数据大小: " + data.size());
|
||||
return data;
|
||||
} catch (IOException e) {
|
||||
// 如果读取失败,返回默认数据
|
||||
System.err.println("读取文件失败: " + e.getMessage());
|
||||
Map<String, List<String>> init = new HashMap<>();
|
||||
init.put("taskLocation", new ArrayList<>());
|
||||
init.put("aircraftName", new ArrayList<>());
|
||||
init.put("sensorDescription", new ArrayList<>());
|
||||
init.put("taskLabel", new ArrayList<>());
|
||||
return init;
|
||||
}
|
||||
}
|
||||
|
||||
private void writeData(Map<String, List<String>> data) throws IOException {
|
||||
Path dataDir = Paths.get(appDataDir);
|
||||
Path filePath = dataDir.resolve(FILE_NAME);
|
||||
|
||||
Files.createDirectories(dataDir);
|
||||
System.out.println("正在写入文件: " + filePath.toString());
|
||||
objectMapper.writerWithDefaultPrettyPrinter()
|
||||
.writeValue(filePath.toFile(), data);
|
||||
System.out.println("文件写入成功");
|
||||
}
|
||||
|
||||
private Map<String, Object> success(Object data) {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
result.put("success", true);
|
||||
result.put("data", data);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,51 @@
|
||||
package com.yfd.platform.modules.experimentalData.controller;
|
||||
|
||||
import com.yfd.platform.modules.experimentalData.service.InsMergeService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.core.io.FileSystemResource;
|
||||
import org.springframework.http.*;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/ins")
|
||||
public class InsMergeController {
|
||||
|
||||
@Autowired
|
||||
private InsMergeService service;
|
||||
|
||||
@PostMapping("/merge")
|
||||
public ResponseEntity<FileSystemResource> merge(
|
||||
@RequestParam MultipartFile vinsFile,
|
||||
@RequestParam MultipartFile fvnsFile,
|
||||
@RequestParam(required = false) MultipartFile templateFile
|
||||
) throws Exception {
|
||||
|
||||
// 1️⃣ 必传文件
|
||||
File vins = File.createTempFile("vins", ".txt");
|
||||
File fvns = File.createTempFile("fvns", ".csv");
|
||||
vinsFile.transferTo(vins);
|
||||
fvnsFile.transferTo(fvns);
|
||||
|
||||
// 2️⃣ 可选模板文件
|
||||
File tmpl = null;
|
||||
if (templateFile != null && !templateFile.isEmpty()) {
|
||||
tmpl = File.createTempFile("tmpl", ".txt");
|
||||
templateFile.transferTo(tmpl);
|
||||
}
|
||||
|
||||
// 3️⃣ 合并处理(Service 内决定使用默认模板还是自定义模板)
|
||||
File out = service.merge(vins, fvns, tmpl);
|
||||
|
||||
// 4️⃣ 下载响应
|
||||
return ResponseEntity.ok()
|
||||
.header(HttpHeaders.CONTENT_DISPOSITION,
|
||||
"attachment; filename=ins_frameSimu_0_out.txt")
|
||||
.contentType(MediaType.APPLICATION_OCTET_STREAM)
|
||||
.contentLength(out.length())
|
||||
.body(new FileSystemResource(out));
|
||||
|
||||
}
|
||||
}
|
||||
@ -10,6 +10,7 @@ import com.yfd.platform.annotation.Log;
|
||||
import com.yfd.platform.component.ExtractTaskStatus;
|
||||
import com.yfd.platform.component.TaskStatusHolder;
|
||||
import com.yfd.platform.config.ResponseResult;
|
||||
import com.yfd.platform.modules.common.exception.BizException;
|
||||
import com.yfd.platform.modules.experimentalData.domain.*;
|
||||
import com.yfd.platform.modules.experimentalData.service.ITsFilesService;
|
||||
import com.yfd.platform.modules.experimentalData.service.ITsTaskService;
|
||||
@ -19,8 +20,10 @@ import io.swagger.annotations.ApiOperation;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
@ -815,4 +818,39 @@ public class TsFilesController {
|
||||
}
|
||||
|
||||
|
||||
/**********************************
|
||||
* 用途说明: 拆分文件接口
|
||||
* 参数说明 id 要拆分的文件id
|
||||
* 参数说明 taskId 任务ID
|
||||
* 返回值说明: com.yfd.platform.config.ResponseResult
|
||||
***********************************/
|
||||
@Log(module = "实验数据管理", value = "拆分文件接口!")
|
||||
@PostMapping("/splitFile")
|
||||
@ApiOperation("解压缩接口")
|
||||
public ResponseResult splitFile(@RequestParam("id") String id,@RequestParam("taskId") String taskId,@RequestParam(required = false) MultipartFile jsonFile) {
|
||||
File jsonFileOnDisk = null;
|
||||
try {
|
||||
// 参数检查
|
||||
if (id == null || id.isEmpty()) {
|
||||
return ResponseResult.error("id不能为空");
|
||||
}
|
||||
if (taskId == null || taskId.isEmpty()) {
|
||||
return ResponseResult.error("taskId不能为空");
|
||||
}
|
||||
if (jsonFile != null && !jsonFile.isEmpty()) {
|
||||
jsonFileOnDisk = File.createTempFile("convertConfFile", ".json");
|
||||
jsonFile.transferTo(jsonFileOnDisk);
|
||||
}
|
||||
Map<String, TsFiles> mapTsfiles = tsFilesService.splitFile(id,taskId,jsonFileOnDisk);
|
||||
return ResponseResult.successData(mapTsfiles);
|
||||
|
||||
} catch (BizException | IllegalArgumentException e) {
|
||||
//System.out.print("拆分文件异常原因" + e);
|
||||
return ResponseResult.error(e.getMessage());
|
||||
} catch (Exception e) {
|
||||
System.out.print("拆分文件异常原因" + e);
|
||||
return ResponseResult.error("系统错误: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -20,6 +20,7 @@ import io.swagger.annotations.ApiOperation;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
||||
import org.springframework.security.core.Authentication;
|
||||
import org.springframework.security.core.context.SecurityContextHolder;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
@ -167,10 +168,16 @@ public class TsNodesController {
|
||||
if ("IN_PROGRESS".equals(existingStatus)) {
|
||||
return ResponseResult.success("试验数据扫描任务正在处理中!");
|
||||
} else if ("COMPLETED".equals(existingStatus)) {
|
||||
return ResponseResult.success("验数据扫描任务已完成!");
|
||||
return ResponseResult.success("试验数据扫描任务已完成!");
|
||||
}
|
||||
UsernamePasswordAuthenticationToken authentication = (UsernamePasswordAuthenticationToken) SecurityContextHolder.getContext().getAuthentication();
|
||||
LoginUser loginuser = (LoginUser) authentication.getPrincipal();
|
||||
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
|
||||
if (!(authentication instanceof UsernamePasswordAuthenticationToken)) {
|
||||
return ResponseResult.error("未登录,无法启动试验数据扫描任务");
|
||||
}
|
||||
|
||||
LoginUser loginuser =
|
||||
(LoginUser) ((UsernamePasswordAuthenticationToken) authentication).getPrincipal();
|
||||
|
||||
// 原子性启动新任务
|
||||
if (taskStatusHolder.startTaskIfAbsent(asyncKey)) {
|
||||
// 直接异步执行并推送结果
|
||||
|
||||
@ -1,25 +1,43 @@
|
||||
package com.yfd.platform.modules.experimentalData.controller;
|
||||
|
||||
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import cn.hutool.core.util.ObjUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.TypeReference;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.yfd.platform.annotation.Log;
|
||||
import com.yfd.platform.config.ResponseResult;
|
||||
import com.yfd.platform.modules.experimentalData.domain.TsFiles;
|
||||
import com.yfd.platform.modules.experimentalData.domain.TsNodes;
|
||||
import com.yfd.platform.modules.experimentalData.domain.TsTask;
|
||||
import com.yfd.platform.modules.experimentalData.service.ITsFilesService;
|
||||
import com.yfd.platform.modules.experimentalData.service.ITsNodesService;
|
||||
import com.yfd.platform.modules.experimentalData.service.ITsTaskService;
|
||||
import com.yfd.platform.utils.StringUtils;
|
||||
import com.yfd.platform.utils.TableNameContextHolder;
|
||||
import io.netty.channel.ChannelInboundHandlerAdapter;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.sql.DataSource;
|
||||
import java.io.IOException;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URLDecoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.sql.Connection;
|
||||
import java.sql.DatabaseMetaData;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
@ -37,10 +55,23 @@ import java.util.Map;
|
||||
@RequestMapping("/experimentalData/tstask")
|
||||
public class TsTaskController {
|
||||
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(ChannelInboundHandlerAdapter.class);
|
||||
|
||||
//试验任务服务类
|
||||
@Resource
|
||||
private ITsTaskService tsTaskService;
|
||||
|
||||
//试验任务节点服务类
|
||||
@Resource
|
||||
private ITsNodesService tsNodesService;
|
||||
|
||||
//实验任务文档表
|
||||
@Resource
|
||||
private ITsFilesService tsFilesService;
|
||||
|
||||
@Autowired
|
||||
private DataSource dataSource;
|
||||
|
||||
/**********************************
|
||||
* 用途说明: 分页查询试验数据管理-试验任务管理
|
||||
* 参数说明
|
||||
@ -86,8 +117,57 @@ public class TsTaskController {
|
||||
|
||||
//分页查询
|
||||
Page<TsTask> sdProjectPage = tsTaskService.getTsTaskPage(keyword, startDate, endDate, fieldNameData, page, attributeContent);
|
||||
// 循环处理每条数据
|
||||
if (sdProjectPage != null && CollectionUtil.isNotEmpty(sdProjectPage.getRecords())) {
|
||||
for (TsTask task : sdProjectPage.getRecords()) {
|
||||
//根据任务ID 查询是否存在节点 如果存在不能修改1 如果不存在可以修改0
|
||||
LambdaQueryWrapper<TsNodes> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.eq(TsNodes::getTaskId,task.getId());
|
||||
int count = tsNodesService.count(queryWrapper);
|
||||
//如果存在不能修改1
|
||||
if (count>0){
|
||||
task.setModifiableStatus("1");
|
||||
}else {
|
||||
task.setModifiableStatus("0");
|
||||
}
|
||||
|
||||
//
|
||||
if (tableExists("ts_files_" + task.getTaskCode())) {
|
||||
TableNameContextHolder.setTaskCode(task.getTaskCode());
|
||||
|
||||
LambdaQueryWrapper<TsFiles> queryWrapperTsFiles = new LambdaQueryWrapper<>();
|
||||
queryWrapperTsFiles.eq(TsFiles::getTaskId,task.getId());
|
||||
int countTsFiles = tsFilesService.count(queryWrapperTsFiles);
|
||||
//如果存在不能修改1
|
||||
if (countTsFiles>0){
|
||||
task.setModifiableStatus("1");
|
||||
}else {
|
||||
task.setModifiableStatus("0");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return ResponseResult.successData(sdProjectPage);
|
||||
}
|
||||
private boolean tableExists(String tableName) {
|
||||
try (Connection conn = dataSource.getConnection()) {
|
||||
DatabaseMetaData meta = conn.getMetaData();
|
||||
// 获取当前数据库信息
|
||||
String catalog = conn.getCatalog();
|
||||
String schema = conn.getSchema();
|
||||
// 查询表是否存在
|
||||
try (ResultSet rs = meta.getTables(catalog, schema, tableName, new String[]{"TABLE"})) {
|
||||
return rs.next();
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
LOGGER.error("检查表存在失败: {}", tableName, e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/***********************************
|
||||
* 用途说明:新增试验数据管理-试验任务管理
|
||||
@ -214,4 +294,125 @@ public class TsTaskController {
|
||||
List<TsTask> tsTasks = tsTaskService.listTsTask();
|
||||
return ResponseResult.successData(tsTasks);
|
||||
}
|
||||
|
||||
@Log(module = "试验数据管理", value = "导出试验任务SQL数据")
|
||||
@PostMapping("/exportTaskSql")
|
||||
@ApiOperation("导出试验任务SQL数据")
|
||||
@PreAuthorize("@el.check('export:tsTask')")
|
||||
public void exportTaskSql(@RequestParam String taskId, HttpServletResponse response) {
|
||||
if (StrUtil.isBlank(taskId)) {
|
||||
throw new RuntimeException("任务ID不能为空");
|
||||
}
|
||||
|
||||
try {
|
||||
// 调用服务层执行导出操作
|
||||
byte[] zipData = tsTaskService.exportTaskSqlAsZip(taskId);
|
||||
|
||||
// 添加日志记录ZIP数据大小
|
||||
LOGGER.info("生成的ZIP文件大小: {} 字节", zipData.length);
|
||||
|
||||
// 验证ZIP数据是否有效
|
||||
if (zipData.length == 0) {
|
||||
throw new RuntimeException("生成的ZIP数据为空");
|
||||
}
|
||||
|
||||
// 获取任务信息用于文件名
|
||||
TsTask task = tsTaskService.getById(taskId);
|
||||
String taskCode = "";
|
||||
|
||||
// 确保taskCode有值且符合5位数字格式
|
||||
if (task != null && StrUtil.isNotBlank(task.getTaskCode())) {
|
||||
taskCode = task.getTaskCode();
|
||||
// 验证taskCode格式是否正确(5位数字)
|
||||
if (!taskCode.matches("^\\d{5}$")) {
|
||||
// 如果不是5位数字格式,需要处理
|
||||
try {
|
||||
int codeValue = Integer.parseInt(taskCode);
|
||||
if (codeValue >= 1 && codeValue <= 99999) {
|
||||
// 格式化为5位数字字符串
|
||||
taskCode = String.format("%05d", codeValue);
|
||||
} else {
|
||||
throw new IllegalArgumentException("该任务编号超出有效范围: " + taskCode);
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
throw new IllegalArgumentException("无效的任务编号格式: " + taskCode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 设置响应头信息
|
||||
String fileName = taskCode + "_exportdata.zip";
|
||||
response.setContentType("application/zip");
|
||||
response.setCharacterEncoding("UTF-8");
|
||||
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
|
||||
response.setContentLength(zipData.length);
|
||||
|
||||
// 写入响应流
|
||||
response.getOutputStream().write(zipData);
|
||||
response.getOutputStream().flush();
|
||||
|
||||
LOGGER.info("ZIP文件导出成功,文件名: {}, 大小: {} 字节", fileName, zipData.length);
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("导出试验任务SQL数据失败", e);
|
||||
throw new RuntimeException("导出失败:" + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**********************************
|
||||
* 用途说明: 导入ZIP文件中的试验任务SQL数据
|
||||
* 参数说明:
|
||||
* file ZIP文件
|
||||
* taskCode 任务编号
|
||||
* localStorageId 本地存储空间标识
|
||||
* backupStorageId 备份空间标识
|
||||
* 返回值说明: ResponseResult 返回导入结果
|
||||
***********************************/
|
||||
@Log(module = "试验数据管理", value = "导入试验任务SQL数据")
|
||||
@PostMapping("/importTaskSql")
|
||||
@ApiOperation("导入试验任务SQL数据")
|
||||
@PreAuthorize("@el.check('import:tsTask')")
|
||||
public ResponseResult importTaskSql(@RequestParam("file") MultipartFile file,
|
||||
@RequestParam("taskCode") String taskCode,
|
||||
@RequestParam("localStorageId") int localStorageId,
|
||||
@RequestParam("backupStorageId") int backupStorageId) {
|
||||
if (file.isEmpty() || StrUtil.isBlank(taskCode)) {
|
||||
return ResponseResult.error("文件或任务编号不能为空");
|
||||
}
|
||||
|
||||
try {
|
||||
// 调用服务层执行导入操作
|
||||
boolean result = tsTaskService.importTaskSqlFromZip(file, taskCode, localStorageId, backupStorageId);
|
||||
|
||||
if (result) {
|
||||
return ResponseResult.success("导入成功");
|
||||
} else {
|
||||
return ResponseResult.error("导入失败");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
//log.error("导入试验任务SQL数据失败", e);
|
||||
return ResponseResult.error("导入失败:" + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**********************************
|
||||
* 用途说明: 获取最大的任务编号+1
|
||||
* 参数说明: 无
|
||||
* 返回值说明: ResponseResult 返回最大任务编号+1
|
||||
***********************************/
|
||||
@Log(module = "试验数据管理", value = "获取最大任务编号")
|
||||
@GetMapping("/getMaxTaskCode")
|
||||
@ApiOperation("获取最大任务编号")
|
||||
// @PreAuthorize("@el.check('select:tsTask')")
|
||||
public ResponseResult getMaxTaskCode() {
|
||||
try {
|
||||
String maxTaskCode = tsTaskService.getMaxTaskCode();
|
||||
return ResponseResult.successData(maxTaskCode);
|
||||
} catch (Exception e) {
|
||||
//log.error("获取最大任务编号失败", e);
|
||||
return ResponseResult.error("获取最大任务编号失败:" + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -155,5 +155,11 @@ public class TsTask implements Serializable {
|
||||
@TableField(exist = false)
|
||||
private String key;
|
||||
|
||||
/**
|
||||
* 是否可修改:TODO 增加用于前端展示
|
||||
*/
|
||||
@TableField(exist = false)
|
||||
private String modifiableStatus;
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,33 @@
|
||||
package com.yfd.platform.modules.experimentalData.dto;
|
||||
import java.util.List;
|
||||
|
||||
public class ItemReq {
|
||||
|
||||
private String type; // treatment | suggestion
|
||||
private String label; // 内容
|
||||
private List<String> labels; // 多个标签
|
||||
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public void setType(String type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public String getLabel() {
|
||||
return label;
|
||||
}
|
||||
|
||||
public void setLabel(String label) {
|
||||
this.label = label;
|
||||
}
|
||||
|
||||
public List<String> getLabels() {
|
||||
return labels;
|
||||
}
|
||||
|
||||
public void setLabels(List<String> labels) {
|
||||
this.labels = labels;
|
||||
}
|
||||
}
|
||||
@ -24,4 +24,14 @@ public interface TsFilesMapper extends BaseMapper<TsFiles> {
|
||||
|
||||
|
||||
void updateTsFileByPath(@Param("taskId") String taskId,@Param("oldBasePath") String oldBasePath,@Param("newBasePath") String newBasePath);
|
||||
|
||||
/**
|
||||
* 查询某任务、某节点的所有文件
|
||||
*/
|
||||
List<TsFiles> selectByTaskAndNode(String taskId, String nodeId);
|
||||
|
||||
/**
|
||||
* 批量更新 parent_id
|
||||
*/
|
||||
int updateParentIdBatch(List<TsFiles> list);
|
||||
}
|
||||
|
||||
@ -13,4 +13,10 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
*/
|
||||
public interface TsTaskMapper extends BaseMapper<TsTask> {
|
||||
|
||||
/**
|
||||
* 查询最大的任务编号
|
||||
* @return 最大任务编号
|
||||
*/
|
||||
String selectMaxTaskCode();
|
||||
|
||||
}
|
||||
|
||||
@ -8,10 +8,12 @@ import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.yfd.platform.modules.storage.model.result.FileItemResult;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
@ -264,4 +266,18 @@ public interface ITsFilesService extends IService<TsFiles> {
|
||||
* 返回值说明: com.yfd.platform.config.ResponseResult 返回文件集合列表
|
||||
***********************************/
|
||||
Object listTsFilesById(String id, String taskId, String nodeId);
|
||||
|
||||
/**
|
||||
* 根据任务ID获取文件列表
|
||||
* @param taskId 任务ID
|
||||
* @return 文件列表
|
||||
*/
|
||||
List<TsFiles> getByTaskId(String taskId);
|
||||
|
||||
Map<String, TsFiles> splitFile(String id, String taskId, File jsonFile) throws Exception;
|
||||
|
||||
/**
|
||||
* 批量计算并更新 parent_id
|
||||
*/
|
||||
int updateParentId(String taskId, String nodeId);
|
||||
}
|
||||
|
||||
@ -65,4 +65,12 @@ public interface ITsNodesService extends IService<TsNodes> {
|
||||
* 返回值说明: com.yfd.platform.config.ResponseResult 返回删除成功或者失败
|
||||
***********************************/
|
||||
Object confirmDeleteNodes(String id);
|
||||
|
||||
/**
|
||||
* 根据任务ID获取节点列表
|
||||
* @param taskId 任务ID
|
||||
* @return 节点列表
|
||||
*/
|
||||
List<TsNodes> getByTaskId(String taskId);
|
||||
|
||||
}
|
||||
|
||||
@ -3,6 +3,7 @@ package com.yfd.platform.modules.experimentalData.service;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.yfd.platform.modules.experimentalData.domain.TsTask;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
@ -70,4 +71,27 @@ public interface ITsTaskService extends IService<TsTask> {
|
||||
|
||||
List<TsTask> listTsTask();
|
||||
|
||||
/**
|
||||
* 导出试验任务相关SQL数据为ZIP文件
|
||||
* @param taskId 任务ID
|
||||
* @return ZIP文件字节数组
|
||||
*/
|
||||
byte[] exportTaskSqlAsZip(String taskId) throws IOException;
|
||||
|
||||
/**
|
||||
* 从ZIP文件导入试验任务SQL数据
|
||||
* @param file ZIP文件
|
||||
* @param taskCode 任务编号
|
||||
* @param localStorageId 本地存储空间标识
|
||||
* @param backupStorageId 备份空间标识
|
||||
* @return 是否导入成功
|
||||
*/
|
||||
boolean importTaskSqlFromZip(MultipartFile file, String taskCode, int localStorageId, int backupStorageId) throws IOException;
|
||||
|
||||
/**
|
||||
* 获取最大任务编号+1
|
||||
* @return 最大任务编号+1
|
||||
*/
|
||||
String getMaxTaskCode();
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,367 @@
|
||||
package com.yfd.platform.modules.experimentalData.service;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.yfd.platform.modules.common.exception.BizException;
|
||||
import com.yfd.platform.modules.experimentalData.config.DownsampleConfig;
|
||||
import com.yfd.platform.modules.experimentalData.config.InsConvertConfig;
|
||||
import com.yfd.platform.modules.experimentalData.config.OutputConfig;
|
||||
import com.yfd.platform.modules.experimentalData.config.RuleConfig;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* INS 文件转换服务
|
||||
* - JSON 配置支持 INPUT / CONST 列
|
||||
* - 模板文件决定输出列全集
|
||||
* - 支持默认配置 + 客户自定义配置
|
||||
*/
|
||||
@Service
|
||||
@Slf4j
|
||||
public class InsFileConvertNewService {
|
||||
@Value("${app.config-dir}")
|
||||
private String configDir;
|
||||
@Value("${app.templates-dir}")
|
||||
private String templatesDir;
|
||||
|
||||
private static final String CONVERT_FILE_NAME = "ins-convert-default.json";
|
||||
private static final Charset UTF8 = StandardCharsets.UTF_8;
|
||||
|
||||
|
||||
/**
|
||||
* 转换 INS 文件
|
||||
* @param insFile INS 源文件
|
||||
* @param jsonConfigFile 客户自定义 JSON 配置(可为 null,使用默认)
|
||||
* @return Map<输出文件标识, 输出文件对象>
|
||||
*/
|
||||
public Map<String, String> convert(File insFile, File jsonConfigFile) throws Exception {
|
||||
|
||||
long start = System.currentTimeMillis();
|
||||
|
||||
if (!insFile.exists()) {
|
||||
throw new IOException("INS 文件不存在:" + insFile.getAbsolutePath());
|
||||
}
|
||||
|
||||
// 1. 加载配置
|
||||
InsConvertConfig config = loadConfig(jsonConfigFile);
|
||||
|
||||
// 2. 读取 INS 表头
|
||||
String insDelimiter;
|
||||
Map<String, Integer> insHeaderIndex;
|
||||
try (BufferedReader insReader = Files.newBufferedReader(insFile.toPath(), UTF8)) {
|
||||
String insHeaderLine = insReader.readLine();
|
||||
if (insHeaderLine == null) {
|
||||
throw new IllegalStateException("INS 文件为空");
|
||||
}
|
||||
//---------- 自动识别分隔符 ----------
|
||||
|
||||
if (insHeaderLine.contains("\t")) {
|
||||
insDelimiter = "\t";
|
||||
} else if (insHeaderLine.contains(",")) {
|
||||
insDelimiter = ",";
|
||||
} else {
|
||||
throw new RuntimeException("未能识别源数据文件分隔符,请确认文件使用逗号(,)或制表符(\\t)分隔。");
|
||||
}
|
||||
|
||||
// 构建列名索引
|
||||
String[] insHeaders = insHeaderLine.split(insDelimiter, -1);
|
||||
Map<String, Integer> insIndex = new HashMap<>();
|
||||
for (int i = 0; i < insHeaders.length; i++) {
|
||||
insIndex.put(insHeaders[i].trim(), i);
|
||||
}
|
||||
insHeaderIndex = parseHeaderIndex(insHeaderLine,insDelimiter);
|
||||
}
|
||||
|
||||
// 3. 校验 INS 必需字段
|
||||
validateInsHeader(insHeaderIndex, config);
|
||||
|
||||
// 4. 初始化每个输出文件
|
||||
Map<String, OutputContext> outputs = initOutputs(config.getOutputs(), insFile.getParentFile());
|
||||
|
||||
// ===== 新增:初始化降采样 =====
|
||||
initDownsample(outputs);
|
||||
|
||||
// 5. 流式读取 INS 正文
|
||||
long rowCount = 0;
|
||||
try (BufferedReader insReader = Files.newBufferedReader(insFile.toPath(), UTF8)) {
|
||||
insReader.readLine(); // skip header
|
||||
String line;
|
||||
while ((line = insReader.readLine()) != null) {
|
||||
rowCount++;
|
||||
String[] insValues = line.split(insDelimiter, -1);
|
||||
|
||||
for (OutputContext ctx : outputs.values()) {
|
||||
// ===== 新增:降采样判断 =====
|
||||
if (ctx.sampleStep > 1 && rowCount % ctx.sampleStep != 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
String[] out = new String[ctx.headers.length];
|
||||
Arrays.fill(out, "0");
|
||||
|
||||
for (Map.Entry<String, RuleConfig> e : ctx.rules.entrySet()) {
|
||||
String outCol = e.getKey();
|
||||
RuleConfig rule = e.getValue();
|
||||
int outIdx = ctx.headerIndex.get(outCol);
|
||||
|
||||
if ("INPUT".equalsIgnoreCase(rule.getType())) {
|
||||
int inIdx = insHeaderIndex.get(rule.getFrom());
|
||||
out[outIdx] = inIdx < insValues.length ? insValues[inIdx] : "0";
|
||||
} else if ("CONST".equalsIgnoreCase(rule.getType())) {
|
||||
out[outIdx] = rule.getValue() != null ? rule.getValue() : "0";
|
||||
} else {
|
||||
out[outIdx] = "0"; // 未来扩展 FORMULA
|
||||
}
|
||||
}
|
||||
|
||||
ctx.writer.write(String.join(ctx.delimiter, out));
|
||||
ctx.writer.newLine();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 6. 关闭 writer
|
||||
for (OutputContext ctx : outputs.values()) {
|
||||
ctx.writer.flush();
|
||||
ctx.writer.close();
|
||||
}
|
||||
|
||||
log.info("INS 转换完成,行数={}, 耗时={}ms", rowCount, System.currentTimeMillis() - start);
|
||||
|
||||
Map<String, String> result = new HashMap<>();
|
||||
for (OutputContext ctx : outputs.values()) {
|
||||
result.put(ctx.name, ctx.outFile.getAbsolutePath());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// =================== 内部方法 ===================
|
||||
|
||||
/** 加载 JSON 配置,客户自定义优先,否则默认 */
|
||||
private InsConvertConfig loadConfig(File jsonConfigFile) throws IOException {
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
// 1. 显式传入的配置文件(优先级最高)
|
||||
if (jsonConfigFile != null && jsonConfigFile.exists()) {
|
||||
log.info("加载客户自定义 JSON 配置:{}", jsonConfigFile.getAbsolutePath());
|
||||
return mapper.readValue(jsonConfigFile, InsConvertConfig.class);
|
||||
}
|
||||
|
||||
// 2. 尝试 配置文件获取 该方法兼容war部署
|
||||
// 获取项目根目录下的data文件夹路径
|
||||
Path dataDir = Paths.get(configDir);
|
||||
Path filePath = dataDir.resolve(CONVERT_FILE_NAME);
|
||||
if (Files.exists(filePath) && Files.isRegularFile(filePath)) {
|
||||
log.info("加载 JSON 配置文件:{}", filePath.toAbsolutePath());
|
||||
// 直接用 Jackson 从 Path 读取
|
||||
return mapper.readValue(filePath.toFile(), InsConvertConfig.class);
|
||||
}
|
||||
|
||||
// 3. 回退到 jar 内 classpath
|
||||
log.info("加载内置默认 JSON 配置:classpath:config/ins-convert-default.json");
|
||||
ClassPathResource res = new ClassPathResource("config/ins-convert-default.json");
|
||||
try (InputStreamReader in = new InputStreamReader(res.getInputStream(), UTF8)) {
|
||||
return mapper.readValue(in, InsConvertConfig.class);
|
||||
}
|
||||
}
|
||||
|
||||
/** 解析表头到 Map<列名,索引> */
|
||||
private Map<String, Integer> parseHeaderIndex(String headerLine,String delimiter) {
|
||||
String[] headers = headerLine.split(delimiter, -1);
|
||||
Map<String, Integer> map = new HashMap<>();
|
||||
for (int i = 0; i < headers.length; i++) {
|
||||
map.put(headers[i].trim(), i);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
/** 用","解析输出表头到 Map<列名,索引> */
|
||||
private Map<String, Integer> parseOutHeaderIndex(String headerLine,String delimiter) {
|
||||
String[] headers = headerLine.split(delimiter, -1);
|
||||
Map<String, Integer> map = new HashMap<>();
|
||||
for (int i = 0; i < headers.length; i++) {
|
||||
map.put(headers[i].trim(), i);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
/** 校验 INS 必需列 */
|
||||
private void validateInsHeader(Map<String, Integer> insHeader, InsConvertConfig config) {
|
||||
Set<String> required = new HashSet<>();
|
||||
for (OutputConfig out : config.getOutputs()) {
|
||||
for (RuleConfig rule : out.getRules().values()) {
|
||||
if ("INPUT".equalsIgnoreCase(rule.getType())) {
|
||||
required.add(rule.getFrom());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (String col : required) {
|
||||
if (!insHeader.containsKey(col)) {
|
||||
throw new BizException("源数据文件 缺少必须字段:" + col);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** 初始化输出文件流和上下文 */
|
||||
private Map<String, OutputContext> initOutputs(
|
||||
List<OutputConfig> outputs, File parentDir) throws Exception {
|
||||
|
||||
Map<String, OutputContext> map = new HashMap<>();
|
||||
for (OutputConfig out : outputs) {
|
||||
|
||||
// 1.读取模板文件表头
|
||||
// ClassPathResource tpl = new ClassPathResource(out.getTemplateResource());
|
||||
// String headerLine;
|
||||
// try (BufferedReader r = new BufferedReader(new InputStreamReader(tpl.getInputStream(), UTF8))) {
|
||||
// headerLine = r.readLine();
|
||||
// }
|
||||
String headerLine;
|
||||
try (BufferedReader r = openTemplateReader(out.getTemplateResource())) {
|
||||
headerLine = r.readLine();
|
||||
}
|
||||
|
||||
|
||||
if (headerLine == null || headerLine.isEmpty()) {
|
||||
throw new RuntimeException("模板文件为空:" + out.getTemplateResource());
|
||||
}
|
||||
|
||||
String delimiter = out.getDelimiter() != null ? out.getDelimiter() : ",";
|
||||
String[] headers = headerLine.split(delimiter, -1);
|
||||
Map<String, Integer> headerIndex = parseOutHeaderIndex(headerLine,delimiter);
|
||||
|
||||
// ---------- 2. 输出规则列校验 ----------
|
||||
for (String col : out.getRules().keySet()) {
|
||||
if (!headerIndex.containsKey(col)) {
|
||||
throw new BizException(
|
||||
String.format(
|
||||
"输出模板文件 [%s] 中未找到规则列 [%s]。",
|
||||
out.getTemplateResource(),
|
||||
col
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
// --------- 3. 构造输出文件 ---------
|
||||
String ts = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
|
||||
String ext = out.getExtension() != null ? out.getExtension() : ".txt";
|
||||
File outFile = new File(parentDir, out.getName() + "_" + ts + ext);
|
||||
|
||||
BufferedWriter writer = Files.newBufferedWriter(outFile.toPath(), UTF8);
|
||||
|
||||
// ------- 4. 写入模板表头 ----------
|
||||
writer.write(headerLine);
|
||||
writer.newLine();
|
||||
|
||||
// ---------- 5. 初始化上下文 ----------
|
||||
OutputContext ctx = new OutputContext();
|
||||
ctx.name = out.getName();
|
||||
ctx.headers = headers;
|
||||
ctx.headerIndex = headerIndex;
|
||||
ctx.rules = out.getRules();
|
||||
ctx.writer = writer;
|
||||
ctx.delimiter = out.getDelimiter();
|
||||
ctx.outFile = outFile;
|
||||
|
||||
// ===== 新增:绑定降采样配置 =====
|
||||
ctx.downsample = out.getDownsample();
|
||||
|
||||
map.put(ctx.name, ctx);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
private BufferedReader openTemplateReader(String templatePath) throws IOException {
|
||||
|
||||
// 1. jar 、war外部加载
|
||||
// 01. 仅截取文件名(兼容 templates/xxx.txt、/templates/xxx.txt)
|
||||
String fileName = Paths.get(templatePath).getFileName().toString();
|
||||
// 02. 拼接外部 templatesDir
|
||||
Path externalPath = Paths.get(templatesDir).resolve(fileName);
|
||||
// 03. 校验并读取
|
||||
if (Files.exists(externalPath) && Files.isRegularFile(externalPath)) {
|
||||
log.info("加载外部模板文件:{}", externalPath.toAbsolutePath());
|
||||
return Files.newBufferedReader(externalPath, UTF8);
|
||||
}
|
||||
// File external = new File(templatePath);
|
||||
// if (external.exists()) {
|
||||
// log.info("加载 jar 同级模板文件:{}", external.getAbsolutePath());
|
||||
// return Files.newBufferedReader(external.toPath(), UTF8);
|
||||
// }
|
||||
|
||||
// 2. classpath 内模板
|
||||
log.info("加载内置模板文件:classpath:{}", templatePath);
|
||||
ClassPathResource res = new ClassPathResource(templatePath);
|
||||
return new BufferedReader(new InputStreamReader(res.getInputStream(), UTF8));
|
||||
}
|
||||
|
||||
|
||||
// ===== 新增:初始化降采样步长 =====
|
||||
private void initDownsample(Map<String, OutputContext> outputs) {
|
||||
for (OutputContext ctx : outputs.values()) {
|
||||
DownsampleConfig ds = ctx.downsample;
|
||||
if (ds != null && ds.isEnabled()) {
|
||||
|
||||
if (ds.getOutputInterval() <= 0 || ds.getInputDelta() <= 0) {
|
||||
throw new BizException(
|
||||
String.format("错误:输出 [%s] 的降采样(inputDelta/outputInterval)配置无效。", ctx.name)
|
||||
);
|
||||
}
|
||||
|
||||
double ratio = ds.getOutputInterval() / ds.getInputDelta();
|
||||
int step = (int) Math.round(ratio);
|
||||
|
||||
ctx.sampleStep = step <= 1 ? 1 : step;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/** 输出上下文 */
|
||||
private static class OutputContext {
|
||||
String name;
|
||||
String[] headers;
|
||||
Map<String, RuleConfig> rules;
|
||||
Map<String, Integer> headerIndex;
|
||||
BufferedWriter writer;
|
||||
String delimiter;
|
||||
File outFile;
|
||||
|
||||
// ===== 新增(最小)=====
|
||||
DownsampleConfig downsample;
|
||||
int sampleStep = 1; // 默认不降采样
|
||||
}
|
||||
|
||||
// =================== 测试 main ===================
|
||||
public static void main(String[] args) {
|
||||
try {
|
||||
InsFileConvertNewService service = new InsFileConvertNewService();
|
||||
|
||||
File insFile = new File("D:/data/test.txt"); // 修改为实际路径
|
||||
File jsonFile = new File("D:/data/ins-convert-2.json");
|
||||
|
||||
// File jsonFile = new File("D:/data/customer-ins-convert.json"); // 客户自定义 JSON
|
||||
Map<String, String> result = service.convert(insFile,null); // 使用默认配置
|
||||
|
||||
result.forEach((k, f) -> System.out.println(k + " -> " + f));
|
||||
System.out.println("转换完成!");
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,228 @@
|
||||
package com.yfd.platform.modules.experimentalData.service;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.*;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Path;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.*;
|
||||
|
||||
@Service
|
||||
public class InsFileConvertService {
|
||||
|
||||
private static final Logger log =
|
||||
LoggerFactory.getLogger(InsFileConvertService.class);
|
||||
|
||||
/**
|
||||
* INS 转换通用方法
|
||||
* INS 数据 → VINS/FVNS 文件
|
||||
*/
|
||||
public Map<String, String> convertByTemplate(File insFile) throws Exception {
|
||||
|
||||
long startTime = System.currentTimeMillis();
|
||||
|
||||
if (!insFile.exists()) {
|
||||
throw new FileNotFoundException("INS 文件不存在:" + insFile.getAbsolutePath());
|
||||
}
|
||||
|
||||
log.info("INS 转换开始,源文件:{}", insFile.getAbsolutePath());
|
||||
|
||||
// ---------- 1. 时间戳 ----------
|
||||
String ts = LocalDateTime.now()
|
||||
.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
|
||||
|
||||
Path outDir = insFile.getParentFile().toPath();
|
||||
|
||||
File vinsOut = outDir.resolve("VINS_0_mode1_" + ts + ".txt").toFile();
|
||||
File fvnsOut = outDir.resolve("FVNS_" + ts + ".csv").toFile();
|
||||
|
||||
// ---------- 2. 模板 ----------
|
||||
ClassPathResource vinsTpl =
|
||||
new ClassPathResource("templates/VINS_0_mode1.txt");
|
||||
ClassPathResource fvnsTpl =
|
||||
new ClassPathResource("templates/FVNS.csv");
|
||||
|
||||
// ---------- 3. 流 ----------
|
||||
try (
|
||||
BufferedReader insReader = new BufferedReader(
|
||||
new InputStreamReader(new FileInputStream(insFile), StandardCharsets.UTF_8));
|
||||
|
||||
BufferedReader vinsTplReader = new BufferedReader(
|
||||
new InputStreamReader(vinsTpl.getInputStream(), StandardCharsets.UTF_8));
|
||||
|
||||
BufferedReader fvnsTplReader = new BufferedReader(
|
||||
new InputStreamReader(fvnsTpl.getInputStream(), StandardCharsets.UTF_8));
|
||||
|
||||
BufferedWriter vinsWriter = new BufferedWriter(
|
||||
new OutputStreamWriter(new FileOutputStream(vinsOut), StandardCharsets.UTF_8));
|
||||
|
||||
BufferedWriter fvnsWriter = new BufferedWriter(
|
||||
new OutputStreamWriter(new FileOutputStream(fvnsOut), StandardCharsets.UTF_8))
|
||||
) {
|
||||
|
||||
// ---------- 4. INS 表头 ----------
|
||||
String insHeaderLine = insReader.readLine();
|
||||
if (insHeaderLine == null) {
|
||||
throw new RuntimeException("INS 文件为空");
|
||||
}
|
||||
|
||||
Map<String, Integer> insIndex = buildIndex(insHeaderLine);
|
||||
|
||||
// ---------- 5. 表头校验(关键增强) ----------
|
||||
validateInsHeader(insIndex);
|
||||
|
||||
// ---------- 6. 模板表头 ----------
|
||||
String vinsHeader = vinsTplReader.readLine();
|
||||
String fvnsHeader = fvnsTplReader.readLine();
|
||||
|
||||
if (vinsHeader == null || fvnsHeader == null) {
|
||||
throw new RuntimeException("模板文件缺少表头");
|
||||
}
|
||||
|
||||
vinsWriter.write(vinsHeader);
|
||||
vinsWriter.newLine();
|
||||
|
||||
fvnsWriter.write(fvnsHeader);
|
||||
fvnsWriter.newLine();
|
||||
|
||||
String[] vinsCols = vinsHeader.split(",");
|
||||
String[] fvnsCols = fvnsHeader.split(",");
|
||||
|
||||
// ---------- 7. 映射规则 ----------
|
||||
Map<String, String> vinsMapping = new HashMap<>();
|
||||
vinsMapping.put("UTC", "utc");
|
||||
vinsMapping.put("LatGps", "LatJG");
|
||||
vinsMapping.put("LonGps", "LonJG");
|
||||
|
||||
Map<String, String> fvnsMapping = new HashMap<>();
|
||||
fvnsMapping.put("FvnsSts", "posx");
|
||||
fvnsMapping.put("PosxFvns", "posy");
|
||||
fvnsMapping.put("PosyFvns", "posz");
|
||||
|
||||
|
||||
// ---------- 8. 流式处理 ----------
|
||||
String line;
|
||||
long rowCount = 0;
|
||||
|
||||
while ((line = insReader.readLine()) != null) {
|
||||
|
||||
String[] insRow = line.split("[,\t]", -1);
|
||||
|
||||
writeLine(vinsWriter, vinsCols, vinsMapping, insIndex, insRow, ",");
|
||||
writeLine(fvnsWriter, fvnsCols, fvnsMapping, insIndex, insRow, ",");
|
||||
|
||||
rowCount++;
|
||||
}
|
||||
|
||||
vinsWriter.flush();
|
||||
fvnsWriter.flush();
|
||||
|
||||
long cost = System.currentTimeMillis() - startTime;
|
||||
|
||||
log.info(
|
||||
"INS 转换完成,行数:{},耗时:{} ms,输出文件:{}, {}",
|
||||
rowCount,
|
||||
cost,
|
||||
vinsOut.getName(),
|
||||
fvnsOut.getName()
|
||||
);
|
||||
}
|
||||
// 最后返回 Map<String, String>:
|
||||
Map<String, String> out = new HashMap<>();
|
||||
out.put("vins", vinsOut.getAbsolutePath());
|
||||
out.put("fvns", fvnsOut.getAbsolutePath());
|
||||
return out;
|
||||
}
|
||||
|
||||
// ================== 校验与工具方法 ==================
|
||||
|
||||
/**
|
||||
* INS 必须字段校验
|
||||
*/
|
||||
private void validateInsHeader(Map<String, Integer> insIndex) {
|
||||
|
||||
List<String> required = Arrays.asList(
|
||||
"utc",
|
||||
"LatJG",
|
||||
"LonJG",
|
||||
"posx",
|
||||
"posy",
|
||||
"posz"
|
||||
);
|
||||
|
||||
|
||||
List<String> missing = new ArrayList<>();
|
||||
|
||||
for (String field : required) {
|
||||
if (!insIndex.containsKey(field)) {
|
||||
missing.add(field);
|
||||
}
|
||||
}
|
||||
|
||||
if (!missing.isEmpty()) {
|
||||
throw new RuntimeException(
|
||||
"INS 文件缺少必要字段:" + String.join(", ", missing)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private Map<String, Integer> buildIndex(String headerLine) {
|
||||
String[] headers = headerLine.split("[,\t]");
|
||||
Map<String, Integer> map = new HashMap<>();
|
||||
for (int i = 0; i < headers.length; i++) {
|
||||
map.put(headers[i].trim(), i);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
private void writeLine(BufferedWriter writer,
|
||||
String[] targetCols,
|
||||
Map<String, String> mapping,
|
||||
Map<String, Integer> insIndex,
|
||||
String[] insRow,
|
||||
String delimiter) throws IOException {
|
||||
|
||||
String[] out = new String[targetCols.length];
|
||||
Arrays.fill(out, "0");
|
||||
|
||||
for (int i = 0; i < targetCols.length; i++) {
|
||||
String targetCol = targetCols[i].trim();
|
||||
String insCol = mapping.get(targetCol);
|
||||
if (insCol != null) {
|
||||
Integer idx = insIndex.get(insCol);
|
||||
if (idx != null && idx < insRow.length) {
|
||||
out[i] = insRow[idx];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
writer.write(String.join(delimiter, out));
|
||||
writer.newLine();
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
try {
|
||||
// ---------- 1. 构造待测 Service ----------
|
||||
InsFileConvertService service = new InsFileConvertService();
|
||||
|
||||
// ---------- 2. 指定 INS 文件路径 ----------
|
||||
File insFile = new File("D:/data/ins_frameSimu_1.txt");
|
||||
// Linux 示例:
|
||||
// File insFile = new File("/data/ins/ins_frameSimu_0.txt");
|
||||
|
||||
// ---------- 3. 执行转换 ----------
|
||||
service.convertByTemplate(insFile);
|
||||
|
||||
System.out.println("转换完成,请检查输出文件。");
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,154 @@
|
||||
package com.yfd.platform.modules.experimentalData.service;
|
||||
|
||||
import com.yfd.platform.utils.InterpCursor;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.*;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.*;
|
||||
|
||||
@Service
|
||||
public class InsMergeService {
|
||||
|
||||
public File merge(File vinsFile, File fvnsFile, File templateFileOptional) throws Exception {
|
||||
|
||||
// ---------- 1. 模板表头 ----------
|
||||
String[] headers = loadTemplateHeaders(templateFileOptional);
|
||||
// try (BufferedReader br = new BufferedReader(new FileReader(templateFile))) {
|
||||
// headers = br.readLine().split("\t");
|
||||
// }
|
||||
|
||||
// ---------- 2. 读取 FVNS(一次性,较小) ----------
|
||||
List<Double> tList = new ArrayList<>();
|
||||
List<Double> sList = new ArrayList<>();
|
||||
List<Double> xList = new ArrayList<>();
|
||||
List<Double> yList = new ArrayList<>();
|
||||
|
||||
try (BufferedReader br = new BufferedReader(new FileReader(fvnsFile))) {
|
||||
String[] head = br.readLine().split(",", -1);
|
||||
Map<String, Integer> idx = indexMap(head);
|
||||
|
||||
String line;
|
||||
while ((line = br.readLine()) != null) {
|
||||
String[] a = line.split(",",-1);
|
||||
tList.add(Double.parseDouble(a[idx.get("UTC")]));
|
||||
sList.add(Double.parseDouble(a[idx.get("FvnsSts")]));
|
||||
xList.add(Double.parseDouble(a[idx.get("PosxFvns")]));
|
||||
yList.add(Double.parseDouble(a[idx.get("PosyFvns")]));
|
||||
}
|
||||
}
|
||||
// 检查时间序列,在读 FVNS 后,只加一次校验即可
|
||||
for (int i = 1; i < tList.size(); i++) {
|
||||
if (tList.get(i) < tList.get(i - 1)) {
|
||||
throw new IllegalStateException("FVNS UTC not sorted at line " + i);
|
||||
}
|
||||
}
|
||||
|
||||
InterpCursor cPosX = new InterpCursor(toArr(tList), toArr(sList));
|
||||
InterpCursor cPosY = new InterpCursor(toArr(tList), toArr(xList));
|
||||
InterpCursor cPosZ = new InterpCursor(toArr(tList), toArr(yList));
|
||||
|
||||
// ---------- 3. 输出文件 ----------
|
||||
File out = File.createTempFile("ins_frameSimu_0_out", ".txt");
|
||||
|
||||
try (
|
||||
BufferedReader br = new BufferedReader(new FileReader(vinsFile));
|
||||
BufferedWriter bw = new BufferedWriter(
|
||||
new OutputStreamWriter(new FileOutputStream(out), StandardCharsets.UTF_8), 1 << 20)
|
||||
) {
|
||||
// VINS header
|
||||
String[] vinsHead = br.readLine().split(",",-1);
|
||||
Map<String, Integer> vinsIdx = indexMap(vinsHead);
|
||||
requireField(vinsIdx, "UTC");
|
||||
requireField(vinsIdx, "LatGps");
|
||||
requireField(vinsIdx, "LonGps");
|
||||
|
||||
|
||||
// 写表头
|
||||
bw.write(String.join("\t", headers));
|
||||
bw.newLine();
|
||||
|
||||
String line;
|
||||
while ((line = br.readLine()) != null) {
|
||||
String[] a = line.split(",",-1);
|
||||
|
||||
double utc = Double.parseDouble(a[vinsIdx.get("UTC")]);
|
||||
double lat = Double.parseDouble(a[vinsIdx.get("LatGps")]);
|
||||
double lon = Double.parseDouble(a[vinsIdx.get("LonGps")]);
|
||||
|
||||
double posx = cPosX.valueAt(utc);
|
||||
double posy = cPosY.valueAt(utc);
|
||||
double posz = cPosZ.valueAt(utc);
|
||||
|
||||
// 按模板顺序输出
|
||||
for (int i = 0; i < headers.length; i++) {
|
||||
switch (headers[i]) {
|
||||
case "utc": bw.write(fmt(utc)); break;
|
||||
case "LatJG": bw.write(fmt(lat)); break;
|
||||
case "LonJG": bw.write(fmt(lon)); break;
|
||||
case "posx": bw.write(fmt(posx)); break;
|
||||
case "posy": bw.write(fmt(posy)); break;
|
||||
case "posz": bw.write(fmt(posz)); break;
|
||||
default: bw.write("0"); break;
|
||||
}
|
||||
if (i < headers.length - 1) bw.write("\t");
|
||||
}
|
||||
bw.newLine();
|
||||
}
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
// ---------- utils ----------
|
||||
|
||||
private Map<String, Integer> indexMap(String[] head) {
|
||||
Map<String, Integer> m = new HashMap<>();
|
||||
for (int i = 0; i < head.length; i++) {
|
||||
m.put(head[i].trim(), i);
|
||||
}
|
||||
return m;
|
||||
}
|
||||
|
||||
private void requireField(Map<String, Integer> idx, String name) {
|
||||
if (!idx.containsKey(name)) {
|
||||
throw new IllegalArgumentException("Missing required field: " + name);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private double[] toArr(List<Double> list) {
|
||||
double[] a = new double[list.size()];
|
||||
for (int i = 0; i < a.length; i++) a[i] = list.get(i);
|
||||
return a;
|
||||
}
|
||||
|
||||
private String fmt(double v) {
|
||||
return String.format(Locale.US, "%.6f", v);
|
||||
}
|
||||
|
||||
private String[] loadTemplateHeaders(File templateFile) throws IOException {
|
||||
|
||||
// 1️⃣ 若用户上传模板
|
||||
if (templateFile != null && templateFile.exists()) {
|
||||
try (BufferedReader br = new BufferedReader(new FileReader(templateFile))) {
|
||||
return br.readLine().split("\t");
|
||||
}
|
||||
}
|
||||
|
||||
// 2️⃣ 使用内置模板
|
||||
try (InputStream is = getClass()
|
||||
.getClassLoader()
|
||||
.getResourceAsStream("templates/ins_frameSimu_0.txt")) {
|
||||
|
||||
if (is == null) {
|
||||
throw new RuntimeException("Default template ins_frameSimu_0.txt not found");
|
||||
}
|
||||
|
||||
try (BufferedReader br = new BufferedReader(new InputStreamReader(is))) {
|
||||
return br.readLine().split("\t");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -35,6 +35,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.opencsv.CSVReader;
|
||||
import com.opencsv.CSVWriter;
|
||||
import com.opencsv.exceptions.CsvValidationException;
|
||||
import com.qiniu.storage.model.FileInfo;
|
||||
import com.yfd.platform.component.ExtractTaskStatus;
|
||||
import com.yfd.platform.component.ServerSendEventServer;
|
||||
import com.yfd.platform.component.TaskStatusHolder;
|
||||
@ -45,6 +46,8 @@ import com.yfd.platform.modules.experimentalData.mapper.TsFilesMapper;
|
||||
import com.yfd.platform.modules.experimentalData.mapper.TsTaskMapper;
|
||||
import com.yfd.platform.modules.experimentalData.service.ITsFilesService;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.yfd.platform.modules.experimentalData.service.InsFileConvertNewService;
|
||||
import com.yfd.platform.modules.experimentalData.service.InsFileConvertService;
|
||||
import com.yfd.platform.modules.storage.context.StorageSourceContext;
|
||||
import com.yfd.platform.modules.storage.mapper.StorageSourceConfigMapper;
|
||||
import com.yfd.platform.modules.storage.mapper.StorageSourceMapper;
|
||||
@ -77,6 +80,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.redis.core.RedisTemplate;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
||||
import org.springframework.security.core.Authentication;
|
||||
import org.springframework.security.core.context.SecurityContextHolder;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
@ -138,10 +142,18 @@ public class TsFilesServiceImpl extends ServiceImpl<TsFilesMapper, TsFiles> impl
|
||||
@Autowired
|
||||
private ExtractTaskStatus extractTaskStatus;
|
||||
|
||||
@Autowired
|
||||
private InsFileConvertService insFileConvertService;
|
||||
|
||||
@Autowired
|
||||
private InsFileConvertNewService insFileConvertNewService;
|
||||
|
||||
@Autowired
|
||||
private RedisTemplate<String, Object> redisTemplate;
|
||||
private TaskMessage taskMessage;
|
||||
|
||||
private static final int BATCH_SIZE = 5000;
|
||||
|
||||
/**********************************
|
||||
* 用途说明: 分页查询试验数据管理-文档内容
|
||||
* 参数说明
|
||||
@ -253,6 +265,8 @@ public class TsFilesServiceImpl extends ServiceImpl<TsFilesMapper, TsFiles> impl
|
||||
FileItemResult fileItemResult = fileService.getFileItem(path);
|
||||
if (fileItemResult == null || fileItemResult.getName() == null) {
|
||||
LOGGER.error("{}文件没有上传到工作空间,请重新选择上传", fileNameData);
|
||||
// 跳过处理这个文件,避免空指针异常
|
||||
continue;
|
||||
}
|
||||
tsFiles.setUrl(fileItemResult.getUrl());
|
||||
//如果是压缩文件 类型就给zip
|
||||
@ -260,7 +274,12 @@ public class TsFilesServiceImpl extends ServiceImpl<TsFilesMapper, TsFiles> impl
|
||||
if (isValid) {
|
||||
tsFiles.setType("ZIP");
|
||||
} else {
|
||||
// 添加空值检查,防止空指针异常
|
||||
if (fileItemResult.getType() != null) {
|
||||
tsFiles.setType(fileItemResult.getType().getValue());
|
||||
} else {
|
||||
tsFiles.setType("UNKNOWN");
|
||||
}
|
||||
}
|
||||
if (tsFiles.getUpdateTime() == null) {
|
||||
tsFiles.setUpdateTime(tsFiles.getUploadTime());
|
||||
@ -468,9 +487,23 @@ public class TsFilesServiceImpl extends ServiceImpl<TsFilesMapper, TsFiles> impl
|
||||
List<String> names = Arrays.asList(tsFiles.getFileName().split(","));
|
||||
List<String> sizes = Arrays.asList(tsFiles.getFileSize().split(","));
|
||||
// 获取当前登录用户
|
||||
UsernamePasswordAuthenticationToken authentication =
|
||||
(UsernamePasswordAuthenticationToken) SecurityContextHolder.getContext().getAuthentication();
|
||||
LoginUser loginuser = (LoginUser) authentication.getPrincipal();
|
||||
// UsernamePasswordAuthenticationToken authentication =
|
||||
// (UsernamePasswordAuthenticationToken) SecurityContextHolder.getContext().getAuthentication();
|
||||
// LoginUser loginuser = (LoginUser) authentication.getPrincipal();
|
||||
|
||||
// ===== 安全获取当前登录用户 =====
|
||||
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
|
||||
LoginUser loginUser;
|
||||
if (authentication instanceof UsernamePasswordAuthenticationToken) {
|
||||
UsernamePasswordAuthenticationToken token = (UsernamePasswordAuthenticationToken) authentication;
|
||||
loginUser = (LoginUser) token.getPrincipal();
|
||||
|
||||
// 这里继续你的业务逻辑
|
||||
} else {
|
||||
// 匿名访问处理:可以抛异常或记录默认值
|
||||
throw new IllegalStateException("未登录用户无法新增试验数据");
|
||||
}
|
||||
|
||||
|
||||
// 数据校验
|
||||
if (names.size() != sizes.size()) {
|
||||
@ -516,7 +549,7 @@ public class TsFilesServiceImpl extends ServiceImpl<TsFilesMapper, TsFiles> impl
|
||||
files1.setKeywords(tsFiles.getKeywords());
|
||||
files1.setDescription(tsFiles.getDescription());
|
||||
files1.setUploadTime(tsFiles.getUploadTime());
|
||||
files1.setUploader(loginuser.getUsername());
|
||||
files1.setUploader(loginUser.getUsername());
|
||||
files1.setFileName(name);
|
||||
files1.setFileSize("0.000".equals(sizeStr) ? "0.001" : sizeStr);
|
||||
|
||||
@ -5422,20 +5455,40 @@ public class TsFilesServiceImpl extends ServiceImpl<TsFilesMapper, TsFiles> impl
|
||||
|
||||
//判断文件后缀是.txt还是.csv
|
||||
String fileName = tsFiles.getFileName();
|
||||
TsFiles tsFilesData = tsFilesMapper.selectById(configId);
|
||||
// TsFiles tsFilesData = tsFilesMapper.selectById(configId);
|
||||
|
||||
// 根据文件后缀确定配置文件路径
|
||||
String configResourcePath;
|
||||
String Separator;
|
||||
if (fileName.toLowerCase().endsWith(".csv")) {
|
||||
|
||||
configResourcePath = "config/trj_config.txt";
|
||||
Separator = ",";
|
||||
} else if (fileName.toLowerCase().endsWith(".txt")) {
|
||||
configResourcePath = "config/trj_config_ins_img.txt";
|
||||
Separator = "\t";
|
||||
} else {
|
||||
Separator = "";
|
||||
throw new IllegalArgumentException("不支持的文件格式: " + fileName + ",仅支持.csv和.txt文件");
|
||||
}
|
||||
|
||||
|
||||
if (currentTaskFuture != null && !currentTaskFuture.isDone()) {
|
||||
currentTaskFuture.cancel(true);
|
||||
}
|
||||
|
||||
currentTaskFuture = executorService.submit(() -> {
|
||||
try {
|
||||
// 1. 获取配置文件路径
|
||||
StorageSourceConfig config = getStorageSourceConfig("filePath", "local", tsTask.getLocalStorageId());
|
||||
Path basePath = Paths.get(config.getValue() + tsFilesData.getWorkPath());
|
||||
// // 1. 获取配置文件路径
|
||||
// StorageSourceConfig config = getStorageSourceConfig("filePath", "local", tsTask.getLocalStorageId());
|
||||
// Path basePath = Paths.get(config.getValue() + tsFilesData.getWorkPath());
|
||||
//
|
||||
// // 2. 读取配置文件(假设配置文件名为 trj_config.txt)
|
||||
// Path configPath = basePath.resolve(tsFilesData.getFileName());
|
||||
// Map<String, String> columnMapping = parseConfigFile(configPath, token);
|
||||
|
||||
// 2. 读取配置文件(假设配置文件名为 trj_config.txt)
|
||||
Path configPath = basePath.resolve(tsFilesData.getFileName());
|
||||
Map<String, String> columnMapping = parseConfigFile(configPath, token);
|
||||
// 1. 从资源文件读取配置文件
|
||||
Map<String, String> columnMapping = parseConfigFromResource(configResourcePath, token);
|
||||
|
||||
String timeColumn = columnMapping.get("time");
|
||||
String lonColumn = columnMapping.get("lon");
|
||||
@ -5446,10 +5499,12 @@ public class TsFilesServiceImpl extends ServiceImpl<TsFilesMapper, TsFiles> impl
|
||||
timeColumn, lonColumn, latColumn, hgtColumn);
|
||||
|
||||
// 3. 获取数据文件路径
|
||||
StorageSourceConfig config = getStorageSourceConfig("filePath", "local", tsTask.getLocalStorageId());
|
||||
Path basePath = Paths.get(config.getValue() + tsFiles.getWorkPath());
|
||||
Path dataPath = basePath.resolve(tsFiles.getFileName());
|
||||
|
||||
// 4. 处理数据文件
|
||||
processDataFile(dataPath, samTimes, token, timeColumn, lonColumn, latColumn, hgtColumn);
|
||||
processDataFile(dataPath, samTimes, token, timeColumn, lonColumn, latColumn, hgtColumn,Separator);
|
||||
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("任务执行失败: {}", e.getMessage(), e);
|
||||
@ -5465,6 +5520,64 @@ public class TsFilesServiceImpl extends ServiceImpl<TsFilesMapper, TsFiles> impl
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 从资源文件读取配置文件并解析为列名映射
|
||||
*/
|
||||
public Map<String, String> parseConfigFromResource(String resourcePath, String token) throws IOException {
|
||||
Map<String, String> columnMapping = new HashMap<>();
|
||||
|
||||
// 使用ClassLoader读取资源文件
|
||||
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
|
||||
try (InputStream inputStream = classLoader.getResourceAsStream(resourcePath);
|
||||
BufferedReader reader = inputStream != null ?
|
||||
new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)) : null) {
|
||||
|
||||
if (reader == null) {
|
||||
throw new IOException("找不到配置文件: " + resourcePath);
|
||||
}
|
||||
|
||||
String line;
|
||||
while ((line = reader.readLine()) != null) {
|
||||
line = line.trim();
|
||||
if (line.isEmpty() || line.startsWith("#")) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 分割键值对,支持=和:分隔符
|
||||
String[] parts = line.split("[=:]", 2);
|
||||
if (parts.length < 2) {
|
||||
LOGGER.warn("忽略无效行: {}", line);
|
||||
continue;
|
||||
}
|
||||
|
||||
String key = parts[0].trim().toLowerCase();
|
||||
String value = parts[1].trim();
|
||||
|
||||
// 清理引号
|
||||
if (value.startsWith("\"") && value.endsWith("\"")) {
|
||||
value = value.substring(1, value.length() - 1);
|
||||
}
|
||||
|
||||
// 只处理需要的键
|
||||
if (key.equals("time") || key.equals("lon") ||
|
||||
key.equals("lat") || key.equals("hgt")) {
|
||||
columnMapping.put(key, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 验证是否获取到所有必需的列
|
||||
if (columnMapping.size() < 4) {
|
||||
JSONObject jsonResponse = new JSONObject();
|
||||
jsonResponse.put("message", "配置文件选择错误,请重新选择!");
|
||||
|
||||
ServerSendEventServer.sendMessageById(token, jsonResponse.toString());
|
||||
throw new IOException("配置文件缺少必需列");
|
||||
}
|
||||
|
||||
return columnMapping;
|
||||
}
|
||||
|
||||
|
||||
// // 封装发送数据的逻辑
|
||||
// private void sendData(String token, String[] values, int lineCount) {
|
||||
@ -5557,7 +5670,7 @@ public class TsFilesServiceImpl extends ServiceImpl<TsFilesMapper, TsFiles> impl
|
||||
|
||||
private void processDataFile(Path dataPath, int samTimes, String token,
|
||||
String timeColumn, String lonColumn,
|
||||
String latColumn, String hgtColumn)
|
||||
String latColumn, String hgtColumn,String Separator)
|
||||
throws IOException {
|
||||
|
||||
try (BufferedReader reader = Files.newBufferedReader(dataPath, StandardCharsets.UTF_8)) {
|
||||
@ -5641,32 +5754,50 @@ public class TsFilesServiceImpl extends ServiceImpl<TsFilesMapper, TsFiles> impl
|
||||
int sendCount = 0;
|
||||
|
||||
int lineCountData = 0;
|
||||
float timeValue0 = 0;
|
||||
float timeValue1 = 0;
|
||||
double timeValue0 = 0;
|
||||
double timeValue1 = 0;
|
||||
int result = 0; //
|
||||
|
||||
while (!Thread.currentThread().isInterrupted() && (line = reader.readLine()) != null) {
|
||||
lineCountData++;
|
||||
if (lineCountData > 2) {
|
||||
break; // 跳出循环,停止读取数据
|
||||
while (!Thread.currentThread().isInterrupted() ) {
|
||||
String line1 = "";
|
||||
String line2 = "";
|
||||
if((line = reader.readLine()) != null)
|
||||
line1 = line;
|
||||
if ((line = reader.readLine()) != null) {
|
||||
line2 = line;
|
||||
}
|
||||
System.out.println("正在处理数据行: {}" +line1);
|
||||
System.out.println("正在处理数据行: {}" +line2);
|
||||
// 使用逗号分隔数据行
|
||||
String[] values = line.split(","); // 改为逗号分隔
|
||||
if (lineCountData == 1) {
|
||||
// 读取第一行的时间值
|
||||
timeValue0 = Float.parseFloat(getValueSafely(values, timeIndex, "0.0")); // 将字符串转换为数字
|
||||
} else if (lineCountData == 2) {
|
||||
// 读取第二行的时间值
|
||||
timeValue1 = Float.parseFloat(getValueSafely(values, timeIndex, "0.0")); // 将字符串转换为数字
|
||||
// 计算 timeValue1 - timeValue0
|
||||
float data = timeValue1 - timeValue0;
|
||||
String[] values = line1.split(Separator); // 改为逗号分隔
|
||||
timeValue0 = Float.parseFloat(values[timeIndex]);//Float.parseFloat(getValueSafely(values, timeIndex, "0.0"));
|
||||
String[] values2 = line2.split(Separator); // 改为逗号分隔
|
||||
timeValue1 = Float.parseFloat(values2[timeIndex]);//Float.parseFloat(getValueSafely(values2, timeIndex, "0.0"));
|
||||
|
||||
double data = timeValue1 - timeValue0;
|
||||
// 计算 1 / data
|
||||
if (data != 0) { // 确保避免除以零
|
||||
result = (int) Math.floor(1 / data);
|
||||
} else {
|
||||
if (Math.abs(data) > 0.0000001) {
|
||||
// 四舍五入,而不是向下取整
|
||||
result = (int) Math.round(1.0 / data);
|
||||
break;
|
||||
}else {
|
||||
result = 1;
|
||||
}
|
||||
}
|
||||
// if (lineCountData == 1) {
|
||||
// // 读取第一行的时间值
|
||||
// timeValue0 = Float.parseFloat(getValueSafely(values, timeIndex, "0.0")); // 将字符串转换为数字
|
||||
// } else if (lineCountData == 2) {
|
||||
// // 读取第二行的时间值
|
||||
// timeValue1 = Float.parseFloat(getValueSafely(values, timeIndex, "0.0")); // 将字符串转换为数字
|
||||
// // 计算 timeValue1 - timeValue0
|
||||
// float data = timeValue1 - timeValue0;
|
||||
// // 计算 1 / data
|
||||
// if (data != 0) { // 确保避免除以零
|
||||
// result = (int) Math.floor(1 / data);
|
||||
// } else {
|
||||
// result = 1;
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
@ -6275,6 +6406,105 @@ public class TsFilesServiceImpl extends ServiceImpl<TsFilesMapper, TsFiles> impl
|
||||
return String.format("%s,%s,%s,%s", parts[0], parts[1], parts[2], parts[3]);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TsFiles> getByTaskId(String taskId) {
|
||||
LambdaQueryWrapper<TsFiles> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.eq(TsFiles::getTaskId, taskId);
|
||||
return this.list(queryWrapper);
|
||||
}
|
||||
|
||||
/**
|
||||
* 拆分文件接口
|
||||
* @param id
|
||||
*/
|
||||
@Override
|
||||
public Map<String, TsFiles> splitFile(String id,String taskId,File jsonFile) throws Exception {
|
||||
//1:动态表名 以及通过ID查询tsfiles 然后根据id path taskId nodeid 等等条件查询所欲的集合
|
||||
Map<String, TsFiles> resultMap = new HashMap<>();
|
||||
try {
|
||||
TsTask tsTask = tsTaskMapper.selectById(taskId);
|
||||
TableNameContextHolder.setTaskCode(tsTask.getTaskCode());
|
||||
StorageSource storageSource = getStorageConfig(tsTask.getLocalStorageId());
|
||||
TsFiles tsFile = tsFilesMapper.selectById(id);
|
||||
if (tsFile == null) {
|
||||
throw new RuntimeException("文件不存在: " + id);
|
||||
}
|
||||
StorageSourceConfig config = getStorageSourceConfig("filePath", "local", tsTask.getLocalStorageId());
|
||||
|
||||
|
||||
// 2. 构建源文件路径
|
||||
Path sourcePath = Paths.get(config.getValue(), tsFile.getWorkPath(), tsFile.getFileName()).normalize();
|
||||
File sourceFile = sourcePath.toFile();
|
||||
if (!sourceFile.exists()) {
|
||||
throw new FileNotFoundException("文件不存在: " + sourcePath);
|
||||
}
|
||||
|
||||
// 3. 根据规则拆分文件
|
||||
Map<String, String> outputPaths = insFileConvertNewService.convert(sourceFile, jsonFile);
|
||||
|
||||
// 3. 生成TsFiles对象集合
|
||||
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
|
||||
// 遍历所有输出文件
|
||||
for (Map.Entry<String, String> entry : outputPaths.entrySet()) {
|
||||
String outputName = entry.getKey(); // 如 vins、fvns
|
||||
String path = entry.getValue();
|
||||
File outFile = new File(path);
|
||||
|
||||
TsFiles ts = new TsFiles();
|
||||
ts.setNodeId(tsFile.getNodeId());
|
||||
ts.setTaskId(tsFile.getTaskId());
|
||||
ts.setIsFile("FILE");
|
||||
ts.setParentId(tsFile.getParentId());
|
||||
ts.setFileName(outFile.getName());
|
||||
ts.setFileSize(String.valueOf(outFile.length() / (1024.0 * 1024.0))); // 转 M
|
||||
ts.setWorkPath(tsFile.getWorkPath());
|
||||
this.addTsFiles(ts);
|
||||
|
||||
resultMap.put(outputName, ts);
|
||||
}
|
||||
} finally {
|
||||
TableNameContextHolder.clear(); // 确保清理资源
|
||||
}
|
||||
|
||||
return resultMap;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量计算并更新 parent_id
|
||||
*/
|
||||
public int updateParentId(String taskId, String nodeId) {
|
||||
// 1. 查询所有文件和文件夹
|
||||
List<TsFiles> allFiles = tsFilesMapper.selectByTaskAndNode(taskId, nodeId);
|
||||
|
||||
// 2. 构建父路径 -> id 映射
|
||||
Map<String, String> pathToId = allFiles.stream()
|
||||
.collect(Collectors.toMap(
|
||||
f -> f.getWorkPath() + f.getFileName() + "/", // 父路径
|
||||
TsFiles::getId,
|
||||
(existing, replacement) -> existing // 避免重复 key
|
||||
));
|
||||
|
||||
// 3. 设置 parent_id
|
||||
for (TsFiles f : allFiles) {
|
||||
String parentId = pathToId.getOrDefault(f.getWorkPath(), "00"); // 顶级为 00
|
||||
f.setParentId(parentId);
|
||||
}
|
||||
|
||||
|
||||
// 4. 分批更新并累加返回值
|
||||
int totalUpdated = 0;
|
||||
for (int i = 0; i < allFiles.size(); i += BATCH_SIZE) {
|
||||
List<TsFiles> subList = allFiles.subList(i, Math.min(i + BATCH_SIZE, allFiles.size()));
|
||||
int updated = tsFilesMapper.updateParentIdBatch(subList);
|
||||
totalUpdated += updated;
|
||||
|
||||
}
|
||||
// 5. 返回总更新行数
|
||||
return totalUpdated;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -38,6 +38,7 @@ import com.yfd.platform.system.domain.LoginUser;
|
||||
import com.yfd.platform.utils.StringUtils;
|
||||
import com.yfd.platform.utils.TableNameContextHolder;
|
||||
import io.netty.channel.ChannelInboundHandlerAdapter;
|
||||
import lombok.val;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
@ -46,6 +47,7 @@ import org.springframework.scheduling.annotation.Async;
|
||||
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
||||
import org.springframework.security.core.context.SecurityContextHolder;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Propagation;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
@ -70,6 +72,8 @@ public class TsNodesServiceImpl extends ServiceImpl<TsNodesMapper, TsNodes> impl
|
||||
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(ChannelInboundHandlerAdapter.class);
|
||||
|
||||
private static final int BATCH_SIZE = 5000;
|
||||
|
||||
//试验任务节点表 Mapper
|
||||
@Resource
|
||||
private TsNodesMapper tsNodesMapper;
|
||||
@ -109,52 +113,181 @@ public class TsNodesServiceImpl extends ServiceImpl<TsNodesMapper, TsNodes> impl
|
||||
|
||||
@Override
|
||||
public List<Map<String, Object>> getTsNodesTree(String nodeName, String taskId) {
|
||||
TsTask tsTask = tsTaskMapper.selectOne(new QueryWrapper<TsTask>().eq("id", taskId));
|
||||
// 查询所有节点数据
|
||||
List<Map<String, Object>> result = new ArrayList<>();
|
||||
|
||||
// 查询所有节点数据(如果taskId为空,查询所有任务节点)
|
||||
List<Map<String, Object>> allNodes = getAllNodes(taskId);
|
||||
|
||||
// 查找所有根节点(parentId为"00"的节点)
|
||||
List<Map<String, Object>> rootNodes = findRootNodes(allNodes, taskId);
|
||||
// 如果taskId为空,根据nodeName直接过滤
|
||||
if (StringUtils.isEmpty(taskId)) {
|
||||
if (StringUtils.isEmpty(nodeName)) {
|
||||
// 返回所有节点(需要按任务分组构建树)
|
||||
// return buildAllTaskTrees(allNodes);
|
||||
return result;
|
||||
} else {
|
||||
// 根据nodeName查询所有匹配节点,构建到根节点的路径
|
||||
return findNodesByName(allNodes, nodeName);
|
||||
}
|
||||
} else {
|
||||
// 原有逻辑:taskId不为空时按任务查询
|
||||
TsTask tsTask = tsTaskMapper.selectOne(new QueryWrapper<TsTask>().eq("id", taskId));
|
||||
if (tsTask == null) {
|
||||
throw new RuntimeException("任务不存在");
|
||||
}
|
||||
|
||||
// 根节点的基本路径:/项目名称/
|
||||
List<Map<String, Object>> rootNodes = findRootNodes(allNodes, taskId);
|
||||
String basePath = "/" + tsTask.getTaskName() + "/";
|
||||
|
||||
// 存储最终结果
|
||||
List<Map<String, Object>> result = new ArrayList<>();
|
||||
Map<String, Object> rootNodeData = new HashMap<>();
|
||||
rootNodeData.put("nodeName", "根节点");
|
||||
rootNodeData.put("path", "/"+tsTask.getTaskName()+"/");
|
||||
rootNodeData.put("path", basePath);
|
||||
rootNodeData.put("nodeId", tsTask.getId());
|
||||
rootNodeData.put("nodeOrder", "0");
|
||||
rootNodeData.put("taskId", tsTask.getId());
|
||||
rootNodeData.put("taskName", tsTask.getTaskName());
|
||||
rootNodeData.put("parentId", "00");
|
||||
result.add(rootNodeData);
|
||||
|
||||
// 如果 nodeName 为空,返回所有根节点的完整树形结构
|
||||
if (StringUtils.isEmpty(nodeName)) {
|
||||
if (!rootNodes.isEmpty()) {
|
||||
for (Map<String, Object> rootNode : rootNodes) {
|
||||
rootNode.put("path", basePath);
|
||||
result.addAll(buildFullTree(rootNode, allNodes));
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// 否则,返回从根节点到目标节点的树形结构
|
||||
if (!rootNodes.isEmpty()) {
|
||||
} else {
|
||||
for (Map<String, Object> rootNode : rootNodes) {
|
||||
rootNode.put("path", basePath);
|
||||
List<Map<String, Object>> tree = buildTreeToTargetNode(rootNode, allNodes, nodeName);
|
||||
if (!tree.isEmpty()) {
|
||||
result.addAll(tree);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 返回结果
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 根据节点名称查找所有匹配节点并构建树
|
||||
*/
|
||||
private List<Map<String, Object>> findNodesByName(List<Map<String, Object>> allNodes, String nodeName) {
|
||||
List<Map<String, Object>> result = new ArrayList<>();
|
||||
|
||||
// 查找所有匹配的节点
|
||||
List<Map<String, Object>> matchedNodes = allNodes.stream()
|
||||
.filter(node -> {
|
||||
Object nodeNameObj = node.get("nodeName");
|
||||
if (nodeNameObj instanceof String) {
|
||||
String currentName = (String) nodeNameObj;
|
||||
return currentName.toLowerCase().contains(nodeName.toLowerCase());
|
||||
}
|
||||
return false;
|
||||
})
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// 为每个匹配节点构建到根节点的路径
|
||||
for (Map<String, Object> matchedNode : matchedNodes) {
|
||||
// 找到该节点的完整路径
|
||||
List<Map<String, Object>> pathToRoot = findPathToRoot(matchedNode, allNodes);
|
||||
if (!pathToRoot.isEmpty()) {
|
||||
result.addAll(pathToRoot);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 查找节点到根节点的路径
|
||||
*/
|
||||
private List<Map<String, Object>> findPathToRoot(Map<String, Object> node, List<Map<String, Object>> allNodes) {
|
||||
List<Map<String, Object>> path = new ArrayList<>();
|
||||
Map<String, Object> currentNode = node;
|
||||
|
||||
// 向上查找直到根节点
|
||||
while (currentNode != null) {
|
||||
|
||||
String parentId = (String) currentNode.get("parentId");
|
||||
String taskId = (String) currentNode.get("taskId");
|
||||
TsTask task = tsTaskMapper.selectOne(new QueryWrapper<TsTask>().eq("id", taskId));
|
||||
currentNode.put("taskName",task.getTaskName());
|
||||
path.add(0, new HashMap<>(currentNode)); // 添加到路径开头
|
||||
if ("00".equals(parentId)) {
|
||||
// 找到根节点,添加任务信息
|
||||
// String taskId = (String) currentNode.get("taskId");
|
||||
// TsTask task = tsTaskMapper.selectOne(new QueryWrapper<TsTask>().eq("id", taskId));
|
||||
// currentNode.put("taskName",task.getTaskName());
|
||||
// if (task != null) {
|
||||
// Map<String, Object> taskNode = new HashMap<>();
|
||||
// taskNode.put("nodeName", "根节点");
|
||||
// taskNode.put("path", "/" + task.getTaskName() + "/");
|
||||
// taskNode.put("nodeId", task.getId());
|
||||
// taskNode.put("nodeOrder", "0");
|
||||
// taskNode.put("taskId", task.getId());
|
||||
// taskNode.put("taskName", task.getTaskName());
|
||||
// taskNode.put("parentId", "00");
|
||||
// path.add(0, taskNode);
|
||||
// }
|
||||
break;
|
||||
}
|
||||
|
||||
// 查找父节点
|
||||
String finalParentId = parentId;
|
||||
currentNode = allNodes.stream()
|
||||
.filter(n -> finalParentId.equals(n.get("nodeId")))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
// public List<Map<String, Object>> getTsNodesTree(String nodeName, String taskId) {
|
||||
// TsTask tsTask = tsTaskMapper.selectOne(new QueryWrapper<TsTask>().eq("id", taskId));
|
||||
// // 查询所有节点数据
|
||||
// List<Map<String, Object>> allNodes = getAllNodes(taskId);
|
||||
//
|
||||
// // 查找所有根节点(parentId为"00"的节点)
|
||||
// List<Map<String, Object>> rootNodes = findRootNodes(allNodes, taskId);
|
||||
//
|
||||
// // 根节点的基本路径:/项目名称/
|
||||
// String basePath = "/" + tsTask.getTaskName() + "/";
|
||||
//
|
||||
// // 存储最终结果
|
||||
// List<Map<String, Object>> result = new ArrayList<>();
|
||||
// Map<String, Object> rootNodeData = new HashMap<>();
|
||||
// rootNodeData.put("nodeName", "根节点");
|
||||
// rootNodeData.put("path", "/"+tsTask.getTaskName()+"/");
|
||||
// rootNodeData.put("nodeId", tsTask.getId());
|
||||
// rootNodeData.put("nodeOrder", "0");
|
||||
// rootNodeData.put("taskId", tsTask.getId());
|
||||
// rootNodeData.put("parentId", "00");
|
||||
// result.add(rootNodeData);
|
||||
//
|
||||
// // 如果 nodeName 为空,返回所有根节点的完整树形结构
|
||||
// if (StringUtils.isEmpty(nodeName)) {
|
||||
// if (!rootNodes.isEmpty()) {
|
||||
// for (Map<String, Object> rootNode : rootNodes) {
|
||||
// rootNode.put("path", basePath);
|
||||
// result.addAll(buildFullTree(rootNode, allNodes));
|
||||
// }
|
||||
// }
|
||||
// return result;
|
||||
// }
|
||||
//
|
||||
// // 否则,返回从根节点到目标节点的树形结构
|
||||
// if (!rootNodes.isEmpty()) {
|
||||
// for (Map<String, Object> rootNode : rootNodes) {
|
||||
// rootNode.put("path", basePath);
|
||||
// List<Map<String, Object>> tree = buildTreeToTargetNode(rootNode, allNodes, nodeName);
|
||||
// if (!tree.isEmpty()) {
|
||||
// result.addAll(tree);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// // 返回结果
|
||||
// return result;
|
||||
// }
|
||||
|
||||
/**
|
||||
* 查询所有节点数据
|
||||
@ -682,7 +815,10 @@ public class TsNodesServiceImpl extends ServiceImpl<TsNodesMapper, TsNodes> impl
|
||||
} else {
|
||||
deleteFailCount++;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
}catch (NullPointerException e) {
|
||||
LOGGER.error("删除节点时发生空指针异常,文件路径: {}, 文件名称: {}", deleteItem.getPath(), deleteItem.getName(), e);
|
||||
deleteFailCount++;
|
||||
}catch (Exception e) {
|
||||
LOGGER.error("删除文件/文件夹失败, 文件路径: {}, 文件名称: {}", deleteItem.getPath(), deleteItem.getName(), e);
|
||||
deleteFailCount++;
|
||||
}
|
||||
@ -723,6 +859,7 @@ public class TsNodesServiceImpl extends ServiceImpl<TsNodesMapper, TsNodes> impl
|
||||
taskStatusHolder.finishTask(asyncKey);
|
||||
WebSocketServer.sendMessageTo("试验数据扫描接口完成", "taskId_" + id);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**********************************
|
||||
@ -786,6 +923,15 @@ public class TsNodesServiceImpl extends ServiceImpl<TsNodesMapper, TsNodes> impl
|
||||
return "扫描完成";
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("执行试验数据扫描时发生未知异常: {}", e.getMessage(), e);
|
||||
//异常的时候删除节点和文件表
|
||||
LambdaQueryWrapper<TsNodes> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.eq(TsNodes::getTaskId, id);
|
||||
tsNodesMapper.delete(queryWrapper);
|
||||
|
||||
LambdaQueryWrapper<TsFiles> queryWrapperTsFile = new LambdaQueryWrapper<>();
|
||||
queryWrapperTsFile.eq(TsFiles::getTaskId, id);
|
||||
tsFilesMapper.delete(queryWrapperTsFile);
|
||||
|
||||
return "扫描失败:" + e.getMessage();
|
||||
} finally {
|
||||
TableNameContextHolder.clear();
|
||||
@ -975,16 +1121,24 @@ public class TsNodesServiceImpl extends ServiceImpl<TsNodesMapper, TsNodes> impl
|
||||
// 批量插入文件表(忽略重复)
|
||||
if (!tsFilesToCreate.isEmpty()) {
|
||||
long startBatchInsertFiles = System.currentTimeMillis();
|
||||
int affectedRowsFiles = tsFilesMapper.batchInsertTsFiles(tsFilesToCreate);
|
||||
LOGGER.info("[批量插入试验任务文件表] 耗时 {} ms | 实际新增数量: {} 条",
|
||||
System.currentTimeMillis() - startBatchInsertFiles,
|
||||
affectedRowsFiles);
|
||||
//int affectedRowsFiles = tsFilesMapper.batchInsertTsFiles(tsFilesToCreate);
|
||||
int affected = 0;
|
||||
for (int i = 0; i < tsFilesToCreate.size(); i += BATCH_SIZE) {
|
||||
List<TsFiles> sub =
|
||||
new ArrayList<>(tsFilesToCreate.subList(i, Math.min(i + BATCH_SIZE, tsFilesToCreate.size())));
|
||||
affected += this.insertOneBatch(sub);
|
||||
}
|
||||
|
||||
LOGGER.info("[批量插入试验任务文件表] 耗时 {} ms | 实际新增数量: {} 条",
|
||||
System.currentTimeMillis() - startBatchInsertFiles,
|
||||
affected);
|
||||
}
|
||||
// 记录开始时间
|
||||
long startTimeFiles = System.currentTimeMillis();
|
||||
// 执行更新操作 taskId, String nodeId
|
||||
int affectedLevelFilesRows = tsFilesMapper.updateParentIdByPathHierarchy(taskId, nodeId);
|
||||
// 执行更新操作 taskId, String nodeId(这个方法是瓶颈,SQL自连接+字符串拼接,数据大的时候就是瓶颈)
|
||||
// int affectedLevelFilesRows = tsFilesMapper.updateParentIdByPathHierarchy(taskId, nodeId);
|
||||
//在Java内存中计算父子关系——避免上面方法中SQL自连接+字符串拼接,分批更新。实测有效。
|
||||
int affectedLevelFilesRows = tsFilesService.updateParentId(taskId, nodeId);
|
||||
// 记录结束时间
|
||||
long endTimeFiles = System.currentTimeMillis();
|
||||
// 计算耗时
|
||||
@ -993,6 +1147,14 @@ public class TsNodesServiceImpl extends ServiceImpl<TsNodesMapper, TsNodes> impl
|
||||
LOGGER.info("文件表中的节点ID更新完成,影响 {} 行,总耗时 {} 毫秒", affectedLevelFilesRows, costTimeFiles);
|
||||
}
|
||||
|
||||
/**
|
||||
* 每批独立事务插入
|
||||
*/
|
||||
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
|
||||
public int insertOneBatch(List<TsFiles> batch) {
|
||||
return tsFilesMapper.batchInsertTsFiles(batch);
|
||||
}
|
||||
|
||||
/**
|
||||
* 确保路径格式为以 "/" 开头和结尾(例如 "/data/test/")
|
||||
* 若路径为空或非法,返回根路径 "/"
|
||||
@ -1132,4 +1294,12 @@ public class TsNodesServiceImpl extends ServiceImpl<TsNodesMapper, TsNodes> impl
|
||||
return storageSourceMapper.selectOne(new LambdaQueryWrapper<StorageSource>().eq(StorageSource::getId, id)
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TsNodes> getByTaskId(String taskId) {
|
||||
LambdaQueryWrapper<TsNodes> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.eq(TsNodes::getTaskId, taskId);
|
||||
return this.list(queryWrapper);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -4,11 +4,14 @@ import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.date.DateTime;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.json.JSONObject;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.yfd.platform.config.ResponseResult;
|
||||
import com.yfd.platform.modules.common.exception.BizException;
|
||||
import com.yfd.platform.modules.experimentalData.domain.TsFiles;
|
||||
import com.yfd.platform.modules.experimentalData.domain.TsNodes;
|
||||
import com.yfd.platform.modules.experimentalData.domain.TsTask;
|
||||
@ -36,11 +39,19 @@ import io.netty.channel.ChannelInboundHandlerAdapter;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.dao.DuplicateKeyException;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import org.springframework.dao.DataAccessException;
|
||||
import org.springframework.jdbc.core.JdbcTemplate;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import java.io.*;
|
||||
import java.lang.reflect.Field;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.sql.*;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.*;
|
||||
|
||||
@ -48,7 +59,13 @@ import java.util.*;
|
||||
import javax.annotation.Resource;
|
||||
import javax.sql.DataSource;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Date;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipInputStream;
|
||||
import java.util.zip.ZipOutputStream;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
@ -93,6 +110,9 @@ public class TsTaskServiceImpl extends ServiceImpl<TsTaskMapper, TsTask> impleme
|
||||
private SysDictionaryItemsMapper sysDictionaryItemsMapper;
|
||||
@Autowired
|
||||
private DataSource dataSource;
|
||||
@Autowired
|
||||
private JdbcTemplate jdbcTemplate;
|
||||
private static final int FILE_INSERT_BATCH_SIZE = 500;
|
||||
|
||||
private static final String INITIAL_CODE = "00001";
|
||||
private static final int MAX_CODE_VALUE = 99999;
|
||||
@ -236,6 +256,7 @@ public class TsTaskServiceImpl extends ServiceImpl<TsTaskMapper, TsTask> impleme
|
||||
FIELD_MAPPING.put("device_code", "device_code");
|
||||
FIELD_MAPPING.put("test_describe", "test_describe");
|
||||
FIELD_MAPPING.put("sensor_describe", "sensor_describe");
|
||||
FIELD_MAPPING.put("custom1", "custom1");
|
||||
}
|
||||
|
||||
|
||||
@ -473,7 +494,9 @@ public class TsTaskServiceImpl extends ServiceImpl<TsTaskMapper, TsTask> impleme
|
||||
@Override
|
||||
public boolean updatetsTask(TsTask tsTask) throws IOException {
|
||||
Boolean value = false;
|
||||
|
||||
//生成任务名称 任务开始时间_结束时间_地点_载机名称_设备代号_编号
|
||||
String taskName = buildTaskName(tsTask);
|
||||
tsTask.setTaskName(taskName);
|
||||
//处理属性
|
||||
String frontEndJson = tsTask.getTaskProps();
|
||||
List<TsTask> tsTasksList = tsTaskMapper.selectList(new LambdaQueryWrapper<>());
|
||||
@ -485,10 +508,30 @@ public class TsTaskServiceImpl extends ServiceImpl<TsTaskMapper, TsTask> impleme
|
||||
tsTaskMapper.updateById(tsTaskData);
|
||||
}
|
||||
}
|
||||
|
||||
//修改的时候判断本地存储空间是不是发生了变化 如果是的话 需要重新创建本地文件
|
||||
TsTask TsTaskOld = tsTaskMapper.selectById(tsTask.getId());
|
||||
StorageSource storageSource = getStorageConfig(tsTask.getLocalStorageId());
|
||||
if(!TsTaskOld.getTaskName().equals(tsTask.getTaskName())){
|
||||
String path = "/";
|
||||
//新增节点的时候 创建文件夹
|
||||
NewFolderRequest newFolderRequest = new NewFolderRequest();
|
||||
newFolderRequest.setName(tsTask.getTaskName());//新建的文件夹名称,示例值(/a/b/c)
|
||||
newFolderRequest.setPassword("");//文件夹密码, 如果文件夹需要密码才能访问,则支持请求密码,示例值(123456)
|
||||
newFolderRequest.setPath(path);//请求路径,示例值(/)
|
||||
newFolderRequest.setStorageKey(storageSource.getKey());//存储源 key,示例值(local minio)
|
||||
AbstractBaseFileService<?> fileService = storageSourceContext.getByStorageKey(newFolderRequest.getStorageKey());
|
||||
boolean flag = fileService.newFolder(newFolderRequest.getPath(), newFolderRequest.getName());
|
||||
|
||||
//删除旧文件夹
|
||||
NewFolderRequest oldFolderRequest = new NewFolderRequest();
|
||||
oldFolderRequest.setName(TsTaskOld.getTaskName());//新建的文件夹名称,示例值(/a/b/c)
|
||||
oldFolderRequest.setPassword("");//文件夹密码, 如果文件夹需要密码才能访问,则支持请求密码,示例值(123456)
|
||||
oldFolderRequest.setPath(path);//请求路径,示例值(/)
|
||||
oldFolderRequest.setStorageKey(storageSource.getKey());//存储源 key,示例值(local minio)
|
||||
AbstractBaseFileService<?> fileServiceOld = storageSourceContext.getByStorageKey(oldFolderRequest.getStorageKey());
|
||||
boolean flagOld = fileServiceOld.deleteFolder(oldFolderRequest.getPath(), oldFolderRequest.getName());
|
||||
}
|
||||
//如果存储空间和名称都没有该表的情况下
|
||||
if (!TsTaskOld.getLocalStorageId().equals(tsTask.getLocalStorageId())) {
|
||||
String path = "/";
|
||||
@ -532,41 +575,95 @@ public class TsTaskServiceImpl extends ServiceImpl<TsTaskMapper, TsTask> impleme
|
||||
public boolean deleteTstaskByIds(List<String> dataset) {
|
||||
Boolean value = false;
|
||||
|
||||
LOGGER.info("开始批量删除试验任务,任务数量: {}", dataset.size());
|
||||
LOGGER.debug("待删除的任务ID列表: {}", dataset);
|
||||
|
||||
try {
|
||||
|
||||
|
||||
//循环所有的ID
|
||||
for (String taskId : dataset) {
|
||||
//删除项目
|
||||
try {
|
||||
LOGGER.info("开始处理任务删除,任务ID: {}", taskId);
|
||||
|
||||
//获取试验任务及任务编码
|
||||
TsTask tsTask = tsTaskMapper.selectById(taskId);
|
||||
if (tsTask == null) {
|
||||
LOGGER.warn("未找到指定的任务,任务ID: {}", taskId);
|
||||
continue;
|
||||
}
|
||||
|
||||
TableNameContextHolder.setTaskCode(tsTask.getTaskCode());
|
||||
LOGGER.debug("设置任务编码上下文,任务编码: {}", tsTask.getTaskCode());
|
||||
|
||||
// 删除节点表
|
||||
LambdaQueryWrapper<TsNodes> deleteWrapper = new LambdaQueryWrapper<>();
|
||||
deleteWrapper.eq(TsNodes::getTaskId, taskId);
|
||||
tsNodesMapper.delete(deleteWrapper);
|
||||
int deletedNodes = tsNodesMapper.delete(deleteWrapper);
|
||||
LOGGER.info("删除任务相关的节点数据,任务ID: {}, 删除条数: {}", taskId, deletedNodes);
|
||||
|
||||
// 只有当任务文件表存在时才尝试删除文件数据
|
||||
if (tableExists("ts_files_" + tsTask.getTaskCode())) {
|
||||
// 删除文件表
|
||||
LambdaQueryWrapper<TsFiles> deleteWrapperFiles = new LambdaQueryWrapper<>();
|
||||
deleteWrapperFiles.eq(TsFiles::getTaskId, taskId);
|
||||
tsFilesMapper.delete(deleteWrapperFiles);
|
||||
//todo 删除文件表数据
|
||||
// tsFilesMapper.deleteSdFilesBytaskId(taskId);
|
||||
int deletedFiles = tsFilesMapper.delete(deleteWrapperFiles);
|
||||
LOGGER.info("删除任务相关的文件数据,任务ID: {}, 删除条数: {}", taskId, deletedFiles);
|
||||
} else {
|
||||
LOGGER.info("任务文件表不存在,跳过文件数据删除,任务ID: {}", taskId);
|
||||
}
|
||||
|
||||
// 删除本地存储空间中的文件夹
|
||||
StorageSource localStorageSource = getStorageConfig(tsTask.getLocalStorageId());
|
||||
LOGGER.info("开始删除本地存储空间中的文件夹,任务ID: {}, 本地存储ID: {}", taskId, tsTask.getLocalStorageId());
|
||||
deleteStorageFolder(localStorageSource, tsTask);
|
||||
|
||||
// 如果有备份存储空间,也删除备份存储空间中的文件夹
|
||||
if (tsTask.getBackupStorageId() != null && tsTask.getBackupStorageId() > 0) {
|
||||
StorageSource backupStorageSource = getStorageConfig(tsTask.getBackupStorageId());
|
||||
LOGGER.info("开始删除备份存储空间中的文件夹,任务ID: {}, 备份存储ID: {}", taskId, tsTask.getBackupStorageId());
|
||||
deleteStorageFolder(backupStorageSource, tsTask);
|
||||
}
|
||||
|
||||
// 删除当前试验任务
|
||||
int deleteCount = tsTaskMapper.deleteById(taskId);
|
||||
if (deleteCount == 1) {
|
||||
LOGGER.info("试验任务删除成功,任务ID: {}", taskId);
|
||||
value = true;
|
||||
} else {
|
||||
LOGGER.error("试验任务删除失败,任务ID: {}, 实际删除条数: {}", taskId, deleteCount);
|
||||
value = false;
|
||||
}
|
||||
} finally {
|
||||
// 每次处理完一个任务后清理上下文
|
||||
LOGGER.debug("清理任务上下文,任务ID: {}", taskId);
|
||||
TableNameContextHolder.clear();
|
||||
}
|
||||
}
|
||||
LOGGER.info("批量删除试验任务完成,任务数量: {}", dataset.size());
|
||||
return value;
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("删除试验任务时发生异常,任务ID列表: {}", dataset, e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// String path = "/" + tsTask.getTaskName() + "/";
|
||||
// //调用删除节点 根据任务ID
|
||||
// Boolean deleteTsnodes = tsNodesService.deleteTsNodesByTaskId(taskId, path);
|
||||
// //如果删除成功 接着删除节点表数据
|
||||
// if (deleteTsnodes) {
|
||||
// LOGGER.info("tsNodes表结删除改成功");
|
||||
// value = true;
|
||||
// } else {
|
||||
// LOGGER.error("tsNodes表结构删除失败");
|
||||
// value = false;
|
||||
// }
|
||||
// 这个方法会递归删除试验任务文件夹及其下的所有子文件夹和文件。当调用 fileService.deleteFolder() 方法时,存储服务实现会自动处理递归删除逻辑,确保整个文件夹树都被清除。
|
||||
//这是文件存储系统的基本特性,不论是本地文件系统还是MinIO等云存储服务,在删除文件夹时都会删除其包含的所有内容。
|
||||
private void deleteStorageFolder(StorageSource storageSource, TsTask tsTask) {
|
||||
LOGGER.info("==deleteStorageFolder begin====");
|
||||
if (storageSource == null) {
|
||||
LOGGER.warn("存储源配置为空,跳过删除操作,任务名称: {}", tsTask.getTaskName());
|
||||
return;
|
||||
}
|
||||
|
||||
if (tsTask == null || tsTask.getTaskName() == null) {
|
||||
LOGGER.warn("任务信息不完整,跳过删除操作");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
LOGGER.info("准备删除存储文件夹,存储类型: {}, 任务名称: {}", storageSource.getKey(), tsTask.getTaskName());
|
||||
|
||||
StorageSource storageSource = getStorageConfig(tsTask.getLocalStorageId());
|
||||
// 删除 local 中的文件夹 项目文件夹
|
||||
List<BatchDeleteRequest.DeleteItem> deleteItemList = new ArrayList<>();
|
||||
BatchDeleteRequest.DeleteItem deleteItemData = new BatchDeleteRequest.DeleteItem();
|
||||
deleteItemData.setName(tsTask.getTaskName());
|
||||
@ -578,53 +675,51 @@ public class TsTaskServiceImpl extends ServiceImpl<TsTaskMapper, TsTask> impleme
|
||||
BatchDeleteRequest batchDeleteRequest = new BatchDeleteRequest();
|
||||
batchDeleteRequest.setDeleteItems(deleteItemList);
|
||||
batchDeleteRequest.setStorageKey(storageSource.getKey());
|
||||
AbstractBaseFileService<?> fileService = storageSourceContext.getByStorageKey(batchDeleteRequest.getStorageKey());
|
||||
int deleteSuccessCount = 0, deleteFailCount = 0, totalCount = CollUtil.size(deleteItemList);
|
||||
|
||||
AbstractBaseFileService<?> fileService = storageSourceContext.getByStorageKey(batchDeleteRequest.getStorageKey());
|
||||
if (fileService == null) {
|
||||
LOGGER.error("未能获取到文件服务实例,存储类型: {}", storageSource.getKey());
|
||||
return;
|
||||
}
|
||||
|
||||
int deleteSuccessCount = 0;
|
||||
for (BatchDeleteRequest.DeleteItem deleteItem : deleteItemList) {
|
||||
boolean flag = false;
|
||||
try {
|
||||
if (deleteItem.getType() == FileTypeEnum.FILE) {
|
||||
LOGGER.info("删除文件,存储类型: {}, 路径: {}, 名称: {}",
|
||||
storageSource.getKey(), deleteItem.getPath(), deleteItem.getName());
|
||||
flag = fileService.deleteFile(deleteItem.getPath(), deleteItem.getName());
|
||||
} else if (deleteItem.getType() == FileTypeEnum.FOLDER) {
|
||||
LOGGER.info("删除文件夹,存储类型: {}, 路径: {}, 名称: {}",
|
||||
storageSource.getKey(), deleteItem.getPath(), deleteItem.getName());
|
||||
flag = fileService.deleteFolder(deleteItem.getPath(), deleteItem.getName());
|
||||
|
||||
}
|
||||
|
||||
if (flag) {
|
||||
deleteSuccessCount++;
|
||||
LOGGER.info("删除成功 - 存储类型: {}, 类型: {}, 路径: {}, 名称: {}",
|
||||
storageSource.getKey(), deleteItem.getType(), deleteItem.getPath(), deleteItem.getName());
|
||||
} else {
|
||||
deleteFailCount++;
|
||||
LOGGER.warn("删除失败 - 存储类型: {}, 类型: {}, 路径: {}, 名称: {}",
|
||||
storageSource.getKey(), deleteItem.getType(), deleteItem.getPath(), deleteItem.getName());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("删除文件/文件夹失败, 文件路径: {}, 文件名称: {}", deleteItem.getPath(), deleteItem.getName(), e);
|
||||
deleteFailCount++;
|
||||
LOGGER.error("删除文件/文件夹失败, 存储类型: {}, 文件路径: {}, 文件名称: {}",
|
||||
storageSource.getKey(), deleteItem.getPath(), deleteItem.getName(), e);
|
||||
// 继续处理其他项目,不中断整个删除过程
|
||||
}
|
||||
}
|
||||
|
||||
if (deleteSuccessCount >= 1) {
|
||||
// 删除当前项目
|
||||
int deleteCount = tsTaskMapper.deleteById(taskId);
|
||||
if (deleteCount == 1) {
|
||||
LOGGER.info("tstask表结删除改成功");
|
||||
value = true;
|
||||
} else {
|
||||
LOGGER.error("tstask表结构删除失败");
|
||||
value = false;
|
||||
}
|
||||
} else {
|
||||
value = false;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
return value;
|
||||
LOGGER.info("存储文件夹删除完成,存储类型: {}, 成功删除项数量: {}", storageSource.getKey(), deleteSuccessCount);
|
||||
} catch (Exception e) {
|
||||
|
||||
} finally {
|
||||
TableNameContextHolder.clear();
|
||||
LOGGER.error("删除存储空间文件夹时发生异常, 存储类型: {}", storageSource.getKey(), e);
|
||||
} catch (Error err) {
|
||||
// 捕获Error防止JVM退出
|
||||
LOGGER.error("删除存储空间文件夹时发生严重错误, 存储类型: {}", storageSource.getKey(), err);
|
||||
// 不重新抛出Error,防止Tomcat退出
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
/**********************************
|
||||
@ -643,13 +738,20 @@ public class TsTaskServiceImpl extends ServiceImpl<TsTaskMapper, TsTask> impleme
|
||||
boolean allDeletable = true;
|
||||
|
||||
for (TsTask tsTask : tsTasks) {
|
||||
// 检查对应的任务文件表是否存在
|
||||
if (!tableExists("ts_files_" + tsTask.getTaskCode())) {
|
||||
// 如果表不存在,可以安全删除
|
||||
continue;
|
||||
}
|
||||
|
||||
TableNameContextHolder.setTaskCode(tsTask.getTaskCode());
|
||||
|
||||
// 查询是否有备份路径或非空路径的文件
|
||||
try {
|
||||
// 查询 backup_path 既不为 null 也不为空字符串的记录
|
||||
LambdaQueryWrapper<TsFiles> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.eq(TsFiles::getTaskId, tsTask.getId())
|
||||
.and(wrapper -> wrapper.isNotNull(TsFiles::getBackupPath)
|
||||
.or().ne(TsFiles::getBackupPath, ""));
|
||||
.isNotNull(TsFiles::getBackupPath)
|
||||
.ne(TsFiles::getBackupPath, "");
|
||||
|
||||
int count = tsFilesService.count(queryWrapper);
|
||||
|
||||
@ -657,6 +759,9 @@ public class TsTaskServiceImpl extends ServiceImpl<TsTaskMapper, TsTask> impleme
|
||||
allDeletable = false;
|
||||
break; // 一旦发现不可删除项,提前终止循环
|
||||
}
|
||||
} finally {
|
||||
TableNameContextHolder.clear();
|
||||
}
|
||||
}
|
||||
|
||||
result.putOpt("status", allDeletable ? "1" : "0");
|
||||
@ -666,8 +771,6 @@ public class TsTaskServiceImpl extends ServiceImpl<TsTaskMapper, TsTask> impleme
|
||||
// 使用日志框架代替 printStackTrace
|
||||
LOGGER.error("确认删除实验任务时发生异常", e);
|
||||
return ResponseResult.error("查询失败");
|
||||
} finally {
|
||||
TableNameContextHolder.clear();
|
||||
}
|
||||
}
|
||||
|
||||
@ -719,4 +822,634 @@ public class TsTaskServiceImpl extends ServiceImpl<TsTaskMapper, TsTask> impleme
|
||||
return storageSourceMapper.selectOne(new LambdaQueryWrapper<StorageSource>().eq(StorageSource::getId, id)
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] exportTaskSqlAsZip(String taskId) throws IOException {
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
|
||||
try(ZipOutputStream zos = new ZipOutputStream(baos)) {
|
||||
// 生成SQL内容
|
||||
StringBuilder sqlBuilder = new StringBuilder();
|
||||
|
||||
// 1. 添加ts_task表数据导出
|
||||
TsTask task = this.getById(taskId);
|
||||
String taskCode = "";
|
||||
|
||||
// 确保taskCode有值且符合5位数字格式
|
||||
if (task != null && StrUtil.isNotBlank(task.getTaskCode())) {
|
||||
taskCode = task.getTaskCode();
|
||||
// 验证taskCode格式是否正确(5位数字)
|
||||
if (!taskCode.matches("^\\d{5}$")) {
|
||||
// 如果不是5位数字格式,需要处理
|
||||
try {
|
||||
int codeValue = Integer.parseInt(taskCode);
|
||||
if (codeValue >= 1 && codeValue <= 99999) {
|
||||
// 格式化为5位数字字符串
|
||||
taskCode = String.format("%05d", codeValue);
|
||||
} else {
|
||||
throw new IllegalArgumentException("该任务编号超出有效范围: " + taskCode);
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
throw new IllegalArgumentException("无效的任务编号格式: " + taskCode);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (task != null) {
|
||||
sqlBuilder.append("-- 试验任务数据\n");
|
||||
sqlBuilder.append(generateInsertSql("ts_task", task)).append("\n\n");
|
||||
}
|
||||
|
||||
//2. 添加ts_nodes表相关记录导出(需要注入相应的service)
|
||||
List<TsNodes> nodes = tsNodesService.getByTaskId(taskId);
|
||||
if (nodes != null && !nodes.isEmpty()) {
|
||||
sqlBuilder.append("-- 节点数据\n");
|
||||
for (TsNodes node : nodes) {
|
||||
sqlBuilder.append(generateInsertSql("ts_nodes", node)).append("\n");
|
||||
}
|
||||
sqlBuilder.append("\n");
|
||||
}
|
||||
|
||||
// 3. 添加ts_files表结构和数据导出
|
||||
if (task != null) {
|
||||
String dynamicTableName = "ts_files_" + task.getTaskCode();
|
||||
// 设置动态表名上下文
|
||||
TableNameContextHolder.setTaskCode(task.getTaskCode());
|
||||
|
||||
try {
|
||||
// 查询该任务的所有文件数据
|
||||
List<TsFiles> files = tsFilesService.getByTaskId(taskId);
|
||||
if (files != null && !files.isEmpty()) {
|
||||
sqlBuilder.append("-- 文件表结构\n");
|
||||
sqlBuilder.append(generateCreateTableSql(dynamicTableName)).append("\n\n");
|
||||
|
||||
sqlBuilder.append("-- 文件数据\n");
|
||||
for (TsFiles file : files) {
|
||||
sqlBuilder.append(generateInsertSql(dynamicTableName, file)).append("\n");
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
// 清理表名上下文
|
||||
TableNameContextHolder.clear();
|
||||
}
|
||||
}
|
||||
|
||||
// 将SQL内容写入ZIP文件
|
||||
ZipEntry sqlEntry = new ZipEntry(taskCode+"_exportdata.sql");
|
||||
zos.putNextEntry(sqlEntry);
|
||||
zos.write(sqlBuilder.toString().getBytes(StandardCharsets.UTF_8));
|
||||
zos.closeEntry();
|
||||
|
||||
zos.finish();
|
||||
// zos.flush();
|
||||
|
||||
byte[] result = baos.toByteArray();
|
||||
LOGGER.info("生成ZIP数据大小: {} 字节", result.length);
|
||||
return result;
|
||||
} finally {
|
||||
//zos.close();
|
||||
baos.close();
|
||||
}
|
||||
}
|
||||
|
||||
// 生成INSERT SQL语句的方法
|
||||
private String generateInsertSql(String tableName, Object entity) {
|
||||
if (entity == null) {
|
||||
return "";
|
||||
}
|
||||
|
||||
try {
|
||||
Class<?> clazz = entity.getClass();
|
||||
Field[] fields = clazz.getDeclaredFields();
|
||||
|
||||
StringBuilder columns = new StringBuilder();
|
||||
StringBuilder values = new StringBuilder();
|
||||
|
||||
for (Field field : fields) {
|
||||
// 跳过序列化相关字段
|
||||
if (field.getName().equals("serialVersionUID")) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 检查 TableField 注解,跳过不存在于数据库的字段
|
||||
TableField tableFieldAnnotation = field.getAnnotation(TableField.class);
|
||||
if (tableFieldAnnotation != null && tableFieldAnnotation.exist() == false) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 跳过非数据库字段(可以根据实际需要调整条件)
|
||||
if (field.getName().equals("key")) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 跳过 ts_nodes 表中不存在的字段
|
||||
if ("ts_nodes".equals(tableName) && "path".equals(field.getName())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 跳过 ts_files 相关表中不存在的字段
|
||||
if (tableName.startsWith("ts_files_") &&
|
||||
("url".equals(field.getName()) ||
|
||||
"type".equals(field.getName()) ||
|
||||
"localOnlyFiles".equals(field.getName()) ||
|
||||
"minioOnlyFiles".equals(field.getName()) ||
|
||||
"md5mismatchedFiles".equals(field.getName()) ||
|
||||
"locatMd5".equals(field.getName()) ||
|
||||
"minioMd5".equals(field.getName()) ||
|
||||
"fileContent".equals(field.getName()) ||
|
||||
"md5MismatchedFiles".equals(field.getName()))) {
|
||||
continue;
|
||||
}
|
||||
|
||||
field.setAccessible(true);
|
||||
String columnName = camelToUnderscore(field.getName());
|
||||
Object value = field.get(entity);
|
||||
|
||||
columns.append(columnName).append(",");
|
||||
values.append(formatValue(value)).append(",");
|
||||
}
|
||||
|
||||
// 移除末尾逗号
|
||||
if (columns.length() > 0) {
|
||||
columns.deleteCharAt(columns.length() - 1);
|
||||
values.deleteCharAt(values.length() - 1);
|
||||
}
|
||||
|
||||
return "INSERT INTO " + tableName + " (" + columns + ") VALUES (" + values + ");";
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("生成INSERT SQL语句失败", e);
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
// 驼峰命名转下划线
|
||||
private String camelToUnderscore(String camelCase) {
|
||||
return camelCase.replaceAll("([a-z])([A-Z])", "$1_$2").toLowerCase();
|
||||
}
|
||||
|
||||
// 格式化值
|
||||
private String formatValue(Object value) {
|
||||
if (value == null) {
|
||||
return "NULL";
|
||||
}
|
||||
if (value instanceof String) {
|
||||
return "'" + value.toString().replace("'", "''") + "'";
|
||||
}
|
||||
if (value instanceof Date) {
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
return "'" + sdf.format(value) + "'";
|
||||
}
|
||||
// 处理 java.time 类型
|
||||
if (value instanceof java.time.LocalDate) {
|
||||
return "'" + value.toString() + "'";
|
||||
}
|
||||
if (value instanceof java.time.LocalDateTime) {
|
||||
return "'" + ((java.time.LocalDateTime) value).format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + "'";
|
||||
}
|
||||
return value.toString();
|
||||
}
|
||||
|
||||
// 生成CREATE TABLE SQL语句的方法
|
||||
private String generateCreateTableSql(String tableName) {
|
||||
// 使用 LIKE 语句创建与 ts_files 结构相同的新表
|
||||
return "CREATE TABLE IF NOT EXISTS `" + tableName + "` LIKE `ts_files`;";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 从文件名中提取原始任务编号
|
||||
* @param fileName 文件名,如 "00002_data.sql.zip"
|
||||
* @return 任务编号,如 "00002"
|
||||
*/
|
||||
private String extractTaskCodeFromFileName(String fileName) {
|
||||
if (StrUtil.isBlank(fileName)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// 使用正则表达式匹配5位数字开头的文件名
|
||||
Pattern pattern = Pattern.compile("^(\\d{5})_.*$");
|
||||
Matcher matcher = pattern.matcher(fileName);
|
||||
|
||||
if (matcher.matches()) {
|
||||
String taskCode = matcher.group(1);
|
||||
// 验证任务编号范围是否在00001-99999之间
|
||||
try {
|
||||
int codeValue = Integer.parseInt(taskCode);
|
||||
if (codeValue >= 1 && codeValue <= 99999) {
|
||||
return taskCode;
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
// 解析失败,返回null
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
// 解压ZIP文件并提取SQL内容
|
||||
private List<SqlFileContent> extractSqlFromZip(byte[] zipBytes) throws IOException {
|
||||
List<SqlFileContent> sqlFiles = new ArrayList<>();
|
||||
try (ZipInputStream zis = new ZipInputStream(new ByteArrayInputStream(zipBytes))) {
|
||||
ZipEntry entry;
|
||||
while ((entry = zis.getNextEntry()) != null) {
|
||||
if (!entry.isDirectory() && entry.getName().endsWith(".sql")) {
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
byte[] buffer = new byte[4096];
|
||||
int len;
|
||||
while ((len = zis.read(buffer)) > 0) {
|
||||
baos.write(buffer, 0, len);
|
||||
}
|
||||
// 修改这一行,使用 Charset 的名称而不是 Charset 对象
|
||||
sqlFiles.add(new SqlFileContent(entry.getName(), baos.toString(StandardCharsets.UTF_8.name())));
|
||||
}
|
||||
}
|
||||
}
|
||||
return sqlFiles;
|
||||
}
|
||||
|
||||
|
||||
private String replaceTaskCodeInSql(
|
||||
String sqlContent,
|
||||
String originalTaskCode,
|
||||
String newTaskCode,
|
||||
int localStorageId,
|
||||
int backupStorageId
|
||||
) {
|
||||
if (StrUtil.isBlank(originalTaskCode) || StrUtil.isBlank(sqlContent)) {
|
||||
return sqlContent;
|
||||
}
|
||||
|
||||
String result = sqlContent;
|
||||
|
||||
/* =========================
|
||||
* 1. 替换 ts_files 表名(CREATE + INSERT 全覆盖)
|
||||
* ========================= */
|
||||
result = result.replaceAll(
|
||||
"(?i)\\bts_files_" + Pattern.quote(originalTaskCode) + "\\b",
|
||||
"ts_files_" + newTaskCode
|
||||
);
|
||||
|
||||
/* =========================
|
||||
* 2. 替换 ts_task 中的 task_code
|
||||
* (只改 VALUES 中的第 2 个字段)
|
||||
* ========================= */
|
||||
result = result.replaceAll(
|
||||
"(?i)(INSERT\\s+INTO\\s+`?ts_task`?\\s*\\([^)]*\\)\\s*VALUES\\s*\\(\\s*'[^']+'\\s*,\\s*)'[^']+'",
|
||||
"$1'" + newTaskCode + "'"
|
||||
);
|
||||
|
||||
/* =========================
|
||||
* 3. 替换 local_storage_id / backup_storage_id
|
||||
* (假设在 VALUES 末尾两个)
|
||||
* ========================= */
|
||||
result = result.replaceAll(
|
||||
"(?i)(INSERT\\s+INTO\\s+`?ts_task`?\\s*\\([^)]*\\)\\s*VALUES\\s*\\(.*?,)(-?\\d+)\\s*,\\s*(-?\\d+)(\\s*\\))",
|
||||
"$1" + localStorageId + "," + backupStorageId + "$4"
|
||||
);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 解析SQL语句
|
||||
private List<String> parseSqlStatements(String sqlContent) {
|
||||
List<String> sqlList = new ArrayList<>();
|
||||
String[] lines = sqlContent.split("\n");
|
||||
StringBuilder currentStatement = new StringBuilder();
|
||||
LOGGER.debug("开始解析SQL内容,总行数: {}", lines.length);
|
||||
for (String line : lines) {
|
||||
String trimmedLine = line.trim();
|
||||
|
||||
// 跳过纯注释行
|
||||
if (trimmedLine.startsWith("--")) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 跳过空行
|
||||
if (trimmedLine.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 添加当前行到语句构建器
|
||||
currentStatement.append(trimmedLine).append(" ");
|
||||
|
||||
// 如果当前行以分号结尾,说明是一个完整语句
|
||||
if (trimmedLine.endsWith(";")) {
|
||||
String statement = currentStatement.toString().trim();
|
||||
if (!statement.isEmpty()) {
|
||||
sqlList.add(statement);
|
||||
LOGGER.debug("解析到SQL语句: {}", statement.length() > 200 ? statement.substring(0, 200) + "..." : statement);
|
||||
|
||||
}
|
||||
currentStatement.setLength(0); // 重置构建器
|
||||
}
|
||||
}
|
||||
|
||||
// 处理可能残留的未完成语句(虽然理论上不应该有)
|
||||
String remaining = currentStatement.toString().trim();
|
||||
if (!remaining.isEmpty() && remaining.endsWith(";")) {
|
||||
sqlList.add(remaining);
|
||||
LOGGER.debug("解析到残留SQL语句: {}", remaining.length() > 200 ? remaining.substring(0, 200) + "..." : remaining);
|
||||
|
||||
}
|
||||
|
||||
return sqlList;
|
||||
}
|
||||
|
||||
|
||||
// =========================== 高性能导入部分 ===========================
|
||||
// 批量执行: 使用batchExecute方法进行批量处理
|
||||
// INSERT语句合并: 通过mergeInsertStatements方法将多个INSERT语句合并为批量插入
|
||||
// 事务优化: 导入过程中关闭了外键检查和唯一性检查
|
||||
// 禁用自动提交: 使用SET AUTOCOMMIT=0来提高性能
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public boolean executeSqlImport(List<String> sqlStatements) {
|
||||
int total = 0; // 在方法开始处声明 total 变量
|
||||
int failedCount = 0; // 记录失败的SQL数量
|
||||
try {
|
||||
jdbcTemplate.execute("SET FOREIGN_KEY_CHECKS=0;");
|
||||
jdbcTemplate.execute("SET UNIQUE_CHECKS=0;");
|
||||
jdbcTemplate.execute("SET AUTOCOMMIT=0;");
|
||||
|
||||
int batchSize = 2000;
|
||||
List<String> batch = new ArrayList<>(batchSize);
|
||||
|
||||
for (String sql : sqlStatements) {
|
||||
if (StringUtils.isBlank(sql)) continue;
|
||||
batch.add(sql);
|
||||
if (batch.size() >= batchSize) {
|
||||
int failedInBatch = batchExecute(batch);
|
||||
failedCount += failedInBatch;
|
||||
total += batch.size();
|
||||
LOGGER.info("已执行 {} 条SQL语句", total);
|
||||
batch.clear();
|
||||
}
|
||||
}
|
||||
if (!batch.isEmpty()) {
|
||||
int failedInBatch = batchExecute(batch);
|
||||
failedCount += failedInBatch;
|
||||
total += batch.size();
|
||||
}
|
||||
|
||||
jdbcTemplate.execute("SET FOREIGN_KEY_CHECKS=1;");
|
||||
jdbcTemplate.execute("SET UNIQUE_CHECKS=1;");
|
||||
jdbcTemplate.execute("COMMIT;");
|
||||
|
||||
LOGGER.info("批量导入完成,共执行 {} 条SQL,其中失败 {} 条", total, failedCount);
|
||||
|
||||
// 如果有失败的SQL,返回false
|
||||
if (failedCount > 0) {
|
||||
LOGGER.warn("SQL导入过程中有 {} 条SQL执行失败", failedCount);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("SQL导入失败,已执行 {} 条SQL", total, e);
|
||||
try {
|
||||
jdbcTemplate.execute("ROLLBACK;");
|
||||
} catch (Exception rollbackEx) {
|
||||
LOGGER.error("回滚事务失败", rollbackEx);
|
||||
}
|
||||
throw new RuntimeException("SQL导入失败:" + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private int batchExecute(List<String> sqlList) {
|
||||
int failedCount = 0;
|
||||
try {
|
||||
jdbcTemplate.batchUpdate(sqlList.toArray(new String[0]));
|
||||
} catch (DataAccessException e) {
|
||||
LOGGER.warn("批量执行失败,分步重试:{}", e.getMessage());
|
||||
for (String sql : sqlList) {
|
||||
try {
|
||||
jdbcTemplate.update(sql);
|
||||
} catch (Exception ex) {
|
||||
LOGGER.warn("跳过失败SQL:{}", ex.getMessage());
|
||||
failedCount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
return failedCount;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// =========================== 内部类定义 ===========================
|
||||
|
||||
private static class SqlFileContent {
|
||||
private final String name;
|
||||
private final String content;
|
||||
|
||||
public SqlFileContent(String name, String content) {
|
||||
this.name = name;
|
||||
this.content = content;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public String getContent() {
|
||||
return content;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getMaxTaskCode() {
|
||||
// 查询数据库中最大的任务编号
|
||||
String maxTaskCode = this.baseMapper.selectMaxTaskCode();
|
||||
if (StrUtil.isBlank(maxTaskCode)) {
|
||||
// 如果没有任务编号记录,返回默认值
|
||||
return "00001";
|
||||
}
|
||||
try {
|
||||
// 解析5位数字格式的任务编号并递增
|
||||
int currentNumber = Integer.parseInt(maxTaskCode);
|
||||
int nextNumber = currentNumber + 1;
|
||||
|
||||
// 确保不超过5位数的最大值
|
||||
if (nextNumber > 99999) {
|
||||
throw new IllegalStateException("任务编号已达到最大值99999");
|
||||
}
|
||||
|
||||
// 格式化为5位数字字符串
|
||||
return String.format("%05d", nextNumber);
|
||||
} catch (NumberFormatException e) {
|
||||
// 如果解析失败,返回默认值
|
||||
return "00001";
|
||||
}
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public boolean importTaskSqlFromZip(MultipartFile file,
|
||||
String taskCode,
|
||||
int localStorageId,
|
||||
int backupStorageId) throws IOException {
|
||||
if ( file == null || file.isEmpty()) {
|
||||
throw new IllegalArgumentException("ZIP 文件不能为空");
|
||||
}
|
||||
long startTime = System.currentTimeMillis();
|
||||
LOGGER.info("开始导入任务 SQL,taskCode={}, 文件名={}", taskCode, file.getOriginalFilename());
|
||||
// 1. 获取原始任务编号
|
||||
String originalFilename = file.getOriginalFilename();
|
||||
String originalTaskCode = extractTaskCodeFromFileName(originalFilename); // 例如 00002
|
||||
LOGGER.debug("原始任务编号: {}", originalTaskCode);
|
||||
// 2. 解压 ZIP 并获取 SQL 文件内容
|
||||
byte[] zipBytes = file.getBytes();
|
||||
List<SqlFileContent> sqlFiles = extractSqlFromZip(zipBytes);
|
||||
LOGGER.info("解压完成,共找到 {} 个 SQL 文件", sqlFiles.size());
|
||||
|
||||
// 3. 替换 SQL 中的任务编号、存储空间
|
||||
List<String> allSqlStatements = new ArrayList<>();
|
||||
for (SqlFileContent sqlFile : sqlFiles) {
|
||||
String modifiedContent = replaceTaskCodeInSql(sqlFile.getContent(), originalTaskCode, taskCode, localStorageId, backupStorageId);
|
||||
allSqlStatements.addAll(parseSqlStatements(modifiedContent));
|
||||
LOGGER.debug("处理 SQL 文件 长度 {} 字符", modifiedContent.length());
|
||||
}
|
||||
LOGGER.info("SQL 替换完成,总语句数: {}", allSqlStatements.size());
|
||||
|
||||
// 4. 拆分 DDL、TS_TASK、TS_NODES、TS_FILES
|
||||
List<String> ddlSqlList = new ArrayList<>();
|
||||
String taskInsertSql = null;
|
||||
List<String> nodeInsertSqls = new ArrayList<>();
|
||||
List<String> fileInsertSqls = new ArrayList<>();
|
||||
|
||||
for (String sql : allSqlStatements) {
|
||||
String upper = sql.trim().toUpperCase();
|
||||
if (upper.startsWith("CREATE") || upper.startsWith("DROP") || upper.startsWith("ALTER") || upper.startsWith("SET")) {
|
||||
ddlSqlList.add(sql);
|
||||
} else if (upper.startsWith("INSERT INTO TS_TASK")) {
|
||||
taskInsertSql = sql;
|
||||
} else if (upper.startsWith("INSERT INTO TS_NODES")) {
|
||||
nodeInsertSqls.add(sql);
|
||||
} else if (upper.startsWith("INSERT INTO TS_FILES_")) {
|
||||
fileInsertSqls.add(sql);
|
||||
}
|
||||
}
|
||||
|
||||
LOGGER.info("拆分 SQL 完成:DDL {} 条,TS_TASK {} 条,TS_NODES {} 条,TS_FILES {} 条",
|
||||
ddlSqlList.size(),
|
||||
taskInsertSql != null ? 1 : 0,
|
||||
nodeInsertSqls.size(),
|
||||
fileInsertSqls.size());
|
||||
|
||||
|
||||
// 5. 执行 DDL
|
||||
if (!ddlSqlList.isEmpty()) {
|
||||
LOGGER.info("开始执行 {} 条 DDL 语句", ddlSqlList.size());
|
||||
executeSqlImport(ddlSqlList);
|
||||
LOGGER.info("DDL 执行完成");
|
||||
}
|
||||
|
||||
// 6. 执行 TS_TASK
|
||||
if (taskInsertSql != null) {
|
||||
LOGGER.info("插入 TS_TASK 记录");
|
||||
jdbcTemplate.update(taskInsertSql);
|
||||
LOGGER.info("TS_TASK 插入完成");
|
||||
}
|
||||
|
||||
// 7. 执行 TS_NODES
|
||||
if(!nodeInsertSqls.isEmpty()) {
|
||||
LOGGER.info("插入 TS_NODES {} 条", nodeInsertSqls.size());
|
||||
for (String nodeSql : nodeInsertSqls) {
|
||||
jdbcTemplate.update(nodeSql);
|
||||
}
|
||||
LOGGER.info("TS_NODES 插入完成");
|
||||
}
|
||||
|
||||
// 8. 流式分批插入 TS_FILES
|
||||
if (!fileInsertSqls.isEmpty()) {
|
||||
LOGGER.info("开始分批插入 TS_FILES,共 {} 条", fileInsertSqls.size());
|
||||
int batchSize = 5000; // 可调
|
||||
List<String> batch = new ArrayList<>(batchSize);
|
||||
int batchCount = 0;
|
||||
for (String fileSql : fileInsertSqls) {
|
||||
batch.add(fileSql);
|
||||
if (batch.size() >= batchSize) {
|
||||
batchCount++;
|
||||
String mergedSql = mergeFileInsert(batch);
|
||||
jdbcTemplate.update(mergedSql);
|
||||
LOGGER.info("已插入 TS_FILES 第 {} 批 ({} 条记录)", batchCount, batch.size());
|
||||
batch.clear();
|
||||
}
|
||||
}
|
||||
if (!batch.isEmpty()) {
|
||||
batchCount++;
|
||||
String mergedSql = mergeFileInsert(batch);
|
||||
jdbcTemplate.update(mergedSql);
|
||||
LOGGER.info("已插入 TS_FILES 第 {} 批 ({} 条记录)", batchCount, batch.size());
|
||||
}
|
||||
LOGGER.info("TS_FILES 插入完成,共 {} 批", batchCount);
|
||||
}
|
||||
|
||||
long endTime = System.currentTimeMillis();
|
||||
LOGGER.info("任务 SQL 导入完成,taskCode={},耗时 {} ms", taskCode, (endTime - startTime));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
private void executeFileBatch(List<String> inserts) {
|
||||
|
||||
String mergedSql = mergeFileInsert(inserts);
|
||||
|
||||
try {
|
||||
jdbcTemplate.update(mergedSql);
|
||||
LOGGER.info("ts_files 批量插入 {} 条", inserts.size());
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("ts_files 批量插入失败", e);
|
||||
throw e; // 触发事务回滚
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 合并同一表的 INSERT VALUES
|
||||
*/
|
||||
private String mergeFileInsert(List<String> insertSqls) {
|
||||
if (insertSqls.isEmpty()) return "";
|
||||
|
||||
String first = insertSqls.get(0);
|
||||
Matcher matcher = Pattern.compile(
|
||||
"INSERT\\s+INTO\\s+`?(\\w+)`?\\s*\\(([^)]+)\\)\\s*VALUES\\s*\\((.*)\\)",
|
||||
Pattern.CASE_INSENSITIVE
|
||||
).matcher(first);
|
||||
|
||||
if (!matcher.find()) {
|
||||
return String.join(";", insertSqls); // 无法解析,原样返回
|
||||
}
|
||||
|
||||
String table = matcher.group(1);
|
||||
String columns = matcher.group(2);
|
||||
|
||||
StringBuilder sb = new StringBuilder("INSERT IGNORE INTO `").append(table).append("` (")
|
||||
.append(columns).append(") VALUES ");
|
||||
|
||||
for (int i = 0; i < insertSqls.size(); i++) {
|
||||
Matcher m = Pattern.compile(
|
||||
"INSERT\\s+INTO\\s+`?\\w+`?\\s*\\([^)]*\\)\\s*VALUES\\s*\\((.*)\\)",
|
||||
Pattern.CASE_INSENSITIVE
|
||||
).matcher(insertSqls.get(i));
|
||||
|
||||
if (m.find()) {
|
||||
if (i > 0) sb.append(",");
|
||||
sb.append("(").append(m.group(1)).append(")");
|
||||
}
|
||||
}
|
||||
sb.append(";");
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -135,7 +135,28 @@ public class LocalServiceImpl extends AbstractProxyTransferService<LocalParam> {
|
||||
checkNameSecurity(name);
|
||||
|
||||
String fullPath = StringUtils.concat(param.getFilePath(), path, name);
|
||||
try {
|
||||
// 检查文件是否存在
|
||||
File file = new File(fullPath);
|
||||
if (!file.exists()) {
|
||||
log.warn("文件不存在: {}", fullPath);
|
||||
return true; // 文件不存在也算删除成功
|
||||
}
|
||||
|
||||
// 检查并尝试修改文件权限
|
||||
if (!file.canWrite()) {
|
||||
log.info("文件无写权限,尝试修改权限: {}", fullPath);
|
||||
boolean permissionChanged = file.setWritable(true);
|
||||
if (!permissionChanged) {
|
||||
log.warn("无法修改文件写权限: {}", fullPath);
|
||||
}
|
||||
}
|
||||
|
||||
return FileUtil.del(fullPath);
|
||||
} catch (Exception e) {
|
||||
log.error("删除文件失败: {}, 错误: {}", fullPath, e.getMessage(), e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -144,7 +165,64 @@ public class LocalServiceImpl extends AbstractProxyTransferService<LocalParam> {
|
||||
checkPathSecurity(path);
|
||||
checkNameSecurity(name);
|
||||
|
||||
return deleteFile(path, name);
|
||||
String fullPath = StringUtils.concatTrimStartSlashes(param.getFilePath(), name);
|
||||
log.info("param.getFilePath==========,{}", param.getFilePath());
|
||||
log.info("fullPath==========,{}", fullPath);
|
||||
|
||||
try {
|
||||
// 检查文件夹是否存在
|
||||
File folder = new File(fullPath);
|
||||
if (!folder.exists()) {
|
||||
log.warn("文件夹不存在: {}", fullPath);
|
||||
return true; // 文件夹不存在也算删除成功
|
||||
}
|
||||
|
||||
// 检查并尝试修改文件夹权限
|
||||
if (!folder.canWrite()) {
|
||||
log.info("文件夹无写权限,尝试修改权限: {}", fullPath);
|
||||
boolean permissionChanged = folder.setWritable(true);
|
||||
if (!permissionChanged) {
|
||||
log.warn("无法修改文件夹写权限: {}", fullPath);
|
||||
}
|
||||
}
|
||||
|
||||
// 递归修改文件夹内所有文件的权限
|
||||
//setWritableRecursively(folder);
|
||||
|
||||
return FileUtil.del(fullPath);
|
||||
} catch (Exception e) {
|
||||
log.error("删除文件夹失败: {}, 错误: {}", fullPath, e.getMessage(), e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 递归设置文件夹及其内部所有文件的写权限
|
||||
* @param file 文件或文件夹
|
||||
*/
|
||||
private void setWritableRecursively(File file) {
|
||||
if (file.isFile()) {
|
||||
if (!file.canWrite()) {
|
||||
boolean success = file.setWritable(true);
|
||||
if (!success) {
|
||||
log.debug("无法设置文件写权限: {}", file.getAbsolutePath());
|
||||
}
|
||||
}
|
||||
} else if (file.isDirectory()) {
|
||||
if (!file.canWrite()) {
|
||||
boolean success = file.setWritable(true);
|
||||
if (!success) {
|
||||
log.debug("无法设置文件夹写权限: {}", file.getAbsolutePath());
|
||||
}
|
||||
}
|
||||
|
||||
File[] files = file.listFiles();
|
||||
if (files != null) {
|
||||
for (File f : files) {
|
||||
setWritableRecursively(f);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -18,7 +18,9 @@ import com.yfd.platform.system.service.IUserService;
|
||||
import com.yfd.platform.utils.FileUtil;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.security.authentication.AnonymousAuthenticationToken;
|
||||
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
||||
import org.springframework.security.core.Authentication;
|
||||
import org.springframework.security.core.context.SecurityContextHolder;
|
||||
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||
@ -65,20 +67,47 @@ public class UserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impleme
|
||||
***********************************/
|
||||
@Override
|
||||
public String getUsername() {
|
||||
UsernamePasswordAuthenticationToken authentication =
|
||||
(UsernamePasswordAuthenticationToken) SecurityContextHolder.getContext().getAuthentication();
|
||||
LoginUser loginuser = (LoginUser) authentication.getPrincipal();
|
||||
String acountname =
|
||||
loginuser.getUser().getNickname();
|
||||
return acountname;
|
||||
//return "admin";
|
||||
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
|
||||
|
||||
if (authentication == null || !authentication.isAuthenticated() ||
|
||||
authentication instanceof AnonymousAuthenticationToken) {
|
||||
return "anonymous";
|
||||
}
|
||||
|
||||
if (authentication instanceof UsernamePasswordAuthenticationToken) {
|
||||
LoginUser loginuser = (LoginUser) authentication.getPrincipal();
|
||||
return loginuser.getUser().getNickname();
|
||||
}
|
||||
|
||||
return "unknown";
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Map<String, String> getNameInfo() {
|
||||
UsernamePasswordAuthenticationToken authentication =
|
||||
(UsernamePasswordAuthenticationToken) SecurityContextHolder.getContext().getAuthentication();
|
||||
LoginUser loginuser = (LoginUser) authentication.getPrincipal();
|
||||
// 安全地获取认证信息
|
||||
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
|
||||
|
||||
// 检查认证信息是否有效
|
||||
if (authentication == null || !authentication.isAuthenticated() ||
|
||||
authentication instanceof AnonymousAuthenticationToken) {
|
||||
// 返回默认值或抛出自定义异常
|
||||
Map<String, String> defaultMap = new HashMap<>();
|
||||
defaultMap.put("nickname", "Anonymous");
|
||||
defaultMap.put("username", "anonymous");
|
||||
return defaultMap;
|
||||
}
|
||||
|
||||
// 确保是 UsernamePasswordAuthenticationToken 类型
|
||||
if (!(authentication instanceof UsernamePasswordAuthenticationToken)) {
|
||||
Map<String, String> defaultMap = new HashMap<>();
|
||||
defaultMap.put("nickname", "Unknown");
|
||||
defaultMap.put("username", "unknown");
|
||||
return defaultMap;
|
||||
}
|
||||
|
||||
UsernamePasswordAuthenticationToken usernameAuth = (UsernamePasswordAuthenticationToken) authentication;
|
||||
LoginUser loginuser = (LoginUser) usernameAuth.getPrincipal();
|
||||
String nickname = loginuser.getUser().getNickname();
|
||||
String username = loginuser.getUser().getUsername();
|
||||
Map<String, String> map = new HashMap<>();
|
||||
@ -87,6 +116,7 @@ public class UserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impleme
|
||||
return map;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public SysUser getUserInfo() {
|
||||
UsernamePasswordAuthenticationToken authentication =
|
||||
|
||||
31
java/src/main/java/com/yfd/platform/utils/InterpCursor.java
Normal file
31
java/src/main/java/com/yfd/platform/utils/InterpCursor.java
Normal file
@ -0,0 +1,31 @@
|
||||
package com.yfd.platform.utils;
|
||||
//双指针线性插值
|
||||
public class InterpCursor {
|
||||
|
||||
private final double[] t;
|
||||
private final double[] v;
|
||||
private int idx = 0;
|
||||
|
||||
public InterpCursor(double[] t, double[] v) {
|
||||
this.t = t;
|
||||
this.v = v;
|
||||
}
|
||||
|
||||
public double valueAt(double x) {
|
||||
int n = t.length;
|
||||
if (n == 0) return 0;
|
||||
if (x <= t[0] || x >= t[n - 1]) return 0;
|
||||
|
||||
while (idx < n - 2 && t[idx + 1] < x) {
|
||||
idx++;
|
||||
}
|
||||
|
||||
double t0 = t[idx];
|
||||
double t1 = t[idx + 1];
|
||||
if (x < t0 || x > t1) return 0;
|
||||
|
||||
double r = (x - t0) / (t1 - t0);
|
||||
return v[idx] + r * (v[idx + 1] - v[idx]);
|
||||
}
|
||||
}
|
||||
|
||||
@ -20,6 +20,18 @@ spring:
|
||||
url: jdbc:mysql://43.138.168.68:3306/filemanagedb?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true
|
||||
username: root
|
||||
password: ylfw20230626@
|
||||
# url: jdbc:mysql://127.0.0.1:3307/filemanagedb?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true
|
||||
# username: root
|
||||
# password: 123456
|
||||
initial-size: 5
|
||||
min-idle: 5
|
||||
max-active: 20
|
||||
test-while-idle: true
|
||||
test-on-borrow: false
|
||||
test-on-return: false
|
||||
validation-query: SELECT 1
|
||||
time-between-eviction-runs-millis: 60000
|
||||
min-evictable-idle-time-millis: 300000
|
||||
mvc:
|
||||
pathmatch:
|
||||
matching-strategy: ant_path_matcher
|
||||
@ -84,7 +96,10 @@ ip:
|
||||
|
||||
file-space: #项目文档空间
|
||||
system: D:\file\system\ #单独上传的文件
|
||||
|
||||
app:
|
||||
common-dir: E:\projectJava\FileManage\common
|
||||
templates-dir: E:\projectJava\FileManage\templates
|
||||
config-dir: E:\projectJava\FileManage\config
|
||||
# 文件预览大小
|
||||
file-system:
|
||||
preview:
|
||||
|
||||
@ -1,7 +1,10 @@
|
||||
server:
|
||||
port: 8087
|
||||
port: 8080
|
||||
tomcat:
|
||||
connection-timeout: 300000
|
||||
#密码加密传输,前端公钥加密,后端私钥解密
|
||||
rsa:
|
||||
private_key: MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A==
|
||||
spring:
|
||||
#应用名称
|
||||
application:
|
||||
@ -11,31 +14,41 @@ spring:
|
||||
druid:
|
||||
master:
|
||||
driverClassName: com.mysql.cj.jdbc.Driver
|
||||
# url: jdbc:mysql://120.27.210.161:3306/testdb?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true
|
||||
# username: testdb
|
||||
# password: 27CTfsyJmZRESmsa
|
||||
url: jdbc:mysql://121.37.111.42:33306/filemanagedb?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true
|
||||
username: filemanagedb
|
||||
password: GAPchydbCKYFjjAa
|
||||
url: jdbc:mysql://db-container:3306/filemanagedb?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true
|
||||
username: root
|
||||
password: pwd@FileMgr
|
||||
initial-size: 5
|
||||
min-idle: 5
|
||||
max-active: 20
|
||||
validation-query: SELECT 1
|
||||
mvc:
|
||||
pathmatch:
|
||||
matching-strategy: ant_path_matcher
|
||||
servlet:
|
||||
multipart:
|
||||
max-file-size: 30MB
|
||||
max-request-size: 100MB
|
||||
max-file-size: 50GB
|
||||
max-request-size: 50GB
|
||||
tomcat:
|
||||
max-swallow-size: -1
|
||||
connection-timeout: 86400000
|
||||
max-http-form-post-size: -1
|
||||
redis:
|
||||
host: localhost
|
||||
port: 6379
|
||||
password: MySecurePass123
|
||||
database: 0
|
||||
logging:
|
||||
file:
|
||||
path: /opt/filemgr/logs
|
||||
path: /opt/filemgr/logs/
|
||||
name: logs/projectname.log
|
||||
level:
|
||||
com.genersoft.iot: debug
|
||||
com.genersoft.iot: info
|
||||
com.genersoft.iot.vmp.storager.dao: info
|
||||
com.genersoft.iot.vmp.gb28181: info
|
||||
|
||||
# 在线文档: swagger-ui(生产环境建议关闭)
|
||||
swagger-ui:
|
||||
enabled: true
|
||||
enabled: false
|
||||
|
||||
mybatis-plus:
|
||||
configuration:
|
||||
@ -69,7 +82,12 @@ ip:
|
||||
|
||||
|
||||
file-space: #项目文档空间
|
||||
system: D:\file\system\ #单独上传的文件
|
||||
system: /data/local-data/ #单独上传的文件
|
||||
|
||||
app: #common-dir 加载通用标签文件,可读写,templates-dir 加载文件转换模板文件 ;config-dir 加载文件转换配置文件
|
||||
common-dir: /opt/filemgr/common
|
||||
templates-dir: /opt/filemgr/templates
|
||||
config-dir: /opt/filemgr/config
|
||||
|
||||
file-system:
|
||||
preview:
|
||||
|
||||
37
java/src/main/resources/config/ins-convert-default.json
Normal file
37
java/src/main/resources/config/ins-convert-default.json
Normal file
@ -0,0 +1,37 @@
|
||||
{
|
||||
"outputs": [
|
||||
{
|
||||
"name": "VINS",
|
||||
"templateResource": "templates/VINS_0_mode1.txt",
|
||||
"delimiter": ",",
|
||||
"extension": ".txt",
|
||||
"downsample": {
|
||||
"enabled": true,
|
||||
"inputDelta": 0.05,
|
||||
"outputInterval": 0.1
|
||||
},
|
||||
"rules": {
|
||||
"UTC": { "type": "INPUT", "from": "utc" },
|
||||
"LatGps": { "type": "INPUT", "from": "LatJG" },
|
||||
"LonGps": { "type": "INPUT", "from": "LonJG" }
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "FVNS",
|
||||
"templateResource": "templates/FVNS.csv",
|
||||
"delimiter": ",",
|
||||
"extension": ".csv",
|
||||
"downsample": {
|
||||
"enabled": true,
|
||||
"inputDelta": 0.005,
|
||||
"outputInterval": 10
|
||||
},
|
||||
"rules": {
|
||||
"UTC": { "type": "INPUT", "from": "utc" },
|
||||
"FvnsSts": { "type": "INPUT", "from": "posx" },
|
||||
"PosxFvns": { "type": "INPUT", "from": "posy" },
|
||||
"PosyFvns": { "type": "INPUT", "from": "posz" }
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
6
java/src/main/resources/config/trj_config.txt
Normal file
6
java/src/main/resources/config/trj_config.txt
Normal file
@ -0,0 +1,6 @@
|
||||
time: UTC
|
||||
lon: LonGps
|
||||
lat: LatGps
|
||||
hgt: HgtGps
|
||||
|
||||
|
||||
6
java/src/main/resources/config/trj_config_ins_img.txt
Normal file
6
java/src/main/resources/config/trj_config_ins_img.txt
Normal file
@ -0,0 +1,6 @@
|
||||
time: GPU_TEMP
|
||||
lon: LON
|
||||
lat: LAT
|
||||
hgt: ALT
|
||||
|
||||
|
||||
@ -50,4 +50,33 @@
|
||||
task_id = #{taskId}
|
||||
AND work_path LIKE CONCAT(#{oldBasePath}, '%')
|
||||
</update>
|
||||
|
||||
<!-- 查询某任务某节点的所有文件 -->
|
||||
<select id="selectByTaskAndNode" resultType="com.yfd.platform.modules.experimentalData.domain.TsFiles">
|
||||
SELECT id, work_path, file_name
|
||||
FROM ts_files
|
||||
WHERE task_id = #{taskId} AND node_id = #{nodeId}
|
||||
</select>
|
||||
|
||||
<!-- 批量更新 parent_id -->
|
||||
<!-- <update id="updateParentIdBatch">-->
|
||||
<!-- <foreach collection="list" item="item" separator=" ">-->
|
||||
<!-- UPDATE ts_files-->
|
||||
<!-- SET parent_id = #{item.parentId}-->
|
||||
<!-- WHERE id = #{item.id};-->
|
||||
<!-- </foreach>-->
|
||||
<!-- </update>-->
|
||||
<update id="updateParentIdBatch">
|
||||
UPDATE ts_files
|
||||
SET parent_id = CASE id
|
||||
<foreach collection="list" item="item" separator=" ">
|
||||
WHEN #{item.id} THEN #{item.parentId}
|
||||
</foreach>
|
||||
END
|
||||
WHERE id IN
|
||||
<foreach collection="list" item="item" open="(" separator="," close=")">
|
||||
#{item.id}
|
||||
</foreach>
|
||||
</update>
|
||||
|
||||
</mapper>
|
||||
|
||||
@ -1,5 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.yfd.platform.modules.experimentalData.mapper.TsTaskMapper">
|
||||
|
||||
<select id="selectMaxTaskCode" resultType="java.lang.String">
|
||||
SELECT task_code FROM ts_task
|
||||
ORDER BY task_code DESC
|
||||
LIMIT 1
|
||||
</select>
|
||||
</mapper>
|
||||
|
||||
504
java/src/main/resources/templates/FVNS.csv
Normal file
504
java/src/main/resources/templates/FVNS.csv
Normal file
@ -0,0 +1,504 @@
|
||||
UTC,UTCOut,LatGps,HgtGps,LonGps,RollGps,YawGps,PitchGps,LatVins,HgtVins,LonVins,RollVins,YawVins,PitchVins,FvnsSts,PosxFvns,PosyFvns,PoszFvns,ModeFvns,ConfFvns,MethodFvns,RefID,NumPt,Pt1x,Pt1y,Pt2x,Pt2y,Pt3x,Pt3y,Pt4x,Pt4y,Pt5x,Pt5y,Pt6x,Pt6y,Pt7x,Pt7y,Pt8x,Pt8y,Pt9x,Pt9y,Pt10x,Pt10y,Pt11x,Pt11y,Pt12x,Pt12y
|
||||
60.01,300.31,38.4963361,1399.45,103.2048083,-0.7408333,-70.1041333,-0.4197389,38.4963361,1399.414,103.2048082,-0.810442,-70.1006014,-0.4678626,0,0,0,0.051,1,0.85,1,0,0,4,561.8,1276,585,605.1,547.3,705.2,549.1,0,-128,1247.6,1148,0,-128,0,-128,0,-128,0,-128,615,787.4,648.8,548.8
|
||||
300.425,300.575,38.4963361,1399.45,103.2048083,-0.7510639,-70.08905,-0.4289472,38.4963361,1399.79,103.2048082,-0.8131575,-70.101371,-0.4679276,0,0,0,0.051,1,0.85,1,0,0,6.6,561.8,1276,585.1,604.9,547.4,706.2,549.3,0,-128,1247.3,1148,0,-128,0,-128,0,-128,0,-128,614.8,787.4,648.9,548.9
|
||||
301.43,301.53,38.4963361,1399.45,103.2048083,-0.7622944,-70.0596444,-0.4222306,38.4963357,1399.79,103.2048084,-0.7826933,-70.1156302,-0.4690537,0,0,0,0.051,1,0.85,1,0,0,6.4,562.3,1276,585.7,604.3,547,707,548.9,0,-128,1247.6,1148,0,-128,0,-128,0,-128,0,-128,615.4,787.1,648.9,548.6
|
||||
302.42,302.52,38.4963361,1399.45,103.2048083,-0.7623889,-70.0775167,-0.4978389,38.4963357,1399.79,103.2048084,-0.8042029,-70.1049364,-0.4674049,0,0,0,0.051,1,0.85,1,0,0,4,561.8,1276,585.7,606.4,547.4,705.9,549.4,0,-128,1248.1,1148,0,-128,0,-128,0,-128,0,-128,614.9,787.4,649,548.9
|
||||
303.41,303.505,38.4963361,1399.45,103.2048083,-0.79895,-70.0659389,-0.4385556,38.4963357,1399.79,103.2048084,-0.8124081,-70.0966995,-0.4682888,0,0,0,0.051,1,0.85,1,0,0,4,562.2,1276,585.4,605.4,547.1,705.5,548.9,0,-128,1248.3,1148,0,-128,0,-128,0,-128,0,-128,615.4,787.1,649.1,548.6
|
||||
304.4,304.495,38.4963361,1399.45,103.2048083,-0.75405,-70.0692278,-0.4138917,38.4963357,1399.79,103.2048084,-0.7695076,-70.1184806,-0.4668883,0,0,0,0.052,1,0.85,1,0,0,4,562.1,1276,585.2,605.1,547.2,706.2,549.4,0,-128,1247.2,1148,0,-128,0,-128,0,-128,0,-128,614.8,787.1,649,548.7
|
||||
305.39,305.485,38.4963361,1399.45,103.2048083,-0.7603944,-70.0391389,-0.399525,38.4963357,1399.79,103.2048084,-0.8022389,-70.1043329,-0.4673509,0,0,0,0.051,1,0.85,1,0,0,4,562.5,1276,585.4,603.9,547.1,708.2,549.3,0,-128,1247.5,1148,0,-128,0,-128,0,-128,0,-128,615.2,787.3,648.7,548.9
|
||||
306.415,306.505,38.4963361,1399.45,103.2048083,-0.7792111,-70.0047,-0.4118028,38.4963357,1399.79,103.2048084,-0.7920108,-70.1062327,-0.4686083,0,0,0,0.051,1,0.85,1,0,0,6.4,562.5,1276,585.2,605.3,547.4,705.7,549.3,0,-128,1248.7,1148,0,-128,0,-128,0,-128,0,-128,614.9,787.1,649,548.9
|
||||
307.44,307.535,38.4963361,1399.45,103.2048083,-0.7742722,-69.9731667,-0.477175,38.4963357,1399.79,103.2048084,-0.7828153,-70.1183828,-0.4666397,0,0,0,0.048,1,0.85,1,0,0,4,562.1,1276,585.3,603.2,547.7,707.4,549.5,0,-128,1248.1,1148,0,-128,0,-128,0,-128,0,-128,614.5,787.6,646.7,549.2
|
||||
308.465,308.555,38.4963361,1399.45,103.2048083,-0.724625,-70.0910778,-0.4656333,38.4963357,1399.79,103.2048084,-0.705305,-70.1545873,-0.4648375,0,0,0,0.046,1,0.85,1,0,0,4,562.7,1276,586,604.1,546.7,712.3,549.1,0,-128,1248.3,1148,0,-128,0,-128,0,-128,0,-128,618.7,787.1,649.1,548.5
|
||||
309.59,309.685,38.4963361,1399.46,103.2048083,-0.8465139,-70.0645278,-0.4912472,38.4963357,1399.79,103.2048084,-0.7341136,-70.1127004,-0.4608321,0,0,0,0.053,1,0.85,1,0,0,4,564.1,1276,585.8,604.8,547.5,705.9,549.4,0,-128,1248.6,1148,0,-128,0,-128,0,-128,0,-128,614.1,787.7,648.6,549.1
|
||||
310.58,310.665,38.4963361,1399.45,103.2048083,-0.8396278,-70.0104056,-0.4578611,38.4963357,1399.79,103.2048084,-0.7865157,-70.0731787,-0.4664109,0,0,0,0.049,1,0.85,1,0,0,4,565.2,1276,585.5,602.4,547.4,706.5,549.6,0,-128,1247.7,1148,0,-128,0,-128,0,-128,0,-128,613.5,787.6,646.2,549
|
||||
311.565,311.655,38.4963361,1399.45,103.2048083,-0.8145,-70.0003611,-0.48795,38.4963357,1399.79,103.2048084,-0.7644463,-70.0942909,-0.4629094,0,0,0,0.048,1,0.85,1,0,0,4,562.3,1276,585.7,602.3,546.9,707.2,549.2,0,-128,1248.1,1148,0,-128,0,-128,0,-128,0,-128,614.6,787.3,646.6,548.6
|
||||
312.555,312.645,38.4963361,1399.45,103.2048083,-0.7959556,-70.0574056,-0.4434667,38.4963357,1399.79,103.2048084,-0.723175,-70.1139596,-0.4669312,0,0,0,0.048,1,0.85,1,0,0,4,564.3,1276,585.7,603.2,547.6,705.8,549.7,0,-128,1247.9,1148,0,-128,0,-128,0,-128,0,-128,614.9,787.7,646.4,549.2
|
||||
313.545,313.64,38.4963361,1399.45,103.2048083,-0.8059722,-70.0612556,-0.4154222,38.4963357,1399.79,103.2048084,-0.7063997,-70.1498925,-0.4622192,0,0,0,0.049,1,0.85,1,0,0,6.7,562.6,1276,586.6,599.6,547.2,707.2,549.4,0,-128,1248.2,1148,0,-128,0,-128,0,-128,0,-128,614.1,787.5,646.4,548.9
|
||||
314.57,314.665,38.4963361,1399.45,103.2048083,-0.955775,-69.9902722,-0.3719389,38.4963357,1399.79,103.2048083,-0.8569184,-70.0292449,-0.4722439,0,0,0,0.046,1,0.85,1,0,0,4,562.6,1276,585.6,597.3,547.3,709,549.5,0,-128,1248.2,1148,0,-128,0,-128,0,-128,0,-128,614.4,787.4,645.6,549
|
||||
315.56,315.66,38.4963361,1399.45,103.2048083,-0.9552472,-69.95875,-0.3588194,38.4963357,1399.79,103.2048083,-0.7624109,-70.1037078,-0.4682067,0,0,0,0.046,1,0.85,1,0,0,4,562.3,1276,585.9,604.1,547.2,706.2,549.1,0,-128,1247,1148,0,-128,0,-128,0,-128,0,-128,618.1,788.3,649,548.7
|
||||
316.55,316.64,38.4963361,1399.45,103.2048083,-0.8457306,-70.0163778,-0.3268083,38.4963357,1399.79,103.2048083,-0.7345279,-70.1338771,-0.4645529,0,0,0,0.052,1,0.85,1,0,0,6.7,562.1,1276,585.5,604.2,547.1,702.6,548.9,0,-128,1247.3,1148,0,-128,0,-128,0,-128,0,-128,614.4,787.5,648.7,548.7
|
||||
317.535,317.63,38.4963361,1399.45,103.2048083,-0.9067306,-69.9879167,-0.3828222,38.4963357,1399.79,103.2048083,-0.75324,-70.1105275,-0.460812,0,0,0,0.049,1,0.85,1,0,0,6.8,562.4,1276,585.5,604.4,547.1,706.3,549,0,-128,1248.5,1148,0,-128,0,-128,0,-128,0,-128,614.4,787.7,646.7,548.6
|
||||
318.525,318.62,38.4963361,1399.46,103.2048083,-0.8855972,-70.0025111,-0.3529083,38.4963358,1399.79,103.2048083,-0.7466123,-70.1219424,-0.4670059,0,0,0,0.049,1,0.85,1,0,0,4,561.9,1276,585.6,604.1,547,706.4,549.2,0,-128,1247.5,1148,0,-128,0,-128,0,-128,0,-128,616,787.7,648.5,548.8
|
||||
319.515,319.61,38.4963361,1399.45,103.2048083,-0.8269972,-70.0437111,-0.3937028,38.4963357,1399.79,103.2048083,-0.7669348,-70.1123997,-0.4628737,0,0,0,0.051,1,0.85,1,0,0,6.5,562.1,1276,585.8,604.9,546.8,706.2,548.9,0,-128,1248.2,1148,0,-128,0,-128,0,-128,0,-128,615,787.9,648.7,548.5
|
||||
320.505,320.6,38.4963361,1399.45,103.2048083,-0.7056361,-70.05825,-0.4688528,38.4963357,1399.79,103.2048083,-0.7620526,-70.1088745,-0.4662201,0,0,0,0.046,1,0.85,1,0,0,4,561.9,1276,585.4,604,546.7,707.8,548.8,0,-128,1247.6,1148,0,-128,0,-128,0,-128,0,-128,615.7,788,646.3,548.4
|
||||
321.495,321.59,38.4963361,1399.45,103.2048083,-0.7287917,-70.0293833,-0.4428139,38.4963357,1399.79,103.2048083,-0.7506413,-70.1157491,-0.4626789,0,0,0,0.047,1,0.85,1,0,0,6.5,561.9,1276,585.4,603.1,547.3,707.4,549,0,-128,1247.9,1148,0,-128,0,-128,0,-128,0,-128,615.2,787.9,646.6,548.8
|
||||
322.485,322.58,38.4963361,1399.45,103.2048083,-0.8274611,-70.0228778,-0.5217306,38.4963357,1399.79,103.2048083,-0.7811722,-70.0937779,-0.4675518,0,0,0,0.046,1,0.85,1,0,0,4,562.1,1276,585.7,601.9,547.1,708.6,549.4,0,-128,1248.9,1148,0,-128,0,-128,0,-128,0,-128,615.6,787.7,646.2,549
|
||||
323.475,323.57,38.4963361,1399.45,103.2048083,-0.7695806,-70.05185,-0.5161722,38.4963357,1399.79,103.2048083,-0.7464088,-70.1269324,-0.466205,0,0,0,0.046,1,0.85,1,0,0,6.4,562.1,1276,585.6,602.8,547.1,707.7,549.4,0,-128,1247.7,1148,0,-128,0,-128,0,-128,0,-128,616.1,787.7,646.6,549
|
||||
324.465,324.555,38.4963361,1399.46,103.2048083,-0.8891694,-69.9967667,-0.5342861,38.4963357,1399.79,103.2048083,-0.7748199,-70.0992787,-0.4636553,0,0,0,0.046,1,0.85,1,0,0,4,561.9,1276,585.6,603.5,547,707.3,549.1,0,-128,1247.6,1148,0,-128,0,-128,0,-128,0,-128,615.3,787.8,646.2,548.7
|
||||
325.455,325.545,38.4963361,1399.45,103.2048083,-0.9198472,-69.9495389,-0.4755667,38.4963357,1399.79,103.2048083,-0.7680139,-70.1043424,-0.4625475,0,0,0,0.049,1,0.85,1,0,0,6.5,561.9,1276,586,603.3,547.1,709,549,0,-128,1248.1,1148,0,-128,0,-128,0,-128,0,-128,615.8,787.8,648.5,548.8
|
||||
326.445,326.54,38.4963361,1399.45,103.2048083,-0.9308861,-70.0308667,-0.4610028,38.4963358,1399.79,103.2048082,-0.7907338,-70.0964183,-0.4638714,0,0,0,0.046,1,0.85,1,0,0,4,562.6,1276,585.4,603.5,547.5,709.1,549.5,0,-128,1247.2,1148,0,-128,0,-128,0,-128,0,-128,615.6,787.5,646.5,549.1
|
||||
327.435,327.525,38.4963361,1399.45,103.2048083,-0.8333944,-70.0057444,-0.4681417,38.4963358,1399.79,103.2048082,-0.7800488,-70.100188,-0.4664474,0,0,0,0.046,1,0.85,1,0,0,4,561.5,1276,585.6,602.4,547.4,708.4,549.5,0,-128,1247.6,1148,0,-128,0,-128,0,-128,0,-128,615.5,787.7,646.2,549.2
|
||||
328.425,328.52,38.4963361,1399.45,103.2048083,-0.8321028,-70.0524278,-0.473,38.4963357,1399.79,103.2048082,-0.7710925,-70.1133097,-0.4666904,0,0,0,0.048,1,0.85,1,0,0,4,562,1276,585.2,602.1,547.5,708.8,549.2,0,-128,1247.6,1148,0,-128,0,-128,0,-128,0,-128,614.4,787.5,646.4,549.2
|
||||
329.41,329.51,38.4963361,1399.46,103.2048083,-0.8915944,-70.0844056,-0.452175,38.4963357,1399.79,103.2048082,-0.8058452,-70.0854823,-0.4629986,0,0,0,0.046,1,0.85,1,0,0,6.4,562.3,1276,585.4,604.7,547.6,707.1,549.6,0,-128,1248.5,1148,0,-128,0,-128,0,-128,0,-128,615.7,787.9,646.4,549.2
|
||||
330.4,330.495,38.4963361,1399.46,103.2048083,-0.8270278,-70.0192889,-0.4140083,38.4963357,1399.79,103.2048082,-0.800383,-70.0941328,-0.4646495,0,0,0,0.048,1,0.85,1,0,0,4,561.7,1276,585.7,601.7,547.6,712.4,549.4,0,-128,1248.1,1148,0,-128,0,-128,0,-128,0,-128,614.1,787.3,646.3,549.1
|
||||
331.39,331.485,38.4963361,1399.46,103.2048083,-0.77005,-70.0467167,-0.416125,38.4963357,1399.79,103.2048082,-0.7757795,-70.1090257,-0.4654916,0,0,0,0.048,1,0.85,1,0,0,4,561.7,1276,585.6,602.8,547.4,712.3,549.6,0,-128,1247.7,1148,0,-128,0,-128,0,-128,0,-128,614.7,787.6,646.5,549.1
|
||||
332.415,332.51,38.4963361,1399.45,103.2048083,-0.8208028,-69.9719944,-0.4119444,38.4963357,1399.789,103.2048082,-0.8022081,-70.0906135,-0.466629,0,0,0,0.045,1,0.85,1,0,0,4,562,1276,585.7,601.9,547.3,707.8,549.8,0,-128,1247.6,1148,0,-128,0,-128,0,-128,0,-128,615.7,787.7,646.1,549.3
|
||||
333.405,333.505,38.4963361,1399.45,103.2048083,-0.8190917,-70.0470889,-0.4136861,38.4963357,1399.789,103.2048082,-0.8099906,-70.0891736,-0.4645096,0,0,0,0.046,1,0.85,1,0,0,4,562.3,1276,585.5,602.9,547.3,705.9,549.5,0,-128,1247.6,1148,0,-128,0,-128,0,-128,0,-128,615.2,787.9,646,549
|
||||
334.395,334.49,38.4963361,1399.45,103.2048083,-0.8238028,-70.0743611,-0.4190528,38.4963357,1399.789,103.2048082,-0.7586572,-70.1296308,-0.4632785,0,0,0,0.045,1,0.85,1,0,0,4,562.3,1276,585.9,603.6,547.2,708.8,549.2,0,-128,1247.4,1148,0,-128,0,-128,0,-128,0,-128,616.2,787.7,646.5,549
|
||||
335.385,335.48,38.4963361,1399.45,103.2048083,-0.8334194,-70.0929167,-0.478,38.4963357,1399.789,103.2048082,-0.7980351,-70.0993195,-0.4649945,0,0,0,0.046,1,0.85,1,0,0,4,562.5,1276,585.5,603.3,547.1,706.8,549.3,0,-128,1248.2,1148,0,-128,0,-128,0,-128,0,-128,615.6,787.7,646.3,548.9
|
||||
336.375,336.475,38.4963361,1399.45,103.2048083,-0.7735167,-70.0592889,-0.5159361,38.4963357,1399.789,103.2048082,-0.8000658,-70.0929196,-0.4646349,0,0,0,0.046,1,0.85,1,0,0,4,561.8,1276,585.6,603,547.2,706.7,549.5,0,-128,1247.8,1148,0,-128,0,-128,0,-128,0,-128,615.4,787.8,646.4,549
|
||||
337.365,337.46,38.4963361,1399.46,103.2048083,-0.9530306,-69.8400444,-0.5787972,38.4963357,1399.789,103.2048082,-0.9021154,-70.0307265,-0.4685574,0,0,0,0.045,1,0.85,1,0,0,4,561.5,1276,585.4,604.6,547.2,705.5,549.2,0,-128,1247.5,1148,0,-128,0,-128,0,-128,0,-128,615.8,788.1,646.3,548.8
|
||||
338.355,338.45,38.4963361,1399.45,103.2048083,-0.8710639,-69.1415889,-0.56365,38.4963357,1399.789,103.2048082,-0.8713699,-70.0775532,-0.4691053,0,0,0,0.05,1,0.85,1,0,0,4,561.9,1276,585.5,604.9,546.6,707.4,549,0,-128,1248.3,1148,0,-128,0,-128,0,-128,0,-128,615.7,787.3,649.5,548.4
|
||||
339.345,339.435,38.4963361,1399.44,103.2048083,-0.8834111,-69.2808444,-0.5439556,38.4963357,1399.789,103.2048082,-0.877393,-70.0577499,-0.4683718,0,0,0,0.05,1,0.85,1,0,0,4,562.6,1276,585.7,604.4,546.7,708.7,549,0,-128,1248,1148,0,-128,0,-128,0,-128,0,-128,615.6,787.5,649,548.5
|
||||
340.33,340.42,38.4963361,1399.45,103.2048083,-0.9055111,-69.6729056,-0.5495361,38.4963357,1399.789,103.2048082,-0.8968491,-70.0515178,-0.4728623,0,0,0,0.045,1,0.85,1,0,0,4,562.1,1276,586.1,604.8,546.4,706.5,548.8,0,-128,1247.5,1148,0,-128,0,-128,0,-128,0,-128,618.2,787,648.9,548.2
|
||||
341.32,341.415,38.4963361,1399.45,103.2048083,-0.9256639,-69.8871389,-0.5207583,38.4963357,1399.789,103.2048082,-0.8857887,-70.0604186,-0.4724077,0,0,0,0.05,1,0.85,1,0,0,4,562.1,1276,585.6,604.6,546.5,707.9,549,0,-128,1247.7,1148,0,-128,0,-128,0,-128,0,-128,615.8,787.7,649.2,548.4
|
||||
342.31,342.405,38.4963361,1399.45,103.2048083,-0.9471694,-69.8331,-0.5471667,38.4963357,1399.789,103.2048082,-0.8875021,-70.0577997,-0.4719891,0,0,0,0.049,1,0.85,1,0,0,4,561.9,1276,585.5,604.4,546.5,706.9,549,0,-128,1247.8,1148,0,-128,0,-128,0,-128,0,-128,615.8,787.3,648.8,548.3
|
||||
343.3,343.395,38.4963361,1399.46,103.2048083,-0.9632806,-69.8907111,-0.4555833,38.4963357,1399.789,103.2048082,-0.8832363,-70.0623845,-0.4716679,0,0,0,0.046,1,0.85,1,0,0,4,562.1,1276,585.8,605.5,546.7,707.6,549.1,0,-128,1247.6,1148,0,-128,0,-128,0,-128,0,-128,618.3,787,649.3,548.4
|
||||
344.29,344.38,38.4963361,1399.46,103.2048083,-0.9890333,-70.1895389,-0.4104528,38.4963357,1399.789,103.2048082,-0.8916458,-70.0567051,-0.4722645,0,0,0,0.044,1,0.85,1,0,0,4,562,1276,585.6,605,546.4,706.9,548.9,0,-128,1247.9,1148,0,-128,0,-128,0,-128,0,-128,618.6,787.4,648.9,548.1
|
||||
345.415,345.505,38.4963361,1399.45,103.2048083,-0.9592056,-70.4653,-0.3849833,38.4963357,1399.789,103.2048082,-0.8764272,-70.067182,-0.4719207,0,0,0,0.046,1,0.85,1,0,0,4,561.9,1276,585.7,606.1,543.9,705.6,548.5,0,-128,1247.4,1148,0,-128,0,-128,0,-128,0,-128,618.1,787.2,649.3,547.8
|
||||
346.405,346.495,38.4963361,1399.46,103.2048083,-0.931875,-70.6157056,-0.3427389,38.4963357,1399.789,103.2048082,-0.8849976,-70.0592952,-0.4721729,0,0,0,0.046,1,0.85,1,0,0,4,561.8,1276,585.3,605.6,546.2,708.8,548.7,0,-128,1247.6,1148,0,-128,0,-128,0,-128,0,-128,618.3,787,649.5,547.9
|
||||
347.395,347.49,38.4963361,1399.45,103.2048083,-0.9270056,-70.5515111,-0.4152944,38.4963357,1399.789,103.2048082,-0.8916161,-70.0579611,-0.4723441,0,0,0,0.046,1,0.85,1,0,0,4,562,1276,585.4,605.8,546.3,707.4,548.6,0,-128,1247.8,1148,0,-128,0,-128,0,-128,0,-128,618.2,787,649.2,548
|
||||
348.385,348.475,38.4963361,1399.45,103.2048083,-0.8930722,-70.4515556,-0.43855,38.4963357,1399.789,103.2048082,-0.8883136,-70.0598566,-0.4725421,0,0,0,0.045,1,0.85,1,0,0,4,561.6,1276,585.4,604.9,546.2,707.6,548.7,0,-128,1247.1,1148,0,-128,0,-128,0,-128,0,-128,618.6,787.2,649,548
|
||||
349.37,349.465,38.4963361,1399.45,103.2048083,-0.9253611,-70.4514222,-0.4492639,38.4963357,1399.789,103.2048082,-0.8907459,-70.0576308,-0.4729825,0,0,0,0.045,1,0.85,1,0,0,4,561.2,1276,585.8,604,546.6,708.9,548.9,0,-128,1248,1148,0,-128,0,-128,0,-128,0,-128,618.3,787.1,648.9,548.4
|
||||
350.365,350.455,38.4963361,1399.45,103.2048083,-0.9177722,-70.4682389,-0.4661333,38.4963357,1399.789,103.2048082,-0.8955064,-70.0551254,-0.4730643,0,0,0,0.045,1,0.85,1,0,0,4,561.6,1276,585.8,605.3,546.3,707.1,548.9,0,-128,1247.6,1148,0,-128,0,-128,0,-128,0,-128,618.6,787,649.3,548.1
|
||||
351.355,351.445,38.4963361,1399.44,103.2048083,-0.9106556,-70.3461833,-0.4496167,38.4963357,1399.789,103.2048082,-0.8925411,-70.0592049,-0.4731853,0,0,0,0.045,1,0.85,1,0,0,4,561.6,1276,586.3,605.5,544.1,707.4,548.8,0,-128,1248.4,1148,0,-128,0,-128,0,-128,0,-128,618.4,787.1,649.2,548
|
||||
352.34,352.435,38.4963361,1399.45,103.2048083,-0.9008694,-70.336,-0.4581278,38.4963357,1399.789,103.2048082,-0.8873484,-70.0631648,-0.4727146,0,0,0,0.045,1,0.85,1,0,0,4,561.6,1276,585.6,604.6,546.2,706.6,549.1,0,-128,1247.3,1148,0,-128,0,-128,0,-128,0,-128,618.6,787,649,548.1
|
||||
353.33,353.425,38.4963361,1399.45,103.2048083,-0.8937917,-70.2859778,-0.4364444,38.4963357,1399.789,103.2048082,-0.8907691,-70.0519314,-0.4739897,0,0,0,0.044,1,0.85,1,0,0,4,562.3,1276,585.6,605.3,546.4,707.2,549.1,0,-128,1248.8,1148,0,-128,0,-128,0,-128,0,-128,618.9,787,648.8,548.2
|
||||
354.32,354.415,38.4963361,1399.45,103.2048083,-0.9003194,-70.1931667,-0.4421472,38.4963357,1399.789,103.2048082,-0.8737738,-70.068148,-0.4734097,0,0,0,0.044,1,0.85,1,0,0,4,561.8,1276,585.3,603.7,546.2,708.8,548.9,0,-128,1248.7,1148,0,-128,0,-128,0,-128,0,-128,619,786.9,649.1,548
|
||||
355.31,355.41,38.4963361,1399.45,103.2048083,-0.91775,-70.1184444,-0.456925,38.4963357,1399.789,103.2048082,-0.8911295,-70.0538287,-0.4735708,0,0,0,0.044,1,0.85,1,0,0,4,561.5,1276,585.3,603.8,546.3,708.7,548.9,0,-128,1248.8,1148,0,-128,0,-128,0,-128,0,-128,618.9,787.1,649,548.1
|
||||
356.3,356.39,38.4963361,1399.45,103.2048083,-0.9388583,-70.1718778,-0.4560194,38.4963357,1399.789,103.2048082,-0.8772065,-70.0663139,-0.4729779,0,0,0,0.044,1,0.85,1,0,0,4,561.9,1276,585.2,604.3,546.5,707.7,549.1,0,-128,1248.6,1148,0,-128,0,-128,0,-128,0,-128,619,787.2,648.7,548.4
|
||||
357.29,357.38,38.4963361,1399.44,103.2048083,-0.9089306,-70.2007833,-0.430125,38.4963357,1399.789,103.2048082,-0.8851841,-70.0581261,-0.4731628,0,0,0,0.044,1,0.85,1,0,0,4,561.5,1276,585.3,603.8,546.6,708.4,549.2,0,-128,1248.9,1148,0,-128,0,-128,0,-128,0,-128,618.8,787.2,648.8,548.4
|
||||
358.28,358.375,38.4963361,1399.45,103.2048083,-0.9365306,-70.1591889,-0.4439611,38.4963357,1399.789,103.2048082,-0.8831334,-70.0645416,-0.473653,0,0,0,0.044,1,0.85,1,0,0,4,561.7,1276,585.3,605.4,546.4,708.1,548.8,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,618.7,786.9,649,548.1
|
||||
359.27,359.36,38.4963361,1399.45,103.2048083,-0.9943111,-70.2011667,-0.4516833,38.4963357,1399.789,103.2048082,-0.8915289,-70.0568626,-0.4734192,0,0,0,0.045,1,0.85,1,0,0,4,561.8,1276,586.3,604.5,546.5,712.3,549.2,0,-128,1249,1148,0,-128,0,-128,0,-128,0,-128,618.6,787.4,649,548.2
|
||||
360.26,360.355,38.4963361,1399.45,103.2048083,-0.9894528,-70.2278389,-0.4890417,38.4963357,1399.789,103.2048082,-0.8887536,-70.0596092,-0.4737358,0,0,0,0.044,1,0.85,1,0,0,4,561.3,1276,585.7,605.3,546.6,708.5,549.1,0,-128,1249.1,1148,0,-128,0,-128,0,-128,0,-128,618.8,787,649.1,548.4
|
||||
361.315,361.41,38.4963361,1399.44,103.2048083,-1.011925,-70.2129722,-0.4881944,38.4963357,1399.789,103.2048082,-0.8823164,-70.0619259,-0.4737379,0,0,0,0.046,1,0.85,1,0,0,4,561.8,1276,585.2,605.2,546.6,713.3,549.3,0,-128,1247.5,1148,0,-128,0,-128,0,-128,0,-128,618.2,787.2,649.6,548.5
|
||||
362.305,362.4,38.4963361,1399.45,103.2048083,-1.0009861,-70.2352167,-0.4917833,38.4963357,1399.789,103.2048082,-0.8886815,-70.0579219,-0.4733937,0,0,0,0.046,1,0.85,1,0,0,4,561.3,1276,585.9,604.2,546.6,714.1,549,0,-128,1248.6,1148,0,-128,0,-128,0,-128,0,-128,618.4,787.3,649.3,548.5
|
||||
363.295,363.395,38.4963361,1399.45,103.2048083,-0.9860472,-70.2182556,-0.5285861,38.4963357,1399.789,103.2048082,-0.8921667,-70.0599397,-0.4737444,0,0,0,0.045,1,0.85,1,0,0,4,561.3,1276,585.7,604.8,546.8,713.1,549.4,0,-128,1247.8,1148,0,-128,0,-128,0,-128,0,-128,618.9,787.3,649.3,548.7
|
||||
364.285,364.38,38.4963361,1399.45,103.2048083,-0.9446917,-70.2411722,-0.5208944,38.4963357,1399.789,103.2048082,-0.886681,-70.0594489,-0.4730574,0,0,0,0.044,1,0.85,1,0,0,4,561.8,1276,585.6,603.9,546.7,713,549.4,0,-128,1248,1148,0,-128,0,-128,0,-128,0,-128,618.8,787.1,648.8,548.7
|
||||
365.275,365.365,38.4963361,1399.45,103.2048083,-0.9835333,-70.1897222,-0.4615694,38.4963357,1399.789,103.2048082,-0.905956,-70.0501776,-0.4738494,0,0,0,0.044,1,0.85,1,0,0,4,561.8,1276,585.6,605.2,546.7,707.2,549.2,0,-128,1249,1148,0,-128,0,-128,0,-128,0,-128,618.9,787.1,649.1,548.5
|
||||
366.26,366.36,38.4963361,1399.45,103.2048083,-0.93845,-70.21155,-0.4549611,38.4963356,1399.789,103.2048082,-0.8769849,-70.0730076,-0.472684,0,0,0,0.044,1,0.85,1,0,0,4,561.7,1276,585.4,604.4,546.8,707.5,549.1,0,-128,1248.2,1148,0,-128,0,-128,0,-128,0,-128,618.8,787.2,648.6,548.5
|
||||
367.25,367.345,38.4963361,1399.46,103.2048083,-0.95855,-70.2272111,-0.4385778,38.4963356,1399.789,103.2048082,-0.884885,-70.0594349,-0.472937,0,0,0,0.044,1,0.85,1,0,0,4,561.3,1276,585.4,605.9,546.3,706.5,548.7,0,-128,1247.5,1148,0,-128,0,-128,0,-128,0,-128,618.7,787.1,649.1,547.9
|
||||
368.245,368.34,38.4963361,1399.46,103.2048083,-0.9747083,-69.9361333,-0.3867861,38.4963356,1399.789,103.2048082,-0.8843494,-70.0643912,-0.4729597,0,0,0,0,0,0.85,1,0,0,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
369.23,369.325,38.4963361,1399.45,103.2048083,-0.9378139,-69.9607722,-0.3838583,38.4963356,1399.789,103.2048082,-0.8895703,-70.0619651,-0.4730122,0,0,0,0.046,1,0.85,1,0,0,104.2,535.2,1276,582.7,610.9,546.4,696.4,549.4,95.8,537.6,1247,1148,0,-128,0,-128,0,-128,0,-128,615.6,787.4,646.9,548.2
|
||||
370.22,370.31,38.4963361,1399.47,103.2048083,-0.9317611,-69.9519111,-0.3955139,38.4963356,1399.789,103.2048082,-0.8925454,-70.0600955,-0.4730278,0,0,0,0.049,1,0.85,1,0,0,17.3,-72.6,1276,583,611.4,547.6,694.5,549.8,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,614.1,786.9,646.8,549
|
||||
371.21,371.305,38.4963361,1399.47,103.2048083,-0.9726028,-69.9504556,-0.3909028,38.4963356,1399.789,103.2048082,-0.88857,-70.0617316,-0.4729093,0,0,0,0.049,1,0.85,1,0,0,17.8,-69.3,1276,585.4,611.1,547.8,695.7,549.9,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,613.9,786.9,646.9,549.2
|
||||
372.2,372.29,38.4963361,1399.48,103.2048083,-0.9439694,-69.8747889,-0.3968361,38.4963356,1399.789,103.2048082,-0.8969842,-70.0560881,-0.4735173,0,0,0,0.053,1,0.85,1,0,0,17.1,-72,1276,580.6,612.7,547.8,693.3,549.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,613.9,786.9,649.5,548.9
|
||||
373.19,373.28,38.4963361,1399.47,103.2048083,-0.9247444,-69.9999444,-0.3526611,38.4963356,1399.789,103.2048082,-0.8913483,-70.0610386,-0.4733175,0,0,0,0.048,1,0.85,1,0,0,107.2,538.8,1276,585.6,612,547.4,693.9,549.8,100,541.2,0,-128,0,-128,0,-128,0,-128,0,-128,614.4,787.2,646.7,548.9
|
||||
374.18,374.275,38.4963361,1399.48,103.2048083,-0.8846028,-69.9175556,-0.3705028,38.4963356,1399.789,103.2048082,-0.8857142,-70.0615025,-0.4729864,0,0,0,0.045,1,0.85,1,0,0,0,-128,1276,586.7,595.3,548.8,710.8,552.9,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,615.2,782.6,645.2,550.3
|
||||
375.17,375.26,38.4963361,1399.47,103.2048083,-0.8586389,-70.2154333,-0.4182944,38.4963356,1399.789,103.2048082,-0.8914006,-70.0594041,-0.4745531,0,0,0,0,0,0.85,1,0,0,0,-128,1248.2,1144.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
376.155,376.25,38.4963361,1399.45,103.2048083,-0.8909167,-70.5947889,-0.4443611,38.4963356,1399.789,103.2048082,-0.8866237,-70.0609982,-0.4739935,0,0,0,0,0,0.85,1,0,0,0,-128,1264.4,1148,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
377.145,377.24,38.4963361,1399.44,103.2048083,-0.9731417,-70.6869,-0.4520889,38.4963356,1399.789,103.2048082,-0.8930973,-70.0574928,-0.4734417,0,0,0,0,0,0.85,1,0,0,0,-128,1260.5,1051.7,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
378.14,378.235,38.4963361,1399.44,103.2048083,-0.9799917,-70.4739833,-0.4700917,38.4963356,1399.789,103.2048082,-0.7688196,-69.9300073,-0.538272,0,0,0,0,0,0.85,1,0,0,1119.5,1026.7,1252.9,1135.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
379.125,379.22,38.4963361,1399.45,103.2048083,-1.0489556,-69.2386556,-0.6373972,38.4963357,1399.789,103.2048081,-1.0118229,-68.9538982,-0.6198937,0,0,0,0,0,0.85,1,0,0,0,-128,202.4,514.9,0,-128,0,-128,0,-128,203,515.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
380.115,380.21,38.4963361,1399.45,103.2048083,-0.9658167,-69.2282278,-0.6148167,38.4963357,1399.789,103.2048081,-0.8777296,-69.0294287,-0.611068,0,0,0,0,0,0.85,1,0,0,0,-128,202.8,480.3,0,-128,0,-128,0,-128,203.3,481.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
381.11,381.2,38.4963361,1399.45,103.2048083,-0.9410833,-69.0373556,-0.5864556,38.4963356,1399.789,103.2048081,-0.8471397,-69.0583994,-0.6078774,0,0,0,0,0,0.85,1,0,0,0,-128,1249.8,1144.3,0,-128,1253.9,1100.1,0,-128,1238.5,1148,1227.3,1137.3,0,-128,1267.5,1116.1,0,-128,0,-128,0,-128
|
||||
382.095,382.19,38.4963361,1399.45,103.2048083,-0.879975,-68.8936778,-0.6771722,38.4963356,1399.789,103.2048081,-0.871397,-69.035441,-0.6087262,0,0,0,0,0,0.85,1,0,0,0,-128,1248.5,1144,0,-128,1276,1133.1,0,-128,1237.2,1148,0,-128,0,-128,1267.1,1117.8,0,-128,0,-128,0,-128
|
||||
383.085,383.175,38.4963361,1399.45,103.2048083,-0.9022889,-68.84865,-0.6721056,38.4963356,1399.789,103.2048081,-0.8709912,-69.0333423,-0.6083536,0,0,0,0,0,0.85,1,0,0,0,-128,1249.4,1145.3,0,-128,0,-128,0,-128,1240.9,1148,0,-128,0,-128,1270.8,1116.3,0,-128,0,-128,0,-128
|
||||
384.075,384.17,38.4963361,1399.45,103.2048083,-0.8887861,-68.9037,-0.5978528,38.4963356,1399.789,103.2048081,-0.8672331,-69.0376778,-0.6081659,0,0,0,0,0,0.85,1,0,0,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
385.065,385.155,38.4963361,1399.45,103.2048083,-1.0791306,-69.7117056,-0.5721583,38.4963355,1399.789,103.2048082,-0.6486044,-70.0137837,-0.573161,0,0,0,0,0,0.85,1,0,0,1139.2,1031.5,1258.7,1053.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
386.055,386.15,38.4963361,1399.45,103.2048083,-0.8915,-69.8105167,-0.5569417,38.4963355,1399.789,103.2048082,-0.8949654,-69.8449206,-0.5839926,0,0,0,0,0,0.85,1,0,0,0,-128,1270.6,1139.4,0,-128,1271.8,1104.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
387.05,387.145,38.4963361,1399.42,103.2048083,-0.9823611,-69.5234056,-0.6096361,38.4963355,1399.789,103.2048082,-0.9494993,-69.8235157,-0.5864278,0,0,0,0.052,1,0.85,1,0,0,0,-128,1276,582.2,609.8,543.5,704.1,548.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,615.7,784.5,650.6,548
|
||||
388.03,388.13,38.4963333,1399.56,103.2048083,-0.8917944,-69.2171556,-0.2786444,38.4963355,1399.789,103.2048082,-0.9116889,-69.8477498,-0.5844262,0,0,0,0.044,1,0.85,1,0,0,0,-128,1276,585.2,603.9,545.7,711.5,548.8,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,622.5,781.1,652.1,547.9
|
||||
389.02,389.12,38.4963944,1403.21,103.2048028,-0.7151083,-69.1596056,0.7766833,38.4963355,1399.801,103.204808,-0.836935,-69.8394513,1.6304813,0,0,0,0,0,0.85,1,0,0,18.5,-70.3,1254,1144.6,235.4,639.5,1276,1132.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
390.01,390.105,38.4963944,1402.85,103.2048028,-0.8439167,-69.80265,8.2159389,38.4963352,1399.845,103.2048074,-0.8653382,-70.3731391,8.4146876,0,0,0,0,0,0.85,1,0,0,19.3,-58.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
391.02,391.12,38.4963944,1402.37,103.2048028,-0.7616167,-69.86955,8.8057778,38.4963352,1399.849,103.2048072,-0.8621782,-70.3878934,8.8535712,0,0,0,0,0,0.85,1,0,0,19,-61.1,851.6,1017.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
392.01,392.115,38.4963944,1402.35,103.2048028,-0.7259056,-69.8429333,5.3813083,38.4963353,1399.816,103.2048077,-0.8156523,-70.3321255,2.6734873,0,0,0,0,0,0.85,1,0,0,0,-128,0,-128,565.5,564.2,588.6,560.7,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
393,393.095,38.4963944,1402.4,103.2048028,-0.7618528,-69.7580944,-0.4455333,38.4963354,1399.798,103.204808,-0.8562512,-70.3032219,-0.4140195,0,0,0,0.058,1,0.85,1,0,0,0,-128,1276,586.4,611.3,549.4,693.2,554.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,604.8,789.5,643.3,550.6
|
||||
393.99,394.08,38.4963944,1402.44,103.2048028,-0.0004944,-69.91455,-0.4885278,38.4963354,1399.795,103.204808,-0.0733085,-70.4170894,-0.6531643,0,0,0,0.065,1,0.85,1,0,0,4,565.3,1276,578.8,597.3,546.1,693.6,548.1,0,-128,1256.6,1148,0,-128,0,-128,0,-128,0,-128,598.2,788.9,637.8,547.5
|
||||
395.015,395.115,38.4963944,1402.48,103.2048028,1.9087806,-70.4364833,-0.9932833,38.4963352,1399.799,103.2048081,2.1068427,-70.881474,-1.0986528,0,0,0,0.084,1,0.85,1,0,0,4,571.6,1276,560.7,586.4,538.5,689.4,541.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,592.6,775.4,632.7,541.1
|
||||
396.005,396.1,38.4963944,1402.54,103.2048028,9.6048972,-69.2006222,-4.236525,38.4963347,1399.812,103.2048087,10.4988421,-69.6693186,-4.6620976,0,0,0,0.147,1,0.85,1,0,0,4,567.2,1276,387.3,608.2,445.4,678.4,439.7,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,603.1,675.6,642.4,443.8
|
||||
397.06,397.155,38.4963944,1402.63,103.2048028,10.8174111,-69.0791556,-4.6351861,38.4963345,1399.811,103.2048089,10.9301204,-69.8466977,-4.7904917,0,0,0,0.167,1,0.85,1,0,0,18.9,-61.9,1276,368.9,601.9,434.4,667.5,425.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,587,660.2,634.8,428.9
|
||||
398.05,398.145,38.4963333,1399.78,103.2048111,10.9004306,-69.0395944,-4.6577222,38.4963347,1399.811,103.2048088,10.8848372,-69.9510511,-4.7521166,0,0,0,0.163,1,0.85,1,0,0,4,569.2,1276,366.9,599,434,663.3,425.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,587.4,659.1,633,428.6
|
||||
399.07,399.165,38.4963333,1399.52,103.2048111,10.6690694,-68.7585444,-4.6062028,38.4963348,1399.811,103.2048088,10.7196648,-69.9799617,-4.6748265,0,0,0,0.161,1,0.85,1,0,0,6.6,568.7,1276,366.3,596.2,437,662.7,427.9,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,587.2,662.3,632.1,433.6
|
||||
400.06,400.155,38.4963333,1399.53,103.2048111,8.03755,-68.9503111,-3.5901417,38.4963351,1399.804,103.2048086,7.6241097,-70.3633306,-3.457627,0,0,0,0.134,1,0.85,1,0,0,4,570.4,1276,379.9,597.1,446.9,671.1,438.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,590.1,675.1,634.1,444.9
|
||||
401.05,401.14,38.4963361,1399.55,103.2048083,0.0988111,-69.4151667,-0.7421361,38.4963355,1399.799,103.2048082,-0.3886257,-70.1405979,-0.709597,0,0,0,0.063,1,0.85,1,0,0,4,562.8,1276,565.8,605.2,537.6,693,540.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,604.7,774.1,643.4,539.9
|
||||
402.075,402.165,38.4963361,1399.58,103.2048083,-0.7884583,-69.7685222,-0.6752,38.4963355,1399.789,103.2048081,-0.7664313,-69.9760831,-0.6075565,0,0,0,0.054,1,0.85,1,0,0,4,559.3,1276,584.7,608,541.8,706.8,546.8,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,616,780.7,651.1,545.7
|
||||
403.065,403.16,38.4963361,1399.55,103.2048111,-1.1568722,-69.7902444,-0.4230528,38.4963356,1399.79,103.204808,-1.0284274,-68.2234921,-0.168493,0,0,0,0.048,1,0.85,1,0,0,4,561.8,1276,589.2,614.8,553.9,713.9,555.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,626.8,793.9,659.6,554.8
|
||||
404.055,404.15,38.4963361,1399.57,103.2048083,-0.7219583,-57.8315111,2.5286028,38.4963362,1399.811,103.2048064,-0.7309978,-54.9724705,2.6404277,0,0,0,-0.185,1,0.85,1,0,0,4,649.4,1276,657.1,964.2,628.9,1061.5,629.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,1120.5,886.3,1004.8,629.9
|
||||
405.045,405.135,38.4963361,1399.59,103.2048083,-0.7193583,-56.21455,2.6416972,38.4963364,1399.808,103.2048062,-0.7127962,-53.6451331,2.6906677,0,0,0,-0.218,1,0.85,1,0,0,0,-128,1276,658.3,1074.7,645.5,1143.2,646.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,1246.7,904.4,1106.2,645.9
|
||||
406.03,406.125,38.4963361,1402.82,103.2048083,-0.6784944,-56.2498722,2.425375,38.4963364,1399.809,103.2048061,-0.6953722,-53.635983,2.5132306,0,0,0,-0.22,1,0.85,1,0,0,199.5,632.9,1276,653.7,1073.8,639.8,1150.7,644.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,1247.3,899.6,1106.5,642.5
|
||||
407.02,407.12,38.4963361,1403.08,103.2048083,-0.6677667,-57.1101444,2.7846833,38.4963364,1399.808,103.2048061,-0.6745877,-54.7916373,2.8726554,0,0,0,-0.202,1,0.85,1,0,0,180.9,645.3,1276,659.2,1061.9,646.8,1132.2,647.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,1225.5,912.8,1092.3,647.7
|
||||
408.01,408.105,38.4963361,1400.12,103.2048083,-1.00035,-71.7981722,2.0772028,38.4963358,1399.808,103.2048077,-0.8143311,-69.0339811,2.0513809,0,0,0,0.001,1,0.85,1,0,0,4,645.2,1276,660.8,697.9,630.2,804.9,634.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,734.7,894.5,738.4,633.3
|
||||
409,409.095,38.4963361,1400,103.2048083,-0.8867972,-70.7933722,0.6847389,38.4963359,1399.791,103.2048077,-0.8529057,-68.5506031,0.1270325,0,0,0,0.032,1,0.85,1,0,0,4,601.8,1276,622.1,628.1,587.1,725.6,589.8,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,651,842.2,675.2,589.1
|
||||
410.06,410.15,38.4963361,1399.58,103.2048083,-0.934225,-69.1635611,-0.2970472,38.4963359,1399.795,103.2048077,-0.8907145,-68.608753,-0.3119128,0,0,0,0.024,1,0.85,1,0,0,4,569,1276,594.8,643.3,554.7,740.8,557.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,671.3,797.4,689.7,555.6
|
||||
411.05,411.14,38.4963361,1399.55,103.2048083,-0.9173,-68.5028833,-0.2678889,38.4963359,1399.799,103.2048077,-0.8420511,-68.6560733,-0.3007611,0,0,0,0.025,1,0.85,1,0,0,4,568.4,1276,596.8,645.8,555,741.7,557.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,672,798,690.7,556
|
||||
412.07,412.16,38.4963361,1399.54,103.2048083,-0.8986667,-68.3273167,-0.2593306,38.4963359,1399.799,103.2048077,-0.8589849,-68.6412971,-0.3048497,0,0,0,0.021,1,0.85,1,0,0,4,567.8,1276,596.2,645.1,554.8,742.6,557.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,674.1,800.2,690.7,555.8
|
||||
413.06,413.155,38.4963361,1399.55,103.2048083,-0.8611889,-68.4478778,-0.2914806,38.4963358,1399.799,103.2048077,-0.8367602,-68.6443463,-0.3077904,0,0,0,0.022,1,0.85,1,0,0,4,567.8,1276,599.2,647.1,554.7,745.1,557.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,674.9,800.5,691.8,555.5
|
||||
414.05,414.145,38.4963361,1399.55,103.2048083,-0.8461556,-68.5472333,-0.3145778,38.4963358,1399.799,103.2048077,-0.8497044,-68.6513434,-0.3027978,0,0,0,0.022,1,0.85,1,0,0,4,567.8,1276,594.8,644.3,554.9,741.6,557.5,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,673.5,800.4,690.7,556
|
||||
415.04,415.13,38.4963361,1399.55,103.2048083,-0.8337722,-68.6708778,-0.3306278,38.4963358,1399.799,103.2048077,-0.8266967,-68.6703442,-0.3028647,0,0,0,0.022,1,0.85,1,0,0,4,568.5,1276,593.3,645.4,555,741.9,557.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,673.9,800.3,690.9,555.9
|
||||
416.03,416.125,38.4963361,1399.55,103.2048083,-0.8411333,-68.6429667,-0.293275,38.4963357,1399.799,103.2048077,-0.8042334,-68.687384,-0.3024529,0,0,0,0.022,1,0.85,1,0,0,4,569.1,1276,592.7,644.3,555,740.6,557.5,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,673.7,800.2,690.4,556
|
||||
417.02,417.115,38.4963361,1399.56,103.2048083,-0.9059694,-68.5953667,-0.2868472,38.4963357,1399.795,103.2048077,-0.8361087,-68.6719941,-0.3024007,0,0,0,0.02,1,0.85,1,0,0,4,568.3,1276,596.6,644.7,554.6,743.3,557.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,675.4,798,691,555.7
|
||||
418.01,418.105,38.4963361,1399.55,103.2048083,-0.7791528,-68.6095556,-0.2949694,38.4963357,1399.799,103.2048077,-0.8675956,-68.6311965,-0.3042381,0,0,0,0.021,1,0.85,1,0,0,4,568.5,1276,594.3,644,554.8,742.8,557.5,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,674.3,800.3,690.7,556
|
||||
419.035,419.13,38.4963361,1399.55,103.2048083,-0.846125,-68.53435,-0.2867417,38.4963357,1399.792,103.2048077,-0.859,-68.645719,-0.3038877,0,0,0,0.025,1,0.85,1,0,0,4,568.6,1276,597,645.2,554.8,741.5,557.5,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,672.2,797.9,690.7,555.9
|
||||
420.025,420.12,38.4963361,1399.55,103.2048083,-0.8295944,-68.4985333,-0.2687444,38.4963357,1399.799,103.2048077,-0.9001067,-68.6209928,-0.3051061,0,0,0,0.021,1,0.85,1,0,0,4,568.2,1276,596.3,645.2,554.7,742.1,557.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,674.1,800.7,691,555.8
|
||||
421.015,421.035,38.4963361,1399.55,103.2048083,-0.8014444,-68.49005,-0.3077778,38.4963357,1399.798,103.2048077,-0.9227628,-68.6074335,-0.3051352,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
422,422.025,38.4963361,1399.55,103.2048083,-0.8259417,-68.4716167,-0.3114528,38.4963357,1399.792,103.2048077,-0.921089,-68.6068546,-0.305047,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
422.99,423.085,38.4963361,1399.56,103.2048083,-0.8606639,-68.4810056,-0.318275,38.4963357,1399.797,103.2048076,-0.9113339,-68.6141818,-0.3047055,0,0,0,0.029,1,0.85,1,0,0,4,568.1,1276,595.3,658,555,733.9,556.7,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,671,797,692.5,556.1
|
||||
424.015,424.12,38.4963361,1399.56,103.2048083,-0.8176278,-68.4778111,-0.2941694,38.4963357,1399.789,103.2048077,-0.8901122,-68.6190694,-0.3044897,0,0,0,0.029,1,0.85,1,0,0,4,568.5,1276,591.5,651.6,555.4,740.5,557.7,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,670.5,796.6,691.5,556.6
|
||||
425.005,425.1,38.4963361,1399.56,103.2048083,-0.8559833,-68.4593833,-0.2520472,38.4963357,1399.794,103.2048077,-0.8595208,-68.6440584,-0.303354,0,0,0,0.027,1,0.85,1,0,0,4,568.1,1276,594,652.6,554.9,736.4,557.1,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,671.5,797.2,691.1,556.2
|
||||
425.995,426.085,38.4963361,1399.55,103.2048083,-0.8005944,-68.4595556,-0.2679972,38.4963357,1399.795,103.2048076,-0.8691974,-68.6357372,-0.3036408,0,0,0,0.028,1,0.85,1,0,0,4,568,1276,591.4,652.5,555.1,739.8,557.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,670.7,797.2,691.5,556.2
|
||||
426.985,427.08,38.4963361,1399.57,103.2048083,-0.7821,-68.6155222,-0.2408833,38.4963357,1399.789,103.2048076,-0.8693489,-68.6377084,-0.3035014,0,0,0,0.028,1,0.85,1,0,0,4,567.8,1276,594.2,653.5,555.2,735.3,557.1,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,670.9,797.7,691.7,556.3
|
||||
427.975,428.065,38.4963361,1399.56,103.2048083,-0.7460278,-68.4589667,-0.186525,38.4963357,1399.792,103.2048076,-0.8654503,-68.6392097,-0.3032694,0,0,0,0.027,1,0.85,1,0,0,4,568.4,1276,594.5,652.3,555,735.8,557.1,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,671.7,797,691.5,556.2
|
||||
428.965,429.06,38.4963361,1399.57,103.2048083,-0.7278889,-68.4658889,-0.1861611,38.4963356,1399.793,103.2048076,-0.8685797,-68.6377726,-0.303397,0,0,0,0.028,1,0.85,1,0,0,4,568.3,1276,595.2,652.4,555.2,735.5,557.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,671.1,797.4,691.5,556.3
|
||||
429.955,430.05,38.4963361,1399.56,103.2048083,-0.7672417,-68.4376222,-0.1934639,38.4963356,1399.792,103.2048076,-0.8675782,-68.6382341,-0.3034795,0,0,0,0.028,1,0.85,1,0,0,4,568.6,1276,594.8,652.8,555,735.8,557.1,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,671,797.4,691.7,556.1
|
||||
430.975,431.07,38.4963361,1399.55,103.2048083,-0.7838167,-68.8055944,-0.1906861,38.4963356,1399.789,103.2048076,-0.8659177,-68.639278,-0.3032904,0,0,0,0.029,1,0.85,1,0,0,4,570.8,1276,570.2,654.6,554.9,728.1,556.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,669.5,796.2,690.8,555.6
|
||||
432,432.095,38.4963361,1399.55,103.2048083,-0.7930694,-68.8821722,-0.2197889,38.4963356,1399.789,103.2048076,-0.8684059,-68.6382159,-0.3031603,0,0,0,0.002,1,0.85,1,0,0,4,574.9,1270.2,1129.1,664.1,557,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,679.6,802.8,684.8,556.9
|
||||
432.99,433.085,38.4963361,1399.53,103.2048083,-0.8153639,-68.8619944,-0.2240333,38.4963356,1399.789,103.2048076,-0.8665135,-68.6389238,-0.3032252,0,0,0,0,0,0.85,1,0,0,4,575,1253.3,1144,0,-128,1271.1,1104.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
433.98,434.07,38.4963361,1399.55,103.2048083,-0.8173861,-68.4798056,-0.2933389,38.4963357,1399.789,103.2048076,-0.8676211,-68.6382231,-0.303172,0,0,0,0,0,0.85,1,0,0,17.5,-61,1261.7,1148,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,442.7,570.1
|
||||
434.97,435.06,38.4963333,1399.58,103.2048111,-0.5584944,-73.4336611,1.7223194,38.4963351,1399.801,103.2048081,-0.7454401,-75.9530651,2.3309194,0,0,0,0.097,1,0.85,1,0,0,0,-128,809.5,593,589.1,585.6,683.9,590.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,559.2,844.2,623.4,589.2
|
||||
435.955,436.045,38.4963278,1399.58,103.2048111,-0.5536139,-110.8293889,4.7402361,38.4963319,1399.817,103.2048095,-0.7446202,-114.0044321,4.8579893,0,0,0,0,0,0.85,1,0,0,21.2,-61.2,1276,749.7,529.6,712.9,643.6,700.8,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
436.945,437.04,38.496325,1399.57,103.2048056,-0.8619611,-148.5819222,3.6432694,38.4963293,1399.807,103.2048066,-0.8877696,-155.4636442,3.0593687,0,0,0,0,0,0.85,1,0,0,4,-58.8,1276,740.2,864.4,733.7,934.8,730.8,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
437.935,438.025,38.4963222,1399.5,103.2048056,-1.2007611,-159.9514778,-0.387425,38.4963287,1399.779,103.2048062,-0.703337,-160.1384069,-0.46508,0,0,0,0,0,0.85,1,0,0,4,582,1276,626.2,525.9,600.7,660.5,608.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
438.925,439.025,38.4963222,1399.51,103.2048056,-1.2213028,-160.0050222,-0.4306,38.4963287,1399.779,103.2048062,-0.7456546,-160.0950666,-0.4236772,0,0,0,0,0,0.85,1,0,0,16.8,-68.2,1276,618.3,527.1,596,660.3,595.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,55.5,-105
|
||||
439.915,440.01,38.4963222,1399.54,103.2048056,-1.1782972,-159.6010444,-0.3404222,38.4963286,1399.779,103.2048061,-0.7492102,-160.0938607,-0.4255053,0,0,0,0,0,0.85,1,0,0,4,584.7,1276,618.2,524.1,597.5,661.3,597,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
440.905,440.995,38.4963222,1399.56,103.2048056,-1.1163306,-159.6369778,-0.3544583,38.4963285,1399.779,103.2048061,-0.7492035,-160.0923048,-0.425973,0,0,0,0,0,0.85,1,0,0,0,-128,1276,618.2,523.2,597.3,662.4,597.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
441.895,441.99,38.4963222,1399.57,103.2048056,-1.0672889,-159.6741333,-0.3534972,38.4963285,1399.779,103.2048061,-0.7524723,-160.0921899,-0.4254831,0,0,0,0,0,0.85,1,0,0,18.9,-65.2,1276,618.4,526.2,596.1,662.6,595,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
442.885,442.99,38.4963222,1399.59,103.2048056,-0.8042806,-160.6065111,0.0806361,38.4963285,1399.781,103.2048059,-0.5540786,-161.2721324,0.0242041,0,0,0,0,0,0.85,1,0,0,0,-128,805.5,590.4,1031.6,916.4,745.8,589.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
443.875,443.97,38.4963222,1399.64,103.2048,-0.4644722,171.0203333,3.8209167,38.4963288,1399.81,103.2048018,-0.4953899,161.5916049,4.609772,0,0,0,0,0,0.85,1,0,0,4,705.1,1276,704,452.8,728.2,943,702.5,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
444.865,444.96,38.4963278,1399.65,103.2047917,-0.4172417,123.0288444,5.2315417,38.496331,1399.813,103.2047979,-0.465334,117.2427444,4.5061671,0,0,0,-0.413,1,0.85,1,0,0,18.9,-60.7,1259.5,1139.8,459.8,724.6,1276,1133.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,1276,1141.9,48,-88.1
|
||||
445.855,445.95,38.4963278,1399.58,103.2047889,-0.7055833,113.2801556,1.088475,38.4963318,1399.789,103.2047966,-0.6521828,111.7421073,0.5758402,0,0,0,0,0,0.85,1,0,0,21.1,-58.3,1260.4,1148,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
446.845,446.935,38.4963278,1399.55,103.2047889,-0.7671333,113.2939556,0.1874667,38.4963317,1399.779,103.2047964,-0.6092474,112.0590975,0.0536894,0,0,0,0,0,0.85,1,0,0,23,-55.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
447.865,447.96,38.4963278,1399.55,103.2047889,-0.7443861,112.8126444,0.1855444,38.4963317,1399.779,103.2047963,-0.6491517,112.0883172,0.0344774,0,0,0,0,0,0.85,1,0,0,25.7,-58.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
448.89,448.985,38.4963278,1399.56,103.2047889,-0.7491222,112.1028444,0.1511972,38.4963318,1399.779,103.2047963,-0.6198047,112.0678815,0.0412253,0,0,0,0,0,0.85,1,0,0,21.5,-58.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
449.88,449.98,38.4963278,1399.57,103.2047889,-0.7037111,111.7484222,0.1464639,38.4963318,1399.779,103.2047963,-0.6356098,112.0792399,0.0402168,0,0,0,0,0,0.85,1,0,0,22.1,-56.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
450.87,450.96,38.4963278,1399.57,103.2047889,-0.7213278,110.7413556,0.1450222,38.4963318,1399.779,103.2047963,-0.6489096,112.0890931,0.040053,0,0,0,0,0,0.85,1,0,0,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
451.855,451.95,38.4963306,1399.6,103.2047889,-0.4807556,103.3288,3.0422944,38.4963329,1399.799,103.2047959,-0.5315384,98.8645258,2.958443,0,0,0,0,0,0.85,1,0,0,23.6,-63.4,1265.3,1148,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
452.845,452.94,38.4963361,1399.66,103.2047889,-0.2816444,61.1629333,5.6359972,38.4963365,1399.817,103.2047964,-0.3628014,56.3823667,5.5654703,0,0,0,0,0,0.85,1,0,0,0,-128,1276,766,0,-128,268.9,705.9,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
453.835,453.93,38.4963417,1399.64,103.2047944,-0.3369083,23.2016889,3.1492694,38.496339,1399.807,103.2047986,-0.435728,22.2745842,2.8415569,0,0,0,0,0,0.85,1,0,0,1069.5,640.8,1270.4,1140.8,1086.9,606.5,1110,608,1070.6,640.7,1083.7,646.7,0,-128,0,-128,0,-128,0,-128,0,-128,53,-117.5
|
||||
454.825,454.92,38.4963417,1399.58,103.2047944,-0.6970583,22.1612222,0.0471278,38.4963394,1399.782,103.2047985,-0.6523723,22.6659606,-0.4484155,0,0,0,0,0,0.85,1,0,0,16.8,-61.9,1271.6,1140.4,0,-128,1276,1129.9,0,-128,911.8,557.7,0,-128,0,-128,0,-128,0,-128,0,-128,49.4,-111.9
|
||||
455.815,455.905,38.4963417,1399.55,103.2047944,-0.8186639,22.7285778,-0.4368694,38.4963394,1399.784,103.2047985,-0.590521,22.5979728,-0.4547882,0,0,0,0,0,0.85,1,0,0,0,-128,1273.8,1136.7,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
456.805,456.895,38.4963417,1399.56,103.2047944,-0.8389667,22.5433333,-0.4510389,38.4963395,1399.779,103.2047986,-0.613935,22.6055744,-0.4542261,0,0,0,0,0,0.85,1,0,0,0,-128,1273.8,1136.8,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
457.795,457.885,38.4963417,1399.57,103.2047944,-0.7777944,22.5398889,-0.4489,38.4963395,1399.78,103.2047987,-0.5877495,22.5924602,-0.4533177,0,0,0,0,0,0.85,1,0,0,19.5,-61.4,1273.8,1136.5,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
458.785,458.875,38.4963417,1399.58,103.2047944,-0.7686389,22.7500889,-0.4607944,38.4963395,1399.781,103.2047987,-0.598759,22.5994831,-0.4539773,0,0,0,0,0,0.85,1,0,0,17.6,-68,1252.5,1144.1,0,-128,1270.9,1108.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
459.775,459.87,38.4963417,1399.57,103.2047944,-0.7266472,22.9420444,-0.5303528,38.4963395,1399.785,103.2047988,-0.5928664,22.5952358,-0.4527857,0,0,0,0,0,0.85,1,0,0,19.5,-67,1276,1148,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
460.765,460.855,38.4963417,1399.57,103.2047944,-0.5767722,20.6502444,1.101225,38.4963395,1399.792,103.2047991,-0.3992843,20.0829866,1.5973042,0,0,0,0,0,0.85,1,0,0,16.2,-72,1270.5,1148,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,51.6,-85.3
|
||||
461.75,461.845,38.4963417,1399.58,103.2048,-0.4188639,-4.6072278,3.9224083,38.4963401,1399.818,103.2048029,-0.6011336,-15.1037637,4.8974862,0,0,0,0,0,0.85,1,0,0,0,-128,1247.7,1146.5,0,-128,1276,1141.7,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
462.74,462.835,38.4963389,1399.62,103.2048083,-0.8011389,-49.0879333,3.9633278,38.4963385,1399.807,103.204807,-0.8852355,-56.6190233,3.5091491,0,0,0,-0.419,1,0.85,1,0,0,4,703.6,1253,1139.6,752.1,699.1,1276,1132.4,0,-128,1251.2,1148,0,-128,0,-128,0,-128,0,-128,1276,1140.6,51.9,-111.7
|
||||
463.73,463.825,38.4963361,1399.55,103.2048111,-0.7883111,-65.8116778,0.0350833,38.4963377,1399.779,103.2048087,-0.888045,-67.8454981,-0.0702215,0,0,0,-0.174,1,0.85,1,0,0,4,582.6,1276,601.2,642.4,568,771.6,571,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,810.5,822.4,706,571.4
|
||||
464.72,464.815,38.4963361,1399.56,103.2048111,-1.1737611,-65.5075278,-0.1568694,38.4963377,1399.779,103.2048088,-0.9404387,-67.6501075,-0.1378497,0,0,0,-0.181,1,0.85,1,0,0,4,579.7,1276,596.5,629.5,561.4,782,568.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,823.8,817.9,714.1,564.3
|
||||
465.71,465.8,38.4963361,1399.55,103.2048111,-1.1610056,-65.5192111,-0.1760667,38.4963377,1399.779,103.2048089,-0.9429947,-67.6413699,-0.1390421,0,0,0,-0.181,1,0.85,1,0,0,4,579.8,1276,596.6,639.7,561,778.4,568,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,823.6,818,713.5,564.3
|
||||
466.7,466.795,38.4963361,1399.53,103.2048111,-1.1778472,-65.5248111,-0.2071333,38.4963378,1399.779,103.2048089,-0.9302557,-67.6533869,-0.1362626,0,0,0,-0.181,1,0.85,1,0,0,4,579.4,1276,596.5,631.8,561.9,778.5,568.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,823.8,818,713.8,564.8
|
||||
467.69,467.78,38.4963361,1399.54,103.2048111,-1.1307472,-65.5204167,-0.2356806,38.4963379,1399.779,103.204809,-0.9385094,-67.6466087,-0.1351055,0,0,0,-0.177,1,0.85,1,0,0,0,-128,1276,602.4,662.7,562.1,763.6,567.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,820.6,817.9,713.7,565.5
|
||||
468.68,468.78,38.4963361,1399.54,103.2048111,-1.0879583,-66.9261833,-0.2202,38.4963379,1399.779,103.2048091,-0.9327673,-67.6514961,-0.134776,0,0,0,-0.179,1,0.85,1,0,0,0,-128,1276,603.9,663.4,562.1,765.7,568.5,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,820.3,815.4,713.3,566.3
|
||||
469.67,469.76,38.4963361,1399.54,103.2048111,-1.0758,-67.3661778,-0.2314278,38.4963379,1399.779,103.2048091,-0.9360719,-67.6488702,-0.1345894,0,0,0,-0.18,1,0.85,1,0,0,0,-128,1276,603.8,661,560.2,767.4,568.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,820.5,815.4,713.5,566.4
|
||||
470.66,470.755,38.4963361,1399.55,103.2048111,-1.0839389,-67.3583389,-0.2586028,38.4963379,1399.779,103.2048092,-0.9416791,-67.6459411,-0.1341434,0,0,0,-0.177,1,0.85,1,0,0,201.3,515.4,1276,602.7,663.8,559.8,759.7,568.4,201.9,515,0,-128,0,-128,0,-128,0,-128,0,-128,820.3,817.8,713.8,566.7
|
||||
471.65,471.745,38.4963361,1399.55,103.2048111,-1.1609611,-67.4478056,-0.2293222,38.496338,1399.779,103.2048092,-0.9376896,-67.6476593,-0.1342776,0,0,0,-0.177,1,0.85,1,0,0,201.6,513.4,1276,602.9,661.2,559.3,765.6,568.3,201.8,513.8,0,-128,0,-128,0,-128,0,-128,0,-128,820.3,817.7,714.4,566.8
|
||||
472.64,472.73,38.4963361,1399.55,103.2048111,-1.1992,-67.4804889,-0.2556167,38.496338,1399.779,103.2048093,-0.9374852,-67.6491629,-0.1335552,0,0,0,-0.178,1,0.85,1,0,0,199.7,517.3,1276,602.9,662.3,558.1,765.3,568.4,200.1,516.1,272.5,539.2,0,-128,0,-128,0,-128,0,-128,820.2,817.7,713.5,566.7
|
||||
473.625,473.72,38.4963361,1399.55,103.2048111,-1.2641056,-67.5216389,-0.2626667,38.496338,1399.779,103.2048093,-0.9520221,-67.6422115,-0.1336834,0,0,0,-0.177,1,0.85,1,0,0,0,-128,1276,604.5,660.7,559.8,765.2,567.7,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,820.8,818.3,714.1,566.3
|
||||
474.615,474.71,38.4963361,1399.56,103.2048111,-1.1820917,-67.6846833,-0.2641556,38.496338,1399.779,103.2048094,-0.9463552,-67.6435285,-0.1337217,0,0,0,-0.175,1,0.85,1,0,0,312.1,544.9,1276,599.4,663,562.3,758.1,564.7,310.3,542.1,0,-128,0,-128,0,-128,0,-128,0,-128,820.4,818.2,714.1,564.6
|
||||
475.605,475.695,38.4963361,1399.56,103.2048111,-1.1820472,-67.6119333,-0.2588639,38.496338,1399.779,103.2048094,-0.9105308,-67.6678223,-0.1309762,0,0,0,-0.176,1,0.85,1,0,0,19.3,-66.2,1276,599.6,668.8,563,762.9,565.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,820.6,818,714.1,564.7
|
||||
476.665,476.755,38.4963361,1399.58,103.2048111,-1.0889056,-67.7952778,-0.3048944,38.496338,1399.779,103.2048094,-0.9415612,-67.6467789,-0.1314067,0,0,0,-0.175,1,0.85,1,0,0,19.4,-64.1,1276,595.4,657.2,561.4,763.8,564.5,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,820.9,817,714.9,564
|
||||
477.655,477.75,38.4963361,1399.57,103.2048111,-1.0964889,-67.9414611,-0.3191083,38.496338,1399.779,103.2048095,-0.9378496,-67.648405,-0.1317089,0,0,0,-0.176,1,0.85,1,0,0,19.9,-63.3,1276,595.4,657.3,561.5,764,564.5,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,820.7,814.4,715.1,564
|
||||
478.64,478.735,38.4963361,1399.57,103.2048111,-1.0973472,-67.8437667,-0.2865556,38.496338,1399.779,103.2048095,-0.9384736,-67.6476499,-0.1315657,0,0,0,-0.176,1,0.85,1,0,0,273.8,548.7,1276,594.5,656.2,560.9,764.3,564.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,821.7,817.3,714.7,563.6
|
||||
479.63,479.73,38.4963361,1399.5,103.2048111,-1.0947833,-67.8120056,-0.2745417,38.496338,1399.779,103.2048095,-0.9352575,-67.6497517,-0.1311772,0,0,0,0,0,0.85,1,0,0,0,-128,1269.9,1140.3,1160.5,1139.5,1266.5,1090.2,0,-128,1249.9,1148,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
480.655,480.745,38.4963361,1399.55,103.2048111,-1.1096389,-67.6824056,-0.3146444,38.496338,1399.779,103.2048096,-0.936335,-67.6491132,-0.1312627,0,0,0,0,0,0.85,1,0,0,20.2,-59.8,1263.1,1148,0,-128,1276,1132.7,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
481.645,481.735,38.4963361,1399.56,103.2048111,-1.0817833,-67.5518111,-0.2981389,38.496338,1399.779,103.2048096,-0.934765,-67.6493741,-0.1309653,0,0,0,0,0,0.85,1,0,0,523.3,809.1,1265.1,1148,0,-128,1276,1139.9,523.8,808.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
482.635,482.73,38.4963361,1399.56,103.2048111,-1.1109333,-67.7462778,-0.3265861,38.496338,1399.779,103.2048096,-0.9366407,-67.6486279,-0.1307634,0,0,0,0,0,0.85,1,0,0,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
483.655,483.745,38.4963361,1399.57,103.2048111,-1.0948222,-67.9587,-0.2948056,38.4963381,1399.779,103.2048096,-0.9373477,-67.6481236,-0.1303976,0,0,0,-0.177,1,0.85,1,0,0,0,-128,1276,601.2,670.1,560.9,769.3,565.1,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,819.1,814.1,713.6,565.4
|
||||
484.645,484.74,38.4963361,1399.56,103.2048111,-1.0975722,-68.0219778,-0.2444722,38.4963381,1399.779,103.2048096,-0.9370581,-67.6479328,-0.1305108,0,0,0,-0.176,1,0.85,1,0,0,0,-128,1276,601.2,0,-128,768.7,566.5,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,818.6,813.6,714.2,565.7
|
||||
485.635,485.73,38.4963361,1399.56,103.2048111,-1.1234361,-68.0634667,-0.2503083,38.4963381,1399.779,103.2048097,-0.9368457,-67.6480054,-0.130329,0,0,0,-0.176,1,0.85,1,0,0,0,-128,1276,601.2,0,-128,766.2,564.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,818.5,813.7,713.8,565.1
|
||||
486.625,486.72,38.4963361,1399.56,103.2048111,-1.1293639,-68.0385444,-0.2682306,38.4963381,1399.779,103.2048097,-0.937024,-67.6479813,-0.1300876,0,0,0,-0.18,1,0.85,1,0,0,0,-128,1276,601.1,0,-128,763.5,564.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,817.9,813.4,711.2,565.7
|
||||
487.615,487.705,38.4963361,1399.55,103.2048111,-1.1030611,-67.8798611,-0.27715,38.4963381,1399.779,103.2048097,-0.937528,-67.6477661,-0.1300277,0,0,0,-0.175,1,0.85,1,0,0,0,-128,1276,599.9,0,-128,765.9,564.5,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,818.5,813.7,714.1,564.9
|
||||
488.605,488.695,38.4963361,1399.53,103.2048111,-1.1043694,-67.7435556,-0.3170083,38.4963381,1399.779,103.2048097,-0.9382569,-67.647273,-0.129921,0,0,0,-0.18,1,0.85,1,0,0,18.4,-63.1,1276,600.1,670.1,561.3,764.4,565.1,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,819.3,814.3,712.3,565.3
|
||||
489.595,489.69,38.4963361,1399.52,103.2048111,-1.0870417,-67.7276056,-0.3526694,38.4963381,1399.779,103.2048097,-0.9390691,-67.6467902,-0.1299268,0,0,0,-0.177,1,0.85,1,0,0,0,-128,1276,601.2,0,-128,764.2,565.1,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,818.3,813.7,713.9,566.6
|
||||
490.585,490.68,38.4963361,1399.51,103.2048111,-1.0900917,-67.7495667,-0.2826111,38.4963381,1399.779,103.2048097,-0.938546,-67.6471242,-0.1297594,0,0,0,-0.176,1,0.85,1,0,0,20.4,-60.7,1276,599.8,669.3,559.7,772.7,562.7,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,818.8,814,714.3,565.1
|
||||
491.575,491.67,38.4963361,1399.5,103.2048111,-1.1243472,-67.7682333,-0.3019361,38.4963381,1399.779,103.2048098,-0.9372971,-67.6476826,-0.1297797,0,0,0,-0.18,1,0.85,1,0,0,18.8,-63.5,1276,597.3,670,561,764.7,564.8,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,819.5,813.9,712.5,565.1
|
||||
492.56,492.655,38.4963361,1399.52,103.2048111,-1.1227389,-67.6104889,-0.2464944,38.4963381,1399.779,103.2048098,-0.9399199,-67.646547,-0.1297994,0,0,0,0,0,0.85,1,0,0,17.8,-68.2,1270,1140.4,0,-128,1276,1129.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
493.55,493.645,38.4963361,1399.53,103.2048111,-1.1409944,-67.5696889,-0.0062278,38.4963381,1399.78,103.2048097,-0.8761814,-67.6909564,0.3179142,0,0,0,0,0,0.85,1,0,0,0,-128,1271.7,1139.1,0,-128,1273.7,1099.5,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
494.54,494.635,38.4963361,1399.63,103.2048111,-1.1117806,-67.7455222,6.8846083,38.496338,1399.827,103.2048092,-0.9273366,-67.8122548,7.068244,0,0,0,0,0,0.85,1,0,0,0,-128,1271.6,1140,0,-128,1276,1134.5,0,-128,1027.2,326.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
495.53,495.625,38.4963361,1399.63,103.2048111,-1.09935,-67.8553389,7.1568111,38.4963379,1399.826,103.2048091,-0.9230582,-67.7911516,7.2309825,0,0,0,0,0,0.85,1,0,0,18.7,-58.5,1272.6,1139.8,0,-128,1276,1134.5,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
496.52,496.61,38.4963361,1399.63,103.2048111,-1.1002694,-67.8900778,6.9970194,38.4963379,1399.826,103.204809,-0.9307273,-67.7593935,7.11395,0,0,0,0,0,0.85,1,0,0,18.4,-58.8,1272.5,1139.5,0,-128,1276,1131.1,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
497.51,497.605,38.4963361,1399.64,103.2048111,-1.0974694,-68.0029611,7.0760167,38.4963379,1399.826,103.204809,-0.9288398,-67.7434397,7.0992135,0,0,0,0,0,0.85,1,0,0,18.3,-58.2,1271.9,1139,0,-128,1274.4,1100.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
498.5,498.595,38.4963361,1399.6,103.2048111,-1.07155,-68.1217333,1.8396056,38.4963382,1399.787,103.2048095,-0.8962683,-67.4869282,0.252566,0,0,0,0,0,0.85,1,0,0,26.3,-56.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
499.49,499.585,38.4963361,1399.57,103.2048111,-1.0343306,-67.9709722,-0.203725,38.4963382,1399.779,103.2048095,-0.9108848,-67.4565258,-0.1403427,0,0,0,0,0,0.85,1,0,0,0,-128,1266,1148,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
500.48,500.57,38.4963361,1399.58,103.2048111,-1.0761833,-67.7984222,-0.236975,38.4963382,1399.779,103.2048095,-0.9307391,-67.4374329,-0.1413654,0,0,0,-0.185,1,0.85,1,0,0,4,579.5,1276,595.2,646.2,562,787.7,566.1,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,833.3,817.6,721.1,564.5
|
||||
501.47,501.565,38.4963361,1399.59,103.2048111,-1.0053361,-67.5613111,-0.2701083,38.4963381,1399.779,103.2048096,-0.8797708,-67.4883492,-0.1414018,0,0,0,-0.184,1,0.85,1,0,0,4,579.3,1276,595.8,651,561.8,786.9,566.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,833.3,817.2,722,564.7
|
||||
502.49,502.58,38.4963361,1399.61,103.2048111,1.7797917,-67.8900667,-0.5966417,38.496338,1399.789,103.2048098,2.6570119,-67.6951216,-1.028834,0,0,0,-0.144,1,0.85,1,0,0,4,596.9,1276,556.6,644.5,550.5,753.9,547.9,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,803.9,802.7,699.4,550.5
|
||||
503.48,503.57,38.4963361,1399.65,103.2048111,6.6459528,-66.5332889,-2.8627306,38.4963377,1399.796,103.2048101,7.2100345,-67.6541276,-2.902579,0,0,0,-0.133,1,0.85,1,0,0,4,586.6,1276,464.3,643.5,487,765.4,477.1,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,822.8,717.8,710,483
|
||||
504.47,504.565,38.4963361,1399.66,103.2048111,7.5897861,-65.7622444,-3.2362694,38.4963376,1399.805,103.2048103,7.6711547,-67.3935878,-3.1750472,0,0,0,-0.128,1,0.85,1,0,0,4,583.4,1276,434.3,663.4,468.9,757.5,461.8,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,824.4,697.6,714.5,467.1
|
||||
505.46,505.555,38.4963361,1399.64,103.2048111,7.4671778,-65.7428667,-3.1097861,38.4963375,1399.797,103.2048103,7.627309,-67.5817718,-3.0532206,0,0,0,-0.122,1,0.85,1,0,0,4,586.7,1276,441.2,651.6,475.6,751.4,466.5,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,813.5,702.6,707,470.9
|
||||
506.45,506.54,38.4963361,1399.62,103.2048111,7.3017167,-65.4050778,-3.0817694,38.4963375,1399.796,103.2048103,6.6003657,-67.5181125,-2.6969027,0,0,0,-0.133,1,0.85,1,0,0,4,582.5,1276,436.6,662.4,469.8,752.7,462.5,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,821.9,700.3,713.5,467.9
|
||||
507.44,507.53,38.4963361,1399.64,103.2048111,0.9382028,-65.6983667,-0.6016972,38.4963378,1399.781,103.20481,0.5048052,-67.4104383,-0.5214019,0,0,0,-0.171,1,0.85,1,0,0,4,588.7,1276,555.7,649.4,547.2,770.1,546.8,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,818.5,796.9,709.1,547.4
|
||||
508.43,508.525,38.4963361,1399.64,103.2048111,-1.0156389,-65.2152889,-0.5199306,38.4963379,1399.779,103.20481,-0.774214,-66.7911583,-0.4537472,0,0,0,-0.183,1,0.85,1,0,0,4,570.1,1276,586.3,683.8,550.9,801.3,554.1,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,851.8,807.5,739.5,553.7
|
||||
509.42,509.51,38.4963361,1399.64,103.2048111,-0.9580361,-65.988,-0.5443056,38.496338,1399.779,103.20481,-0.773299,-66.7999121,-0.4492101,0,0,0,-0.18,1,0.85,1,0,0,4,566.5,1276,587.4,691.6,551.1,801.1,554.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,851.7,807.4,741.4,554.1
|
||||
510.41,510.5,38.4963361,1399.66,103.2048111,-0.92315,-66.1260611,-0.5019417,38.496338,1399.779,103.20481,-0.7883077,-66.7926807,-0.4496811,0,0,0,-0.181,1,0.85,1,0,0,325,517.5,1276,588.9,693.9,549.8,800.4,555.1,383.5,543.3,0,-128,0,-128,0,-128,0,-128,0,-128,852,808,740.9,554.3
|
||||
511.4,511.49,38.4963361,1399.67,103.2048111,-0.9019889,-65.9491056,-0.4660944,38.496338,1399.779,103.20481,-0.8328472,-66.7552652,-0.4501191,0,0,0,-0.177,1,0.85,1,0,0,0,-128,1276,588.8,689.1,552.7,807.5,555.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,848,806.7,741.2,556
|
||||
512.385,512.48,38.4963361,1399.68,103.2048111,-0.7538222,-59.8223889,1.4968722,38.4963385,1399.8,103.2048097,-0.8902203,-59.7369282,1.5290233,0,0,0,0,0,0.85,1,0,0,21.8,-58.8,1248.9,1145,0,-128,1276,1130.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
513.375,513.475,38.4963361,1399.7,103.2048111,-0.9644667,-47.2223333,2.9793972,38.4963397,1399.808,103.2048092,-0.8429654,-46.4186176,2.9603934,0,0,0,-0.401,1,0.85,1,0,0,4,670.5,991.5,659.5,632.8,663.4,848.7,657.6,0,-128,996.4,645.9,0,-128,0,-128,0,-128,0,-128,1276,1143,840.5,653.5
|
||||
514.365,514.46,38.4963361,1399.7,103.2048111,-1.0677306,-46.5533722,2.9439361,38.4963398,1399.808,103.2048092,-0.8702841,-46.1809824,3.0214151,0,0,0,-0.27,1,0.85,1,0,0,4,682.6,1099.7,660.9,831.1,643.6,1010.4,660.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,1276,1142.8,974.5,658.2
|
||||
515.355,515.445,38.4963361,1399.67,103.2048111,-1.0913667,-46.6589222,2.7079167,38.4963399,1399.809,103.2048092,-0.8722331,-46.2257031,2.7271137,0,0,0,0,0,0.85,1,0,0,4,661.8,1073.6,650.4,829.9,639.6,1002.3,648,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
516.345,516.44,38.4963361,1399.65,103.2048111,-1.0762361,-46.9485111,2.6961778,38.4963399,1399.809,103.2048092,-0.8571173,-46.6009922,2.745018,0,0,0,0,0,0.85,1,0,0,4,668.2,1072.4,653.1,813.8,642.1,919.7,640.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
517.335,517.43,38.4963361,1399.63,103.2048111,-1.3616861,-55.2932222,2.4883583,38.4963388,1399.799,103.2048094,-0.8054226,-57.7246359,2.7491215,0,0,0,-0.383,1,0.85,1,0,0,21,-58.1,0,-128,1104,659.9,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,1228.9,756.1,1123.8,646.1
|
||||
518.325,518.415,38.4963361,1399.6,103.2048111,-1.0179861,-72.1613056,1.1915083,38.4963376,1399.797,103.2048095,-0.8477469,-71.4057322,0.8491904,0,0,0,-0.073,1,0.85,1,0,0,19.5,-56.7,1276,644,543.8,602.7,659.8,609.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,648.1,883,601.8,606.5
|
||||
519.315,519.41,38.4963361,1399.53,103.2048111,-1.0496167,-71.7527778,-0.0788194,38.4963376,1399.779,103.2048096,-0.9048391,-71.0836172,-0.1125936,0,0,0,-0.09,1,0.85,1,0,0,0,-128,1276,600.3,588.9,563.4,697.6,561.9,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,672.9,812.8,621.1,563.2
|
||||
520.335,520.43,38.4963361,1399.49,103.2048111,-1.1261667,-71.7301944,-0.1120111,38.4963376,1399.779,103.2048096,-0.9821724,-71.0315473,-0.1119345,0,0,0,0,0,0.85,1,0,0,0,-128,1260.6,1148,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
521.325,521.415,38.4963361,1399.47,103.2048111,-1.1290861,-71.3264389,-0.1067833,38.4963376,1399.779,103.2048096,-0.9549423,-71.0442464,-0.1085038,0,0,0,0,0,0.85,1,0,0,19.9,-59.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
522.335,522.425,38.4963361,1399.45,103.2048111,-1.0991722,-71.0519167,-0.1137667,38.4963377,1399.779,103.2048096,-0.9617521,-71.0426007,-0.108635,0,0,0,0,0,0.85,1,0,0,19.8,-61.6,1252.6,1135.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
523.325,523.42,38.4963361,1399.45,103.2048111,-1.0722972,-71.0422389,-0.1034,38.4963377,1399.779,103.2048096,-0.9570516,-71.0409547,-0.1075624,0,0,0,0,0,0.85,1,0,0,663.5,611.7,1248.9,1144,718.2,696.7,721.9,696.9,665.4,612.9,707.8,716.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
524.315,524.415,38.4963361,1399.44,103.2048111,-1.0791556,-71.0132,-0.0921528,38.4963377,1399.779,103.2048096,-0.9538473,-71.0450005,-0.1068953,0,0,0,0,0,0.85,1,0,0,740.6,892,740.2,885.1,737.2,848.8,743.3,850.9,738.5,891.5,740.7,886.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
525.305,525.4,38.4963361,1399.47,103.2048111,-1.0234444,-70.9779,-0.0954444,38.4963378,1399.779,103.2048096,-0.9622216,-71.0370454,-0.1068117,0,0,0,0,0,0.85,1,0,0,736.8,846.1,1258.8,1148,733.4,829.3,737.6,829.5,741.1,845.5,741.4,841.9,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
526.325,526.43,38.4963361,1399.51,103.2048111,-1.060775,-70.9532944,-0.0956278,38.4963378,1399.779,103.2048096,-0.957512,-71.0417098,-0.1059163,0,0,0,0,0,0.85,1,0,0,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,9.9,542.5,0,-128,0,-128,0,-128,0,-128,95.2,907.6
|
||||
527.315,527.405,38.4963361,1399.55,103.2048111,-1.0918306,-71.0209722,-0.0866194,38.4963378,1399.779,103.2048096,-0.9685491,-71.0331691,-0.1062007,0,0,0,0,0,0.85,1,0,0,17.1,-59.8,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
528.305,528.4,38.4963361,1399.57,103.2048111,-1.0898222,-71.0000056,-0.0799472,38.4963378,1399.779,103.2048096,-0.9633453,-71.0370194,-0.1061405,0,0,0,0,0,0.85,1,0,0,16.9,-63.1,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
529.295,529.395,38.4963361,1399.57,103.2048111,-1.0508917,-71.0616167,-0.141225,38.4963379,1399.779,103.2048096,-0.9608284,-71.0375395,-0.1057216,0,0,0,0,0,0.85,1,0,0,19.1,-68.4,1262.2,1148,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
530.35,530.445,38.4963361,1399.59,103.2048111,-1.0579972,-71.1044667,-0.1476861,38.4963379,1399.785,103.2048096,-0.9585401,-71.0385943,-0.1053438,0,0,0,0,0,0.85,1,0,0,0,-128,1265,1148,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
531.34,531.435,38.4963361,1399.61,103.2048111,-1.0149611,-71.1753056,-0.1580361,38.4963379,1399.787,103.2048096,-0.9581202,-71.0370277,-0.1052357,0,0,0,0,0,0.85,1,0,0,18.2,-66.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
532.33,532.42,38.4963361,1399.6,103.2048111,-0.9763056,-71.1678611,-0.196975,38.4963379,1399.789,103.2048096,-0.9489485,-71.042754,-0.104798,0,0,0,0,0,0.85,1,0,0,17.1,-67.9,1260.4,1148,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
533.32,533.415,38.4963361,1399.57,103.2048111,-0.9626361,-71.1067833,-0.1873,38.496338,1399.789,103.2048096,-0.9628441,-71.0309149,-0.1057826,0,0,0,0,0,0.85,1,0,0,21,-64.3,1260.6,1148,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
534.31,534.405,38.4963361,1399.56,103.2048111,-1.0213556,-71.2599278,-0.1925417,38.496338,1399.789,103.2048096,-0.9421964,-71.0465314,-0.104886,0,0,0,0,0,0.85,1,0,0,0,-128,1261.8,1148,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
535.3,535.39,38.4963361,1399.54,103.2048111,-1.0132278,-71.29065,-0.1643917,38.496338,1399.789,103.2048096,-0.9595756,-71.0342787,-0.1046899,0,0,0,-0.654,1,0.85,1,0,0,18.5,-63.2,1272.5,1127.7,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,1276,1141.8,132.3,416.4
|
||||
536.32,536.415,38.4963361,1399.55,103.2048111,-1.0185222,-71.2096611,-0.1634361,38.4963377,1399.789,103.2048097,-0.9702399,-71.0270721,-0.1047248,0,0,0,0,0,0.85,1,0,0,17.8,-62,1267.7,1148,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,47.1,-86.1
|
||||
537.31,537.405,38.4963361,1399.56,103.2048111,-1.0585889,-71.0664389,-0.1814472,38.4963378,1399.789,103.2048097,-0.966944,-71.0338233,-0.1056135,0,0,0,-0.046,1,0.85,1,0,0,0,-128,1265.6,1148,0,-128,1276,1137.7,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,111.1,521.2,105,459.3
|
||||
538.3,538.395,38.4963361,1399.57,103.2048111,-1.0141222,-71.0055944,-0.1595556,38.4963377,1399.789,103.2048097,-0.9569285,-71.0329087,-0.0980651,0,0,0,0,0,0.85,1,0,0,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
539.29,539.38,38.4963361,1399.57,103.2048111,-1.0383111,-71.0968167,-0.0923667,38.4963377,1399.789,103.2048097,-0.9706443,-71.0300011,-0.0957869,0,0,0,0,0,0.85,1,0,0,0,-128,1246.2,1146.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
540.28,540.375,38.4963361,1399.6,103.2048111,-1.0185944,-71.1399167,-0.0904111,38.4963377,1399.789,103.2048097,-0.9689271,-71.0262433,-0.105195,0,0,0,0,0,0.85,1,0,0,22.3,-58.4,1262.4,1148,936,245.2,939.8,245.8,931.5,256.6,937.7,253.8,0,-128,0,-128,0,-128,0,-128,0,-128,53.2,-83.1
|
||||
541.27,541.365,38.4963361,1399.58,103.2048111,-1.0578944,-71.2088833,-0.1626944,38.4963378,1399.789,103.2048097,-0.9495255,-71.0432469,-0.1042522,0,0,0,0,0,0.85,1,0,0,0,-128,1259.9,1148,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
542.26,542.355,38.4963361,1399.58,103.2048111,-1.0476139,-71.2162333,-0.1939861,38.4963378,1399.787,103.2048097,-0.9533696,-71.0382692,-0.1037876,0,0,0,0,0,0.85,1,0,0,0,-128,1246.6,1141.5,180,495.3,204.2,470.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
543.25,543.345,38.4963361,1399.6,103.2048111,-1.0740083,-71.1264667,-0.2276111,38.4963378,1399.788,103.2048097,-0.9479332,-71.0399404,-0.1037313,0,0,0,-0.086,1,0.85,1,0,0,20.2,-61.2,1247.2,1143.9,608.7,565.4,643.5,572.7,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,674,816.2,624.5,564.6
|
||||
544.24,544.33,38.4963361,1399.61,103.2048111,-1.0029583,-71.5123389,-0.2175556,38.4963376,1399.789,103.2048097,-0.9020924,-71.1203543,-0.0846568,0,0,0,-0.085,1,0.85,1,0,0,4,574.6,1276,596.7,579.8,560.6,680,561.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,669.4,812.8,620.7,562.9
|
||||
545.23,545.32,38.4963361,1399.63,103.2048111,-1.1184583,-71.6229,-0.1606472,38.4963376,1399.789,103.2048096,-0.8561337,-71.2107017,-0.113764,0,0,0,-0.086,1,0.85,1,0,0,4,573,1276,596.2,576.3,558.5,679,561.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,669,812.4,619.4,562.3
|
||||
546.215,546.315,38.4963361,1399.67,103.2048111,-1.1330639,-71.6244444,-0.2400972,38.4963376,1399.789,103.2048096,-0.914082,-71.1338164,-0.1162243,0,0,0,-0.085,1,0.85,1,0,0,4,573.1,1276,599.1,577,558.1,679.4,560.7,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,669.3,812.8,620.3,561.9
|
||||
547.205,547.3,38.4963361,1399.68,103.2048111,-1.0328667,-71.7012778,-0.2191861,38.4963375,1399.789,103.2048096,-0.8921204,-71.1748141,-0.122427,0,0,0,-0.084,1,0.85,1,0,0,4,571.6,1276,596.3,577.4,558.5,688,562.9,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,669.1,812.5,620.6,562.1
|
||||
548.195,548.285,38.4963361,1399.67,103.2048111,-1.0337361,-71.7203278,-0.1588944,38.4963376,1399.789,103.2048097,-0.9140275,-71.1061112,-0.0855659,0,0,0,-0.085,1,0.85,1,0,0,4,572.7,1276,596.7,579.3,558.6,678.7,561.1,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,669.6,813.1,620.5,562.5
|
||||
549.22,549.31,38.4963361,1399.67,103.2048111,-0.92175,-72.0254833,-0.1234361,38.4963376,1399.789,103.20481,-0.720149,-71.3734067,-0.0332369,0,0,0,-0.081,1,0.85,1,0,0,4,575.1,1276,597.1,571.8,562.4,702.4,568.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,668.2,818.6,620,565
|
||||
550.21,550.3,38.4963361,1399.69,103.2048111,-1.0194056,-72.3453667,-0.1892611,38.4963376,1399.789,103.20481,-0.6793467,-71.6211963,-0.013892,0,0,0,-0.086,1,0.85,1,0,0,4,577.6,1276,600.1,556.4,563.6,674.6,568,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,657.1,820.5,606.2,568.3
|
||||
551.2,551.29,38.4963361,1399.75,103.2048111,-1.1850889,-72.27955,-0.3280528,38.4963376,1399.789,103.2048097,-0.8990945,-71.4758086,-0.1955859,0,0,0,-0.087,1,0.85,1,0,0,4,570.3,1276,595.6,556.7,560,663.9,562.9,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,656.7,808.3,606.3,559.1
|
||||
552.19,552.28,38.4963361,1399.8,103.2048111,-1.2724444,-71.8784389,-0.4200667,38.4963376,1399.789,103.2048097,-0.9744431,-71.0248928,-0.2451241,0,0,0,-0.082,1,0.85,1,0,0,4,563.5,1276,595.3,581.2,555.6,677.1,558.5,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,669.3,811,622,557.6
|
||||
553.175,553.275,38.4963361,1399.83,103.2048111,-1.0097667,-71.9639111,-0.4535528,38.4963376,1399.789,103.2048097,-0.9137709,-71.1485298,-0.2449182,0,0,0,-0.082,1,0.85,1,0,0,4,564.6,1276,595.8,580,555.9,682.7,558.5,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,669.8,811.3,622.2,557.6
|
||||
554.165,554.255,38.4963361,1399.85,103.2048111,-1.0253333,-71.95755,-0.4451722,38.4963376,1399.788,103.2048097,-0.8980234,-71.1225239,-0.2401413,0,0,0,-0.081,1,0.85,1,0,0,4,565.4,1276,594.5,580.8,555.5,675.1,557.9,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,669.3,810.9,621.8,557.3
|
||||
555.155,555.25,38.4963361,1399.87,103.2048111,-0.9842389,-72.0269389,-0.4020139,38.4963376,1399.784,103.2048097,-0.9033624,-71.1440455,-0.2562072,0,0,0,-0.082,1,0.85,1,0,0,4,565.5,1276,593.8,580.6,555,679,557.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,668.8,810.6,621.1,556.5
|
||||
556.145,556.245,38.4963361,1399.93,103.2048111,-1.0309639,-72.2111889,-0.3969111,38.4963376,1399.787,103.2048097,-0.817418,-71.2661464,-0.2478874,0,0,0,-0.084,1,0.85,1,0,0,4,566.2,1276,593.5,571.7,555.6,678.5,558.1,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,667.5,810.2,618.1,557.1
|
||||
557.135,557.235,38.4963361,1399.94,103.2048111,-1.0268667,-72.2271722,-0.4304222,38.4963376,1399.779,103.2048097,-0.8645572,-71.2406334,-0.2470708,0,0,0,-0.083,1,0.85,1,0,0,4,566.1,1276,594.9,571.8,555.6,677.2,558.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,667.2,810.2,618.5,557.1
|
||||
558.16,558.255,38.4963361,1399.94,103.2048111,-0.9679194,-72.3481444,-0.4157972,38.4963376,1399.788,103.2048096,-0.832577,-71.300107,-0.2397218,0,0,0,-0.082,1,0.85,1,0,0,4,567.4,1276,593.9,578.3,555.7,674.6,558.1,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,666.7,810.7,618.4,557.2
|
||||
559.15,559.24,38.4963361,1399.9,103.2048111,-0.8966111,-72.4523389,-0.4342667,38.4963376,1399.789,103.2048096,-0.902576,-71.3524393,-0.240895,0,0,0,-0.083,1,0.85,1,0,0,4,568.6,1276,594.2,568.4,556.4,668.7,558.7,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,663.2,807.9,615.5,557.5
|
||||
560.205,560.3,38.4963361,1399.89,103.2048111,-0.8815472,-72.4868167,-0.4155167,38.4963376,1399.789,103.2048096,-0.7934818,-71.3972383,-0.2484551,0,0,0,-0.081,1,0.85,1,0,0,4,568.2,1276,594.5,571.3,556,666.8,558.5,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,662.9,808.1,615.5,557.4
|
||||
561.195,561.285,38.4963361,1399.89,103.2048111,-0.8547417,-72.5108167,-0.3977056,38.4963376,1399.788,103.2048096,-0.8066422,-71.4182347,-0.237,0,0,0,-0.085,1,0.85,1,0,0,4,567.4,1276,593.7,564.8,556.5,667,558.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,662.7,810.3,612.7,557.4
|
||||
562.185,562.275,38.4963361,1399.88,103.2048111,-0.9137417,-72.5491889,-0.3932139,38.4963376,1399.789,103.2048096,-0.8274036,-71.4326729,-0.2423037,0,0,0,-0.084,1,0.85,1,0,0,4,568.1,1276,594.4,563.2,556.5,667.4,558.8,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,660.5,807.3,611.7,557.6
|
||||
563.175,563.27,38.4963361,1399.88,103.2048111,-0.8816194,-72.5582667,-0.4350833,38.4963376,1399.785,103.2048095,-0.9340191,-71.4622646,-0.237805,0,0,0,-0.084,1,0.85,1,0,0,4,568.5,1276,594.9,562.7,556.7,662.3,558.7,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,659.2,806.8,611.1,557.4
|
||||
564.195,564.295,38.4963361,1399.85,103.2048111,-0.8672972,-72.6240944,-0.4416639,38.4963376,1399.787,103.2048095,-0.7938114,-71.5347245,-0.2373562,0,0,0,-0.088,1,0.85,1,0,0,4,567.5,1276,594.3,553.6,557,661.5,559.1,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,657.9,807.4,606.4,557.9
|
||||
565.185,565.28,38.4963361,1399.89,103.2048111,-0.8548389,-72.5799111,-0.4965083,38.4963376,1399.788,103.2048095,-0.8942875,-71.5016085,-0.2388159,0,0,0,-0.088,1,0.85,1,0,0,4,568,1276,595.8,556.9,556.7,662.2,559.1,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,658.2,807.3,607.3,557.8
|
||||
566.21,566.3,38.4963361,1399.87,103.2048111,-0.8891972,-72.5732167,-0.4772806,38.4963376,1399.79,103.2048095,-0.7654095,-71.5087903,-0.2333773,0,0,0,-0.087,1,0.85,1,0,0,4,568.4,1276,598.5,556.7,557,663,559.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,658.5,807.1,607.7,557.8
|
||||
567.2,567.295,38.4963361,1399.86,103.2048111,-0.9034222,-72.6479333,-0.5375194,38.4963376,1399.79,103.2048095,-0.7267242,-71.5333636,-0.2345206,0,0,0,-0.088,1,0.85,1,0,0,4,568.6,1276,594.9,554.4,556.6,661.2,558.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,657.9,807,606.4,557.2
|
||||
568.225,568.315,38.4963361,1399.86,103.2048111,-0.9508028,-72.6432556,-0.50165,38.4963376,1399.79,103.2048094,-0.8566861,-71.4889994,-0.2352833,0,0,0,-0.088,1,0.85,1,0,0,4,567.7,1276,595.6,556.6,556.5,662.7,558.7,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,658.7,807.2,607.5,557.2
|
||||
569.215,569.3,38.4963361,1399.87,103.2048111,-0.9206194,-72.6456222,-0.5252833,38.4963376,1399.79,103.2048094,-0.8115141,-71.5190374,-0.2390559,0,0,0,-0.089,1,0.85,1,0,0,4,567.7,1276,598.4,555.2,556.5,663.3,558.9,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,658.7,807,607.1,557.2
|
||||
570.2,570.295,38.4963361,1399.87,103.2048111,-0.9333667,-72.7979944,-0.47585,38.4963376,1399.79,103.2048093,-0.7823607,-71.5630731,-0.2462542,0,0,0,-0.087,1,0.85,1,0,0,4,567.6,1276,593.9,555.3,556.5,660.8,558.5,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,657.8,807.4,606.6,557.1
|
||||
571.19,571.28,38.4963361,1399.88,103.2048111,-0.9192139,-72.8409222,-0.4492917,38.4963376,1399.79,103.2048093,-0.818851,-71.5549868,-0.230526,0,0,0,-0.085,1,0.85,1,0,0,4,569,1276,595.1,548.6,559.3,663.1,559.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,655.8,807.7,606.4,557.8
|
||||
572.18,572.275,38.4963361,1399.89,103.2048111,-0.9409306,-72.6603722,-0.4271917,38.4963377,1399.79,103.2048093,-0.9508246,-71.3231441,-0.2527899,0,0,0,0,0,0.85,1,0,0,0,-128,1251.1,1143.7,0,-128,1276,1131.9,0,-128,1250.8,1148,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128
|
||||
573.17,573.26,38.4963361,1399.89,103.2048111,-0.9611528,-72.7284167,-0.4647833,38.4963377,1399.79,103.2048093,-0.8647629,-71.3340088,-0.2551347,0,0,0,-0.075,1,0.85,1,0,0,4,572.9,809.2,563.6,588.5,554,660.2,557.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,662.4,811.5,618.4,555.5
|
||||
574.195,574.29,38.4963361,1399.91,103.2048111,-0.9431389,-72.7849278,-0.4871139,38.4963377,1399.79,103.2048092,-0.9961595,-71.3510609,-0.2519691,0,0,0,-0.087,1,0.85,1,0,0,4,566.4,1276,586.8,565.3,555.8,666.8,558,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,662,807.9,611.8,556.8
|
||||
575.22,575.31,38.4963361,1399.92,103.2048111,-0.9119639,-72.7750167,-0.4974389,38.4963377,1399.79,103.2048092,-0.8291643,-71.3743919,-0.2421746,0,0,0,-0.084,1,0.85,1,0,0,4,565.6,1276,595,564.5,556.5,670.7,558.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,664.9,810.2,615.6,557.6
|
||||
576.21,576.305,38.4963361,1399.91,103.2048111,-0.8769028,-72.7948056,-0.4545528,38.4963377,1399.79,103.2048091,-0.8544527,-71.3517443,-0.2351596,0,0,0,-0.08,1,0.85,1,0,0,4,565.2,1276,593.4,569.8,556.2,668.8,558.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,662.3,810.5,615.6,557.3
|
||||
577.2,577.29,38.4963361,1399.93,103.2048111,-0.956375,-72.7505333,-0.4931778,38.4963377,1399.79,103.2048091,-0.963954,-71.2868407,-0.2461926,0,0,0,-0.084,1,0.85,1,0,0,4,565.3,1276,593.8,572.1,555.6,675,557.9,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,666.1,810.8,617.3,556.9
|
||||
578.19,578.275,38.4963361,1399.93,103.2048111,-0.9531917,-72.7506,-0.4566528,38.4963377,1399.79,103.204809,-0.9005518,-71.2418492,-0.2435094,0,0,0,-0.084,1,0.85,1,0,0,4,566.1,1276,595.1,577.5,555.7,676.3,558,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,667.5,810.5,618.3,557.1
|
||||
579.175,579.28,38.4963417,1399.24,103.204825,-0.8796028,-72.7814333,-0.3904611,38.4963377,1399.79,103.204809,-0.8890459,-71.2571165,-0.2477015,0,0,0,-0.083,1,0.85,1,0,0,4,566.9,1276,595.5,578.6,556.1,676.2,558.7,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,667.1,811.1,618.4,557.7
|
||||
580.165,580.265,38.4963417,1399.16,103.2048333,-0.8257333,-72.7915278,-0.3621778,38.4963377,1399.79,103.204809,-0.762811,-71.3685739,-0.238263,0,0,0,-0.082,1,0.85,1,0,0,4,566,1276,594.7,571.6,556.4,674.3,558.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,665.5,811.1,616.9,557.6
|
||||
581.155,581.25,38.4963472,1399.09,103.2048472,-0.7940194,-72.8643722,-0.3115861,38.4963377,1399.79,103.2048089,-0.798798,-71.3699917,-0.2433287,0,0,0,-0.088,1,0.85,1,0,0,4,569.3,1276,593.6,568.7,557.2,674.7,559.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,665.1,811.2,613.5,560.3
|
||||
582.145,582.235,38.49635,1399.03,103.2048611,-0.8304972,-72.8448722,-0.2952972,38.4963377,1399.79,103.2048089,-0.7921711,-71.3586543,-0.2412283,0,0,0,-0.083,1,0.85,1,0,0,4,567,1276,595.1,571.6,557,676.2,559.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,665.5,811.1,616.8,558.3
|
||||
583.135,583.23,38.4963528,1399.03,103.2048722,-0.8929833,-72.7173944,-0.317875,38.4963377,1399.79,103.2048088,-0.8378805,-71.2860411,-0.2414203,0,0,0,-0.082,1,0.85,1,0,0,4,565.4,1276,595,573.8,556.9,676.8,559.1,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,666.4,811.6,618.3,558
|
||||
584.125,584.22,38.4963556,1399.02,103.2048861,-0.8804306,-72.7629222,-0.3707583,38.4963377,1399.79,103.2048088,-0.7975862,-71.3051469,-0.2423543,0,0,0,-0.083,1,0.85,1,0,0,4,567.7,1276,594.7,573.8,557.1,677.9,559.5,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,666.3,812,618,560.3
|
||||
585.115,585.205,38.4963583,1399.05,103.2049,-0.8250389,-72.8020611,-0.3517306,38.4963376,1399.79,103.2048089,-0.7898849,-71.3356398,-0.2374605,0,0,0,-0.083,1,0.85,1,0,0,4,567.8,1276,595.7,577.3,557.1,675,559.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,665.6,811.6,617.3,560.3
|
||||
586.105,586.2,38.4963639,1399.16,103.2049194,-0.8277528,-72.9291889,-0.324925,38.4963376,1399.79,103.2048089,-0.7092155,-71.3903639,-0.2272918,0,0,0,-0.081,1,0.85,1,0,0,4,566.9,1276,595,572.5,557.1,670.9,559.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,665,811.6,616.7,558.2
|
||||
587.095,587.185,38.4963667,1399.28,103.2049306,-0.7911222,-72.9905944,-0.2756667,38.4963375,1399.79,103.2048089,-0.6526361,-71.4384864,-0.2178339,0,0,0,-0.084,1,0.85,1,0,0,4,571.3,1276,594.7,568.5,557.8,669.4,559.7,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,661.4,812.1,611.3,560.9
|
||||
588.085,588.175,38.4963694,1399.39,103.20495,-0.7590972,-72.9568778,-0.2839861,38.4963375,1399.79,103.2048089,-0.6557178,-71.4357531,-0.2205716,0,0,0,-0.084,1,0.85,1,0,0,4,571.4,1276,594,570.4,557.5,667.9,559.8,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,661.1,811.9,611.3,560.7
|
||||
589.105,589.2,38.496375,1399.49,103.2049694,-0.735675,-72.968,-0.2574472,38.4963375,1399.79,103.2048089,-0.6706962,-71.4237711,-0.216148,0,0,0,-0.084,1,0.85,1,0,0,4,571.9,1276,594.5,571,557.5,667.5,559.9,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,661.3,812.2,611.8,560.9
|
||||
590.13,590.225,38.4963806,1399.57,103.2049917,-0.8359333,-73.0273833,-0.2178694,38.4963374,1399.79,103.2048089,-0.7043767,-71.3736823,-0.2168499,0,0,0,-0.089,1,0.85,1,0,0,4,570.7,1276,595.4,577.1,557.1,662.3,559.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,664.9,812.3,612.5,560.9
|
||||
591.155,591.245,38.4963861,1399.62,103.2050111,-0.7931306,-73.0265333,-0.2343194,38.4963374,1399.79,103.2048089,-0.7024329,-71.3664408,-0.212757,0,0,0,-0.088,1,0.85,1,0,0,4,570.7,1276,594.5,577.5,557,666.8,559.5,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,665.4,812.4,613.2,560.9
|
||||
592.14,592.24,38.4963889,1399.63,103.205025,-0.7583972,-73.0031278,-0.2709889,38.4963374,1399.789,103.2048089,-0.7058171,-71.3678697,-0.2097004,0,0,0,-0.088,1,0.85,1,0,0,4,570.6,1276,594.5,577.4,557.3,668.1,559.9,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,665.5,812.9,613.2,561.1
|
||||
593.13,593.225,38.4963944,1399.64,103.2050472,-0.7720611,-72.9498833,-0.2673028,38.4963374,1399.785,103.2048089,-0.7511136,-71.3115255,-0.2133461,0,0,0,-0.084,1,0.85,1,0,0,4,569.8,1276,595.2,578.9,557.3,668.6,559.5,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,666,813,616.4,561
|
||||
594.12,594.215,38.4964,1399.61,103.2050667,-0.8115528,-72.9895833,-0.3101083,38.4963374,1399.789,103.2048089,-0.792656,-71.2887632,-0.2150564,0,0,0,-0.083,1,0.85,1,0,0,4,567.5,1276,594.9,581.3,557.2,669.8,559.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,666.5,813,618,560.8
|
||||
595.11,595.2,38.4964,1399.56,103.2050778,-0.8315889,-72.9761056,-0.2987833,38.4963373,1399.79,103.2048088,-0.8391549,-71.2436207,-0.2120993,0,0,0,-0.085,1,0.85,1,0,0,4,569.6,1276,595.6,578.1,557,675.8,559.5,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,667.6,812.9,617.9,560.8
|
||||
596.1,596.195,38.4964028,1399.38,103.2050861,-0.8845333,-72.9879056,-0.3203028,38.4963373,1399.79,103.2048088,-0.9295413,-71.2171054,-0.2278875,0,0,0,-0.084,1,0.85,1,0,0,4,567.1,1276,596.6,582.1,556.8,674.5,559.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,668,812.6,619.1,560.6
|
||||
597.09,597.18,38.4964056,1399.13,103.2050944,-0.8857278,-72.9305111,-0.39155,38.4963373,1399.79,103.2048087,-0.9637562,-71.1973469,-0.2530006,0,0,0,-0.084,1,0.85,1,0,0,4,565,1276,595.3,581.4,555.2,677.6,557.9,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,669,811.4,620.1,556.9
|
||||
598.08,598.175,38.4964056,1398.98,103.2050944,-0.8442222,-73.0097833,-0.4041111,38.4963373,1399.79,103.2048087,-0.8580027,-71.3177127,-0.2398424,0,0,0,-0.082,1,0.85,1,0,0,4,565.4,1276,595.4,577.2,556,675.4,558.5,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,666.5,811.2,618.3,557.4
|
||||
599.07,599.16,38.4964056,1398.88,103.2050944,-0.8293667,-73.0635222,-0.3825944,38.4963373,1399.79,103.2048087,-0.8863974,-71.2896247,-0.2437681,0,0,0,-0.083,1,0.85,1,0,0,4,565.2,1276,594.4,572.8,555.8,669.8,558.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,665.2,810.5,616.5,557.1
|
||||
600.06,600.155,38.4964056,1398.8,103.2050944,-0.9415222,-72.8711611,-0.38485,38.4963373,1399.79,103.2048087,-1.0264708,-71.0617825,-0.2491051,0,0,0,-0.083,1,0.85,1,0,0,4,563.7,1276,594.9,582.2,555,675.6,557.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,669.5,811.6,621.2,556.6
|
||||
601.05,601.14,38.4964056,1398.79,103.2050944,-0.9209194,-72.8273833,-0.3287444,38.4963374,1399.789,103.2048087,-1.0279665,-71.0167811,-0.2928625,0,0,0,-0.083,1,0.85,1,0,0,6.6,563.4,1276,595.5,582.1,554.6,688.1,556.8,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,674,812.3,625.5,556.1
|
||||
602.04,602.135,38.4964056,1398.82,103.2050944,-0.8554944,-72.9702,-0.3441167,38.4963374,1399.79,103.2048087,-0.9765765,-71.0587898,-0.2889348,0,0,0,-0.079,1,0.85,1,0,0,4,563.4,1276,594.4,581.3,553.9,683.1,555.9,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,670.8,811.4,624.6,555
|
||||
603.025,603.12,38.4964056,1398.85,103.2050944,-0.9514028,-72.8547889,-0.2925111,38.4963373,1399.789,103.2048087,-0.9236006,-71.0127071,-0.2721577,0,0,0,-0.088,1,0.85,1,0,0,0,-128,1264.9,1148,610.1,558.3,636.5,556.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,674.6,811.9,623.7,560.1
|
||||
604.055,604.145,38.4964056,1398.85,103.2050944,-0.9840667,-72.9020778,-0.3529972,38.4963374,1399.79,103.2048087,-0.9481017,-71.0169898,-0.290429,0,0,0,-0.082,1,0.85,1,0,0,4,563.3,1276,594.8,583.3,553.9,687.7,556.1,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,674.9,811.7,626.5,555.2
|
||||
605.045,605.135,38.4964056,1398.91,103.2050944,-0.9843222,-72.9124833,-0.3923917,38.4963374,1399.789,103.2048087,-1.0140416,-70.9951677,-0.3081084,0,0,0,-0.09,1,0.85,1,0,0,17.2,-63.6,1276,595,577.8,554.3,702.2,555.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,674.8,806.6,623,555.1
|
||||
606.035,606.125,38.4964056,1398.94,103.2050944,-0.957975,-72.9632167,-0.3806861,38.4963374,1399.79,103.2048086,-0.9133211,-70.9981668,-0.3117612,0,0,0,-0.077,1,0.85,1,0,0,4,562.4,1276,593.8,583.2,553.8,682.5,555.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,670.5,810.8,625.3,555
|
||||
607.055,607.15,38.4964056,1398.95,103.2050944,-0.8991889,-73.0249,-0.3541778,38.4963374,1399.79,103.2048086,-0.9719852,-71.000819,-0.3154007,0,0,0,-0.083,1,0.85,1,0,0,4,561,1276,595.6,582.8,553.2,682.4,555.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,674.4,810.6,625.8,554.3
|
||||
608.08,608.17,38.4964056,1398.93,103.2050944,-0.8768389,-70.9496444,-0.4042389,38.4963374,1399.79,103.2048085,-0.9158724,-70.9964244,-0.3183429,0,0,0,-0.083,1,0.85,1,0,0,4,561.8,1276,594.9,582.5,551,683,555,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,674.3,810.5,625.7,554.3
|
||||
609.065,609.16,38.4964056,1398.88,103.2050944,-0.8019444,-70.9515167,-0.3729917,38.4963374,1399.79,103.2048085,-0.9789931,-71.0066871,-0.3145926,0,0,0,-0.084,1,0.85,1,0,0,4,561.7,1276,594,581.9,550.9,682.4,555,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,674.4,810.6,625.1,554.3
|
||||
610.055,610.15,38.4964056,1398.96,103.2050944,-0.7416556,-70.8937,-0.3416389,38.4963374,1399.79,103.2048084,-1.0721342,-71.0016457,-0.3242455,0,0,0,-0.084,1,0.85,1,0,0,4,561.9,1276,593.6,583.7,553.2,683,555.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,674.5,810.6,625.6,554.5
|
||||
611.045,611.135,38.4964056,1398.97,103.2050944,-0.7074333,-70.8942556,-0.315775,38.4963374,1399.79,103.2048084,-0.9132008,-70.9902945,-0.3117931,0,0,0,-0.083,1,0.85,1,0,0,4,561.3,1276,594.7,582.5,551.1,678.6,555,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,674.2,810.9,625.4,554.3
|
||||
612.035,612.13,38.4964056,1399.01,103.2050944,-0.7205306,-70.9520389,-0.3258667,38.4963374,1399.789,103.2048083,-1.0630651,-71.0088693,-0.3233859,0,0,0,-0.085,1,0.85,1,0,0,4,561.5,1276,594.4,581.6,551.1,684.1,555.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,674.9,810.9,625.6,554.4
|
||||
613.025,613.05,38.4964056,1399.03,103.2050944,-0.6786611,-70.9616333,-0.3272917,38.4963373,1399.786,103.2048082,-0.9614302,-71.0017879,-0.3155095,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
614.015,614.11,38.4964056,1399.04,103.2050944,-0.6747833,-70.9345222,-0.3222306,38.4963374,1399.79,103.2048082,-1.0261873,-71.0133452,-0.3107153,0,0,0,-0.084,1,0.85,1,0,0,4,563.8,1276,590.3,587.3,551.5,687.3,555.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,674.3,809.5,625.8,554.9
|
||||
615.025,615.12,38.4964056,1399.35,103.2050972,-0.66095,-70.9302889,-0.2324556,38.4963374,1399.79,103.2048081,-0.9551185,-71.0075535,-0.309031,0,0,0,-0.084,1,0.85,1,0,0,4,562.9,1276,593.5,582.7,553.5,683.4,555.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,674.5,809.7,625.4,555.1
|
||||
616.05,616.145,38.4964083,1399.17,103.2051028,-0.70075,-70.9101944,-0.2536694,38.4963374,1399.786,103.204808,-0.9429614,-71.0199262,-0.3250184,0,0,0,-0.084,1,0.85,1,0,0,4,563.4,1276,591.2,584.3,553.5,687.5,555.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,674.7,809.9,625.6,554.9
|
||||
617.045,617.14,38.4964083,1399.03,103.2051083,-0.6562833,-70.9668111,-0.49085,38.4963374,1399.79,103.2048083,-0.8474696,-71.0772083,-0.6276453,0,0,0,-0.08,1,0.85,1,0,0,4,560.1,1276,586.4,576.1,549.9,704.9,552.8,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,672.3,804.3,625.6,550.8
|
||||
618.165,618.255,38.4964139,1399.35,103.205125,-0.4848722,-70.9867722,0.1396667,38.4963416,1399.789,103.2048231,-0.7386312,-71.1003557,-0.8059801,0,0,0,-0.094,1,0.85,1,0,0,4,556.5,1276,578.3,563.5,540.5,696.9,541.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,712.5,952.8,621.8,542.5
|
||||
619.155,619.245,38.496425,1399.82,103.2051639,-0.0997778,-70.8586833,0.8163611,38.4963518,1399.747,103.2048594,-0.5771188,-71.094159,-0.8398208,0,0,0,-0.112,1,0.85,1,0,0,4,561,1276,580.7,567,547.7,705.4,548.8,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,755.3,1019.7,628.5,548.9
|
||||
620.18,620.275,38.4964444,1400.44,103.2052361,-0.488825,-70.7516944,1.9314389,38.49637,1399.775,103.204924,-0.6530616,-70.8684856,-0.6098269,0,0,0,-0.161,1,0.85,1,0,0,4,564.5,1276,582,564.7,547.5,688.2,548.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,809.9,1018.7,627.5,548.8
|
||||
621.17,621.26,38.4964778,1401.13,103.2053556,-0.525025,-71.2387444,2.3272528,38.496395,1399.788,103.2050135,-0.7540042,-71.4504619,-0.9158845,0,0,0,-0.24,1,0.85,1,0,0,4,556.4,1276,573.6,567.7,538.6,668.7,539.9,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,899.7,1019.2,620.9,540.4
|
||||
622.16,622.255,38.4965056,1401.18,103.2054667,-0.683125,-71.0320333,2.9607972,38.4964269,1399.793,103.2051275,-0.8463251,-71.2284452,-0.7457954,0,0,0,-0.301,1,0.85,1,0,0,4,568.3,1276,589.3,593.9,554.6,658.4,554.8,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,966.5,1019.3,627.2,555.3
|
||||
623.145,623.24,38.49655,1401.51,103.2056278,-0.5303194,-70.9017111,3.18425,38.4964652,1399.79,103.2052644,-0.7639491,-71.0758705,-0.5416291,0,0,0,0.573,1,0.85,1,0,0,4,551.7,1276,576.1,593.8,534.8,676.4,536.8,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,197.3,826.5,625.7,535.8
|
||||
624.135,624.23,38.4965972,1401.36,103.2058028,-0.3593917,-71.2714667,3.5757889,38.496509,1399.794,103.2054231,-0.6932622,-71.4508625,-0.4889212,0,0,0,-0.472,1,0.85,1,0,0,4,569.9,1276,601.5,576.7,554,676,556.8,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,1156.5,1019.4,623.6,556.4
|
||||
625.125,625.22,38.4966389,1401.65,103.2059556,-0.3596917,-71.3269056,3.7585444,38.4965587,1399.796,103.205602,-1.2418647,-71.7479001,-1.0629984,0,0,0,-0.583,1,0.85,1,0,0,4,552.5,1276,577.5,559.8,530.9,672.5,536.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,1276,1007.5,616.1,533.4
|
||||
626.115,626.21,38.4967,1401.79,103.2061889,-0.7699111,-71.2164444,4.1568778,38.4966133,1399.8,103.2057985,-1.0149583,-71.5588054,-0.6538503,0,0,0,-0.667,1,0.85,1,0,0,4,562.7,1276,589.6,586.5,550.8,680.6,553.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,691.2,595.5,624.5,553.9
|
||||
627.14,627.23,38.4967667,1401.69,103.2064472,-0.6296139,-71.7139944,4.0590944,38.4966739,1399.828,103.206017,-1.3484573,-71.8382417,-1.1884969,0,0,0,-0.744,1,0.85,1,0,0,4,518.5,1276,578.8,537.6,532.7,679,537.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,1276,915.3,604.1,534
|
||||
628.13,628.22,38.4968333,1401.62,103.2067083,-0.6830028,-71.8793556,4.3125194,38.4967367,1399.781,103.2062443,-1.2114254,-71.8159861,-0.6944967,0,0,0,-0.853,1,0.85,1,0,0,4,548.3,1276,572.1,542.6,532.9,661.2,537.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,1276,867.2,602.8,534.3
|
||||
629.12,629.21,38.4968917,1401.28,103.2069278,-0.5481611,-71.6653222,4.5248667,38.4968039,1399.77,103.2064849,-0.8203801,-71.9603277,-1.0619151,0,0,0,-0.908,1,0.85,1,0,0,4,558.2,1276,576.9,563.9,536.8,708,544.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,1276,838.2,626.9,541.5
|
||||
630.11,630.2,38.4969694,1401.09,103.2072167,-0.6558306,-71.2693167,6.4280472,38.4968747,1399.827,103.2067376,-0.7925219,-71.1558115,2.1474793,0,0,0,-1.035,1,0.85,1,0,0,4,575.5,1276,600.3,556.7,567.3,747.4,577.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,1276,829.5,631.2,570.1
|
||||
631.1,631.185,38.4970472,1401.1,103.2075083,0.3312861,-71.5454,9.2297528,38.496949,1400.513,103.2070008,0.0616161,-71.4985195,3.9972416,0,0,0,-1.5,1,0.85,1,0,0,4,701.6,1276,709.8,564.1,668.7,676.6,672.7,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,1091.7,1000.8,625.2,669.5
|
||||
632.085,632.18,38.4971278,1402.45,103.2078028,-0.1228778,-69.1396778,10.9399278,38.4970251,1402.287,103.2072703,0.159203,-69.2230327,5.7949031,0,0,0,-1.691,1,0.85,0,0,0,4,797.6,1276,796.5,649.7,710.3,699.6,713.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,752.4,839.6,675.1,711.1
|
||||
633.075,633.17,38.4971944,1403.81,103.2080333,1.7228194,-70.98575,10.5142889,38.4971011,1403.814,103.2075443,1.6372245,-71.5670702,5.2177612,0,0,0,-1.545,1,0.85,0,0,0,4,897.8,1276,853.9,602.4,728.7,666.7,725,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,750.3,1022,635.6,726.1
|
||||
634.065,634.16,38.4972722,1405.53,103.2083167,-0.6686806,-69.5044333,9.8166528,38.4971751,1405.527,103.2078244,-0.6612737,-69.7472077,5.1438699,0,0,0,-1.422,1,0.85,0,0,0,4,938,1276,902.5,628.9,706.8,686.1,708,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,726.1,1018.4,657.7,708.8
|
||||
635.09,635.18,38.4973528,1407.52,103.2086083,0.0615167,-72.16575,9.6970833,38.4972536,1407.564,103.2081202,-0.6293955,-72.5134465,4.894589,0,0,0,-1.058,1,0.85,0,0,0,4,987.2,1276,996,565.2,708.2,624.9,709.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,621.7,933.2,595.2,710.6
|
||||
636.08,636.17,38.497425,1410.38,103.2089194,1.2407333,-74.2471389,10.6136139,38.4973311,1410.29,103.2084088,0.2716165,-74.3220942,6.3144868,0,0,0,-1.069,1,0.85,0,0,0,75.1,1019.7,965.4,1017.8,491.2,749.5,545.9,749.9,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,537.7,953,517.4,753.3
|
||||
637.1,637.195,38.4974806,1413.23,103.2091694,0.1755111,-72.5539556,12.5267917,38.497411,1413.846,103.2087042,-0.1783522,-72.3139729,8.4627094,0,0,0,-0.985,1,0.85,0,0,0,294.4,1020.2,841.5,1022.5,537.9,819.4,596.7,820.1,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,579,1018.4,567,825.7
|
||||
1746.065,1747.51,38.4868278,1595.36,103.1698861,0.2303333,-66.61725,-3.1967528,38.4868466,1591.644,103.1697967,0.5922167,-66.7244892,-2.8843188,0,-2412.526,199.566,-1.261,3,0.85,0,28,253,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1748.045,1748.94,38.4869361,1593.57,103.1702778,-0.8288556,-66.3174889,-3.1310028,38.4869633,1591.969,103.1702143,-0.2630832,-66.7822992,-3.1223823,0,-2367.755,201.133,-3.954,3,0.85,2,29,331,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1749.04,1749.975,38.4870139,1592.13,103.1705556,0.4514306,-65.8887889,-4.8545444,38.4869517,1590.417,103.1704751,1.0274125,-65.4191636,-4.582915,0,-2333.941,198.133,-2.066,3,0.85,2,30,276,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1750.025,1750.945,38.4870917,1590.29,103.1708361,1.1339722,-65.9084222,-5.7962472,38.4870243,1587.237,103.1707996,1.2485344,-65.8204158,-5.5000075,0,0,0,0,0,0.85,2,31,271,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1751.05,1751.97,38.4871667,1587.96,103.1711194,0.2083889,-67.1240222,-4.6094,38.4870989,1585.912,103.171077,0.5410239,-67.3435941,-4.5347222,0,-2275.365,191.543,-1.075,3,0.85,2,32,320,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1752.04,1752.95,38.4872278,1585.55,103.1713444,-0.0388444,-68.9390278,-4.8441528,38.4871826,1583.911,103.1714377,-0.1881798,-68.4190738,-4.5032244,0,0,0,0,0,0.85,2,33,323,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1753.03,1753.945,38.4873,1582.56,103.1716278,-0.5516417,-64.0912111,-5.3421444,38.4872538,1580.405,103.1717078,-0.3549213,-63.4094673,-4.3949625,0,-2236.919,190.38,-6.082,3,0.85,2,34,253,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1754.055,1754.965,38.4873778,1579.96,103.1719167,-0.7053083,-67.2798833,-3.1787167,38.4873582,1578.458,103.1719577,-0.0439173,-67.8419503,-2.8780699,0,-2231.329,192.974,-7.114,3,0.85,2,34,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1755.045,1755.97,38.4874556,1578.16,103.1722056,0.6661639,-69.0412444,-3.0292944,38.4874125,1576.382,103.172095,0.8596788,-68.9308518,-2.6909109,0,-2190.597,187.032,-11.877,3,0.85,2,35,315,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1756.035,1756.945,38.4875139,1576.43,103.1724333,-2.573675,-67.1295556,-2.5343111,38.4875114,1574.428,103.1723541,-2.2206092,-66.8847721,-2.5238751,0,0,0,0,0,0.85,2,36,297,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1757.025,1757.93,38.4875917,1573.86,103.1727167,-0.7867556,-69.5624222,-2.667475,38.4875849,1571.44,103.1726196,-0.4254684,-69.4702296,-2.3560688,0,-2145.573,183.861,-5.408,3,0.85,2,37,313,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1758.05,1758.965,38.4876694,1571.32,103.1729972,0.2057694,-66.9829944,-2.5274583,38.4876512,1571.293,103.1728721,0.4344897,-66.7284054,-2.2579079,0,-2122.147,180.892,-8.313,3,0.85,2,37,292,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1759.035,1759.96,38.4877472,1568.75,103.1732806,-0.3256528,-68.3349889,-1.2292806,38.4877234,1567.058,103.1731215,-0.1590637,-68.1582577,-1.1690116,0,-2096.996,176.638,-8.349,3,0.85,2,38,290,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1760.025,1760.935,38.487825,1566.39,103.1735639,0.194925,-69.9261333,-1.2376722,38.4877974,1565.612,103.1733796,0.4113778,-69.7732583,-1.0967482,0,-2065.256,172.906,-4.96,3,0.85,2,39,301,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1761.035,1761.975,38.4878889,1564.88,103.1737889,0.2352167,-69.4433444,-0.9458389,38.4878671,1563.008,103.1736728,0.5565949,-69.3211766,-0.653096,0,-2037.648,170.24,-3.216,3,0.85,2,40,286,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1762.025,1762.945,38.4879667,1563.02,103.1740722,-0.1439944,-69.1964722,-0.3077139,38.4879307,1562.606,103.1739667,-0.4687753,-69.0632172,-0.27242,0,0,0,0,0,0.85,2,41,277,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1763.05,1763.975,38.4880417,1561.03,103.1743556,-0.256875,-68.4150111,-0.3107361,38.4880061,1560.526,103.1742422,0.0292957,-68.4209348,0.0765601,0,-1989.854,164.942,-1.801,3,0.85,2,42,265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1764.04,1764.96,38.4881194,1558.77,103.1746361,-0.0057778,-68.5419333,-0.3651972,38.4880586,1557.844,103.174525,0.1168032,-68.2329075,-0.0318019,0,-1969.118,165.281,-2.976,3,0.85,2,42,242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1765.03,1765.965,38.4881806,1557.38,103.1748611,-0.15905,-67.0168167,-0.9598833,38.4881226,1557.481,103.1747907,0.3706356,-66.847314,-0.6274911,0,-1949.147,164.954,-3.13,3,0.85,2,43,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1766.055,1766.975,38.4882528,1555.71,103.1751389,-0.7462111,-67.3869722,-0.3584639,38.4881876,1555.483,103.1750489,-0.5796605,-67.2511998,0.0770502,0,-1912.337,157.943,-5.185,3,0.85,2,44,253,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1767.04,1767.975,38.4883278,1553.1,103.1754167,-0.8351861,-68.6906056,-1.1983444,38.4882678,1553.683,103.1753285,-0.577994,-68.5528744,-1.0673771,0,-1897.523,161.173,-6.486,3,0.85,2,45,266,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1768.1,1769,38.4884056,1550.91,103.1756972,-0.3204639,-67.4093778,0.1165556,38.4883514,1550.972,103.1756046,-0.1587313,-67.2026988,0.3123674,0,-1862.682,152.874,-9.805,3,0.85,2,46,252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1769.125,1770.05,38.4884833,1549.32,103.1759778,0.3836417,-67.5269778,0.3616444,38.4884466,1549.382,103.1758882,1.0700045,-67.5712963,0.3824295,0,-1843.573,154.401,-6.147,3,0.85,2,47,242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1770.11,1771.005,38.4885583,1547.69,103.1762583,-0.6732639,-67.6028278,-0.2686778,38.4885193,1548.774,103.1761487,-0.2048486,-67.4771235,-0.1187517,0,-1797.07,145.516,-6.892,3,0.85,2,48,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1771.1,1772.025,38.4886194,1546.33,103.1764806,0.3014806,-67.47795,-0.4969778,38.4886083,1546.01,103.1764621,0.7385246,-67.4632629,-0.4195518,0,-1821.521,165.996,-10.071,3,0.85,2,49,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1772.09,1772.985,38.4886917,1544.94,103.1767556,-0.5989056,-67.6280889,-0.9791222,38.4886701,1544.485,103.1766471,-0.4836593,-67.636088,-0.927414,0,-1775.102,153.628,-1.44,3,0.85,2,49,277,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1773.08,1773.995,38.4887639,1543.39,103.1770278,-0.6771528,-69.0786111,-1.83825,38.4887395,1543.471,103.1769005,-0.2140326,-69.0302021,-1.8072861,0,-1736.514,147.845,-3.105,3,0.85,2,50,279,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1774.07,1774.975,38.488825,1541.82,103.1772417,-1.0700917,-66.6710444,-2.4597,38.4888091,1540.958,103.1771511,-0.9389722,-65.2183651,-2.3664523,0,-1719.093,148.833,0.288,3,0.85,2,51,283,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1775.06,1775.98,38.4889,1539.61,103.1775111,0.3116167,-66.0125333,-2.6810472,38.4888817,1538.977,103.1774074,1.0013532,-66.1608409,-2.2599669,0,-1693.114,147.82,-3.083,3,0.85,2,52,284,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1776.085,1777.035,38.488975,1537.9,103.1777833,0.94855,-67.4148778,-2.62095,38.488948,1538.429,103.1777069,0.9906481,-68.1102965,-1.9563212,0,-1649.752,135.568,-1.818,3,0.85,2,52,271,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1777.14,1778.04,38.48905,1536.44,103.1780528,-0.7323028,-67.3245722,-1.8601528,38.4890327,1536.104,103.17807,-0.274961,-66.3322909,-1.9257971,0,-1643.721,144.834,-3.292,3,0.85,2,54,307,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1778.13,1779.025,38.4891222,1534.72,103.1783194,-0.1347833,-62.5620778,-3.7219444,38.489097,1535.631,103.1783247,0.1980225,-62.5075373,-3.5356809,0,-1619.517,142.128,-1.543,3,0.85,2,54,306,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1779.12,1780.025,38.4891778,1533.41,103.1785306,-0.2033111,-64.4330611,-3.8746028,38.4891579,1534.455,103.17858,0.4362733,-65.205554,-3.8197743,0,-1595.407,140.431,-1.155,3,0.85,2,55,276,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1780.18,1781.095,38.4892472,1531.38,103.1787944,-1.6177389,-64.5465444,-4.565975,38.4892248,1531.46,103.1788532,-0.807241,-64.7224787,-4.8533383,0,-1569.532,138.681,0.064,3,0.85,2,56,274,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1781.165,1782.095,38.4893194,1529.22,103.1790556,0.2861,-64.3655333,-4.9227972,38.489288,1529.993,103.1791131,0.6385784,-63.9759369,-5.0371036,0,-1542.31,135.547,-2.382,3,0.85,2,57,270,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1782.155,1783.065,38.4893889,1527.71,103.1793194,0.6215472,-65.0063722,-5.8209361,38.4893611,1529.746,103.1793808,1.1826777,-65.1751407,-5.6901227,0,-1517.374,133.713,2.234,3,0.85,2,57,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1783.145,1784.06,38.4894611,1526.28,103.1795861,-0.9399472,-63.2639167,-5.1395194,38.489424,1527.321,103.179654,-0.6749416,-63.1525579,-4.9375692,0,-1493.418,130.545,1.293,3,0.85,2,58,272,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1784.135,1785.04,38.4895194,1524.95,103.1797972,-0.0054639,-65.9667,-6.3179306,38.4894934,1525.984,103.1799247,0.086292,-67.1120506,-5.9931704,0,-1478.273,134.327,0.376,3,0.85,2,59,264,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1785.155,1786.055,38.4895944,1522.86,103.1800611,-0.4448222,-66.1714111,-6.9359417,38.4895639,1523.408,103.1801828,0.0470986,-65.4247061,-6.3371753,0,-1448.03,130.119,-2.408,3,0.85,2,60,315,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1786.18,1787.07,38.4896722,1520.17,103.1803278,0.3237611,-64.5782833,-6.1888139,38.4896446,1521.968,103.1804546,1.2161964,-64.3242684,-6.1629174,0,-1424.901,126.86,-4.615,3,0.85,2,61,335,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1787.205,1788.115,38.48975,1517.86,103.1806028,1.8309972,-68.0751889,-6.3331194,38.4897288,1518.968,103.180727,2.6473062,-68.8475863,-6.2846222,0,-1398.91,124.256,-0.444,3,0.85,2,62,286,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1788.195,1789.135,38.4898278,1516.23,103.1808861,2.7342167,-68.7269611,-6.2138583,38.4898008,1517.465,103.1810035,3.0057114,-68.6645496,-6.056622,0,-1377.664,123.009,-4.297,3,0.85,2,62,342,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1789.185,1790.095,38.4898861,1514.8,103.1811111,-0.9740444,-67.1268667,-5.2193111,38.4898732,1516.482,103.1812656,-0.2529589,-67.3790159,-5.4910245,0,-1350.835,119.944,-0.219,3,0.85,2,63,324,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1790.175,1791.075,38.4899583,1512.66,103.1813917,-0.3553333,-67.22415,-6.2697194,38.4899404,1514.055,103.1815342,-0.0108256,-66.9245985,-6.1065789,0,-1326.948,119.672,-3.1,3,0.85,2,64,282,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1791.16,1792.065,38.4900306,1510.16,103.1816694,-0.5027583,-66.9151611,-6.6342444,38.4900133,1512.576,103.1817969,-0.1031731,-66.9653517,-6.4356983,0,-1301.183,116.864,-2.571,3,0.85,2,65,334,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1792.15,1793.045,38.4900917,1508.18,103.1818917,-1.0601917,-67.8995611,-5.8229361,38.4900876,1509.951,103.1820619,0.2741412,-67.8145088,-6.0925943,0,-1278.906,115.652,-3.959,3,0.85,2,66,296,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1793.14,1794.035,38.4901667,1505.94,103.1821694,-0.479625,-67.19065,-5.6980972,38.4901632,1507.973,103.1823218,0.8669893,-67.4809865,-5.5812143,0,-1257.135,113.348,-0.255,3,0.85,2,66,327,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1794.13,1795.035,38.4902417,1504.2,103.18245,0.1687806,-68.6995833,-6.2043111,38.4902317,1506.046,103.1825806,0.3514338,-68.7034737,-5.9396927,0,-1235.044,112.179,-2.143,3,0.85,2,67,349,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1795.12,1796.015,38.4903167,1502.67,103.1827278,-0.2423278,-71.0605611,-5.8001056,38.4903027,1504.935,103.1828328,0.0472984,-71.0052219,-5.5052223,0,-1205.218,109.55,-1.711,3,0.85,2,68,364,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1796.11,1797.005,38.490375,1500.85,103.1829472,0.6079778,-70.6759389,-6.3241972,38.4903748,1503.896,103.1830911,0.8754905,-70.4142689,-5.9527559,0,-1182.074,108.31,-2.077,3,0.85,2,69,346,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1797.135,1798.05,38.49045,1497.99,103.1832194,-1.5218083,-70.6534222,-6.0655389,38.4904492,1501.863,103.1833577,-1.6205168,-70.5502031,-6.1594664,0,-1160.191,104.719,-1.626,3,0.85,2,70,343,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1798.125,1799.05,38.490525,1495.12,103.1834917,0.1292833,-70.2042833,-4.5255167,38.4905208,1497.488,103.1836091,0.5053384,-70.0449308,-4.5366592,0,-1134.148,102.485,-1.196,3,0.85,2,71,350,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1799.115,1800,38.4906,1492.68,103.1837639,0.6775556,-69.8689778,-4.6018972,38.490592,1495.648,103.1838639,0.9703601,-69.6985047,-4.3621216,0,-1111.471,99.179,-0.65,3,0.85,2,71,363,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1800.1,1801.005,38.4906611,1491.31,103.1839833,-0.5325722,-71.78955,-4.1151361,38.4906614,1493.493,103.1841189,0.469978,-72.110783,-3.6310336,0,-1088.106,97.45,-2.179,3,0.85,2,72,366,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1801.09,1801.985,38.4907333,1490,103.1842556,-0.728425,-70.6053,-4.475125,38.490732,1493.88,103.1843708,-0.4703572,-70.0539439,-4.3263648,0,-1066.44,96.738,-1.114,3,0.85,2,73,335,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1802.115,1803.025,38.4908083,1488.7,103.184525,-0.5772972,-70.5377667,-5.3212833,38.4908023,1491.627,103.1846249,-0.1035116,-70.4208975,-5.1152331,0,-1037.945,94.548,-0.85,3,0.85,2,74,348,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1803.105,1804.005,38.4908806,1486.82,103.1847917,0.3860361,-71.0241333,-5.3113444,38.4908718,1490.944,103.1848767,0.9069915,-70.8996813,-5.0864296,0,-1016.015,93.49,-2.625,3,0.85,2,75,368,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1804.095,1804.99,38.4909389,1484.99,103.1850028,-0.0558139,-71.7145389,-5.3608583,38.4909424,1489.426,103.185125,0.1382313,-71.9304551,-4.9330799,0,-994.176,91.278,-1.897,3,0.85,2,75,397,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1805.085,1805.98,38.4910111,1482.22,103.1852667,-0.5584222,-71.4610278,-4.4048028,38.49101,1485.463,103.1853676,0.2393766,-71.2361543,-3.9740857,0,-972.453,89.226,-2.312,3,0.85,2,76,428,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1806.075,1806.975,38.4910833,1479.67,103.1855278,-0.0638778,-72.3760667,-3.1453667,38.4910779,1483.663,103.185607,0.5027779,-72.1696986,-2.8643589,0,-949.748,86.107,-1.594,3,0.85,2,77,436,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1807.1,1807.995,38.4911528,1477.42,103.1857833,-0.6817194,-71.05935,-2.3478639,38.4911459,1482.391,103.185854,-0.3765989,-70.8927933,-2.1215165,0,-927.876,84.12,-1.728,3,0.85,2,78,416,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1808.085,1808.975,38.4912083,1475.87,103.1859861,-0.83635,-70.6141833,-1.2392444,38.4912095,1479.496,103.1860833,0.063318,-70.6842306,-0.8021161,0,-906.126,81.32,-1.462,3,0.85,2,78,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1809.075,1809.96,38.4912778,1473.68,103.1862361,0.1211667,-72.2759389,-2.3434194,38.4912731,1480.139,103.1863121,0.6701539,-71.949462,-2.2707248,0,-883.729,79.33,-1.314,3,0.85,2,79,425,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1810.065,1810.955,38.4913472,1472.48,103.1864889,-0.5579306,-70.7811611,-1.554475,38.4913364,1479.898,103.1865458,0.1159187,-70.5056047,-1.3721344,0,-862.377,78.705,-1.228,3,0.85,2,80,418,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1811.055,1811.965,38.4914139,1471.48,103.1867417,0.6496806,-73.1256722,-1.8052139,38.4914,1479.678,103.186779,0.89409,-72.9855676,-1.6219648,0,-839.713,78.089,-1.821,3,0.85,2,81,446,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1812.05,1812.945,38.4914694,1470.6,103.1869417,-0.9005361,-70.5286944,-2.4836694,38.4914634,1477.78,103.187013,-0.7500685,-70.0062574,-2.5365738,0,-819.814,76.871,-0.853,3,0.85,2,81,411,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1813.035,1813.945,38.4915361,1469.52,103.1871917,0.5712639,-72.8184722,-3.4099972,38.4915247,1476.409,103.1872388,0.8472177,-72.8976196,-3.4344495,0,-794.099,75.149,-1.422,3,0.85,2,82,430,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1814.025,1814.94,38.4916028,1467.98,103.1874389,-0.0203611,-71.9911667,-4.1939694,38.4915883,1475.165,103.1874726,0.2228774,-71.8489116,-4.1076604,0,-773.242,74.569,-2.306,3,0.85,2,83,444,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1815.01,1815.915,38.4916556,1466.37,103.1876389,-1.6141472,-71.2846611,-4.4538167,38.491652,1473.402,103.1877035,-1.5080291,-71.3918196,-4.4040322,0,-753.304,73.326,-0.912,3,0.85,2,84,426,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1816,1816.89,38.4917222,1464.33,103.1878861,-0.9317,-69.4868444,-3.987825,38.4917144,1471.555,103.1879324,-0.6931302,-69.0088557,-3.6126523,0,-730.902,70.339,-0.231,3,0.85,2,84,369,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1816.99,1817.905,38.4917917,1462.3,103.1881333,-0.6710528,-68.5078222,-3.4620361,38.4917777,1469.28,103.1881635,-0.2741307,-68.3406099,-3.216767,0,-710.196,68.881,-0.269,3,0.85,2,85,376,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1817.98,1818.895,38.4918472,1460.65,103.1883278,0.1644972,-68.9624278,-2.8146194,38.4918418,1467.017,103.1883927,0.3373597,-68.7002328,-2.4869948,0,-688.42,66.831,-1.398,3,0.85,2,86,402,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1818.97,1819.87,38.4919139,1458.76,103.1885722,0.4780444,-68.6477222,-2.2070417,38.4919066,1465.053,103.1886201,0.6720866,-68.7297906,-2.1712365,0,-668.33,65.955,-1.367,3,0.85,2,87,354,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1819.96,1820.88,38.4919833,1456.77,103.1888139,1.4736167,-71.1563944,-1.5968611,38.4919693,1462.987,103.1888421,1.9516208,-71.3601321,-1.461607,0,-646.637,61.916,-0.639,3,0.85,2,87,344,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1820.95,1821.85,38.4920472,1454.36,103.1890528,1.0279917,-70.9907833,-0.9855139,38.4920285,1460.595,103.1890646,1.2261198,-70.9733816,-0.9025614,0,-625.68,61.118,-0.438,3,0.85,2,88,357,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1821.94,1822.835,38.4920972,1452.27,103.1892444,-0.3973222,-71.1371167,0.3963083,38.4920855,1457.962,103.189287,-0.1322349,-70.9739325,0.6798437,0,-604.125,59.159,-1.784,3,0.85,2,89,367,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1822.93,1823.825,38.4921583,1449.65,103.1894806,-1.3289278,-70.1707889,1.7164444,38.492145,1455.062,103.1895098,-1.2374183,-69.9159625,2.0166182,0,-584.249,56.752,-1.643,3,0.85,2,90,353,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1823.92,1824.805,38.4922222,1447.68,103.1897167,-1.4589556,-68.7377722,2.7996583,38.4922067,1452.788,103.1897308,-0.953629,-68.532745,2.9843128,0,-564.01,52.409,-0.37,3,0.85,2,90,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1824.905,1825.8,38.492275,1446.6,103.1899056,1.4443806,-69.6341833,3.5983639,38.4922687,1450.629,103.1899527,1.3174442,-69.8231691,4.0810111,0,-553.235,54.384,1.143,3,0.85,2,91,303,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1825.895,1826.835,38.4923417,1445.58,103.1901417,0.8281556,-70.0906167,2.9566333,38.4923235,1449.282,103.19016,1.0726626,-70.0759213,3.1683496,0,-519.745,50.662,-2.242,3,0.85,2,92,301,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1826.885,1827.78,38.4924056,1444.84,103.1903778,0.88055,-69.6700222,2.7429389,38.492387,1448.354,103.1903868,1.1126292,-69.9792694,2.7266752,0,-499.467,48.109,-0.065,3,0.85,2,92,291,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1827.875,1828.77,38.4924667,1443.98,103.1906167,-0.8692,-69.8017556,1.4737444,38.4924465,1448.426,103.1906123,-0.575767,-69.7434935,1.5739957,0,-479.34,48.217,-1.386,3,0.85,2,93,337,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1828.865,1829.755,38.4925194,1442.93,103.1908083,-0.5698,-69.0128944,1.5212917,38.492509,1447.352,103.1908399,-0.3666634,-68.9582837,1.5304704,0,-458.781,48.32,-0.417,3,0.85,2,94,263,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1829.855,1830.75,38.4925861,1441.45,103.1910556,-1.1733028,-68.6768778,0.5113972,38.492573,1445.998,103.1910739,-0.5557549,-68.7597033,0.6813425,0,-434.409,46.573,-0.339,3,0.85,2,95,276,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1830.845,1831.76,38.4926556,1440.58,103.1913028,0.7690833,-68.5193556,0.2490528,38.4926396,1444.665,103.191312,0.9205721,-68.387605,0.5264125,0,-414.427,47.225,-0.981,3,0.85,2,96,237,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1831.835,1832.735,38.4927111,1439.56,103.1915028,0.7470056,-69.2457278,-0.7076639,38.4927064,1443.495,103.1915497,1.4133037,-69.6702296,-0.6110933,0,-386.456,44.367,0.111,3,0.85,2,96,265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1832.825,1833.73,38.4927806,1437.96,103.1917556,0.094775,-69.6901,-0.56865,38.4927736,1441.6,103.1917981,0.7138221,-69.8578504,-0.2786778,0,-364.589,43.013,-0.32,3,0.85,2,97,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1833.835,1834.745,38.49285,1435.79,103.1920111,0.1482389,-70.3101333,-0.7908056,38.4928421,1439.161,103.1920519,0.8189266,-70.2734827,-0.7123539,0,-347.378,42.377,-1.23,3,0.85,2,98,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1834.825,1835.76,38.4929194,1433.64,103.1922694,-0.5422806,-69.7744667,-0.5676639,38.4929085,1436.634,103.1922952,-0.2531236,-69.6891912,-0.4694945,0,-319.646,38.392,-2.108,3,0.85,2,99,222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1835.815,1836.74,38.492975,1431.99,103.192475,0.1271028,-69.4868778,-0.3661222,38.492979,1434.344,103.1925482,-0.4289994,-69.2773161,-0.0473372,0,-296.59,36.183,-1.214,3,0.85,2,100,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1836.835,1837.74,38.4930444,1430.01,103.1927333,-0.1239778,-69.1382444,-0.0702889,38.4930496,1432.857,103.192803,0.5109358,-69.2695777,0.3212505,0,-282.78,37.395,-3.853,3,0.85,2,101,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1837.825,1838.73,38.4931139,1427.94,103.1929917,-0.0974611,-69.8530667,0.2439444,38.4931189,1430.616,103.1930415,0.3356947,-69.629314,0.5686794,0,-255.044,34.254,-2.268,3,0.85,2,101,203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1838.815,1839.71,38.4931833,1426,103.1932528,-0.4738389,-68.9743111,0.8901028,38.4931873,1428.761,103.1932872,-0.0447743,-68.9116674,1.0274074,0,-224.384,29.552,0.428,3,0.85,2,102,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1839.805,1840.715,38.4932389,1424.54,103.1934611,-0.2703861,-69.4542167,0.9134972,38.4932558,1426.991,103.1935459,0.1441478,-69.3330846,0.8889731,0,-210.651,30.836,-2.802,3,0.85,2,103,226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
1840.795,1840.915,38.4933111,1422.93,103.1937222,-1.2226556,-68.6939389,0.4447222,38.4933246,1425.408,103.1937911,-0.7290364,-68.6957461,0.2861244,0,0,0,0.924,1,0.85,2,0,0,583.7,743.5,788.5,747.6,675.2,602.1,705.3,602.3,593,742.7,778.4,747.3,659,651.2,671.4,651.5,717.5,652.8,701.7,652.4,685.4,705.6,690.2,605.7
|
||||
1841.785,1841.88,38.4933806,1421.69,103.1939833,0.00765,-67.8348556,0.415975,38.493387,1424.186,103.1940396,0.0598898,-67.5579686,0.1825415,0,0,0,0.026,1,0.85,0,0,0,601,748.2,832.3,751.7,701.1,595.7,730.4,596.1,609.5,746.9,819.3,752,685.6,644.2,701.2,644.8,748.8,645.8,733.1,645.3,716.2,700.9,716.2,601.4
|
||||
1842.775,1842.865,38.4934528,1420.37,103.1942444,0.0189861,-68.9636444,0.0356556,38.4934532,1422.807,103.1942864,0.2565466,-68.8836162,0.0895871,0,0,0,-0.576,1,0.85,0,0,0,577.4,745.8,826.2,747.1,681.9,581.9,710.2,581.1,586.2,744.7,811.8,746.6,663.8,629.3,682.2,629.9,730.9,630.5,714,630.3,698.3,690.1,695.2,586.8
|
||||
1843.76,1843.865,38.4935083,1418.73,103.1944528,-1.0298444,-68.9653944,-0.8265083,38.4935207,1420.8,103.1945337,-0.8521452,-68.5836937,-0.7297861,0,0,0,-0.704,1,0.85,0,0,0,541.3,733.7,834.4,740.1,668,560.6,697.2,558.5,553.7,732.7,817.8,738.8,649.4,604.9,667.1,605.2,718.4,607.1,700.7,606.3,685,673,683,563.8
|
||||
1844.75,1844.85,38.4935806,1416.58,103.1947167,-0.8001028,-68.7168722,-0.6036472,38.4935898,1418.721,103.1947794,-0.5261366,-68.6481024,-0.3709674,0,0,0,-1.001,1,0.85,0,0,0,525.4,743.5,870.7,755.2,678.6,561,708.4,558.9,536.9,742.3,856.3,754.5,658.7,604.7,677.5,604.8,731.9,605.9,714.4,605.7,698.6,674.2,693.8,564.3
|
||||
1845.74,1845.835,38.4936556,1414.59,103.1949778,-0.5746194,-69.2973556,-0.6066528,38.4936612,1416.755,103.195027,-0.4183484,-69.1151442,-0.5044929,0,0,0,-1.366,1,0.85,0,0,0,477.3,764.2,877.6,766.2,656.8,568.6,684.2,566.1,487.6,762.7,859.1,765.2,635.2,607.4,656.6,607.7,714,609.9,693,609.6,677.7,676.9,670.1,570.8
|
||||
1846.73,1846.83,38.4937139,1413.24,103.1951917,-0.1506278,-68.5073111,-0.9916833,38.4937342,1415.134,103.1952754,0.4281669,-68.3459022,-0.3596984,0,0,0,-0.495,1,0.85,0,0,0,466.7,763.5,1103.2,931.4,678.8,548.4,712.7,548.6,477.5,760.3,1097.2,932.8,657.3,590.9,677.9,591.4,740.2,592.1,720.6,593.8,701.4,667,697,553.5
|
||||
1847.72,1847.82,38.4937917,1411.53,103.1954556,1.3727667,-69.7547167,-0.6448444,38.4938055,1413.408,103.1955247,1.8890366,-69.7653494,-0.5442738,0,0,0,-1.762,1,0.85,0,0,0,391.4,811.5,1276,1008.5,644.9,557,675.3,555.9,410.2,808.4,938.5,801.8,623.9,596.7,645.4,596.6,709.7,597.3,689.9,596.9,678.7,674.6,660.5,560.9
|
||||
1848.745,1848.845,38.4938667,1409.53,103.1957194,0.8385444,-70.1272278,-1.1039639,38.4938795,1411.383,103.1957854,0.8302581,-70.3277854,-0.684968,0,0,0,-2.16,1,0.85,0,0,0,293.7,844.9,1050.9,832.4,633.8,538,669.1,537.9,311.6,841.7,1027.1,822,612.2,573.9,636.6,574,702.8,572.9,682.3,572.7,676,661.6,652.2,540.3
|
||||
1849.77,1849.86,38.4939417,1407.93,103.1959889,0.5034472,-70.8273389,1.3641861,38.4939527,1409.756,103.1960455,0.8913369,-70.7985666,1.6070192,0,0,0,-2.512,1,0.85,0,0,0,61.3,1022.2,930.5,778.2,610.2,603,644.3,603.5,0,-128,0,-128,582,638.8,610.1,638.9,679.3,639.2,658.9,640.6,662.5,739.7,627.6,605.3
|
||||
1850.76,1850.855,38.4940139,1406.77,103.1962556,1.8767833,-70.8566111,2.7754222,38.4940224,1408.58,103.1962964,2.2700225,-71.0408438,2.970939,0,0,0,-2.569,1,0.85,0,0,0,67.9,1011.8,1082.1,846.5,618.4,649.3,661,647.9,0,-128,0,-128,593.5,680.7,627.3,681.8,700.8,677.4,678.5,678.8,683.3,786.5,639.1,650.5
|
||||
1851.785,1851.88,38.4940694,1406.31,103.1964667,1.1588028,-71.9209111,3.484525,38.4940916,1407.97,103.196555,2.064124,-72.3699858,3.8683844,0,0,0,-2.329,1,0.85,0,0,0,16.9,1013.7,1138.4,916,579.6,670.2,620.3,672.3,0,-128,0,-128,562.5,705.9,585.3,709.4,0,-128,0,-128,652.9,846.4,599,673.8
|
||||
1852.775,1852.865,38.4941361,1406,103.1967333,1.3889472,-75.3006389,4.3070639,38.4941549,1407.65,103.1968055,1.6699893,-76.0264638,4.5589798,0,0,0,-1.834,1,0.85,0,0,0,4,976.2,1276,1002.1,490.9,694.7,536.3,694.1,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,579.8,949.6,515.4,698
|
||||
1853.765,1853.86,38.4942,1405.81,103.197,-2.8081111,-74.4027944,4.2582722,38.4942154,1407.425,103.1970552,-2.4743274,-74.2045339,4.5144614,0,0,0,-0.771,1,0.85,0,0,0,4,900.9,1175,1007.8,492,678.7,534.9,683.3,0,-128,0,-128,0,-128,497.9,712.4,571.9,701,548.5,701.7,533.2,1019.1,515.6,683.8
|
||||
1854.755,1854.85,38.4942667,1405.91,103.1972667,-4.1085417,-71.0549778,4.71915,38.4942789,1407.482,103.1973077,-3.6666897,-70.7437623,4.8841912,0,0,0,-0.172,1,0.85,0,0,0,4,927.2,1180.7,1025.7,582.2,694.5,628.8,698.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,596.1,919.8,605.7,698.9
|
||||
1855.745,1855.84,38.4943222,1406.15,103.1974778,-2.7672472,-69.9236222,4.9291278,38.4943473,1407.679,103.1975573,-2.03412,-69.6815261,4.868197,0,0,0,0.252,1,0.85,0,0,0,4,973.7,1197.5,1013.7,633.5,709.5,679,711.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,634.6,1019.8,655,713.7
|
||||
1856.735,1856.83,38.4943972,1406.34,103.1977444,-0.8656944,-68.3947833,3.062525,38.4944178,1407.861,103.1978064,-0.5997282,-67.727949,3.1283919,0,0,0,-0.056,1,0.85,0,0,0,4,980.9,1276,949.7,669.5,658.7,716.7,659.4,0,-128,0,-128,594,712.6,657.9,715,784,707.8,732.1,711.7,691.2,1022.8,692.9,661.2
|
||||
1857.72,1857.815,38.4944722,1406.37,103.1980139,-1.8358972,-67.14325,2.4115,38.4944906,1407.809,103.1980599,-1.4805692,-66.8165635,2.3866225,0,0,0,-0.342,1,0.85,0,0,0,4,987.7,1276,924,700.4,650.7,749.4,651.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,730.5,1019,725.2,652.9
|
||||
1858.71,1858.81,38.4945361,1406.13,103.1982306,-0.7674167,-65.8768,1.9946667,38.4945668,1407.461,103.1983166,0.6222783,-65.4577972,1.6820573,0,0,0,-0.588,1,0.85,0,0,0,4,997.2,1276,868.2,747.5,628.9,797.8,629.4,0,-128,0,-128,0,-128,0,-128,918,720.1,840,729.6,806,1020.3,773.4,633
|
||||
1859.7,1859.8,38.4946194,1405.46,103.1985056,1.1650389,-66.6653722,0.9876083,38.4946446,1406.774,103.1985791,1.7324776,-66.7856802,0.9053107,0,0,0,-1.239,1,0.85,0,0,0,4,967.9,1276,802.1,725.9,598.4,780.6,601,0,-128,0,-128,0,-128,0,-128,940.8,699.9,0,-128,817.2,913.9,754.8,602.9
|
||||
1860.69,1860.785,38.4947,1404.84,103.1987889,1.8568444,-69.252,1.0549944,38.4947214,1406.136,103.1988441,2.0159157,-69.5333654,1.0862658,0,0,0,-1.715,1,0.85,0,0,0,4,941.5,1276,795.5,664.1,601.6,714.6,602.5,0,-128,0,-128,507.4,729.8,622.6,735.1,948.3,723.6,828.2,726.4,812.3,1020.2,689.8,604.3
|
||||
1861.68,1861.775,38.4947806,1404.19,103.1990722,1.1798861,-70.9879889,0.8724639,38.4947959,1405.479,103.1991113,1.5161011,-71.1166986,1.066213,0,0,0,-1.897,1,0.85,0,0,0,4,867.6,1276,782.5,596.4,595.2,646.9,594.7,0,-128,0,-128,359.5,775.2,543.7,777.3,1010.8,766.5,831.4,769.4,710.2,849.8,623.1,596.7
|
||||
1862.705,1862.795,38.4948417,1403.53,103.1993028,0.0468722,-71.3473111,0.4824472,38.4948716,1404.614,103.1993902,0.3268434,-71.7420362,0.6061513,0,0,0,-1.777,1,0.85,0,0,0,4,805.8,1276,772.3,588,583.4,645.3,585.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,772.1,1020.8,619.8,586.5
|
||||
1863.695,1863.785,38.4949194,1402.61,103.1995889,0.5951833,-71.4279944,0.4315306,38.4949441,1403.681,103.1996603,0.9924796,-71.2912936,0.575136,0,0,0,-1.578,1,0.85,0,0,0,4,764.8,1276,731.7,580.2,580.5,640.8,582,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,686.3,771.7,611.9,582.4
|
||||
1864.715,1864.815,38.4949944,1401.56,103.199875,-0.0339222,-71.2156278,0.5693028,38.4950184,1402.763,103.1999418,0.4657245,-71.2584573,0.8468194,0,0,0,-1.418,1,0.85,0,0,0,4,712.5,1276,705.5,595.5,581.3,649.2,581.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,812.4,1020.6,621.5,581.9
|
||||
1865.705,1865.8,38.4950722,1400.85,103.2001639,-0.3416,-71.8159611,1.0683528,38.4950895,1402.203,103.2002119,0.1394492,-71.7841282,1.1625145,0,0,0,-1.156,1,0.85,0,0,0,4,690.4,1276,700.7,557.4,596.2,638.2,597.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,775,1020.7,595.6,596.8
|
||||
1866.695,1866.79,38.4951306,1400.16,103.2003944,-0.952975,-70.5468889,1.1421861,38.4951607,1401.237,103.2004828,-0.5693913,-70.2544964,1.6190442,0,0,0,-0.79,1,0.85,0,0,0,4,654.5,1276,674.4,599.1,598,685.9,598.5,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,773.4,903.9,642.4,598.7
|
||||
1867.685,1867.78,38.4952083,1399.44,103.2006833,-0.5132056,-70.7525333,1.7033972,38.495233,1400.417,103.2007555,-0.2286779,-70.6766365,1.8576494,0,0,0,-0.201,1,0.85,0,0,0,4,645.8,1276,659.4,594.7,610.3,666,610.9,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,831.2,1018.9,628.4,611
|
||||
1868.675,1868.765,38.4952833,1399.12,103.2009722,-1.5718389,-70.4198889,1.7207472,38.4953052,1400.058,103.2010274,-0.943244,-70.303654,1.7292557,0,0,0,-0.203,1,0.85,1,0,0,4,629.6,1276,650.6,593.4,611.1,673.1,612.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,697.9,730.1,640.6,612.2
|
||||
1869.665,1869.76,38.4953611,1398.99,103.2012556,-0.5765778,-70.4048667,1.7293667,38.4953782,1399.902,103.2012975,-0.2441662,-70.2861853,1.8836622,0,0,0,-0.146,1,0.85,1,0,0,4,635,1276,645.5,609.2,612.4,685,611.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,791.1,1018.5,644.8,612.3
|
||||
1870.655,1870.745,38.4954222,1399.01,103.2014806,-0.8559944,-68.9513,1.5415944,38.4954497,1399.859,103.2015605,-0.650899,-68.8655036,1.7271646,0,0,0,-0.13,1,0.85,1,0,0,4,620.7,1276,641.6,632.3,609.6,734.7,609.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,701.7,689.2,677,609.7
|
||||
1871.68,1871.77,38.4954972,1398.99,103.20175,-0.5627556,-71.2126444,0.712075,38.4955217,1399.772,103.2018202,-0.5620139,-71.0710723,1.2226524,0,0,0,-0.126,1,0.85,1,0,0,4,590.1,1276,612.4,565.2,576.5,678.9,575,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,749.9,1020.7,615.1,578.5
|
||||
1872.665,1872.765,38.4955694,1399,103.2020056,-0.8036694,-70.5365167,-0.9073083,38.4955902,1399.79,103.2020601,-0.4071225,-70.5342835,-0.61937,0,0,0,-0.503,1,0.85,1,0,0,4,560.7,919.1,567.3,585.9,537.8,680.5,542.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,689,584,634.9,540.3
|
||||
1873.655,1873.75,38.4956417,1399.05,103.20225,-0.8454944,-70.62,-0.5468167,38.4956577,1399.784,103.2022888,-0.5571427,-70.4866689,-0.3562397,0,0,0,-0.891,1,0.85,1,0,0,4,558.2,1276,570.6,579.4,534.5,721.7,543.9,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,1276,830.2,642.3,538.2
|
||||
1874.645,1874.74,38.4956972,1399.1,103.2024361,-0.4673472,-70.8314,-0.6863361,38.4957231,1399.784,103.202508,-0.2973584,-70.7592242,-0.384422,0,0,0,-1.251,1,0.85,1,0,0,4,563.1,1276,570.7,582.5,541,700.8,544.7,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,757.3,579.8,636.1,540.4
|
||||
1875.635,1875.73,38.4957639,1399.14,103.2026611,-0.2488222,-71.4129056,-0.6955361,38.4957845,1399.78,103.2027188,0.0779643,-71.3226657,-0.6360587,0,0,0,-1.939,1,0.85,1,0,0,4,566.8,1276,587.8,589.3,547.8,677.2,552.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,1276,680.4,636.6,549.6
|
||||
1876.625,1876.72,38.495825,1399.17,103.2028778,-0.4017472,-71.4472222,-0.7576583,38.4958417,1399.782,103.2029221,-0.0913659,-71.4210762,-0.5459532,0,0,0,-1.825,1,0.85,1,0,0,125,566.8,1276,590.9,587.5,549.3,868.5,559.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,1276,677.3,683.8,546.6
|
||||
1877.65,1877.75,38.4958833,1399.19,103.2030861,-0.3073222,-72.3604611,-0.6466444,38.4958971,1399.782,103.2031251,0.0496282,-72.3331037,-0.5541147,0,0,0,-1.864,1,0.85,1,0,0,153.3,582.5,1273.1,556.3,674.3,551.9,726.2,551.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,830.3,581.9,697.3,553.5
|
||||
1878.64,1878.73,38.495925,1399.22,103.2032444,-0.4281778,-72.7769389,-0.5657361,38.4959465,1399.778,103.2033106,-0.0161168,-72.7677467,-0.6298493,0,0,0,-2.121,1,0.85,1,0,0,20.6,-59.8,1276,618.2,588.5,559.8,701.3,564.5,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,1276,680.8,653.9,563.9
|
||||
1879.63,1879.72,38.495975,1399.24,103.2034361,-0.2361972,-74.1751,-1.2112806,38.4959935,1399.777,103.2034904,-0.1226748,-74.103676,-0.4365532,0,0,0,-2.225,1,0.85,1,0,0,4,571.7,0,-128,507.1,545.9,501,553.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,1276,699.4,450,551.1
|
||||
1880.62,1880.71,38.4960194,1399.27,103.2036167,-0.6091667,-74.4453556,-1.3362944,38.4960349,1399.774,103.2036581,-0.4095101,-74.3279141,-0.8742229,0,0,0,-1.703,1,0.85,1,0,0,4,568.1,1276,580.6,482.7,548.9,619.9,550.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,696.9,583.8,564.1,551.8
|
||||
1881.605,1881.7,38.4960528,1399.31,103.20375,-0.5901194,-74.5394278,-0.778525,38.4960726,1399.78,103.2038119,-0.3042199,-74.1387947,-0.2888982,0,0,0,-0.856,1,0.85,1,0,0,4,566.6,1276,578.5,474.8,546.2,613.9,546.7,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,1276,892.4,543.5,546.8
|
||||
1882.595,1882.695,38.4960889,1399.36,103.2039028,-0.5593889,-73.9919833,-0.9117361,38.4961072,1399.777,103.2039528,-0.2318098,-73.7540478,-0.4525224,0,0,0,-0.393,1,0.85,1,0,0,4,583.2,1276,572.8,495.2,541.9,605.7,545.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,1018.5,1019.6,555.3,545.5
|
||||
1883.585,1883.68,38.496125,1399.41,103.2040389,-0.2371528,-72.0083778,-1.1804361,38.4961394,1399.734,103.20408,-0.0372851,-71.3442578,-0.9566567,0,0,0,-0.094,1,0.85,1,0,0,4,559.8,1276,579.2,520.3,545,654.2,545.7,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,694.3,1020.2,582.5,545.8
|
||||
1884.575,1884.67,38.4961556,1399.43,103.20415,-1.1695806,-71.6686222,-1.2890139,38.4961674,1399.762,103.2041826,-1.0551121,-71.448849,-1.0735214,0,0,0,-0.121,1,0.85,1,0,0,25.9,-60.9,0,-128,555,526.7,683.5,526.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,682.4,767,614.9,529
|
||||
1885.565,1885.655,38.496175,1399.43,103.2042167,-1.0153,-71.1296,-0.9709778,38.4961882,1399.773,103.2042588,-1.2902006,-70.8715883,-1.166553,0,0,0,-0.091,1,0.85,1,0,0,0,-128,1040.4,574.6,550.1,541.2,695.3,543.1,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,644.3,617.8,629.5,545.2
|
||||
1886.555,1886.645,38.4961889,1399.44,103.2042778,-1.0016222,-73.5953167,-0.8778861,38.4962026,1399.783,103.2043146,-0.8203029,-73.2964052,-0.4058016,0,0,0,-0.052,1,0.85,1,0,0,4,569.2,1272.2,596.2,496.5,541.8,639.2,546.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,602.3,882.2,563.5,545.3
|
||||
1887.545,1887.645,38.4962028,1399.42,103.2043333,-1.1488778,-73.2904222,-0.9460778,38.4962154,1399.731,103.2043653,-1.2351032,-73.1394762,-0.6902005,0,0,0,0.049,1,0.85,1,0,0,4,568.2,1271.9,608.3,531.3,543.1,637.6,548.3,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,509.9,1019.9,578.4,547
|
||||
1888.535,1888.63,38.4962139,1399.42,103.2043722,-1.1725889,-72.9154611,-0.7520778,38.4962266,1399.742,103.2044108,-0.7723684,-72.2957007,-0.5230646,0,0,0,0.173,1,0.85,1,0,0,4,569.4,1276,620,540.3,540.7,634.5,546.9,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,365.2,1020.5,578.1,545.6
|
||||
1889.525,1889.615,38.496225,1399.42,103.2044167,-1.5834611,-72.0853556,-0.7757056,38.4962373,1399.763,103.2044517,-0.7502231,-72.1017686,-0.3415592,0,0,0,0.184,1,0.85,1,0,0,4,569.9,1276,617.6,563.5,538.4,662,541.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,375.3,1017.7,602.7,540.1
|
||||
1890.515,1890.605,38.4962361,1399.42,103.2044556,-1.1101611,-72.2970222,-0.8108167,38.4962466,1399.768,103.2044879,-1.0392976,-71.8460052,-0.4468711,0,0,0,0.249,1,0.85,1,0,0,4,569.2,1276,610.4,554.4,548.6,642,550.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,285.3,1020,589.9,549.8
|
||||
1891.505,1891.595,38.4962444,1399.42,103.2044889,-1.2838139,-71.8575833,-0.7044028,38.496255,1399.772,103.2045196,-1.0333999,-71.5501224,-0.5201446,0,0,0,0.256,1,0.85,1,0,0,4,577.8,1276,604.1,573.4,541.1,668.4,545,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,298.6,1018.4,615.5,542.7
|
||||
1892.495,1892.585,38.4962528,1399.44,103.2045139,-0.9556667,-72.2352444,-0.4329083,38.4962621,1399.772,103.2045468,-1.1178201,-72.0823627,-0.3717788,0,0,0,0.255,1,0.85,1,0,0,4,568.2,1276,601.6,550.2,549.8,647.3,552.9,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,282.2,1018.4,593.8,551
|
||||
1893.48,1893.58,38.4962583,1399.45,103.2045361,-1.6436861,-72.5927222,-0.55545,38.4962679,1399.772,103.2045695,-1.3655313,-72.3439784,-0.3422629,0,0,0,0.286,1,0.85,1,0,0,20,-57.2,1276,599.5,543.1,547.9,648.5,551,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,229.7,1017,581.1,549.9
|
||||
1894.47,1894.565,38.4962639,1399.45,103.2045583,-1.1950139,-72.262,-0.3676917,38.4962726,1399.771,103.204588,-0.9439263,-72.0380746,-0.3409524,0,0,0,0.297,1,0.85,1,0,0,20.5,-57.2,1276,590,548.1,540.7,640.9,545.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,220.7,1016.7,585.5,542.6
|
||||
1895.46,1895.555,38.4962667,1399.46,103.2045694,-1.2143111,-71.9495167,-0.4235278,38.4962763,1399.771,103.204602,-0.9584104,-71.538428,-0.1666625,0,0,0,0.297,1,0.85,1,0,0,4,568.4,1276,601.1,563.3,549.5,644.2,551.8,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,237.8,1018.1,597.2,549.9
|
||||
1896.45,1896.54,38.4962694,1399.46,103.2045806,-1.1644611,-70.9457,-0.4549111,38.4962791,1399.771,103.2046121,-0.8109061,-70.600338,-0.2558713,0,0,0,0.284,1,0.85,1,0,0,20,-60.1,1276,594.6,583.7,547.5,674.2,551.4,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,280.8,1019.8,625.6,549
|
||||
1897.44,1897.54,38.4962722,1399.46,103.2045889,-1.1235417,-70.4633889,-0.6260167,38.4962808,1399.771,103.2046179,-0.9714838,-70.1648985,-0.4720742,0,0,0,0.269,1,0.85,1,0,0,22.2,-59,1276,584.9,597.5,546.6,685.3,549,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,309.8,1018.8,637.4,548.4
|
||||
1898.43,1898.525,38.4962722,1399.46,103.2045917,-1.2158028,-70.2670889,-0.7126333,38.4962814,1399.771,103.2046201,-1.0470403,-70.0799177,-0.5493935,0,0,0,0.25,1,0.85,1,0,0,25.5,-62.7,1276,585.4,605.7,543.2,691.4,547.6,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,335.4,1019.7,642.8,546.6
|
||||
1899.42,1899.51,38.4962722,1399.46,103.2045889,-1.4577528,-70.1136222,-0.6086556,38.4962818,1399.781,103.2046199,-1.1760831,-69.9571219,-0.4905675,0,0,0,0.246,1,0.85,1,0,0,25.9,-61.5,1276,587.5,611.5,546.5,694.3,548.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,343.4,1019.8,647.8,547.7
|
||||
1900.41,1900.5,38.4962722,1399.47,103.2045889,-1.3795917,-70.1976222,-0.5472333,38.4962818,1399.781,103.20462,-1.1881537,-69.943048,-0.4873518,0,0,0,0.244,1,0.85,1,0,0,4,562.3,1276,587.1,610,545.8,700.5,547.9,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,343.7,1019.6,645.3,547.5
|
||||
1901.435,1901.53,38.4962722,1399.47,103.2045917,-1.4345444,-70.2199111,-0.6016,38.4962823,1399.781,103.2046198,-1.1913971,-69.9412777,-0.4842176,0,0,0,0.245,1,0.85,1,0,0,4,563.6,1276,588,610.5,545.8,699.5,547.9,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,343,1019.6,645.6,547.3
|
||||
1902.445,1902.545,38.4962722,1399.47,103.2045917,-1.5194778,-70.2251056,-0.5420361,38.4962827,1399.781,103.2046196,-1.204994,-69.9330608,-0.483613,0,0,0,0.244,1,0.85,1,0,0,26.3,-60.7,1276,587.4,609.8,546.2,694.6,548.1,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,343.1,1019.5,645.3,547.7
|
||||
1903.43,1903.525,38.4962722,1399.47,103.2045889,-1.5603917,-70.2275389,-0.4606222,38.4962829,1399.781,103.2046195,-1.1971774,-69.9356527,-0.4819374,0,0,0,0.244,1,0.85,1,0,0,26.4,-60.4,1276,587.8,610.7,546.3,693.6,548.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,344.5,1019.2,645.6,547.6
|
||||
1904.42,1904.515,38.4962722,1399.47,103.2045889,-1.5955389,-70.2087944,-0.4316944,38.496283,1399.781,103.2046195,-1.1999665,-69.9377055,-0.4813092,0,0,0,0.245,1,0.85,1,0,0,26.5,-60.4,1276,588.1,610.7,546.5,691.1,548.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,342.6,1019.6,645.1,547.7
|
||||
1905.41,1905.505,38.4962722,1399.47,103.2045889,-1.5833694,-70.1730167,-0.517775,38.4962831,1399.781,103.2046195,-1.1966004,-69.9365325,-0.480241,0,0,0,0.244,1,0.85,1,0,0,26.4,-61.1,1276,588,609.6,546.4,692.5,548.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,343.5,1019.4,645.1,547.6
|
||||
1906.435,1906.53,38.4962722,1399.47,103.2045889,-1.5485194,-70.1694944,-0.5696111,38.4962831,1399.781,103.2046195,-1.200415,-69.9371007,-0.4799603,0,0,0,0.244,1,0.85,1,0,0,26.3,-61,1276,587.7,610.2,546.3,693.9,548.1,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,343.7,1019.3,645.4,547.5
|
||||
1907.425,1907.52,38.4962722,1399.47,103.2045889,-1.5228556,-70.1819222,-0.58,38.4962832,1399.781,103.2046195,-1.1990912,-69.9383336,-0.4793048,0,0,0,0.244,1,0.85,1,0,0,26.3,-61.9,1276,588.2,609.6,546.4,691.3,548.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,344.4,1019.1,645.4,547.6
|
||||
1908.415,1908.51,38.4962722,1399.47,103.2045889,-1.4939417,-70.1882111,-0.5814444,38.4962832,1399.781,103.2046196,-1.1991427,-69.9372371,-0.478719,0,0,0,0.245,1,0.85,1,0,0,25.9,-61.8,1276,587.9,609.3,546.3,690.9,548.2,0,-128,0,-128,0,-128,0,-128,0,-128,0,-128,342.6,1019.4,645.7,547.4
|
||||
|
1977
java/src/main/resources/templates/VINS_0_mode1.txt
Normal file
1977
java/src/main/resources/templates/VINS_0_mode1.txt
Normal file
File diff suppressed because it is too large
Load Diff
1977
java/src/main/resources/templates/ins_frameSimu_0.txt
Normal file
1977
java/src/main/resources/templates/ins_frameSimu_0.txt
Normal file
File diff suppressed because it is too large
Load Diff
@ -7,250 +7,261 @@ export function tstaskList() {
|
||||
});
|
||||
}
|
||||
//获取试验任务节点树形结构
|
||||
export function getTsNodesTree(params:any) {
|
||||
export function getTsNodesTree(params: any) {
|
||||
return request({
|
||||
url: '/experimentalData/ts-nodes/getTsNodesTree',
|
||||
method: 'post',
|
||||
params:params,
|
||||
params: params,
|
||||
});
|
||||
}
|
||||
//增加试验任务节点
|
||||
export function addTsNodes(params:any) {
|
||||
export function addTsNodes(params: any) {
|
||||
return request({
|
||||
url: '/experimentalData/ts-nodes/addTsNodes',
|
||||
method: 'post',
|
||||
data:params,
|
||||
data: params,
|
||||
});
|
||||
}
|
||||
// 修改试验任务节点
|
||||
export function updateTsNodes(params:any) {
|
||||
export function updateTsNodes(params: any) {
|
||||
return request({
|
||||
url: '/experimentalData/ts-nodes/updateTsNodes',
|
||||
method: 'post',
|
||||
data:params,
|
||||
data: params,
|
||||
});
|
||||
}
|
||||
//根据ID删除试验任务节点
|
||||
export function deleteTsNodesById(params:any) {
|
||||
export function deleteTsNodesById(params: any) {
|
||||
return request({
|
||||
url: '/experimentalData/ts-nodes/deleteTsNodesById',
|
||||
method: 'post',
|
||||
params:params,
|
||||
params: params,
|
||||
});
|
||||
}
|
||||
//分页查询试验数据管理文档内容
|
||||
export function tsFilesPage(params:any) {
|
||||
export function tsFilesPage(params: any) {
|
||||
return request({
|
||||
url: '/experimentalData/ts-files/page',
|
||||
method: 'get',
|
||||
params:params,
|
||||
params: params,
|
||||
});
|
||||
}
|
||||
//新增试验数据管理文档内容
|
||||
export function addTsFiles(params:any) {
|
||||
export function addTsFiles(params: any) {
|
||||
return request({
|
||||
url: '/experimentalData/ts-files/addTsFiles',
|
||||
method: 'post',
|
||||
data:params,
|
||||
data: params,
|
||||
});
|
||||
}
|
||||
//修改试验数据管理文档内容
|
||||
export function updateTsFiles(params:any) {
|
||||
export function updateTsFiles(params: any) {
|
||||
return request({
|
||||
url: '/experimentalData/ts-files/updateTsFiles',
|
||||
method: 'post',
|
||||
data:params,
|
||||
data: params,
|
||||
});
|
||||
}
|
||||
//根据ID删除试验数据管理文档内容
|
||||
export function deleteTsFilesById(params:any) {
|
||||
export function deleteTsFilesById(params: any) {
|
||||
return request({
|
||||
url: '/experimentalData/ts-files/deleteTsFilesById',
|
||||
method: 'post',
|
||||
params:params,
|
||||
params: params,
|
||||
});
|
||||
}
|
||||
//批量删除试验数据管理文档内容
|
||||
export function deleteTsFilesByIds(params:any) {
|
||||
export function deleteTsFilesByIds(params: any) {
|
||||
return request({
|
||||
url: '/experimentalData/ts-files/deleteTsFilesByIds',
|
||||
method: 'post',
|
||||
params:params,
|
||||
params: params,
|
||||
});
|
||||
}
|
||||
//压缩
|
||||
export function compress(params:any) {
|
||||
export function compress(params: any) {
|
||||
return request({
|
||||
url: '/experimentalData/ts-files/compress',
|
||||
method: 'post',
|
||||
params:params,
|
||||
params: params,
|
||||
});
|
||||
}
|
||||
//解压
|
||||
export function Decompression(params:any) {
|
||||
export function Decompression(params: any) {
|
||||
return request({
|
||||
url: '/experimentalData/ts-files/decompression',
|
||||
method: 'post',
|
||||
params:params,
|
||||
params: params,
|
||||
});
|
||||
}
|
||||
//对比两个目录的文件差异
|
||||
export function compare(params:any) {
|
||||
export function compare(params: any) {
|
||||
return request({
|
||||
url: '/experimentalData/ts-files/compare',
|
||||
method: 'post',
|
||||
params:params,
|
||||
params: params,
|
||||
});
|
||||
}
|
||||
//从备份空间下载到工作空间
|
||||
export function downloadToLocal(params:any) {
|
||||
export function downloadToLocal(params: any) {
|
||||
return request({
|
||||
url: '/experimentalData/ts-files/downloadToLocal',
|
||||
method: 'post',
|
||||
params:params,
|
||||
params: params,
|
||||
});
|
||||
}
|
||||
//将文件上传到备份空间
|
||||
export function uploadToBackup(params:any) {
|
||||
export function uploadToBackup(params: any) {
|
||||
return request({
|
||||
url: '/experimentalData/ts-files/uploadToBackup',
|
||||
method: 'post',
|
||||
params:params,
|
||||
params: params,
|
||||
});
|
||||
}
|
||||
//新增试验数据管理文件夹
|
||||
export function addTsFile(params:any) {
|
||||
export function addTsFile(params: any) {
|
||||
return request({
|
||||
url: '/experimentalData/ts-files/addTsFile',
|
||||
method: 'post',
|
||||
data:params,
|
||||
data: params,
|
||||
});
|
||||
}
|
||||
|
||||
//根据父项编码查询数据字典项数据
|
||||
export function list(params:any){
|
||||
return request ({
|
||||
url:'/system/dictionaryItems/list',
|
||||
method:'post',
|
||||
params:params
|
||||
export function list(params: any) {
|
||||
return request({
|
||||
url: '/system/dictionaryItems/list',
|
||||
method: 'post',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
//查询试验数据管理文件夹
|
||||
export function listTsFiles(params:any){
|
||||
return request ({
|
||||
url:'/experimentalData/ts-files/listTsFiles',
|
||||
method:'get',
|
||||
params:params
|
||||
export function listTsFiles(params: any) {
|
||||
return request({
|
||||
url: '/experimentalData/ts-files/listTsFiles',
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
//移动
|
||||
export function moveFileFolder(params:any){
|
||||
return request ({
|
||||
url:'/experimentalData/ts-files/moveFileFolder',
|
||||
method:'post',
|
||||
data:params
|
||||
export function moveFileFolder(params: any) {
|
||||
return request({
|
||||
url: '/experimentalData/ts-files/moveFileFolder',
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
//复制
|
||||
export function copyFileFolder(params:any){
|
||||
return request ({
|
||||
url:'/experimentalData/ts-files/copyFileFolder',
|
||||
method:'post',
|
||||
data:params
|
||||
export function copyFileFolder(params: any) {
|
||||
return request({
|
||||
url: '/experimentalData/ts-files/copyFileFolder',
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
//定义频率
|
||||
export function startSimpleNavi(params:any){
|
||||
return request ({
|
||||
url:'/experimentalData/ts-files/startSimpleNavi',
|
||||
method:'post',
|
||||
params:params
|
||||
export function startSimpleNavi(params: any) {
|
||||
return request({
|
||||
url: '/experimentalData/ts-files/startSimpleNavi',
|
||||
method: 'post',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
//关闭
|
||||
export function stopSimpleNavi(params:any){
|
||||
return request ({
|
||||
url:'/experimentalData/ts-files/stopSimpleNavi',
|
||||
method:'post',
|
||||
params:params
|
||||
export function stopSimpleNavi(params: any) {
|
||||
return request({
|
||||
url: '/experimentalData/ts-files/stopSimpleNavi',
|
||||
method: 'post',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
//读取text文件
|
||||
export function apicontent(params:any){
|
||||
return request ({
|
||||
url:'/experimentalData/ts-files/api/files/content',
|
||||
method:'get',
|
||||
params:params
|
||||
export function apicontent(params: any) {
|
||||
return request({
|
||||
url: '/experimentalData/ts-files/api/files/content',
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
//保存编辑的图片
|
||||
export function saveContent(params:any){
|
||||
return request ({
|
||||
url:'/experimentalData/ts-files/save/files/content',
|
||||
method:'post',
|
||||
params:params,
|
||||
export function saveContent(params: any) {
|
||||
return request({
|
||||
url: '/experimentalData/ts-files/save/files/content',
|
||||
method: 'post',
|
||||
params: params,
|
||||
// headers: {
|
||||
// 'Content-Type': 'application/json' // 明确指定内容类型
|
||||
// }
|
||||
})
|
||||
}
|
||||
//excel编辑保存
|
||||
export function batchModify(params:any){
|
||||
return request ({
|
||||
url:'/experimentalData/ts-files/batchModify',
|
||||
method:'post',
|
||||
data:params,
|
||||
export function batchModify(params: any) {
|
||||
return request({
|
||||
url: '/experimentalData/ts-files/batchModify',
|
||||
method: 'post',
|
||||
data: params,
|
||||
|
||||
})
|
||||
}
|
||||
//试验数据扫描接口通过试验任务ID
|
||||
export function testDataScanById(params:any){
|
||||
return request ({
|
||||
url:'/experimentalData/ts-nodes/testDataScanById',
|
||||
method:'post',
|
||||
params:params,
|
||||
export function testDataScanById(params: any) {
|
||||
return request({
|
||||
url: '/experimentalData/ts-nodes/testDataScanById',
|
||||
method: 'post',
|
||||
params: params,
|
||||
|
||||
})
|
||||
}
|
||||
//获取异步信息(扫描)
|
||||
export function obtaintestData(params:any){
|
||||
return request ({
|
||||
url:'/experimentalData/ts-nodes/obtaintestData',
|
||||
method:'post',
|
||||
params:params,
|
||||
export function obtaintestData(params: any) {
|
||||
return request({
|
||||
url: '/experimentalData/ts-nodes/obtaintestData',
|
||||
method: 'post',
|
||||
params: params,
|
||||
|
||||
})
|
||||
}
|
||||
//获取异步信息(解压)
|
||||
export function decompressionFolderData(params:any){
|
||||
return request ({
|
||||
url:'/experimentalData/ts-files/decompressionFolderData',
|
||||
method:'post',
|
||||
params:params,
|
||||
export function decompressionFolderData(params: any) {
|
||||
return request({
|
||||
url: '/experimentalData/ts-files/decompressionFolderData',
|
||||
method: 'post',
|
||||
params: params,
|
||||
|
||||
})
|
||||
}
|
||||
//判断节点
|
||||
export function selectTsNodesByTskeId(params:any){
|
||||
return request ({
|
||||
url:'/experimentalData/ts-nodes/selectTsNodesByTskeId',
|
||||
method:'post',
|
||||
params:params,
|
||||
export function selectTsNodesByTskeId(params: any) {
|
||||
return request({
|
||||
url: '/experimentalData/ts-nodes/selectTsNodesByTskeId',
|
||||
method: 'post',
|
||||
params: params,
|
||||
|
||||
})
|
||||
}
|
||||
export function confirmDeleteNodes(params:any){
|
||||
return request ({
|
||||
url:'/experimentalData/ts-nodes/confirmDeleteNodes',
|
||||
method:'post',
|
||||
params:params,
|
||||
export function confirmDeleteNodes(params: any) {
|
||||
return request({
|
||||
url: '/experimentalData/ts-nodes/confirmDeleteNodes',
|
||||
method: 'post',
|
||||
params: params,
|
||||
})
|
||||
}
|
||||
//获取文件相关的属性
|
||||
export function listTsFilesById(params:any){
|
||||
return request ({
|
||||
url:'/experimentalData/ts-files/listTsFilesById',
|
||||
method:'post',
|
||||
params:params,
|
||||
export function listTsFilesById(params: any) {
|
||||
return request({
|
||||
url: '/experimentalData/ts-files/listTsFilesById',
|
||||
method: 'post',
|
||||
params: params,
|
||||
})
|
||||
}
|
||||
// 解压缩接口
|
||||
export function splitFile(params: any) {
|
||||
return request({
|
||||
url: '/experimentalData/ts-files/splitFile',
|
||||
method: 'post',
|
||||
data: params,
|
||||
headers: {
|
||||
'Content-Type': 'multipart/form-data'
|
||||
}
|
||||
})
|
||||
}
|
||||
@ -78,3 +78,31 @@ export function importTaskSql(queryParams: any) {
|
||||
headers: { 'Content-Type': 'multipart/form-data' }
|
||||
});
|
||||
}
|
||||
//
|
||||
export function commonItems() {
|
||||
return request({
|
||||
url: '/api/common-items',
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
export function addCommonItems(queryParams: any) {
|
||||
return request({
|
||||
url: '/api/common-items',
|
||||
method: 'post',
|
||||
data: queryParams,
|
||||
});
|
||||
}
|
||||
export function delCommonItems(queryParams: any) {
|
||||
return request({
|
||||
url: '/api/common-items',
|
||||
method: 'delete',
|
||||
data: queryParams,
|
||||
});
|
||||
}
|
||||
export function batchCommonItems(queryParams: any) {
|
||||
return request({
|
||||
url: '/api/common-items/batch',
|
||||
method: 'post',
|
||||
data: queryParams,
|
||||
});
|
||||
}
|
||||
BIN
web/src/assets/MenuIcon/datazh.png
Normal file
BIN
web/src/assets/MenuIcon/datazh.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 419 B |
BIN
web/src/assets/MenuIcon/lbcz_qzsc.png
Normal file
BIN
web/src/assets/MenuIcon/lbcz_qzsc.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 518 B |
BIN
web/src/assets/MenuIcon/save.png
Normal file
BIN
web/src/assets/MenuIcon/save.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 280 B |
BIN
web/src/assets/MenuIcon/select.png
Normal file
BIN
web/src/assets/MenuIcon/select.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 560 B |
BIN
web/src/assets/MenuIcon/set.png
Normal file
BIN
web/src/assets/MenuIcon/set.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 665 B |
@ -1,6 +1,6 @@
|
||||
import minimatch from "minimatch";
|
||||
import useRouterData from "@/components/file/useRouterData";
|
||||
import { removeDuplicateSlashes } from "fast-glob/out/managers/patterns";
|
||||
// import { removeDuplicateSlashes } from "fast-glob/out/managers/patterns";
|
||||
import common from "@/components/file/common";
|
||||
import { useStorage } from '@vueuse/core';
|
||||
let { storageKey, currentPath } = useRouterData()
|
||||
@ -8,7 +8,9 @@ let { storageKey, currentPath } = useRouterData()
|
||||
const zfilePasswordCache = useStorage('zfile-pwd-cache', {});
|
||||
|
||||
export default function useFilePwd() {
|
||||
|
||||
function removeDuplicateSlashes(path) {
|
||||
return path.replace(/\\/g, '/').replace(/\/+/g, '/');
|
||||
}
|
||||
// 向缓存中写入当前路径密码
|
||||
let putPathPwd = (pattern, password) => {
|
||||
if (pattern) {
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
import JSEncrypt from 'jsencrypt/bin/jsencrypt.min'
|
||||
import JSEncrypt from 'jsencrypt';
|
||||
// 密钥对生成 http://web.chacuo.net/netrsakeypair
|
||||
|
||||
const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANL378k3RiZHWx5AfJqdH9xRNBmD9wGD\n' +
|
||||
|
||||
@ -14,7 +14,7 @@ const title = userStore.title;
|
||||
<div class="dashboard-container"
|
||||
style="display: flex;align-items: center;justify-content: center;flex-wrap: wrap;align-content:center;">
|
||||
<div style="width: 100%; text-align: center;
|
||||
font-size: 80px;
|
||||
font-size: 70px;
|
||||
margin-top: 200px;
|
||||
color: #fff;">欢迎使用{{ title }}</div>
|
||||
</div>
|
||||
|
||||
148
web/src/views/testdata/datamanagement/index.vue
vendored
148
web/src/views/testdata/datamanagement/index.vue
vendored
@ -13,7 +13,10 @@ import { ElMessageBox, ElMessage, ElMain } from "element-plus";
|
||||
import Page from '@/components/Pagination/page.vue';
|
||||
import AudioPlayer from '@/components/file/preview/AudioPlayer.vue';
|
||||
import { batchDeleteReq } from "@/api/file-operator";
|
||||
import { tstaskList, obtaintestData, decompressionFolderData, getTsNodesTree, confirmDeleteNodes, addTsNodes, selectTsNodesByTskeId, updateTsNodes, deleteTsNodesById, tsFilesPage, addTsFiles, testDataScanById, updateTsFiles, deleteTsFilesById, listTsFiles, deleteTsFilesByIds, compress, Decompression, compare, downloadToLocal, uploadToBackup, addTsFile, list, moveFileFolder, copyFileFolder, startSimpleNavi, stopSimpleNavi, listTsFilesById } from "@/api/datamanagement";
|
||||
import {
|
||||
tstaskList, obtaintestData, decompressionFolderData, getTsNodesTree, confirmDeleteNodes, addTsNodes, selectTsNodesByTskeId, updateTsNodes, deleteTsNodesById, tsFilesPage, addTsFiles, testDataScanById, updateTsFiles, deleteTsFilesById, listTsFiles, deleteTsFilesByIds, compress, Decompression, compare, downloadToLocal, uploadToBackup, addTsFile, list, moveFileFolder, copyFileFolder,
|
||||
startSimpleNavi, stopSimpleNavi, listTsFilesById, splitFile
|
||||
} from "@/api/datamanagement";
|
||||
import ZUpload from '@/components/file/ZUpload.vue'
|
||||
import useFileUpload from "@/components/file/file/useFileUpload";
|
||||
import useHeaderStorageList from "@/components/header/useHeaderStorageList";
|
||||
@ -45,6 +48,8 @@ import TextViewerAsyncLoading from "@/components/file/preview/TextViewerAsyncLoa
|
||||
import MarkdownViewerDialogAsyncLoading from "@/components/file/preview/MarkdownViewerDialogAsyncLoading.vue";
|
||||
import { display } from "html2canvas/dist/types/css/property-descriptors/display";
|
||||
import { getDict } from '@/api/dict'
|
||||
import type { UploadInstance } from 'element-plus'
|
||||
import type { UploadProps } from 'element-plus'
|
||||
const { dialogVideoVisible, dialogTextVisible, dialogPdfVisible, dialogOfficeVisible, dialog3dVisible } = useFilePreview();
|
||||
const { clearALlFinishedUploadFile } = useFileUpload();
|
||||
const { currentStorageKey } = useHeaderStorageList();
|
||||
@ -154,7 +159,7 @@ function getProject() {
|
||||
setupWebSocket()
|
||||
ws2 = new WebSocket(userStore.WebSocketUrl + '/websocket/' + "id_extract_" + projectId.value)
|
||||
setupWebSocket2()
|
||||
gettreedata()
|
||||
gettreedata('')
|
||||
tonstatus(false)
|
||||
})
|
||||
}
|
||||
@ -179,7 +184,7 @@ function tonstatus(ready: any) {
|
||||
tonloading.value = true
|
||||
buttonmsg.value = '处理中...'
|
||||
}
|
||||
gettreedata()
|
||||
gettreedata('')
|
||||
|
||||
})
|
||||
//解压
|
||||
@ -242,9 +247,13 @@ const treeForm = ref({
|
||||
//获取树数据
|
||||
const treeRef = ref();
|
||||
const filepath = ref('')
|
||||
function gettreedata() {
|
||||
function gettreedata(type: string) {
|
||||
treeloading.value = true
|
||||
if (type == '节点搜索' && treeForm.value.nodeName !== '') {
|
||||
treeForm.value.taskId = ''
|
||||
} else {
|
||||
treeForm.value.taskId = projectId.value
|
||||
}
|
||||
let keyar = projectArr.value.find(item => item.id === projectId.value);
|
||||
storageKey.value = keyar.key
|
||||
getTsNodesTree(treeForm.value).then((res: any) => {
|
||||
@ -252,6 +261,7 @@ function gettreedata() {
|
||||
treeloading.value = false
|
||||
if (treedata.value[0]) {
|
||||
pathid.value = treedata.value[0].nodeId
|
||||
projectId.value = treedata.value[0].taskId
|
||||
nodename.value = res.data[0].nodeName
|
||||
if (nodename.value == '根节点') {
|
||||
filepath.value = res.data[0].path
|
||||
@ -273,6 +283,7 @@ const pathid = ref()
|
||||
const nodename = ref('')
|
||||
function handleNodeClick(data: any, node: any) {
|
||||
pathid.value = data.nodeId
|
||||
projectId.value = data.taskId
|
||||
// filepath.value = data.path + data.nodeName + '/'
|
||||
creatform.value.parentId = ''
|
||||
patharr.value.length = 0
|
||||
@ -349,7 +360,7 @@ async function submitForm(formEl: any) {
|
||||
if (projectForme.value.nodeId) {
|
||||
updateTsNodes(projectForme.value).then((res: any) => {
|
||||
if (res.code == 0) {
|
||||
gettreedata()
|
||||
gettreedata('')
|
||||
ElMessage.success("修改成功")
|
||||
frame.value = false
|
||||
}
|
||||
@ -358,7 +369,7 @@ async function submitForm(formEl: any) {
|
||||
} else {
|
||||
addTsNodes(projectForme.value).then((res: any) => {
|
||||
if (res.code == 0) {
|
||||
gettreedata()
|
||||
gettreedata('')
|
||||
ElMessage.success("添加成功")
|
||||
frame.value = false
|
||||
}
|
||||
@ -393,7 +404,7 @@ function delSubItem(row: any) {
|
||||
loading.value = true
|
||||
deleteTsNodesById({ id: row.nodeId, path: row.path }).then((res: any) => {
|
||||
if (res.code == 0) {
|
||||
gettreedata()
|
||||
gettreedata('')
|
||||
ElMessage({
|
||||
type: 'success',
|
||||
message: '删除成功',
|
||||
@ -1656,11 +1667,11 @@ const pngobj: any = ref({
|
||||
textcontent: []
|
||||
})
|
||||
function pngsure() {
|
||||
if (!(pngradio.value && txtradio.value && configradio.value)) {
|
||||
// configradio.value
|
||||
if (!(pngradio.value && txtradio.value)) {
|
||||
ElMessage.warning('请选择底图或地理信息文件')
|
||||
return
|
||||
}
|
||||
|
||||
// 创建新的响应式对象
|
||||
const newPngobj = {
|
||||
pngurl: '',
|
||||
@ -1714,7 +1725,7 @@ function mapClose() {
|
||||
}
|
||||
// 1s/10s/30s/1m/2m/5m
|
||||
const options = ref([
|
||||
{
|
||||
{
|
||||
name: '10秒钟'
|
||||
, id: 10
|
||||
},
|
||||
@ -1741,7 +1752,7 @@ const qvehuan: any = ref(false)
|
||||
const qvehuan1: any = ref(false)
|
||||
function frequency(row: any) {
|
||||
startSimpleNavi({
|
||||
samTimes: maptime.value, id: fredid.value, token: userStore.userId, taskId: projectId.value, configId: configradio.value
|
||||
samTimes: maptime.value, id: fredid.value, token: userStore.userId, taskId: projectId.value, configId: ''
|
||||
}).then((res: any) => {
|
||||
if (res.code == '0' && row) {
|
||||
ElMessage.success("切换成功")
|
||||
@ -1780,7 +1791,7 @@ function getSSELink() {
|
||||
try {
|
||||
const data = JSON.parse(e.data)
|
||||
console.log('SSE消息:', data)
|
||||
if(data.message == '配置文件选择错误,请重新选择!'){
|
||||
if (data.message == '配置文件选择错误,请重新选择!') {
|
||||
ElMessage.warning(data.message)
|
||||
return
|
||||
}
|
||||
@ -1857,18 +1868,78 @@ const formatFileSize = (size: number): string => {
|
||||
const txtradio: any = ref(null)
|
||||
const pngradio: any = ref(null)
|
||||
const configradio: any = ref(null)
|
||||
const dataConversionDialog = ref(false)
|
||||
const isConversionSuccess = ref(false)
|
||||
const fvnsFileName = ref('')
|
||||
const vinsFileName = ref('')
|
||||
const configFile = ref('')
|
||||
const selectedFile = ref<File | null>(null);
|
||||
const selectdata: any = ref({})
|
||||
const conversionLoading = ref(false)
|
||||
function dataConversionClose() {
|
||||
dataConversionDialog.value = false
|
||||
}
|
||||
function delfiles() {
|
||||
selectedFile.value = null
|
||||
configFile.value = ''
|
||||
}
|
||||
function saveDataConversion() {
|
||||
conversionLoading.value = true
|
||||
const formData = new FormData();
|
||||
if (selectedFile.value != null) {
|
||||
formData.append('jsonFile', selectedFile.value);
|
||||
}
|
||||
formData.append('id', selectdata.value.id);
|
||||
formData.append('taskId', selectdata.value.taskId);
|
||||
splitFile(formData).then((res: any) => {
|
||||
if (res && res.code == '0') {
|
||||
fvnsFileName.value = res.data.FVNS.fileName
|
||||
vinsFileName.value = res.data.VINS.fileName
|
||||
getdata()
|
||||
isConversionSuccess.value = true
|
||||
conversionLoading.value = false
|
||||
} else {
|
||||
conversionLoading.value = false
|
||||
ElMessage.error('转换失败')
|
||||
}
|
||||
})
|
||||
}
|
||||
function dataConversion(row: any) {
|
||||
const params = {
|
||||
id: row.id,
|
||||
taskId: row.taskId
|
||||
}
|
||||
selectdata.value = params
|
||||
configFile.value = ''
|
||||
selectedFile.value = null
|
||||
isConversionSuccess.value = false
|
||||
dataConversionDialog.value = true
|
||||
}
|
||||
function isConversion(fileName: string) {
|
||||
return fileName.endsWith('.txt')
|
||||
}
|
||||
const uploadRef = ref<UploadInstance>()
|
||||
function handleFileChange(uploadFile: any) {
|
||||
if (uploadFile.raw.type !== 'application/json') {
|
||||
ElMessage.error('请上传.json 文件')
|
||||
return
|
||||
}
|
||||
configFile.value = uploadFile.raw.name
|
||||
const rawFile = uploadFile.raw
|
||||
selectedFile.value = rawFile
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="faulttemplate-box">
|
||||
<aside id="silderLeft">
|
||||
<div>
|
||||
<el-select v-model="projectId" placeholder="请选择项目" @change="gettreedata()">
|
||||
<el-select v-model="projectId" placeholder="请选择项目" @change="gettreedata('')">
|
||||
<el-option v-for="item in projectArr" :key="item.id" :label="item.taskName" :value="item.id" />
|
||||
</el-select>
|
||||
<div class="tree_sou">
|
||||
<el-input v-model="treeForm.nodeName" style="width:100%;margin:10px 9px 10px 0px;"
|
||||
placeholder="节点名称" clearable :suffix-icon="Search" @change="gettreedata()" />
|
||||
placeholder="节点名称" clearable :suffix-icon="Search" @change="gettreedata('节点搜索')" />
|
||||
<img src="@/assets/images/addNew.png" style="cursor: pointer;" title="新增子项目"
|
||||
@click="addSubItem({ nodeId: '00' })" alt="">
|
||||
<!-- <el-input v-model="treeForm.nodeName" style="width:100%;margin:10px 9px 10px 0px;"
|
||||
@ -1967,7 +2038,7 @@ const configradio: any = ref(null)
|
||||
</el-table-column>
|
||||
<el-table-column prop="uploader" width="80" label="上传人"></el-table-column>
|
||||
<el-table-column prop="updateTime" width="170" label="修改日期"></el-table-column>
|
||||
<el-table-column label="操作" width="140" align="center">
|
||||
<el-table-column label="操作" width="160" align="center">
|
||||
<template #default="scope">
|
||||
<span
|
||||
style="display: flex;display: -webkit-flex;justify-content: space-between;-webkit-justify-content: space-between; ">
|
||||
@ -1975,10 +2046,10 @@ const configradio: any = ref(null)
|
||||
style="cursor: pointer;"> -->
|
||||
<img src="@/assets/project/chong.png" alt="" title="重命名" @click="editfile(scope.row, false)"
|
||||
style="cursor: pointer;">
|
||||
|
||||
<img v-if="iftrackFile(scope.row.fileName)"
|
||||
src="@/assets/MenuIcon/guiji.png" alt="" @click="openMap(scope.row)" title="轨迹预览图"
|
||||
style="cursor: pointer;">
|
||||
<img v-if="isConversion(scope.row.fileName)" src="@/assets/MenuIcon/datazh.png" alt=""
|
||||
title="数据转换" @click="dataConversion(scope.row)" style="cursor: pointer;">
|
||||
<img v-if="iftrackFile(scope.row.fileName)" src="@/assets/MenuIcon/guiji.png" alt=""
|
||||
@click="openMap(scope.row)" title="轨迹预览图" style="cursor: pointer;">
|
||||
<img src="@/assets/MenuIcon/lbcz_xg.png" alt="" @click="editfile(scope.row, true)"
|
||||
title="修改" style="cursor: pointer;">
|
||||
<img v-if="scope.row.type == 'ZIP'" src="@/assets/images/jieyasuo.png" alt=""
|
||||
@ -2249,10 +2320,10 @@ const configradio: any = ref(null)
|
||||
top="30px" draggable destroy-on-close>
|
||||
<div v-loading="pngloading">
|
||||
<div class="map_select" style="margin-top: 0px;">
|
||||
<div style="width: 220px;margin-top: 5px;">请选择配置文件(trj_config*.txt):</div>
|
||||
<el-radio-group v-model="configradio">
|
||||
<!-- <div style="width: 220px;margin-top: 5px;">请选择配置文件(trj_config*.txt):</div> -->
|
||||
<!-- <el-radio-group v-model="configradio">
|
||||
<el-radio v-for="(item, index) in conarr" :value="item.id">{{ item.fileName }}</el-radio>
|
||||
</el-radio-group>
|
||||
</el-radio-group> -->
|
||||
</div>
|
||||
<div style="margin:0px 0px 15px 0px ;">
|
||||
<span>设定采样频率:</span>
|
||||
@ -2353,7 +2424,38 @@ const configradio: any = ref(null)
|
||||
top="30px" draggable width="60%" destroy-on-close>
|
||||
<txtexl :file-url="fileUrl" :rowId="rowId" :taskId="projectId" />
|
||||
</el-dialog>
|
||||
|
||||
<el-dialog :close-on-click-modal="false" title="数据转换" v-model="dataConversionDialog"
|
||||
:before-close="dataConversionClose" top="30px" draggable width="30%" destroy-on-close>
|
||||
<div v-loading="conversionLoading">
|
||||
<div v-if="isConversionSuccess" style="text-align: center;">
|
||||
<div style="color:#67c23a;font-size:16px;margin-bottom: 15px;"><span>数据转换成功!</span></div>
|
||||
<div style="font-size:16px;line-height: 1.5em;color:#409eff">
|
||||
<div>{{ fvnsFileName }}</div>
|
||||
<div>{{ vinsFileName }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else>
|
||||
<div style="display: flex;align-items: center;width: 100%;">
|
||||
<div style="min-width: max-content;">上传配置文件(.json)</div>
|
||||
<div style="margin-right: 10px;width: 290px;border: 1px solid #dcdfe6;display: flex;justify-content: space-between;align-items: center;
|
||||
border-radius: 4px;word-wrap: break-word;word-break: break-all;padding: 3px;min-height: 32px;">
|
||||
{{ configFile }}
|
||||
<CircleClose v-if="configFile !== ''" @click="delfiles"
|
||||
style="width: 1em; height: 1em;margin-right: 3px; margin-right: 5px;min-width: 1em;cursor: pointer;" />
|
||||
</div>
|
||||
<el-upload ref="uploadRef" class="upload-demo" :show-file-list="false"
|
||||
@change="handleFileChange" action=""
|
||||
:auto-upload="false">
|
||||
<el-button type="primary">上传</el-button>
|
||||
</el-upload>
|
||||
</div>
|
||||
</div>
|
||||
<div style="width: 100%;display: flex;justify-content: end;margin-top: 25px;">
|
||||
<el-button v-if="isConversionSuccess" type="primary" @click="dataConversionClose">关闭</el-button>
|
||||
<el-button v-else type="primary" @click="saveDataConversion">确定</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
||||
517
web/src/views/testdata/testtask/index.vue
vendored
517
web/src/views/testdata/testtask/index.vue
vendored
@ -5,17 +5,18 @@ export default {
|
||||
</script>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { onMounted, ref } from "vue";
|
||||
import { onMounted, ref,h } from "vue";
|
||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||
import Page from '@/components/Pagination/page.vue'
|
||||
import {
|
||||
tstaskPage, addtsTask, updatetsTask, exportTaskSql, deleteTsTaskById,
|
||||
deleteTsTaskByIds, confirmDeleteTask, selectTsNodesById, getMaxTaskCode,
|
||||
importTaskSql
|
||||
importTaskSql, commonItems, addCommonItems, delCommonItems, batchCommonItems
|
||||
} from "@/api/testtask";
|
||||
import { storagesBytype } from "@/api/storage";
|
||||
import { getDict } from '@/api/dict'
|
||||
import { getUserInfo } from '@/api/user';
|
||||
import { st } from "vue-router/dist/router-CWoNjPRp.mjs";
|
||||
///////
|
||||
let result2 = ref([])
|
||||
let result1 = ref([
|
||||
@ -27,6 +28,7 @@ let result1 = ref([
|
||||
{ name: '载机名称', code: 'carrier_name' },
|
||||
{ name: '设备代号_编号', code: 'device_code' },
|
||||
{ name: '试验描述', code: 'test_describe' },
|
||||
{ name: '试验标签项', code: 'custom1' },
|
||||
{ name: '传感器描述', code: 'sensor_describe' },
|
||||
{ name: '本地存储空间', code: 'local_storage_id' },
|
||||
{ name: '备份存储空间', code: 'backup_storage_id' },
|
||||
@ -143,6 +145,7 @@ const frame = ref(false)
|
||||
//新增项目弹框
|
||||
function addproject() {
|
||||
frame.value = true
|
||||
customList.value = []
|
||||
title.value = "新增试验任务"
|
||||
projectForme.value = {
|
||||
taskName: "",//任务名称
|
||||
@ -172,6 +175,11 @@ function addproject() {
|
||||
//修改项目弹框
|
||||
function editproject(row: any) {
|
||||
projectForme.value = JSON.parse(JSON.stringify(row))
|
||||
if( projectForme.value.custom1 !== null&& projectForme.value.custom1 !== undefined && projectForme.value.custom1 !== ''){
|
||||
customList.value = projectForme.value.custom1.split(',')
|
||||
}else{
|
||||
customList.value = []
|
||||
}
|
||||
formitemarr.value = projectForme.value.taskProps
|
||||
projectForme.value.taskDate = [projectForme.value.taskStartdate, projectForme.value.taskEnddate]
|
||||
title.value = "修改试验任务"
|
||||
@ -216,6 +224,38 @@ function delproject(row: any) {
|
||||
})
|
||||
})
|
||||
}
|
||||
//强制删除项目弹框
|
||||
function reforcedelproject(row: any) {
|
||||
ElMessageBox.confirm(
|
||||
'',
|
||||
'警告',
|
||||
{
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning',
|
||||
message: h(
|
||||
'span',
|
||||
{ style: 'color:#f56c6c' },
|
||||
'强制删除将删除该试验任务的所有内容:包括本地存储空间文件及备份存储空间文件。建议限于测试数据或者已有其他备份的的试验任务数据。您确认要强制删除吗?'
|
||||
)
|
||||
}
|
||||
)
|
||||
.then(() => {
|
||||
deleteTsTaskById({ id: row.id }).then((res: any) => {
|
||||
if (res.code == 0) {
|
||||
getdata()
|
||||
ElMessage({
|
||||
type: 'success',
|
||||
message: '强制删除成功',
|
||||
})
|
||||
}
|
||||
else {
|
||||
ElMessage.warning("强制删除失败!")
|
||||
return
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
function expproject(row: any) {
|
||||
ElMessageBox.confirm(
|
||||
'您确定要导出该任务吗?',
|
||||
@ -314,14 +354,16 @@ const projectForme: any = ref({
|
||||
carrierName: "",//载体名称
|
||||
deviceName: "",//设备名称
|
||||
taskCode: "",//任务编号
|
||||
deviceCode: ""//设备编号
|
||||
, taskType: "",
|
||||
deviceCode: "", //设备编号
|
||||
taskType: "",
|
||||
testDescribe: "",// 试验描述
|
||||
sensorDescribe: "",// 传感器描述
|
||||
taskProps: "",//信息
|
||||
localStorageId: '',
|
||||
backupStorageId: ''
|
||||
backupStorageId: '',
|
||||
custom1: '',//试验标签项
|
||||
})
|
||||
const isdouble = ref(false)
|
||||
//表单确定
|
||||
async function submitForm(formEl: any) {
|
||||
if (!formEl) return
|
||||
@ -339,6 +381,16 @@ async function submitForm(formEl: any) {
|
||||
projectForme.value.taskStartdate = ''
|
||||
projectForme.value.taskEnddate = ''
|
||||
}
|
||||
//试验标签项
|
||||
if(customList.value.length>0){
|
||||
projectForme.value.custom1 = customList.value.join(',')
|
||||
}else{
|
||||
projectForme.value.custom1 = ''
|
||||
}
|
||||
if(isdouble.value){
|
||||
return
|
||||
}
|
||||
isdouble.value = true
|
||||
if (projectForme.value.id) {
|
||||
updatetsTask(projectForme.value).then((res: any) => {
|
||||
if (res.code == 0) {
|
||||
@ -346,6 +398,7 @@ async function submitForm(formEl: any) {
|
||||
ElMessage.success("修改成功")
|
||||
frame.value = false
|
||||
}
|
||||
isdouble.value = false
|
||||
})
|
||||
} else {
|
||||
addtsTask(projectForme.value).then((res: any) => {
|
||||
@ -354,7 +407,7 @@ async function submitForm(formEl: any) {
|
||||
ElMessage.success("添加成功")
|
||||
frame.value = false
|
||||
}
|
||||
|
||||
isdouble.value = false
|
||||
})
|
||||
}
|
||||
}
|
||||
@ -364,7 +417,9 @@ async function submitForm(formEl: any) {
|
||||
const moderules = ref({
|
||||
taskType: [{ required: true, message: "请选择任务类型", trigger: "change" }],
|
||||
taskDate: [{ required: true, message: "请选择任务时间", trigger: "change" }],
|
||||
taskPlace: [{ required: true, message: "请输入任务地点", trigger: "blur" }],
|
||||
taskPlace: [{ required: true, message: "请选择任务地点", trigger: "change" }],
|
||||
carrierName: [{ required: true, message: "请选择载机名称", trigger: "change" }],
|
||||
deviceCode: [{ required: true, message: "请输入设备代号_编号", trigger: "blur" }],
|
||||
localStorageId: [{ required: true, message: "请选择本地存储空间", trigger: "change" }],
|
||||
backupStorageId: [{ required: true, message: "请选择minio存储空间", trigger: "change" }],
|
||||
});
|
||||
@ -515,7 +570,7 @@ function importSubmit(formEl: any) {
|
||||
if (res.code == '0') {
|
||||
isconnect.value = false
|
||||
importDialog.value = false
|
||||
ElMessage.success('上传成功')
|
||||
ElMessage.success('导入成功')
|
||||
getdata()
|
||||
} else {
|
||||
isconnect.value = false
|
||||
@ -529,6 +584,317 @@ function importSubmit(formEl: any) {
|
||||
function importClose() {
|
||||
importDialog.value = false
|
||||
}
|
||||
//输入框单选
|
||||
const taskPlaceOptions = ref([])
|
||||
const taskPlaceLoading = ref(false)
|
||||
const selectDialog = ref(false)
|
||||
const selectData = ref([])
|
||||
const selectDataAll = ref([])
|
||||
const selectKeyword = ref('')
|
||||
const selectDialogLoading = ref(false)
|
||||
const selectData2 = ref([])
|
||||
const selectDataAll2 = ref([])
|
||||
const selectKeyword2 = ref('')
|
||||
// 载机名称
|
||||
const aircraftOptions = ref([])
|
||||
const aircraftLoading = ref(false)
|
||||
// 传感器描述
|
||||
const sensorDescribeOptions = ref([])
|
||||
const sensorDescribeLoading = ref(false)
|
||||
// 多选试验标签项
|
||||
const customList = ref([])
|
||||
const customMultpieOptions = ref([])
|
||||
const customMultpieLoading = ref(false)
|
||||
const iscustomMultpie = ref(false)
|
||||
const selectionList = ref([])
|
||||
const multipleTableRef = ref(null)
|
||||
|
||||
function remoteMethod(query) {
|
||||
let list = []
|
||||
commonItems().then((res: any) => {
|
||||
if (res.data.taskLocation) {
|
||||
list = res.data.taskLocation
|
||||
}
|
||||
if (query !== '') {
|
||||
taskPlaceLoading.value = true;
|
||||
setTimeout(() => {
|
||||
taskPlaceLoading.value = false;
|
||||
taskPlaceOptions.value = list.filter(item => item.includes(query));
|
||||
}, 200);
|
||||
} else {
|
||||
taskPlaceOptions.value = list
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
function remoteMethod2(query) {
|
||||
let list = []
|
||||
commonItems().then((res: any) => {
|
||||
if (res.data.aircraftName) {
|
||||
list = res.data.aircraftName
|
||||
}
|
||||
if (query !== '') {
|
||||
aircraftLoading.value = true;
|
||||
setTimeout(() => {
|
||||
aircraftLoading.value = false;
|
||||
aircraftOptions.value = list.filter(item => item.includes(query));
|
||||
}, 200);
|
||||
} else {
|
||||
aircraftOptions.value = list
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
function remoteMethod3(query) {
|
||||
let list = []
|
||||
commonItems().then((res: any) => {
|
||||
if (res.data.sensorDescription) {
|
||||
list = res.data.sensorDescription
|
||||
}
|
||||
if (query !== '') {
|
||||
sensorDescribeLoading.value = true;
|
||||
setTimeout(() => {
|
||||
sensorDescribeLoading.value = false;
|
||||
sensorDescribeOptions.value = list.filter(item => item.includes(query));
|
||||
}, 200);
|
||||
} else {
|
||||
sensorDescribeOptions.value = list
|
||||
}
|
||||
})
|
||||
}
|
||||
function remoteMethod4(query) {
|
||||
let list = []
|
||||
commonItems().then((res: any) => {
|
||||
if (res.data.taskLabel) {
|
||||
list = res.data.taskLabel
|
||||
}
|
||||
if (query !== '') {
|
||||
aircraftLoading.value = true;
|
||||
setTimeout(() => {
|
||||
customMultpieLoading.value = false;
|
||||
customMultpieOptions.value = list.filter(item => item.includes(query));
|
||||
}, 200);
|
||||
} else {
|
||||
customMultpieOptions.value = list
|
||||
}
|
||||
})
|
||||
}
|
||||
function saveSelect(type: string) {
|
||||
let value = ''
|
||||
if (type === 'taskLocation') {
|
||||
value = projectForme.value.taskPlace
|
||||
} else if (type === 'aircraftName') {
|
||||
value = projectForme.value.carrierName
|
||||
} else if (type === 'sensorDescription') {
|
||||
value = projectForme.value.sensorDescribe
|
||||
}
|
||||
const params = {
|
||||
label: value,
|
||||
type: type
|
||||
}
|
||||
addCommonItems(params).then((res: any) => {
|
||||
if (res.success) {
|
||||
ElMessage.success('保存成功')
|
||||
} else {
|
||||
ElMessage.error('保存失败')
|
||||
}
|
||||
})
|
||||
}
|
||||
function showSelectList(type: string) {
|
||||
querySelectList(type)
|
||||
iscustomMultpie.value = false
|
||||
selectDialog.value = true
|
||||
}
|
||||
function selectDataProcess(data: any, type: string) {
|
||||
let list = []
|
||||
data.forEach((item: any) => {
|
||||
list.push({
|
||||
name: item,
|
||||
type: type
|
||||
})
|
||||
})
|
||||
return list
|
||||
}
|
||||
function blurChange(type: string, e: any) {
|
||||
if (type == 'taskLocation' && e.target.value !== '') {
|
||||
projectForme.value.taskPlace = e.target.value
|
||||
} else if (type == 'aircraftName' && e.target.value !== '') {
|
||||
projectForme.value.carrierName = e.target.value
|
||||
} else if (type == 'sensorDescription' && e.target.value !== '') {
|
||||
projectForme.value.sensorDescribe = e.target.value
|
||||
} else if (type == 'taskLabel' && e.target.value !== '') {
|
||||
const issave = customList.value.indexOf(e.target.value) !== -1;
|
||||
if (!issave) {
|
||||
customList.value.push(e.target.value)
|
||||
}
|
||||
}
|
||||
}
|
||||
function selectKeywordChange(type: string) {
|
||||
if (type == '1') {
|
||||
const list = selectDataAll.value
|
||||
if (selectKeyword.value !== '') {
|
||||
selectData.value = list.filter(item => item.name.includes(selectKeyword.value))
|
||||
} else {
|
||||
selectData.value = selectDataAll.value
|
||||
}
|
||||
} else {
|
||||
const list2 = selectDataAll2.value
|
||||
if (selectKeyword2.value !== '') {
|
||||
selectData2.value = list2.filter(item => item.name.includes(selectKeyword2.value))
|
||||
} else {
|
||||
selectData2.value = selectDataAll2.value
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
function selectClose() {
|
||||
selectDialog.value = false
|
||||
}
|
||||
function delSelect(row: any, type: string) {
|
||||
const params = {
|
||||
label: row.name,
|
||||
type: row.type
|
||||
}
|
||||
delCommonItems(params).then((res: any) => {
|
||||
if (res.success) {
|
||||
ElMessage.success('删除成功')
|
||||
if (type == '1') {
|
||||
querySelectList(row.type)
|
||||
} else {
|
||||
customList.value.splice(customList.value.indexOf(row.name), 1)
|
||||
queryCustomMultpieList()
|
||||
}
|
||||
} else {
|
||||
ElMessage.error('删除失败')
|
||||
}
|
||||
})
|
||||
}
|
||||
function submitSelect(row: any) {
|
||||
if (row.type === 'taskLocation') {
|
||||
projectForme.value.taskPlace = row.name
|
||||
} else if (row.type === 'aircraftName') {
|
||||
projectForme.value.carrierName = row.name
|
||||
} else if (row.type === 'sensorDescription') {
|
||||
projectForme.value.sensorDescribe = row.name
|
||||
} else if (row.type === 'sensorDescription') {
|
||||
projectForme.value.sensorDescribe = row.name
|
||||
}
|
||||
selectDialog.value = false
|
||||
}
|
||||
function querySelectList(type: string) {
|
||||
selectDialogLoading.value = true
|
||||
selectData.value = []
|
||||
selectDataAll.value = []
|
||||
commonItems().then((res: any) => {
|
||||
if (type === 'taskLocation') {
|
||||
if (res.data.taskLocation) {
|
||||
selectData.value = selectDataProcess(res.data.taskLocation, 'taskLocation')
|
||||
selectDataAll.value = selectDataProcess(res.data.taskLocation, 'taskLocation')
|
||||
}
|
||||
} else if ((type === 'aircraftName')) {
|
||||
if (res.data.aircraftName) {
|
||||
selectData.value = selectDataProcess(res.data.aircraftName, 'aircraftName')
|
||||
selectDataAll.value = selectDataProcess(res.data.aircraftName, 'aircraftName')
|
||||
}
|
||||
} else if ((type === 'sensorDescription')) {
|
||||
if (res.data.aircraftName) {
|
||||
selectData.value = selectDataProcess(res.data.sensorDescription, 'sensorDescription')
|
||||
selectDataAll.value = selectDataProcess(res.data.sensorDescription, 'sensorDescription')
|
||||
}
|
||||
}
|
||||
selectDialogLoading.value = false
|
||||
})
|
||||
}
|
||||
function queryCustomMultpieList() {
|
||||
customMultpieOptions.value = []
|
||||
commonItems().then((res: any) => {
|
||||
if (res.data.taskLabel) {
|
||||
customMultpieOptions.value = res.data.taskLabel
|
||||
}
|
||||
let list = []
|
||||
customMultpieOptions.value.forEach((item: any) => {
|
||||
list.push({
|
||||
name: item,
|
||||
type: 'taskLabel'
|
||||
})
|
||||
})
|
||||
selectData2.value = list
|
||||
selectDataAll2.value = list
|
||||
setTimeout(() => {
|
||||
if (customList.value.length > 0) {
|
||||
customList.value.forEach((item: any) => {
|
||||
multipleTableRef.value!.toggleRowSelection(
|
||||
{
|
||||
name: item,
|
||||
type: 'taskLabel',
|
||||
},
|
||||
)
|
||||
})
|
||||
}
|
||||
}, 100)
|
||||
})
|
||||
}
|
||||
function saveMultpieSelect() {
|
||||
console.log(customList.value)
|
||||
const params = {
|
||||
type: 'taskLabel',
|
||||
labels: customList.value
|
||||
}
|
||||
batchCommonItems(params).then((res: any) => {
|
||||
if (res.success) {
|
||||
ElMessage.success('保存成功')
|
||||
customMultpieOptions.value = res.data.taskLabel
|
||||
} else {
|
||||
ElMessage.error('保存失败')
|
||||
}
|
||||
})
|
||||
}
|
||||
function showMultpieSelectList() {
|
||||
commonItems().then((res: any) => {
|
||||
if (res.data.taskLabel) {
|
||||
customMultpieOptions.value = res.data.taskLabel
|
||||
}
|
||||
iscustomMultpie.value = true
|
||||
let list = []
|
||||
customMultpieOptions.value.forEach((item: any) => {
|
||||
list.push({
|
||||
name: item,
|
||||
type: 'taskLabel'
|
||||
})
|
||||
})
|
||||
selectData2.value = list
|
||||
selectDataAll2.value = list
|
||||
selectDialog.value = true
|
||||
setTimeout(() => {
|
||||
if (customList.value.length > 0) {
|
||||
customList.value.forEach((item: any) => {
|
||||
multipleTableRef.value!.toggleRowSelection(
|
||||
{
|
||||
name: item,
|
||||
type: 'taskLabel',
|
||||
},
|
||||
)
|
||||
})
|
||||
}
|
||||
}, 100)
|
||||
})
|
||||
}
|
||||
function saveCustomMultpie() {
|
||||
if (selectionList.value.length === 0) {
|
||||
ElMessage.warning('请选择试验标签项')
|
||||
return
|
||||
} else {
|
||||
const list = []
|
||||
selectionList.value.forEach((item: any) => {
|
||||
list.push(item.name)
|
||||
})
|
||||
customList.value = list
|
||||
}
|
||||
selectDialog.value = false
|
||||
}
|
||||
function customSelectionChange(val: any) {
|
||||
selectionList.value = val
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@ -641,16 +1007,19 @@ function importClose() {
|
||||
<template #default="scope">
|
||||
<span
|
||||
style="display: flex;display: -webkit-flex;justify-content: space-around;-webkit-justify-content: space-around; ">
|
||||
|
||||
<img src="@/assets/MenuIcon/lbcz_xg.png" alt="" title="修改" @click="editproject(scope.row)"
|
||||
style="cursor: pointer;">
|
||||
<img src="@/assets/MenuIcon/lbcz_sc.png" alt="" title="删除" @click="delproject(scope.row)"
|
||||
style="cursor: pointer;">
|
||||
<img v-if="standAlone == false" src="@/assets/MenuIcon/lbcz_qzsc.png" alt="" title="强制删除" @click="reforcedelproject(scope.row)"
|
||||
style="cursor: pointer;">
|
||||
<img v-if="standAlone" src="@/assets/MenuIcon/lbcz_dc.png" alt="" title="导出"
|
||||
@click="expproject(scope.row)" style="cursor: pointer;">
|
||||
</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column v-for="item in result2" :prop="item.code" :label="item.name"
|
||||
<el-table-column v-for="item in result2" :key="item.code" :prop="item.code" :label="item.name"
|
||||
width="180"></el-table-column>
|
||||
</el-table>
|
||||
<Page :total="total" v-model:size="queryParams.size" v-model:current="queryParams.current"
|
||||
@ -679,46 +1048,97 @@ function importClose() {
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="任务时间" prop="taskDate" style="width: 50%;margin-left: 15px;">
|
||||
<el-date-picker :disabled="projectForme.id" v-model="projectForme.taskDate" type="daterange"
|
||||
range-separator="-" start-placeholder="开始时间" end-placeholder="结束时间" format="YYYY-MM-DD"
|
||||
<el-date-picker :disabled="projectForme.modifiableStatus == '1' ? true : false"
|
||||
v-model="projectForme.taskDate" type="daterange" range-separator="-"
|
||||
start-placeholder="开始时间" end-placeholder="结束时间" format="YYYY-MM-DD"
|
||||
value-format="YYYY-MM-DD" />
|
||||
</el-form-item>
|
||||
</div>
|
||||
|
||||
<div style="width: 100%;display: flex;justify-content: space-between;align-items: center;">
|
||||
<el-form-item label="任务地点" prop="taskPlace" style="width: 50%;">
|
||||
<el-input :disabled="projectForme.id" v-model="projectForme.taskPlace" maxlength="500"
|
||||
show-word-limit />
|
||||
<div style="display: flex;width: 100%;">
|
||||
<el-select :disabled="projectForme.modifiableStatus == '1' ? true : false"
|
||||
v-model="projectForme.taskPlace" filterable remote reserve-keyword
|
||||
style="width:100%" placeholder="请选择任务地点" :remote-method="remoteMethod"
|
||||
:loading="taskPlaceLoading" @blur="blurChange('taskLocation', $event)">
|
||||
<el-option v-for="item in taskPlaceOptions" :key="item" :label="item" :value="item">
|
||||
</el-option>
|
||||
</el-select>
|
||||
<el-button :disabled="projectForme.modifiableStatus == '1' ? true : false" style="padding: 0px 5px;margin-left: 5px;"
|
||||
@click="saveSelect('taskLocation')"><img src="@/assets/MenuIcon/save.png" title="保存"
|
||||
alt=""></el-button>
|
||||
<el-button :disabled="projectForme.modifiableStatus == '1' ? true : false" style="padding: 0px 5px;margin-left: 5px;"
|
||||
@click="showSelectList('taskLocation')"><img src="@/assets/MenuIcon/set.png"
|
||||
title="设置" alt=""></el-button>
|
||||
</div>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="任务人员" style="width: 50%;margin-left: 15px;">
|
||||
<el-input v-model="projectForme.taskPerson" maxlength="500" show-word-limit />
|
||||
</el-form-item>
|
||||
</div>
|
||||
<div style="width: 100%;display: flex;justify-content: space-between;align-items: center;">
|
||||
<el-form-item label="载机名称" style="width: 50%;">
|
||||
<el-input :disabled="projectForme.id" v-model="projectForme.carrierName" maxlength="40"
|
||||
show-word-limit />
|
||||
<el-form-item label="载机名称" prop="carrierName" style="width: 50%;">
|
||||
<div style="display: flex;width: 100%;">
|
||||
<el-select :disabled="projectForme.modifiableStatus == '1' ? true : false" v-model="projectForme.carrierName" filterable
|
||||
remote reserve-keyword style="width:100%" placeholder="请选择载机名称"
|
||||
:remote-method="remoteMethod2" :loading="aircraftLoading"
|
||||
@blur="blurChange('aircraftName', $event)">
|
||||
<el-option v-for="item in aircraftOptions" :key="item" :label="item" :value="item">
|
||||
</el-option>
|
||||
</el-select>
|
||||
<el-button :disabled="projectForme.modifiableStatus == '1' ? true : false" style="padding: 0px 5px;margin-left: 5px;"
|
||||
@click="saveSelect('aircraftName')"><img src="@/assets/MenuIcon/save.png" title="保存"
|
||||
alt=""></el-button>
|
||||
<el-button :disabled="projectForme.modifiableStatus == '1' ? true : false" style="padding: 0px 5px;margin-left: 5px;"
|
||||
@click="showSelectList('aircraftName')"><img src="@/assets/MenuIcon/set.png"
|
||||
title="设置" alt=""></el-button>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="设备代号_编号" style="width: 50%;margin-left: 15px;">
|
||||
<el-input :disabled="projectForme.id" v-model="projectForme.deviceCode" maxlength="40"
|
||||
<el-form-item label="设备代号_编号" prop="deviceCode" style="width: 50%;margin-left: 15px;">
|
||||
<el-input :disabled="projectForme.modifiableStatus == '1' ? true : false" v-model="projectForme.deviceCode" maxlength="40"
|
||||
show-word-limit />
|
||||
</el-form-item>
|
||||
</div>
|
||||
<!-- <el-form-item label="载体类型">
|
||||
<el-input v-model="projectForme.carrierType" maxlength="200" show-word-limit />
|
||||
</el-form-item> -->
|
||||
|
||||
<el-form-item label="试验描述">
|
||||
<el-input v-model="projectForme.testDescribe" :rows="7" type="textarea" show-word-limit />
|
||||
</el-form-item>
|
||||
<el-form-item label="传感器描述">
|
||||
<el-input v-model="projectForme.sensorDescribe" :rows="7" type="textarea" show-word-limit />
|
||||
<el-form-item label="试验标签项">
|
||||
<div style="display: flex;width: 100%;">
|
||||
<el-select v-model="customList" filterable remote
|
||||
reserve-keyword style="width:100%" multiple placeholder="请选择试验标签项"
|
||||
:remote-method="remoteMethod4" :loading="customMultpieLoading"
|
||||
@blur="blurChange('taskLabel', $event)">
|
||||
<el-option v-for="item in customMultpieOptions" :key="item" :label="item" :value="item">
|
||||
</el-option>
|
||||
</el-select>
|
||||
<el-button style="padding: 0px 5px;margin-left: 5px;" @click="saveMultpieSelect"><img
|
||||
src="@/assets/MenuIcon/save.png" title="保存" alt=""></el-button>
|
||||
<el-button style="padding: 0px 5px;margin-left: 5px;" @click="showMultpieSelectList"><img
|
||||
src="@/assets/MenuIcon/set.png" title="设置" alt=""></el-button>
|
||||
</div>
|
||||
</el-form-item>
|
||||
|
||||
<!-- <el-form-item label="设备名称">
|
||||
<el-input v-model="projectForme.deviceName" maxlength="40" show-word-limit />
|
||||
</el-form-item> -->
|
||||
<el-form-item v-for="(item, index) in formitemarr" :label="item.name">
|
||||
<el-form-item label="传感器描述">
|
||||
<div style="display: flex;width: 100%;">
|
||||
<el-select v-model="projectForme.sensorDescribe" filterable
|
||||
remote reserve-keyword style="width:100%" placeholder="请选择传感器描述"
|
||||
:remote-method="remoteMethod3" :loading="aircraftLoading"
|
||||
@blur="blurChange('sensorDescription', $event)">
|
||||
<el-option v-for="item in sensorDescribeOptions" :key="item" :label="item" :value="item">
|
||||
</el-option>
|
||||
</el-select>
|
||||
<el-button style="padding: 0px 5px;margin-left: 5px;"
|
||||
@click="saveSelect('sensorDescription')"><img src="@/assets/MenuIcon/save.png"
|
||||
title="保存" alt=""></el-button>
|
||||
<el-button style="padding: 0px 5px;margin-left: 5px;"
|
||||
@click="showSelectList('sensorDescription')"><img src="@/assets/MenuIcon/set.png"
|
||||
title="设置" alt=""></el-button>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item v-for="(item, index) in formitemarr" :key="index" :label="item.name">
|
||||
<div style="width: 100%;display: flex;align-items: center;justify-content: space-between;">
|
||||
<el-input v-model="item.data" style="width: 92%;" />
|
||||
<el-button type="primary" @click="dellable(index)">删除</el-button>
|
||||
@ -813,6 +1233,49 @@ function importClose() {
|
||||
<el-button type="primary" @click="importSubmit(importFormRef)">导入</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
<el-dialog title="选择" :close-on-click-modal="false" v-model="selectDialog" width="30%" :before-close="selectClose">
|
||||
<div v-if="iscustomMultpie">
|
||||
<el-input v-model="selectKeyword2" placeholder="请输入内容" @input="selectKeywordChange('2')"></el-input>
|
||||
<el-table row-key="name" ref="multipleTableRef" :data="selectData2" border height="440"
|
||||
style="width: 100%;margin-top:10px;" @selection-change="customSelectionChange">
|
||||
<el-table-column type="selection" width="55">
|
||||
</el-table-column>
|
||||
<el-table-column prop="name" label="名称">
|
||||
</el-table-column>
|
||||
<el-table-column fixed="right" label="操作" width="60" align="center">
|
||||
<template #default="scope">
|
||||
<span
|
||||
style="display: flex;display: -webkit-flex;justify-content: space-around;-webkit-justify-content: space-around; ">
|
||||
<img src="@/assets/MenuIcon/lbcz_sc.png" alt="" title="删除"
|
||||
@click="delSelect(scope.row, '2')" style="cursor: pointer;">
|
||||
</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<div style="width: 100%;display: flex;justify-content: end;margin-top: 10px;">
|
||||
<el-button type="primary" @click="saveCustomMultpie">确定</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else v-loading="selectDialogLoading" style="height: 500px;">
|
||||
<el-input v-model="selectKeyword" placeholder="请输入内容" @input="selectKeywordChange('1')"></el-input>
|
||||
<el-table :data="selectData" border height="440" style="width: 100%;margin-top:10px;">
|
||||
<el-table-column prop="name" label="名称">
|
||||
</el-table-column>
|
||||
<el-table-column fixed="right" label="操作" width="80" align="center">
|
||||
<template #default="scope">
|
||||
<span
|
||||
style="display: flex;display: -webkit-flex;justify-content: space-around;-webkit-justify-content: space-around; ">
|
||||
<img src="@/assets/MenuIcon/select.png" alt="" title="选择"
|
||||
@click="submitSelect(scope.row)" style="cursor: pointer;">
|
||||
<img src="@/assets/MenuIcon/lbcz_sc.png" alt="" title="删除"
|
||||
@click="delSelect(scope.row, '1')" style="cursor: pointer;">
|
||||
</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user