Merge branch 'main' into dev_20260130_RemoveRedis

This commit is contained in:
longguancheng 2026-02-04 11:16:24 +08:00
commit c1575d47dd
12 changed files with 659 additions and 782 deletions

View File

@ -7,6 +7,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.annotation.EnableScheduling;
import java.io.File;
@EnableScheduling
@MapperScan("com.zhangy.skyeye.**.mapper")
@SpringBootApplication(scanBasePackages = "com.zhangy.**")
@ -18,6 +20,20 @@ import org.springframework.scheduling.annotation.EnableScheduling;
public class SEApplication {
public static void main(String[] args) {
String projectRoot = System.getProperty("user.dir");
// String libPath = projectRoot + "/library/logisen/GMTI";
// System.setProperty("jna.library.path", libPath);
// 1. GMTI 路径
String gmtiPath = projectRoot + "/library/logisen/GMTI";
// 2. OpenCV 路径 (根据您的目录名: opencv-4.11.0-windows)
String opencvPath = projectRoot + "/library/opencv-4.11.0-windows";
// 使用 File.pathSeparator (Windows是分号; Linux是冒号:) 连接多个路径
String combinedPath = gmtiPath + File.pathSeparator + opencvPath;
System.setProperty("jna.library.path", combinedPath);
// 如果 OpenCV 使用的是标准 JNI (System.loadLibrary)可能还需要设置 java.library.path
System.setProperty("java.library.path", opencvPath);
SpringApplication.run(SEApplication.class, args);
}
}

View File

@ -346,6 +346,15 @@ public class JmJobServiceImpl implements JmJobService {
// SarBackImageFrameDTO.i = 1;
// 校验无人机载荷
jobStatusService.checkDeviceForNewJob(job.getUavList());
JmJobUav uav = job.getUavList().get(0);
List<JmAirline> airlineList = uav.getAirlineList();
for(JmAirline airline:airlineList) {
log.info("we are going to start job {}", job.getId());
log.info("airline origin status is {}, set to {}", airline.getStatus(), ExecStatusEnum.NOT);
airline.setStatus(ExecStatusEnum.NOT.getValue());
}
// 保存任务状态
job.setStatus(ExecStatusEnum.PROCESSING.getValue());
job.setBeginTime(DateUtil.date());

View File

@ -1,120 +1,148 @@
; (function (win, lib) {
var doc = win.document
var docEl = doc.documentElement
var metaEl = doc.querySelector('meta[name="viewport"]')
var flexibleEl = doc.querySelector('meta[name="flexible"]')
var dpr = 0
var scale = 0
var tid
var flexible = lib.flexible || (lib.flexible = {})
;(function(win, lib) {
var doc = win.document;
var docEl = doc.documentElement;
var metaEl = doc.querySelector('meta[name="viewport"]');
var flexibleEl = doc.querySelector('meta[name="flexible"]');
var dpr = 0;
var scale = 0;
var tid;
var flexible = lib.flexible || (lib.flexible = {});
if (metaEl) {
console.warn('将根据已有的meta标签来设置缩放比例');
var match = metaEl.getAttribute('content').match(/initial\-scale=([\d\.]+)/);
if (match) {
scale = parseFloat(match[1]);
dpr = parseInt(1 / scale);
}
} else if (flexibleEl) {
var content = flexibleEl.getAttribute('content');
if (content) {
var initialDpr = content.match(/initial\-dpr=([\d\.]+)/);
var maximumDpr = content.match(/maximum\-dpr=([\d\.]+)/);
if (initialDpr) {
dpr = parseFloat(initialDpr[1]);
scale = parseFloat((1 / dpr).toFixed(2));
}
if (maximumDpr) {
dpr = parseFloat(maximumDpr[1]);
scale = parseFloat((1 / dpr).toFixed(2));
}
}
if (metaEl) {
console.warn('将根据已有的meta标签来设置缩放比例')
var match = metaEl.getAttribute('content').match(/initial\-scale=([\d\.]+)/)
if (match) {
scale = parseFloat(match[1])
dpr = parseInt(1 / scale)
}
if (!dpr && !scale) {
var isAndroid = win.navigator.appVersion.match(/android/gi);
var isIPhone = win.navigator.appVersion.match(/iphone/gi);
var devicePixelRatio = win.devicePixelRatio;
if (isIPhone) {
// iOS下对于2和3的屏用2倍的方案其余的用1倍方案
if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {
dpr = 3;
} else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)){
dpr = 2;
} else {
dpr = 1;
}
} else {
// 其他设备下仍旧使用1倍的方案
dpr = 1;
}
scale = 1 / dpr;
} else if (flexibleEl) {
var content = flexibleEl.getAttribute('content')
if (content) {
var initialDpr = content.match(/initial\-dpr=([\d\.]+)/)
var maximumDpr = content.match(/maximum\-dpr=([\d\.]+)/)
if (initialDpr) {
dpr = parseFloat(initialDpr[1])
scale = parseFloat((1 / dpr).toFixed(2))
}
if (maximumDpr) {
dpr = parseFloat(maximumDpr[1])
scale = parseFloat((1 / dpr).toFixed(2))
}
}
}
docEl.setAttribute('data-dpr', dpr);
if (!metaEl) {
metaEl = doc.createElement('meta');
metaEl.setAttribute('name', 'viewport');
metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');
if (docEl.firstElementChild) {
docEl.firstElementChild.appendChild(metaEl);
} else {
var wrap = doc.createElement('div');
wrap.appendChild(metaEl);
doc.write(wrap.innerHTML);
}
}
function refreshRem(){
var width = docEl.getBoundingClientRect().width;
if (width / dpr < 1980) {
width = 1980 * dpr;
} else if (width / dpr > 5760) {
width = 5760 * dpr;
}
var rem = width / 10;
docEl.style.fontSize = rem + 'px';
flexible.rem = win.rem = rem;
}
win.addEventListener('resize', function() {
clearTimeout(tid);
tid = setTimeout(refreshRem, 300);
}, false);
win.addEventListener('pageshow', function(e) {
if (e.persisted) {
clearTimeout(tid);
tid = setTimeout(refreshRem, 300);
}
}, false);
if (doc.readyState === 'complete') {
doc.body.style.fontSize = 12 * dpr + 'px';
if (!dpr && !scale) {
var isAndroid = win.navigator.appVersion.match(/android/gi)
var isIPhone = win.navigator.appVersion.match(/iphone/gi)
var devicePixelRatio = win.devicePixelRatio
if (isIPhone) {
// iOS下对于2和3的屏用2倍的方案其余的用1倍方案
if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {
dpr = 3
} else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)) {
dpr = 2
} else {
dpr = 1
}
} else {
doc.addEventListener('DOMContentLoaded', function(e) {
doc.body.style.fontSize = 12 * dpr + 'px';
}, false);
// 其他设备下仍旧使用1倍的方案
dpr = 1
}
scale = 1 / dpr
}
refreshRem();
flexible.dpr = win.dpr = dpr;
flexible.refreshRem = refreshRem;
flexible.rem2px = function(d) {
var val = parseFloat(d) * this.rem;
if (typeof d === 'string' && d.match(/rem$/)) {
val += 'px';
}
return val;
}
flexible.px2rem = function(d) {
var val = parseFloat(d) / this.rem;
if (typeof d === 'string' && d.match(/px$/)) {
val += 'rem';
}
return val;
docEl.setAttribute('data-dpr', dpr)
if (!metaEl) {
metaEl = doc.createElement('meta')
metaEl.setAttribute('name', 'viewport')
metaEl.setAttribute(
'content',
'initial-scale=' +
scale +
', maximum-scale=' +
scale +
', minimum-scale=' +
scale +
', user-scalable=no'
)
if (docEl.firstElementChild) {
docEl.firstElementChild.appendChild(metaEl)
} else {
var wrap = doc.createElement('div')
wrap.appendChild(metaEl)
doc.write(wrap.innerHTML)
}
}
})(window, window['lib'] || (window['lib'] = {}));
function refreshRem() {
var width = docEl.getBoundingClientRect().width
if (width / dpr <= 1366) {
width = 1366 * dpr
} else if (width / dpr <= 1440) {
width = 1440 * dpr
} else if (width / dpr <= 1600) {
width = 1600 * dpr
} else if (width / dpr <= 1680) {
width = 1680 * dpr
} else if (width / dpr <= 1768) {
width = 1768 * dpr
} else if (width / dpr <= 1980) {
width = 1980 * dpr
} else if (width / dpr > 5760) {
width = 5760 * dpr
}
var rem = width / 10
docEl.style.fontSize = rem + 'px'
flexible.rem = win.rem = rem
}
win.addEventListener(
'resize',
function () {
clearTimeout(tid)
tid = setTimeout(refreshRem, 300)
},
false
)
win.addEventListener(
'pageshow',
function (e) {
if (e.persisted) {
clearTimeout(tid)
tid = setTimeout(refreshRem, 300)
}
},
false
)
if (doc.readyState === 'complete') {
doc.body.style.fontSize = 12 * dpr + 'px'
} else {
doc.addEventListener(
'DOMContentLoaded',
function (e) {
doc.body.style.fontSize = 12 * dpr + 'px'
},
false
)
}
refreshRem()
flexible.dpr = win.dpr = dpr
flexible.refreshRem = refreshRem
flexible.rem2px = function (d) {
var val = parseFloat(d) * this.rem
if (typeof d === 'string' && d.match(/rem$/)) {
val += 'px'
}
return val
}
flexible.px2rem = function (d) {
var val = parseFloat(d) / this.rem
if (typeof d === 'string' && d.match(/px$/)) {
val += 'rem'
}
return val
}
})(window, window['lib'] || (window['lib'] = {}))

View File

@ -29,7 +29,7 @@
<!-- </template>-->
<div class="task-list__content">
<div v-for="item in taskList.data" :key="item.id" class="task-item">
<div class="left-part">
<div class="top-part">
<!-- <div class="task-progress-bar" :style="'width: ' + item.uavCompletion +'%;'"></div>-->
<div class="execute-info" @click="openTaskLineDetail(item)">
<span
@ -41,14 +41,13 @@
</div>
<div class="task-info">
{{ item.statusName }}
<!-- <i class="el-icon-camera"></i>-->
<!-- <span class="task-name">{{ item.name }}</span>-->
<!-- <span :class="{ 'task-finish': item.isFinish }">{{-->
<!-- item.taskProgressName-->
<!-- }}</span>-->
</div>
<div class="task-time">{{ item.beginTime }}</div>
<!-- <div class="task-time">{{ item.beginTime }}</div> -->
</div>
<p>无人机名称: 无人机1</p>
<p>雷达名称: SAR1</p>
<p>开始时间{{ item.beginTime }}</p>
<div class="right-part">
<!-- <i class="el-icon-edit-outline edit-task" @click.stop="editTask(item)"></i>-->
<!-- <el-tooltip-->
@ -59,18 +58,6 @@
<!-- <i class="ri-repeat-line" @click.stop="reRunTask(item)"></i>-->
<!-- </el-tooltip>-->
<el-tooltip effect="dark" content="修改名称" placement="right">
<i
class="el-icon-edit-outline"
@click.stop="editTaskName(item)"
></i>
</el-tooltip>
<el-tooltip effect="dark" content="删除" placement="right">
<i
class="el-icon-close delete-task"
@click.stop="deleteTask(item)"
></i>
</el-tooltip>
</div>
</div>
</div>

View File

@ -876,7 +876,9 @@ export default {
if (name === '执行中') {
return '#6ae965'
} else if (name === '已完成') {
return '#336dff'
return '#0f8cc7'
} else if (name === '未执行') {
return '#b2ff38'
}
},
getUavList() {
@ -985,6 +987,15 @@ export default {
let list = []
data.forEach(item => {
item.statusName = this.jobStatus[item.status + '']
console.log(item, 33333333333);
let uav = undefined
let sar = undefined
if (item.uavList.length) {
uav = item.uavList[0].uavName
if (item.uavList[0].payloadList.length) {
sar = item.uavList[0].payloadList[0].payloadName
}
}
list.push({
id: item.id,
beginTime: item.beginTime,
@ -994,6 +1005,8 @@ export default {
name: item.name,
status: item.status,
statusName: item.statusName,
uav,
sar
})
this.removeTaskTarget(item.id)
})

View File

@ -26,183 +26,59 @@
}
.task-item {
height: 40px;
box-sizing: border-box;
width: 100%;
width: calc(100% - 5px);
position: relative;
display: flex;
justify-content: space-between;
align-items: center;
margin: 8px 0;
border: 1px solid $--color-border-1;
padding: 8px 15px;
box-sizing: border-box;
border-radius: 6px;
background-color: $--color-black-3-alpha;
.left-part {
padding: 0 8px;
background: rgba(51, 51, 51, 0.6);
border-radius: 4px;
flex: 1;
height: 100%;
position: relative;
box-sizing: border-box;
display: flex;
justify-content: space-between;
align-items: center;
.task-progress-bar {
position: absolute;
height: 100%;
left: 0;
top: 0;
border-radius: 4px;
background: #43522c;
//z-index: -1;
}
.execute-info {
z-index: 1;
display: flex;
justify-content: flex-start;
align-items: center;
// width: 150px;
.execute-type-icon {
display: flex;
justify-content: center;
align-items: center;
width: 20px;
height: 20px;
border-radius: 50%;
margin-right: 4px;
border: 1px solid $--color-text-1;
>i {
color: $--color-text-1;
font-size: 12px;
}
}
.execute-state-0 {
border: 1px solid #a45d35;
box-shadow: 0 0 5px rgba(164, 93, 53, 0.8),
0 0 10px rgba(164, 93, 53, 0.6),
0 0 20px rgba(164, 93, 53, 0.3);
}
.execute-state-1 {
border: 1px solid #39cf0b;
box-shadow: 0 0 5px rgba(17, 172, 38, 0.8),
0 0 10px rgba(17, 172, 38, 0.6),
0 0 20px rgba(17, 172, 38, 0.3);
}
.execute-state-2 {
border: 1px solid $--color-text-1;
box-shadow: 0 0 2px rgba(250, 250, 250, 0.8),
0 0 6px rgba(250, 250, 250, 0.6),
0 0 14px rgba(250, 250, 250, 0.3);
}
.execute-state-3 {
border: 1px solid #a45d35;
box-shadow: 0 0 5px rgba(164, 93, 53, 0.8),
0 0 10px rgba(164, 93, 53, 0.6),
0 0 20px rgba(164, 93, 53, 0.3);
}
.execute-state-4 {
border: 1px solid #893654;
box-shadow: 0 0 5px rgba(137, 54, 84, 0.8),
0 0 10px rgba(137, 54, 84, 0.6),
0 0 20px rgba(137, 54, 84, 0.3);
}
.execute-state-5 {
border: 1px solid #681c1f;
box-shadow: 0 0 5px rgba(104, 28, 31, 0.8),
0 0 10px rgba(104, 28, 31, 0.6),
0 0 20px rgba(104, 28, 31, 0.3);
}
.task-execute {
color: $--color-text-1;
font-size: 14px;
width: 85px;
margin-left: 5px;
display: inline-block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
cursor: pointer;
}
}
.task-info {
z-index: 1;
width: 50px;
display: flex;
justify-content: flex-start;
align-items: center;
>i {
font-size: 16px;
color: #07e5e5;
margin-right: 6px;
}
>span {
color: $--color-orange;
}
.task-name {
color: $--color-text-1;
font-size: 14px;
margin-right: 2px;
}
.task-finish {
color: $--color-green;
}
}
.task-time {
z-index: 1;
color: $--color-text-1;
min-width: 140px;
}
&:hover {
background-color: $--color-black-3;
}
.right-part {
width: 60px;
height: 100%;
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 5px;
>p {
line-height: 24px;
color: $--color-text-2;
padding-left: 3px;
}
.task-info {
z-index: 1;
position: absolute;
bottom: 0;
right: 0;
background-color: $--color-black-2;
padding: 4px 15px;
border-bottom-right-radius: 6px;
border-top-left-radius: 6px;
>i {
font-size: 16px;
color: #07e5e5;
margin-right: 6px;
}
>span {
color: $--color-orange;
}
.task-name {
color: $--color-text-1;
font-size: 14px;
cursor: pointer;
margin: 2px 0;
margin-right: 2px;
}
.edit-task {
color: #ffff00;
}
.delete-task {
color: $--color-red;
.task-finish {
color: $--color-green;
}
}
}
}
//.task-list__large {
// height: calc(50vh - 110px);
// left: $--icon-mode-larger-card-left;
// top: $--icon-mode-larger-card-top;
// transition: 0.2s ease-in-out;
//}
.task-form {
width: 410px;
height: calc(100vh - 70px);
@ -213,12 +89,6 @@
}
}
//.task-form__large {
// height: calc(100vh - 110px);
// left: $--icon-mode-larger-card-left;
// top: $--icon-mode-larger-card-top;
// transition: 0.2s ease-in-out;
//}
.requirement-form {
box-sizing: border-box;
padding-right: 10px;
@ -553,3 +423,115 @@
background-color: #00000052;
}
}
.top-part {
display: flex;
justify-content: space-between;
line-height: 24px;
&__left {
flex: 1;
.execute-info {
z-index: 1;
display: flex;
justify-content: flex-start;
align-items: center;
// width: 150px;
.execute-type-icon {
display: flex;
justify-content: center;
align-items: center;
width: 20px;
height: 20px;
border-radius: 50%;
margin-right: 4px;
border: 1px solid $--color-text-1;
>i {
color: $--color-text-1;
font-size: 12px;
}
}
.execute-state-0 {
border: 1px solid #a45d35;
box-shadow: 0 0 5px rgba(164, 93, 53, 0.8),
0 0 10px rgba(164, 93, 53, 0.6),
0 0 20px rgba(164, 93, 53, 0.3);
}
.execute-state-1 {
border: 1px solid #39cf0b;
box-shadow: 0 0 5px rgba(17, 172, 38, 0.8),
0 0 10px rgba(17, 172, 38, 0.6),
0 0 20px rgba(17, 172, 38, 0.3);
}
.execute-state-2 {
border: 1px solid $--color-text-1;
box-shadow: 0 0 2px rgba(250, 250, 250, 0.8),
0 0 6px rgba(250, 250, 250, 0.6),
0 0 14px rgba(250, 250, 250, 0.3);
}
.execute-state-3 {
border: 1px solid #a45d35;
box-shadow: 0 0 5px rgba(164, 93, 53, 0.8),
0 0 10px rgba(164, 93, 53, 0.6),
0 0 20px rgba(164, 93, 53, 0.3);
}
.execute-state-4 {
border: 1px solid #893654;
box-shadow: 0 0 5px rgba(137, 54, 84, 0.8),
0 0 10px rgba(137, 54, 84, 0.6),
0 0 20px rgba(137, 54, 84, 0.3);
}
.execute-state-5 {
border: 1px solid #681c1f;
box-shadow: 0 0 5px rgba(104, 28, 31, 0.8),
0 0 10px rgba(104, 28, 31, 0.6),
0 0 20px rgba(104, 28, 31, 0.3);
}
.task-execute {
color: $--color-text-1;
font-size: 14px;
width: calc(100% - 50px);
margin-left: 5px;
display: inline-block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
cursor: pointer;
}
}
}
&__right {
width: 60px;
height: 100%;
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 5px;
>i {
font-size: 14px;
cursor: pointer;
margin: 2px 0;
}
.edit-task {
color: #ffff00;
}
.delete-task {
color: $--color-red;
}
}
}

View File

@ -30,91 +30,75 @@
:key="item.id"
class="task-item"
>
<div class="left-part">
<div class="top-part">
<!-- <div class="task-progress-bar" :style="'width: ' + item.uavCompletion +'%;'"></div>-->
<div class="execute-info" @click="openTaskLineDetail(item)">
<span
class="execute-type-icon"
:class="'execute-state-' + item.status"
><i class="ri-playstation-line"></i
></span>
<span class="task-execute">{{ item.name }}</span>
<div class="top-part__left">
<div class="execute-info" @click="openTaskLineDetail(item)">
<span
class="execute-type-icon"
:class="'execute-state-' + item.status"
><i class="ri-playstation-line"></i
></span>
<span class="task-execute">{{ item.name }}</span>
</div>
</div>
<div
class="task-info"
:style="{ color: dealStatusColor(item.statusName) }"
>
{{ item.statusName }}
<!-- <i class="el-icon-camera"></i>-->
<!-- <span class="task-name">{{ item.name }}</span>-->
<!-- <span :class="{ 'task-finish': item.isFinish }">{{-->
<!-- item.taskProgressName-->
<!-- }}</span>-->
<div class="top-part__right">
<el-tooltip
effect="dark"
:content="item.check ? '隐藏' : '显示'"
placement="top"
>
<i
:class="item.check ? 'ri-eye-off-line' : 'ri-eye-line'"
@click.stop="toggleTaskSceneShow(item, index)"
></i>
</el-tooltip>
<el-tooltip
v-if="item.status === 0"
effect="dark"
content="执行"
placement="top"
>
<i
class="ri-arrow-up-circle-line"
@click.stop="makeTaskUavFly(item, index)"
></i>
</el-tooltip>
<el-tooltip
effect="dark"
content="重新执行"
placement="top"
v-if="item.status === 2"
>
<i
class="ri-restart-line"
@click.stop="makeTaskUavFly(item, index)"
></i>
</el-tooltip>
<el-dropdown
@command="handleCommand($event, item)"
placement="bottom"
size="small"
>
<span class="el-dropdown-link">
<i class="ri-more-fill"></i>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="edit">修改名称</el-dropdown-item>
<el-dropdown-item command="copy">复制</el-dropdown-item>
<el-dropdown-item command="remove">删除</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
<div class="task-time">{{ item.beginTime }}</div>
</div>
<div class="right-part">
<el-tooltip
effect="dark"
:content="item.check ? '隐藏' : '显示'"
placement="top"
>
<i
:class="item.check ? 'ri-eye-off-line' : 'ri-eye-line'"
@click.stop="toggleTaskSceneShow(item, index)"
></i>
</el-tooltip>
<el-tooltip
v-if="item.status === 0"
effect="dark"
content="执行"
placement="top"
>
<i
class="ri-arrow-up-circle-line"
@click.stop="makeTaskUavFly(item, index)"
></i>
</el-tooltip>
<el-tooltip
effect="dark"
content="重新执行"
placement="top"
v-if="item.status === 2"
>
<i
class="ri-restart-line"
@click.stop="makeTaskUavFly(item, index)"
></i>
</el-tooltip>
<el-dropdown
@command="handleCommand($event, item)"
placement="bottom"
size="small"
>
<span class="el-dropdown-link">
<i class="ri-more-fill"></i>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="edit">修改名称</el-dropdown-item>
<el-dropdown-item command="copy">复制</el-dropdown-item>
<el-dropdown-item command="remove">删除</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<!-- <el-tooltip effect="dark" content="修改名称" placement="top">
<i
class="el-icon-edit-outline"
@click.stop="editTaskName(item)"
></i>
</el-tooltip>
<el-tooltip effect="dark" content="复制" placement="top">
<i class="ri-file-copy-2-line" @click.stop="copyTask(item)"></i>
</el-tooltip>
<el-tooltip effect="dark" content="删除" placement="top">
<i
class="el-icon-close delete-task"
@click.stop="deleteTask(item)"
></i>
</el-tooltip> -->
<p>无人机名称: {{ item.uav }}</p>
<p>雷达名称: {{ item.sar }}</p>
<p>开始时间{{ item.beginTime }}</p>
<div
class="task-info"
:style="{ color: dealStatusColor(item.statusName) }"
>
{{ item.statusName }}
</div>
</div>
</div>

View File

@ -1085,6 +1085,7 @@ export default {
console.log('任务列表', res.data.data)
let data = res.data.data
let list = []
data.forEach(item => {
// item.check = item.status === 1 || item.status === 3
item.check = false
@ -1096,6 +1097,15 @@ export default {
}
child.jobName = item.name
})
let uav = undefined
let sar = undefined
if (item.uavList.length) {
uav = item.uavList[0].uavName
if (item.uavList[0].payloadList.length) {
sar = item.uavList[0].payloadList[0].payloadName
}
}
list.push({
id: item.id,
beginTime: item.beginTime,
@ -1105,6 +1115,8 @@ export default {
name: item.name,
status: item.status,
statusName: item.statusName,
uav,
sar
})
// TODO
// item.pointList = [item.pointList]
@ -2607,6 +2619,10 @@ export default {
name: '/topic/jobStatus',
callback: this.handleWebsocketState
},
{
name: '/topic/gmti',
callback: this.handleWebsocketGmti
},
],
success: () => {
console.log('自身websocket链接成功2')
@ -2616,6 +2632,9 @@ export default {
socketInstance = socket
stompClientInstance = stompClient
},
handleWebsocketGmti(info) {
console.log('Gmti信息', info.body)
},
handleWebsocketStatus(info) {
console.log('SAR状态信息', info.body)
let data = JSON.parse(info.body)
@ -2778,7 +2797,7 @@ export default {
// console.log('SAR图像', info.body)
let data = JSON.parse(info.body)
console.log('SAR图像2', data)
// this.addMarkPicture2(data)
this.addMarkPicture2(data)
// console.log('灭有匹配到吗taskUavCollection', taskUavCollection, taskUavCollection[data.jobId])
if (taskUavCollection[data.jobId]) {
let find = taskUavCollection[data.jobId].find(item => item.uavId + '' === data.uavId + '')
@ -2987,9 +3006,12 @@ export default {
// 从执行中变为执行完毕
if (this.taskList.data[findIndex].status === 1 && data.jobStatus === 2) {
// 移除任务相关信息
console.log('任务变更', this.jobStatus, this.jobStatus[data.jobStatus + ''])
this.taskList.data[findIndex].statusName = this.jobStatus[data.jobStatus + '']
taskListResource[findIndex].statusName = this.jobStatus[data.jobStatus + '']
// console.log('任务变更', this.jobStatus, this.jobStatus[data.jobStatus + ''])
// this.taskList.data[findIndex].statusName = this.jobStatus[data.jobStatus + '']
// taskListResource[findIndex].statusName = this.jobStatus[data.jobStatus + '']
taskListResource.splice(findIndex, 1)
this.getTaskList()
this.removeTaskTarget(data.jobId)
}
if (data.jobStatus === 1 && this.detailUav.id === data.jobId) {
this.updateUavInfo(data.sarStatus)

View File

@ -48,171 +48,53 @@
}
.task-item {
height: 40px;
box-sizing: border-box;
width: 100%;
width: calc(100% - 5px);
position: relative;
display: flex;
justify-content: space-between;
align-items: center;
margin: 8px 0;
border: 1px solid $--color-border-1;
padding: 8px 15px;
box-sizing: border-box;
border-radius: 6px;
background-color: $--color-black-3-alpha;
.left-part {
padding: 0 8px;
background: rgba(51, 51, 51, 0.6);
border-radius: 4px;
flex: 1;
height: 100%;
position: relative;
box-sizing: border-box;
display: flex;
justify-content: space-between;
align-items: center;
.task-progress-bar {
position: absolute;
height: 100%;
left: 0;
top: 0;
border-radius: 4px;
background: #43522c;
//z-index: -1;
}
.execute-info {
z-index: 1;
display: flex;
justify-content: flex-start;
align-items: center;
// width: 150px;
.execute-type-icon {
display: flex;
justify-content: center;
align-items: center;
width: 20px;
height: 20px;
border-radius: 50%;
margin-right: 4px;
border: 1px solid $--color-text-1;
>i {
color: $--color-text-1;
font-size: 12px;
}
}
.execute-state-0 {
border: 1px solid #a45d35;
box-shadow: 0 0 5px rgba(164, 93, 53, 0.8),
0 0 10px rgba(164, 93, 53, 0.6),
0 0 20px rgba(164, 93, 53, 0.3);
}
.execute-state-1 {
border: 1px solid #39cf0b;
box-shadow: 0 0 5px rgba(17, 172, 38, 0.8),
0 0 10px rgba(17, 172, 38, 0.6),
0 0 20px rgba(17, 172, 38, 0.3);
}
.execute-state-2 {
border: 1px solid $--color-text-1;
box-shadow: 0 0 2px rgba(250, 250, 250, 0.8),
0 0 6px rgba(250, 250, 250, 0.6),
0 0 14px rgba(250, 250, 250, 0.3);
}
.execute-state-3 {
border: 1px solid #a45d35;
box-shadow: 0 0 5px rgba(164, 93, 53, 0.8),
0 0 10px rgba(164, 93, 53, 0.6),
0 0 20px rgba(164, 93, 53, 0.3);
}
.execute-state-4 {
border: 1px solid #893654;
box-shadow: 0 0 5px rgba(137, 54, 84, 0.8),
0 0 10px rgba(137, 54, 84, 0.6),
0 0 20px rgba(137, 54, 84, 0.3);
}
.execute-state-5 {
border: 1px solid #681c1f;
box-shadow: 0 0 5px rgba(104, 28, 31, 0.8),
0 0 10px rgba(104, 28, 31, 0.6),
0 0 20px rgba(104, 28, 31, 0.3);
}
.task-execute {
color: $--color-text-1;
font-size: 14px;
width: 90px;
margin-left: 5px;
display: inline-block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
cursor: pointer;
}
}
.task-info {
z-index: 1;
width: 50px;
display: flex;
justify-content: flex-start;
align-items: center;
>i {
font-size: 16px;
color: #07e5e5;
margin-right: 6px;
}
>span {
color: $--color-orange;
}
.task-name {
color: $--color-text-1;
font-size: 14px;
margin-right: 2px;
}
.task-finish {
color: $--color-green;
}
}
.task-time {
z-index: 1;
color: $--color-text-1;
min-width: 140px;
}
&:hover {
background-color: $--color-black-3;
}
.right-part {
width: 40px;
height: 100%;
display: flex;
justify-content: space-between;
padding: 0 8px;
align-items: center;
>p {
color: $--color-text-2;
line-height: 24px;
}
.task-info {
z-index: 1;
position: absolute;
bottom: 0;
right: 0;
background-color: $--color-black-2;
padding: 4px 15px;
border-bottom-right-radius: 6px;
border-top-left-radius: 6px;
>i {
font-size: 16px;
color: #07e5e5;
margin-right: 6px;
}
>span {
color: $--color-orange;
}
.task-name {
color: $--color-text-1;
font-size: 14px;
cursor: pointer;
margin: 2px 0;
margin-right: 2px;
}
.edit-task {
color: #ffff00;
}
.delete-task {
color: $--color-red;
.task-finish {
color: $--color-green;
}
}
}
@ -408,9 +290,9 @@
.detail-uav-wrap {
width: 430px;
position: fixed;
bottom: 5px;
top: 60px;
right: 10px;
height: calc(100vh - 60px);
height: calc(100vh - 220px);
}
.detail-info {
@ -1086,35 +968,6 @@
}
}
.task-info {
z-index: 1;
flex: 1;
display: flex;
justify-content: flex-start;
align-items: center;
width: 50px;
>i {
font-size: 16px;
color: #07e5e5;
margin-right: 6px;
}
>span {
color: $--color-orange;
}
.task-name {
color: $--color-text-1;
font-size: 14px;
margin-right: 2px;
}
.task-finish {
color: $--color-green;
}
}
.task-time {
z-index: 1;
color: $--color-text-1;
@ -1183,13 +1036,7 @@
.detail-uav {
width: 410px;
// position: fixed;
top: 60px;
//bottom: 5px;
right: 10px;
//right: 510px;
height: calc(100vh - 70px);
//height: calc(100vh - 620px);
height: calc(100vh - 220px);
transition: 0.2s ease-in-out;
z-index: 2;
@ -1259,66 +1106,6 @@
}
}
.target-task-item {
height: 40px;
margin: 8px 0;
box-sizing: border-box;
width: 100%;
padding: 0 8px;
background: #333333;
border-radius: 4px;
flex: 1;
display: flex;
justify-content: space-between;
align-items: center;
position: relative;
.task-progress-bar {
position: absolute;
height: 100%;
left: 0;
top: 0;
border-radius: 4px;
background: #43522c;
//z-index: -1;
}
.task-info {
z-index: 1;
flex: 1;
display: flex;
justify-content: flex-start;
align-items: center;
width: 50px;
>i {
font-size: 16px;
color: #07e5e5;
margin-right: 6px;
}
>span {
color: $--color-orange;
}
.task-name {
color: $--color-text-1;
font-size: 14px;
margin-right: 2px;
}
.task-finish {
color: $--color-green;
}
}
.task-time {
z-index: 1;
color: $--color-text-1;
min-width: 140px;
}
}
.uav-span-wrap {
display: flex;
justify-content: flex-start;
@ -1415,3 +1202,114 @@
::v-deep .el-collapse {
border-top: unset;
}
.top-part {
display: flex;
justify-content: space-between;
line-height: 24px;
&__left {
flex: 1;
.execute-info {
z-index: 1;
display: flex;
justify-content: flex-start;
align-items: center;
.execute-type-icon {
display: flex;
justify-content: center;
align-items: center;
width: 20px;
height: 20px;
border-radius: 50%;
margin-right: 4px;
border: 1px solid $--color-text-1;
>i {
color: $--color-text-1;
font-size: 12px;
}
}
.execute-state-0 {
border: 1px solid #a45d35;
box-shadow: 0 0 5px rgba(164, 93, 53, 0.8),
0 0 10px rgba(164, 93, 53, 0.6),
0 0 20px rgba(164, 93, 53, 0.3);
}
.execute-state-1 {
border: 1px solid #39cf0b;
box-shadow: 0 0 5px rgba(17, 172, 38, 0.8),
0 0 10px rgba(17, 172, 38, 0.6),
0 0 20px rgba(17, 172, 38, 0.3);
}
.execute-state-2 {
border: 1px solid $--color-text-1;
box-shadow: 0 0 2px rgba(250, 250, 250, 0.8),
0 0 6px rgba(250, 250, 250, 0.6),
0 0 14px rgba(250, 250, 250, 0.3);
}
.execute-state-3 {
border: 1px solid #a45d35;
box-shadow: 0 0 5px rgba(164, 93, 53, 0.8),
0 0 10px rgba(164, 93, 53, 0.6),
0 0 20px rgba(164, 93, 53, 0.3);
}
.execute-state-4 {
border: 1px solid #893654;
box-shadow: 0 0 5px rgba(137, 54, 84, 0.8),
0 0 10px rgba(137, 54, 84, 0.6),
0 0 20px rgba(137, 54, 84, 0.3);
}
.execute-state-5 {
border: 1px solid #681c1f;
box-shadow: 0 0 5px rgba(104, 28, 31, 0.8),
0 0 10px rgba(104, 28, 31, 0.6),
0 0 20px rgba(104, 28, 31, 0.3);
}
.task-execute {
color: $--color-text-1;
font-size: 14px;
width: calc(100% - 50px);
margin-left: 5px;
display: inline-block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
cursor: pointer;
}
}
}
&__right {
width: 40px;
height: 100%;
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 5px;
>i {
font-size: 14px;
cursor: pointer;
margin: 2px 0;
}
.edit-task {
color: #ffff00;
}
.delete-task {
color: $--color-red;
}
}
}

View File

@ -75,68 +75,50 @@
class="task-item"
@click="openSarStatusDetail(item)"
>
<div class="left-part">
<div class="top-part">
<!-- <div class="task-progress-bar" :style="'width: ' + item.uavCompletion +'%;'"></div>-->
<div class="execute-info">
<span
class="execute-type-icon"
:class="'execute-state-' + item.status"
><i class="ri-playstation-line"></i
></span>
<span class="task-execute">{{ item.name }}</span>
<div class="top-part__left">
<div class="execute-info">
<span
class="execute-type-icon"
:class="'execute-state-' + item.status"
><i class="ri-playstation-line"></i
></span>
<span class="task-execute">{{ item.name }}</span>
</div>
</div>
<div
class="task-info"
:style="{ color: dealStatusColor(item.statusName) }"
>
{{ item.statusName }}
<div class="top-part__right">
<el-tooltip
effect="dark"
:content="item.check ? '隐藏' : '显示'"
placement="top"
>
<i
:class="item.check ? 'ri-eye-off-line' : 'ri-eye-line'"
@click.stop="toggleTaskSceneShow(item, index)"
></i>
</el-tooltip>
<el-tooltip
effect="dark"
content="结束任务"
placement="top"
v-if="item.status === 1"
>
<i
class="ri-stop-circle-line"
@click.stop="stopTask(item, index)"
></i>
</el-tooltip>
</div>
<div class="task-time">{{ item.beginTime }}</div>
</div>
<div class="right-part">
<el-tooltip
effect="dark"
:content="item.check ? '隐藏' : '显示'"
placement="top"
>
<i
:class="item.check ? 'ri-eye-off-line' : 'ri-eye-line'"
@click.stop="toggleTaskSceneShow(item, index)"
></i>
</el-tooltip>
<!-- <el-tooltip
v-if="item.status === 0"
effect="dark"
content="执行"
placement="top"
>
<i
class="ri-arrow-up-circle-line"
@click.stop="makeTaskUavFly(item, index)"
></i>
</el-tooltip> -->
<el-tooltip
effect="dark"
content="结束任务"
placement="top"
v-if="item.status === 1"
>
<i
class="ri-stop-circle-line"
@click.stop="stopTask(item, index)"
></i>
</el-tooltip>
<!-- <el-tooltip
effect="dark"
content="重新执行"
placement="top"
v-if="item.status === 2"
>
<i
class="ri-restart-line"
@click.stop="reRunTask(item, index)"
></i>
</el-tooltip> -->
<p>无人机名称: {{ item.uav }}</p>
<p>雷达名称: {{ item.sar }}</p>
<p>开始时间{{ item.beginTime }}</p>
<div
class="task-info"
:style="{ color: dealStatusColor(item.statusName) }"
>
{{ item.statusName }}
</div>
</div>
</template>
@ -292,50 +274,6 @@
<i class="el-icon-info device-lock" @click="showUavMore"></i>
</div>
</div>
<!-- <div class="target-task-list">-->
<!-- <div class="target-task-item" v-for="item in detailInfo.taskList" :key="item.id">-->
<!-- <div class="execute-info">-->
<!-- <span class="execute-type-icon" :class="'execute-state-' + item.status"><i class="ri-dv-line"></i></span>-->
<!-- <span class="task-execute">{{ item.name }}</span>-->
<!-- </div>-->
<!-- <div class="task-time">{{item.beginTime}}</div>-->
<!-- </div>-->
<!-- </div>-->
<div class="picture-list">
<div>回传图像</div>
<div
v-for="item in detailInfo.pictureList"
:key="item.createTime"
class="picture-list-item"
>
<div class="picture-item-image">
<el-image
style="width: 40px; height: 40px"
:src="item.url"
:preview-src-list="[item.url]"
>
</el-image>
</div>
<div class="picture-item-info">
<div>
拍摄任务{{ item.taskName }} | 拍摄载荷{{
item.loaderName
}}
</div>
<div>拍摄时间{{ item.createTime }}</div>
</div>
<div class="picture-command">
<i
class="iconfont icon-dt-icon-dingwei"
@click="lockHistoryPicture(item)"
></i>
<i
class="iconfont icon-quanjushijiao-copy"
@click="toggleHistoryPicture(item)"
></i>
</div>
</div>
</div>
</div>
</dt-card>
</right-slide>
@ -410,41 +348,41 @@
</div>
</el-collapse-item>
<!-- <el-collapse-item title="回传图像" name="5">
<div class="back-image">
<div
v-for="item in detailInfo.pictureList"
:key="item.time"
class="picture-list-item"
>
<div class="picture-item-image">
<el-image
style="width: 40px; height: 40px"
:src="item.url"
:preview-src-list="[item.url]"
>
</el-image>
</div>
<div class="picture-item-info">
<div>
拍摄任务{{ item.taskName }} | 拍摄载荷{{
item.loaderName
}}
<div class="back-image">
<div
v-for="item in detailInfo.pictureList"
:key="item.time"
class="picture-list-item"
>
<div class="picture-item-image">
<el-image
style="width: 40px; height: 40px"
:src="item.url"
:preview-src-list="[item.url]"
>
</el-image>
</div>
<div class="picture-item-info">
<div>
拍摄任务{{ item.taskName }} | 拍摄载荷{{
item.loaderName
}}
</div>
<div>拍摄时间{{ item.time }}</div>
</div>
<div class="picture-command">
<i
class="iconfont icon-dt-icon-dingwei"
@click="lockHistoryPicture(item)"
></i>
<i
class="iconfont icon-quanjushijiao-copy"
@click="toggleHistoryPicture(item)"
></i>
</div>
<div>拍摄时间{{ item.time }}</div>
</div>
<div class="picture-command">
<i
class="iconfont icon-dt-icon-dingwei"
@click="lockHistoryPicture(item)"
></i>
<i
class="iconfont icon-quanjushijiao-copy"
@click="toggleHistoryPicture(item)"
></i>
</div>
</div>
</div>
</el-collapse-item> -->
</el-collapse-item> -->
</el-collapse>
</div>
</div>

View File

@ -1524,7 +1524,7 @@ export default {
},
//#endregion
sarChange(val) {
this.moveInfoBar = val
// this.moveInfoBar = val
},
//#region ais船

View File

@ -147,18 +147,18 @@ module.exports = {
css: {
loaderOptions: {
postcss: {
// plugins: [
// require('postcss-pxtorem')({
// rootValue: 192, // 正常适配
// // rootValue: 280, // 3840 * 2160
// propList: ['*'], // 可以从px更改为rem的属性
// selectorBlackList: [
// // 匹配不被转换为rem的选择器
// 'super-cesium-timeline-icon16'
// // 'card-position'
// ]
// })
// ]
plugins: [
require('postcss-pxtorem')({
rootValue: 192, // 正常适配
// rootValue: 280, // 3840 * 2160
propList: ['*'], // 可以从px更改为rem的属性
selectorBlackList: [
// 匹配不被转换为rem的选择器
'super-cesium-timeline-icon16'
// 'card-position'
]
})
]
}
}
}