|
@@ -15,7 +15,7 @@
|
|
|
<div class="header-actions">
|
|
<div class="header-actions">
|
|
|
<button class="action-btn refresh-btn" @click="getAgvRfidLog">
|
|
<button class="action-btn refresh-btn" @click="getAgvRfidLog">
|
|
|
<i class="fas fa-sync-alt" />
|
|
<i class="fas fa-sync-alt" />
|
|
|
- <span>刷新结果</span>
|
|
|
|
|
|
|
+ <span>重新校验</span>
|
|
|
</button>
|
|
</button>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
@@ -41,7 +41,7 @@
|
|
|
</div>
|
|
</div>
|
|
|
<div class="status-info-item">
|
|
<div class="status-info-item">
|
|
|
<span class="info-label">执行次数</span>
|
|
<span class="info-label">执行次数</span>
|
|
|
- <span class="info-value">{{ taskStatus.success ? `第 ${taskInfo.executionCount} 次` : '-' }}</span>
|
|
|
|
|
|
|
+ <span class="info-value">{{ `${taskInfo.executionCount} 次` }}</span>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="status-info-item">
|
|
<div class="status-info-item">
|
|
|
<span class="info-label">信息</span>
|
|
<span class="info-label">信息</span>
|
|
@@ -59,24 +59,33 @@
|
|
|
<i class="fas fa-box-open" />
|
|
<i class="fas fa-box-open" />
|
|
|
</div>
|
|
</div>
|
|
|
<div class="card-title">
|
|
<div class="card-title">
|
|
|
- <h3>目标搬运工装</h3>
|
|
|
|
|
- <p>AGV 应当搬运的设备信息</p>
|
|
|
|
|
|
|
+ <h3>目标搬运</h3>
|
|
|
|
|
+ <p>AGV 应当搬运的信息</p>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="target-device-list">
|
|
<div class="target-device-list">
|
|
|
- <div class="target-device-item">
|
|
|
|
|
- <div class="device-info">
|
|
|
|
|
- <span class="device-label">工装名称</span>
|
|
|
|
|
- <span class="device-name">{{ targetDevice.name || '暂无' }}</span>
|
|
|
|
|
- </div>
|
|
|
|
|
- <span class="device-tag target">目标</span>
|
|
|
|
|
|
|
+ <div v-if="targetDevices.length === 0" class="empty-state-small">
|
|
|
|
|
+ <i class="fas fa-inbox" />
|
|
|
|
|
+ <p>暂无目标搬运信息</p>
|
|
|
</div>
|
|
</div>
|
|
|
- <div v-if="targetDevice2.name" class="target-device-item">
|
|
|
|
|
- <div class="device-info">
|
|
|
|
|
- <span class="device-label">工装名称</span>
|
|
|
|
|
- <span class="device-name">{{ targetDevice2.name }}</span>
|
|
|
|
|
|
|
+ <div v-else>
|
|
|
|
|
+ <div v-for="(device, index) in targetDevices" :key="device.inventoryNo || index" class="target-device-item">
|
|
|
|
|
+ <div class="device-row">
|
|
|
|
|
+ <div class="device-info">
|
|
|
|
|
+ <span class="device-label">编号</span>
|
|
|
|
|
+ <span class="device-code font-mono">{{ device.inventoryNo || '-' }}</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <span class="device-tag target">目标</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="device-name-row">
|
|
|
|
|
+ <span class="device-label">名称</span>
|
|
|
|
|
+ <span class="device-name">{{ device.inventoryName || '-' }}</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="device-feedbox-row">
|
|
|
|
|
+ <span class="device-label">料箱</span>
|
|
|
|
|
+ <span class="device-feedbox">{{ device.feedBoxName }}</span>
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
- <span class="device-tag target">目标</span>
|
|
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
@@ -88,27 +97,31 @@
|
|
|
<i class="fas fa-tags" />
|
|
<i class="fas fa-tags" />
|
|
|
</div>
|
|
</div>
|
|
|
<div class="card-title">
|
|
<div class="card-title">
|
|
|
- <h3>已识别工装列表</h3>
|
|
|
|
|
|
|
+ <h3>已识别列表</h3>
|
|
|
<p>RFID 实际扫描到的设备信息</p>
|
|
<p>RFID 实际扫描到的设备信息</p>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="identified-device-list">
|
|
<div class="identified-device-list">
|
|
|
<div v-if="identifiedDevices.length === 0" class="empty-state-small">
|
|
<div v-if="identifiedDevices.length === 0" class="empty-state-small">
|
|
|
<i class="fas fa-inbox" />
|
|
<i class="fas fa-inbox" />
|
|
|
- <p>暂无识别到的工装设备</p>
|
|
|
|
|
|
|
+ <p>暂未识别到的数据</p>
|
|
|
</div>
|
|
</div>
|
|
|
<div v-else>
|
|
<div v-else>
|
|
|
- <div v-for="device in identifiedDevices" :key="device.code" class="identified-device-item">
|
|
|
|
|
|
|
+ <div v-for="device in identifiedDevices" :key="device.inventoryNo" class="identified-device-item">
|
|
|
<div class="device-row">
|
|
<div class="device-row">
|
|
|
<div class="device-info">
|
|
<div class="device-info">
|
|
|
- <span class="device-label">工装编号</span>
|
|
|
|
|
- <span class="device-code font-mono">{{ device.code }}</span>
|
|
|
|
|
|
|
+ <span class="device-label">编号</span>
|
|
|
|
|
+ <span class="device-code font-mono">{{ device.inventoryNo }}</span>
|
|
|
</div>
|
|
</div>
|
|
|
<span class="device-tag identified">已识别</span>
|
|
<span class="device-tag identified">已识别</span>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="device-name-row">
|
|
<div class="device-name-row">
|
|
|
- <span class="device-label">工装名称</span>
|
|
|
|
|
- <span class="device-name">{{ device.name }}</span>
|
|
|
|
|
|
|
+ <span class="device-label">名称</span>
|
|
|
|
|
+ <span class="device-name">{{ device.inventoryName }}</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="device-feedbox-row">
|
|
|
|
|
+ <span class="device-label">料箱</span>
|
|
|
|
|
+ <span class="device-feedbox">{{ device.feedBoxName || '-' }}</span>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
@@ -119,7 +132,12 @@
|
|
|
|
|
|
|
|
<!-- Loading -->
|
|
<!-- Loading -->
|
|
|
<div v-if="loading" class="loading-overlay">
|
|
<div v-if="loading" class="loading-overlay">
|
|
|
- <div class="loading-spinner" />
|
|
|
|
|
|
|
+ <div class="loading-dots">
|
|
|
|
|
+ <div class="dot" />
|
|
|
|
|
+ <div class="dot" />
|
|
|
|
|
+ <div class="dot" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <span class="loading-text">加载中...</span>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
@@ -152,15 +170,8 @@ const taskStatus = ref({
|
|
|
text: '待识别',
|
|
text: '待识别',
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
-// 目标设备
|
|
|
|
|
-const targetDevice = ref({
|
|
|
|
|
- name: '',
|
|
|
|
|
-});
|
|
|
|
|
-
|
|
|
|
|
-// 目标设备2
|
|
|
|
|
-const targetDevice2 = ref({
|
|
|
|
|
- name: '',
|
|
|
|
|
-});
|
|
|
|
|
|
|
+// 目标设备列表(从 inventoryNameResponseList 获取)
|
|
|
|
|
+const targetDevices = ref([]);
|
|
|
|
|
|
|
|
// 已识别设备列表(支持多个)
|
|
// 已识别设备列表(支持多个)
|
|
|
const identifiedDevices = ref([]);
|
|
const identifiedDevices = ref([]);
|
|
@@ -174,7 +185,7 @@ const getAgvRfidLog = async () => {
|
|
|
if (res.errorCode === 0 && res.datas && res.datas.length > 0) {
|
|
if (res.errorCode === 0 && res.datas && res.datas.length > 0) {
|
|
|
// 取最后一条数据(最新的记录)
|
|
// 取最后一条数据(最新的记录)
|
|
|
const latestData = res.datas[res.datas.length - 1];
|
|
const latestData = res.datas[res.datas.length - 1];
|
|
|
-
|
|
|
|
|
|
|
+ console.log(latestData.countExecute);
|
|
|
// 更新任务信息
|
|
// 更新任务信息
|
|
|
taskInfo.value = {
|
|
taskInfo.value = {
|
|
|
taskId: latestData.scheduleTaskId.toString(),
|
|
taskId: latestData.scheduleTaskId.toString(),
|
|
@@ -182,19 +193,24 @@ const getAgvRfidLog = async () => {
|
|
|
message: latestData.message,
|
|
message: latestData.message,
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
- // 更新目标设备
|
|
|
|
|
- targetDevice.value = {
|
|
|
|
|
- name: latestData.inventoryName,
|
|
|
|
|
- };
|
|
|
|
|
- targetDevice2.value = {
|
|
|
|
|
- name: latestData.inventoryName2,
|
|
|
|
|
- };
|
|
|
|
|
|
|
+ // 更新目标设备列表(从 checkInventoryResponseList 获取)
|
|
|
|
|
+ if (latestData.checkInventoryResponseList && latestData.checkInventoryResponseList.length > 0) {
|
|
|
|
|
+ targetDevices.value = latestData.checkInventoryResponseList.map(item => ({
|
|
|
|
|
+ inventoryNo: item.inventoryNo,
|
|
|
|
|
+ inventoryName: item.inventoryName,
|
|
|
|
|
+ feedBoxName: item.feedBoxName || '',
|
|
|
|
|
+ }));
|
|
|
|
|
+
|
|
|
|
|
+ } else {
|
|
|
|
|
+ targetDevices.value = [];
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- // 更新已识别设备列表
|
|
|
|
|
|
|
+ // 更新已识别设备列表(包含料箱信息)
|
|
|
if (latestData.rfidInventoryResponseList && latestData.rfidInventoryResponseList.length > 0) {
|
|
if (latestData.rfidInventoryResponseList && latestData.rfidInventoryResponseList.length > 0) {
|
|
|
identifiedDevices.value = latestData.rfidInventoryResponseList.map(item => ({
|
|
identifiedDevices.value = latestData.rfidInventoryResponseList.map(item => ({
|
|
|
- code: item.inventoryNo,
|
|
|
|
|
- name: item.inventoryName,
|
|
|
|
|
|
|
+ inventoryNo: item.inventoryNo,
|
|
|
|
|
+ inventoryName: item.inventoryName,
|
|
|
|
|
+ feedBoxName: item.feedBoxName || '',
|
|
|
}));
|
|
}));
|
|
|
} else {
|
|
} else {
|
|
|
identifiedDevices.value = [];
|
|
identifiedDevices.value = [];
|
|
@@ -209,11 +225,7 @@ const getAgvRfidLog = async () => {
|
|
|
|
|
|
|
|
// message.success('获取识别结果成功');
|
|
// message.success('获取识别结果成功');
|
|
|
} else {
|
|
} else {
|
|
|
- showNotify({
|
|
|
|
|
- type: 'warning',
|
|
|
|
|
- message: '暂无识别记录',
|
|
|
|
|
- duration: 3000,
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ showNotify({ type: 'danger', message: '暂无识别记录', duration: 3000 });
|
|
|
}
|
|
}
|
|
|
} catch (error) {
|
|
} catch (error) {
|
|
|
console.error('获取RFID识别记录失败:', error);
|
|
console.error('获取RFID识别记录失败:', error);
|
|
@@ -238,11 +250,12 @@ const operationTip = computed(() => {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 检查是否所有识别的设备都与目标一致
|
|
// 检查是否所有识别的设备都与目标一致
|
|
|
|
|
+ const targetNames = targetDevices.value.map(d => d.inventoryName);
|
|
|
const allMatch = identifiedDevices.value.every(
|
|
const allMatch = identifiedDevices.value.every(
|
|
|
- device => device.name === targetDevice.value.name,
|
|
|
|
|
|
|
+ device => targetNames.includes(device.name),
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
- if (allMatch && identifiedDevices.value.length === 1) {
|
|
|
|
|
|
|
+ if (allMatch && identifiedDevices.value.length === targetDevices.value.length) {
|
|
|
return '当前识别到的工装与目标一致,可以继续执行任务。';
|
|
return '当前识别到的工装与目标一致,可以继续执行任务。';
|
|
|
} else if (!allMatch) {
|
|
} else if (!allMatch) {
|
|
|
return '当前识别到的工装与目标不符,请检查 RFID 标签是否正确贴附,或手动确认后重试任务。';
|
|
return '当前识别到的工装与目标不符,请检查 RFID 标签是否正确贴附,或手动确认后重试任务。';
|
|
@@ -259,7 +272,7 @@ const handleBack = () => {
|
|
|
// 重新识别
|
|
// 重新识别
|
|
|
const handleReIdentify = () => {
|
|
const handleReIdentify = () => {
|
|
|
showNotify({
|
|
showNotify({
|
|
|
- type: 'warning',
|
|
|
|
|
|
|
+ type: 'danger',
|
|
|
message: '正在重新识别 RFID 标签...',
|
|
message: '正在重新识别 RFID 标签...',
|
|
|
duration: 3000,
|
|
duration: 3000,
|
|
|
});
|
|
});
|
|
@@ -281,7 +294,7 @@ const handleManualConfirm = () => {
|
|
|
// 取消任务
|
|
// 取消任务
|
|
|
const handleCancelTask = () => {
|
|
const handleCancelTask = () => {
|
|
|
showNotify({
|
|
showNotify({
|
|
|
- type: 'warning',
|
|
|
|
|
|
|
+ type: 'danger',
|
|
|
message: '任务已取消',
|
|
message: '任务已取消',
|
|
|
duration: 3000,
|
|
duration: 3000,
|
|
|
});
|
|
});
|
|
@@ -317,91 +330,6 @@ const handleCancelTask = () => {
|
|
|
z-index: 0;
|
|
z-index: 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-/* ========== 顶部标题区域 ========== */
|
|
|
|
|
-.header-section {
|
|
|
|
|
- position: relative;
|
|
|
|
|
- width: 100%;
|
|
|
|
|
- padding: 20px 30px;
|
|
|
|
|
- box-sizing: border-box;
|
|
|
|
|
- z-index: 10;
|
|
|
|
|
- display: flex;
|
|
|
|
|
- align-items: center;
|
|
|
|
|
- justify-content: center;
|
|
|
|
|
- flex-shrink: 0;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.logout-btn {
|
|
|
|
|
- position: absolute;
|
|
|
|
|
- left: 30px;
|
|
|
|
|
- top: 50%;
|
|
|
|
|
- transform: translateY(-50%);
|
|
|
|
|
- display: flex;
|
|
|
|
|
- align-items: center;
|
|
|
|
|
- gap: 8px;
|
|
|
|
|
- background: linear-gradient(90deg, #1a4a7a 0%, #0d3a6a 100%);
|
|
|
|
|
- border: 1px solid #2a7fff;
|
|
|
|
|
- border-radius: 8px;
|
|
|
|
|
- padding: 10px 20px;
|
|
|
|
|
- color: #fff;
|
|
|
|
|
- font-size: 16px;
|
|
|
|
|
- cursor: pointer;
|
|
|
|
|
- transition: all 0.3s;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.logout-btn:hover {
|
|
|
|
|
- background: linear-gradient(90deg, #2a5a8a 0%, #1d4a7a 100%);
|
|
|
|
|
- box-shadow: 0 0 15px rgba(30, 144, 255, 0.4);
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.logout-btn i {
|
|
|
|
|
- font-size: 18px;
|
|
|
|
|
- color: #00bfff;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.page-title {
|
|
|
|
|
- font-size: 28px;
|
|
|
|
|
- font-weight: bold;
|
|
|
|
|
- color: #ffffff;
|
|
|
|
|
- letter-spacing: 2px;
|
|
|
|
|
- margin: 0;
|
|
|
|
|
- text-shadow: 0 0 10px rgba(0, 191, 255, 0.5);
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-/* 右侧操作按钮 */
|
|
|
|
|
-.header-actions {
|
|
|
|
|
- position: absolute;
|
|
|
|
|
- right: 30px;
|
|
|
|
|
- top: 50%;
|
|
|
|
|
- transform: translateY(-50%);
|
|
|
|
|
- display: flex;
|
|
|
|
|
- align-items: center;
|
|
|
|
|
- gap: 15px;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.action-btn {
|
|
|
|
|
- display: flex;
|
|
|
|
|
- align-items: center;
|
|
|
|
|
- gap: 8px;
|
|
|
|
|
- background: linear-gradient(90deg, #1a4a7a 0%, #0d3a6a 100%);
|
|
|
|
|
- border: 1px solid #2a7fff;
|
|
|
|
|
- border-radius: 8px;
|
|
|
|
|
- padding: 10px 20px;
|
|
|
|
|
- color: #fff;
|
|
|
|
|
- font-size: 14px;
|
|
|
|
|
- cursor: pointer;
|
|
|
|
|
- transition: all 0.3s;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.action-btn:hover {
|
|
|
|
|
- background: linear-gradient(90deg, #2a5a8a 0%, #1d4a7a 100%);
|
|
|
|
|
- box-shadow: 0 0 15px rgba(30, 144, 255, 0.4);
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.action-btn i {
|
|
|
|
|
- font-size: 16px;
|
|
|
|
|
- color: #00bfff;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
/* ========== 主内容区域 ========== */
|
|
/* ========== 主内容区域 ========== */
|
|
|
.main-content {
|
|
.main-content {
|
|
|
flex: 1;
|
|
flex: 1;
|
|
@@ -419,8 +347,8 @@ const handleCancelTask = () => {
|
|
|
.task-status-card {
|
|
.task-status-card {
|
|
|
background: rgba(9, 61, 140, 0.5);
|
|
background: rgba(9, 61, 140, 0.5);
|
|
|
border: 1px solid #049FD8;
|
|
border: 1px solid #049FD8;
|
|
|
- border-radius: 12px;
|
|
|
|
|
- padding: 20px;
|
|
|
|
|
|
|
+ border-radius: 16px;
|
|
|
|
|
+ padding: 30px;
|
|
|
flex-shrink: 0;
|
|
flex-shrink: 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -428,30 +356,30 @@ const handleCancelTask = () => {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
justify-content: space-between;
|
|
justify-content: space-between;
|
|
|
align-items: center;
|
|
align-items: center;
|
|
|
- margin-bottom: 20px;
|
|
|
|
|
|
|
+ margin-bottom: 25px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.status-title {
|
|
.status-title {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
align-items: center;
|
|
align-items: center;
|
|
|
- gap: 10px;
|
|
|
|
|
- font-size: 20px;
|
|
|
|
|
|
|
+ gap: 12px;
|
|
|
|
|
+ font-size: 28px;
|
|
|
font-weight: 600;
|
|
font-weight: 600;
|
|
|
color: #fff;
|
|
color: #fff;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.status-title i {
|
|
.status-title i {
|
|
|
color: #00bfff;
|
|
color: #00bfff;
|
|
|
- font-size: 22px;
|
|
|
|
|
|
|
+ font-size: 30px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.status-badge {
|
|
.status-badge {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
align-items: center;
|
|
align-items: center;
|
|
|
- gap: 8px;
|
|
|
|
|
- padding: 8px 20px;
|
|
|
|
|
- border-radius: 20px;
|
|
|
|
|
- font-size: 14px;
|
|
|
|
|
|
|
+ gap: 10px;
|
|
|
|
|
+ padding: 12px 28px;
|
|
|
|
|
+ border-radius: 25px;
|
|
|
|
|
+ font-size: 20px;
|
|
|
font-weight: 500;
|
|
font-weight: 500;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -470,26 +398,26 @@ const handleCancelTask = () => {
|
|
|
.status-info-grid {
|
|
.status-info-grid {
|
|
|
display: grid;
|
|
display: grid;
|
|
|
grid-template-columns: repeat(3, 1fr);
|
|
grid-template-columns: repeat(3, 1fr);
|
|
|
- gap: 15px;
|
|
|
|
|
|
|
+ gap: 20px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.status-info-item {
|
|
.status-info-item {
|
|
|
background: rgba(13, 58, 106, 0.6);
|
|
background: rgba(13, 58, 106, 0.6);
|
|
|
border: 1px solid rgba(42, 127, 255, 0.3);
|
|
border: 1px solid rgba(42, 127, 255, 0.3);
|
|
|
- border-radius: 8px;
|
|
|
|
|
- padding: 15px;
|
|
|
|
|
|
|
+ border-radius: 12px;
|
|
|
|
|
+ padding: 20px;
|
|
|
display: flex;
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
flex-direction: column;
|
|
|
- gap: 8px;
|
|
|
|
|
|
|
+ gap: 10px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.status-info-item .info-label {
|
|
.status-info-item .info-label {
|
|
|
- font-size: 13px;
|
|
|
|
|
|
|
+ font-size: 18px;
|
|
|
color: #7ec8ff;
|
|
color: #7ec8ff;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.status-info-item .info-value {
|
|
.status-info-item .info-value {
|
|
|
- font-size: 16px;
|
|
|
|
|
|
|
+ font-size: 22px;
|
|
|
color: #fff;
|
|
color: #fff;
|
|
|
font-weight: 500;
|
|
font-weight: 500;
|
|
|
}
|
|
}
|
|
@@ -510,7 +438,7 @@ const handleCancelTask = () => {
|
|
|
.device-section {
|
|
.device-section {
|
|
|
display: grid;
|
|
display: grid;
|
|
|
grid-template-columns: 1fr 1fr;
|
|
grid-template-columns: 1fr 1fr;
|
|
|
- gap: 20px;
|
|
|
|
|
|
|
+ gap: 25px;
|
|
|
flex: 1;
|
|
flex: 1;
|
|
|
min-height: 0;
|
|
min-height: 0;
|
|
|
}
|
|
}
|
|
@@ -518,8 +446,8 @@ const handleCancelTask = () => {
|
|
|
.device-card {
|
|
.device-card {
|
|
|
background: rgba(9, 61, 140, 0.5);
|
|
background: rgba(9, 61, 140, 0.5);
|
|
|
border: 1px solid #049FD8;
|
|
border: 1px solid #049FD8;
|
|
|
- border-radius: 12px;
|
|
|
|
|
- padding: 20px;
|
|
|
|
|
|
|
+ border-radius: 16px;
|
|
|
|
|
+ padding: 25px;
|
|
|
display: flex;
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
flex-direction: column;
|
|
|
overflow: hidden;
|
|
overflow: hidden;
|
|
@@ -528,19 +456,19 @@ const handleCancelTask = () => {
|
|
|
.card-header-icon {
|
|
.card-header-icon {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
align-items: center;
|
|
align-items: center;
|
|
|
- gap: 15px;
|
|
|
|
|
- margin-bottom: 20px;
|
|
|
|
|
|
|
+ gap: 18px;
|
|
|
|
|
+ margin-bottom: 25px;
|
|
|
flex-shrink: 0;
|
|
flex-shrink: 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.icon-circle {
|
|
.icon-circle {
|
|
|
- width: 50px;
|
|
|
|
|
- height: 50px;
|
|
|
|
|
|
|
+ width: 60px;
|
|
|
|
|
+ height: 60px;
|
|
|
border-radius: 50%;
|
|
border-radius: 50%;
|
|
|
display: flex;
|
|
display: flex;
|
|
|
align-items: center;
|
|
align-items: center;
|
|
|
justify-content: center;
|
|
justify-content: center;
|
|
|
- font-size: 22px;
|
|
|
|
|
|
|
+ font-size: 28px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.icon-circle.target {
|
|
.icon-circle.target {
|
|
@@ -554,14 +482,14 @@ const handleCancelTask = () => {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.card-title h3 {
|
|
.card-title h3 {
|
|
|
- font-size: 18px;
|
|
|
|
|
|
|
+ font-size: 26px;
|
|
|
font-weight: 600;
|
|
font-weight: 600;
|
|
|
color: #fff;
|
|
color: #fff;
|
|
|
- margin: 0 0 5px 0;
|
|
|
|
|
|
|
+ margin: 0 0 8px 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.card-title p {
|
|
.card-title p {
|
|
|
- font-size: 13px;
|
|
|
|
|
|
|
+ font-size: 18px;
|
|
|
color: #7ec8ff;
|
|
color: #7ec8ff;
|
|
|
margin: 0;
|
|
margin: 0;
|
|
|
}
|
|
}
|
|
@@ -570,46 +498,45 @@ const handleCancelTask = () => {
|
|
|
.target-device-list {
|
|
.target-device-list {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
flex-direction: column;
|
|
|
- gap: 15px;
|
|
|
|
|
|
|
+ gap: 18px;
|
|
|
flex: 1;
|
|
flex: 1;
|
|
|
|
|
+ overflow-y: auto;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.target-device-item {
|
|
.target-device-item {
|
|
|
background: linear-gradient(135deg, rgba(30, 144, 255, 0.2) 0%, rgba(0, 191, 255, 0.1) 100%);
|
|
background: linear-gradient(135deg, rgba(30, 144, 255, 0.2) 0%, rgba(0, 191, 255, 0.1) 100%);
|
|
|
border: 1px solid rgba(30, 144, 255, 0.4);
|
|
border: 1px solid rgba(30, 144, 255, 0.4);
|
|
|
- border-radius: 10px;
|
|
|
|
|
- padding: 15px 20px;
|
|
|
|
|
- display: flex;
|
|
|
|
|
- justify-content: space-between;
|
|
|
|
|
- align-items: center;
|
|
|
|
|
|
|
+ border-radius: 12px;
|
|
|
|
|
+ padding: 20px 25px;
|
|
|
|
|
+ margin-bottom: 6px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.device-info {
|
|
.device-info {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
flex-direction: column;
|
|
|
- gap: 5px;
|
|
|
|
|
|
|
+ gap: 6px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.device-label {
|
|
.device-label {
|
|
|
- font-size: 12px;
|
|
|
|
|
|
|
+ font-size: 16px;
|
|
|
color: #7ec8ff;
|
|
color: #7ec8ff;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.device-name {
|
|
.device-name {
|
|
|
- font-size: 18px;
|
|
|
|
|
|
|
+ font-size: 24px;
|
|
|
font-weight: 600;
|
|
font-weight: 600;
|
|
|
color: #fff;
|
|
color: #fff;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.device-code {
|
|
.device-code {
|
|
|
- font-size: 16px;
|
|
|
|
|
|
|
+ font-size: 20px;
|
|
|
color: #fff;
|
|
color: #fff;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.device-tag {
|
|
.device-tag {
|
|
|
- padding: 6px 16px;
|
|
|
|
|
- border-radius: 15px;
|
|
|
|
|
- font-size: 12px;
|
|
|
|
|
|
|
+ padding: 10px 22px;
|
|
|
|
|
+ border-radius: 20px;
|
|
|
|
|
+ font-size: 16px;
|
|
|
font-weight: 500;
|
|
font-weight: 500;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -631,29 +558,55 @@ const handleCancelTask = () => {
|
|
|
overflow-y: auto;
|
|
overflow-y: auto;
|
|
|
display: flex;
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
flex-direction: column;
|
|
|
- gap: 15px;
|
|
|
|
|
|
|
+ gap: 18px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.identified-device-item {
|
|
.identified-device-item {
|
|
|
background: linear-gradient(135deg, rgba(139, 92, 246, 0.2) 0%, rgba(167, 139, 250, 0.1) 100%);
|
|
background: linear-gradient(135deg, rgba(139, 92, 246, 0.2) 0%, rgba(167, 139, 250, 0.1) 100%);
|
|
|
border: 1px solid rgba(139, 92, 246, 0.4);
|
|
border: 1px solid rgba(139, 92, 246, 0.4);
|
|
|
- border-radius: 10px;
|
|
|
|
|
- padding: 15px 20px;
|
|
|
|
|
|
|
+ border-radius: 12px;
|
|
|
|
|
+ padding: 8px 25px;
|
|
|
|
|
+ margin-bottom: 6px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.device-row {
|
|
.device-row {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
justify-content: space-between;
|
|
justify-content: space-between;
|
|
|
align-items: center;
|
|
align-items: center;
|
|
|
- margin-bottom: 10px;
|
|
|
|
|
|
|
+ /* margin-bottom: 12px; */
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.device-name-row {
|
|
.device-name-row {
|
|
|
- padding-top: 10px;
|
|
|
|
|
|
|
+ padding-top: 12px;
|
|
|
border-top: 1px solid rgba(139, 92, 246, 0.3);
|
|
border-top: 1px solid rgba(139, 92, 246, 0.3);
|
|
|
display: flex;
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
flex-direction: column;
|
|
|
- gap: 5px;
|
|
|
|
|
|
|
+ gap: 6px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/* 料箱信息行 */
|
|
|
|
|
+.device-feedbox-row {
|
|
|
|
|
+ padding-top: 12px;
|
|
|
|
|
+ border-top: 1px solid rgba(139, 92, 246, 0.2);
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-direction: column;
|
|
|
|
|
+ gap: 6px;
|
|
|
|
|
+ margin-top: 6px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.device-feedbox {
|
|
|
|
|
+ font-size: 22px;
|
|
|
|
|
+ font-weight: 500;
|
|
|
|
|
+ color: #f59e0b;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/* 目标设备的料箱行样式 */
|
|
|
|
|
+.target-device-item .device-feedbox-row {
|
|
|
|
|
+ border-top: 1px solid rgba(30, 144, 255, 0.2);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.target-device-item .device-feedbox {
|
|
|
|
|
+ color: #fbbf24;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/* 空状态 */
|
|
/* 空状态 */
|
|
@@ -662,139 +615,245 @@ const handleCancelTask = () => {
|
|
|
flex-direction: column;
|
|
flex-direction: column;
|
|
|
align-items: center;
|
|
align-items: center;
|
|
|
justify-content: center;
|
|
justify-content: center;
|
|
|
- padding: 40px 20px;
|
|
|
|
|
|
|
+ padding: 50px 20px;
|
|
|
color: #5a8abf;
|
|
color: #5a8abf;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.empty-state-small i {
|
|
.empty-state-small i {
|
|
|
- font-size: 48px;
|
|
|
|
|
- margin-bottom: 15px;
|
|
|
|
|
|
|
+ font-size: 60px;
|
|
|
|
|
+ margin-bottom: 20px;
|
|
|
opacity: 0.5;
|
|
opacity: 0.5;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.empty-state-small p {
|
|
.empty-state-small p {
|
|
|
- font-size: 14px;
|
|
|
|
|
|
|
+ font-size: 20px;
|
|
|
margin: 0;
|
|
margin: 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-/* ========== Loading 遮罩 ========== */
|
|
|
|
|
-.loading-overlay {
|
|
|
|
|
- position: fixed;
|
|
|
|
|
- top: 0;
|
|
|
|
|
- left: 0;
|
|
|
|
|
- width: 100%;
|
|
|
|
|
- height: 100%;
|
|
|
|
|
- background: rgba(4, 28, 61, 0.8);
|
|
|
|
|
- display: flex;
|
|
|
|
|
- align-items: center;
|
|
|
|
|
- justify-content: center;
|
|
|
|
|
- z-index: 1000;
|
|
|
|
|
-}
|
|
|
|
|
|
|
+/* ========== 响应式 - 横屏 1920*1080 ========== */
|
|
|
|
|
+@media screen and (orientation: landscape) {
|
|
|
|
|
+ .main-content {
|
|
|
|
|
+ padding: 0 30px 20px;
|
|
|
|
|
+ gap: 20px;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
-.loading-spinner {
|
|
|
|
|
- width: 60px;
|
|
|
|
|
- height: 60px;
|
|
|
|
|
- border: 4px solid rgba(30, 144, 255, 0.3);
|
|
|
|
|
- border-top-color: #00bfff;
|
|
|
|
|
- border-radius: 50%;
|
|
|
|
|
- animation: spin 1s linear infinite;
|
|
|
|
|
-}
|
|
|
|
|
|
|
+ .task-status-card {
|
|
|
|
|
+ padding: 25px;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
-@keyframes spin {
|
|
|
|
|
- to {
|
|
|
|
|
- transform: rotate(360deg);
|
|
|
|
|
|
|
+ .status-title {
|
|
|
|
|
+ font-size: 24px;
|
|
|
}
|
|
}
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
-/* ========== 响应式 - 横屏 ========== */
|
|
|
|
|
-@media screen and (orientation: landscape) {
|
|
|
|
|
- .header-section {
|
|
|
|
|
- padding: 10px 20px;
|
|
|
|
|
|
|
+ .status-title i {
|
|
|
|
|
+ font-size: 26px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- .page-title {
|
|
|
|
|
|
|
+ .status-badge {
|
|
|
|
|
+ padding: 10px 24px;
|
|
|
|
|
+ font-size: 18px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .status-info-item {
|
|
|
|
|
+ padding: 18px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .status-info-item .info-label {
|
|
|
|
|
+ font-size: 16px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .status-info-item .info-value {
|
|
|
|
|
+ font-size: 20px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .device-section {
|
|
|
|
|
+ gap: 20px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .device-card {
|
|
|
|
|
+ padding: 20px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .icon-circle {
|
|
|
|
|
+ width: 50px;
|
|
|
|
|
+ height: 50px;
|
|
|
|
|
+ font-size: 24px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .card-title h3 {
|
|
|
font-size: 22px;
|
|
font-size: 22px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- .logout-btn {
|
|
|
|
|
- padding: 6px 14px;
|
|
|
|
|
- font-size: 13px;
|
|
|
|
|
- left: 20px;
|
|
|
|
|
|
|
+ .card-title p {
|
|
|
|
|
+ font-size: 16px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- .header-actions {
|
|
|
|
|
- right: 20px;
|
|
|
|
|
|
|
+ .target-device-item,
|
|
|
|
|
+ .identified-device-item {
|
|
|
|
|
+ padding: 8px 22px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- .action-btn {
|
|
|
|
|
- padding: 6px 14px;
|
|
|
|
|
- font-size: 12px;
|
|
|
|
|
|
|
+ .device-label {
|
|
|
|
|
+ font-size: 14px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ .device-name {
|
|
|
|
|
+ font-size: 20px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .device-code {
|
|
|
|
|
+ font-size: 22px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .device-feedbox {
|
|
|
|
|
+ font-size: 18px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .device-tag {
|
|
|
|
|
+ padding: 8px 18px;
|
|
|
|
|
+ font-size: 14px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .empty-state-small i {
|
|
|
|
|
+ font-size: 48px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .empty-state-small p {
|
|
|
|
|
+ font-size: 16px;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/* ========== 响应式 - 竖屏 1080*1920 ========== */
|
|
|
|
|
+@media screen and (orientation: portrait) {
|
|
|
.main-content {
|
|
.main-content {
|
|
|
- padding: 0 20px 15px;
|
|
|
|
|
- gap: 15px;
|
|
|
|
|
|
|
+ padding: 0 30px 30px;
|
|
|
|
|
+ gap: 25px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.task-status-card {
|
|
.task-status-card {
|
|
|
- padding: 15px;
|
|
|
|
|
|
|
+ padding: 35px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .status-header {
|
|
|
|
|
+ margin-bottom: 30px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.status-title {
|
|
.status-title {
|
|
|
- font-size: 16px;
|
|
|
|
|
|
|
+ font-size: 32px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .status-title i {
|
|
|
|
|
+ font-size: 34px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.status-badge {
|
|
.status-badge {
|
|
|
- padding: 5px 15px;
|
|
|
|
|
- font-size: 12px;
|
|
|
|
|
|
|
+ padding: 14px 32px;
|
|
|
|
|
+ font-size: 22px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .status-info-grid {
|
|
|
|
|
+ gap: 25px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.status-info-item {
|
|
.status-info-item {
|
|
|
- padding: 10px;
|
|
|
|
|
|
|
+ padding: 25px;
|
|
|
|
|
+ gap: 12px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.status-info-item .info-label {
|
|
.status-info-item .info-label {
|
|
|
- font-size: 11px;
|
|
|
|
|
|
|
+ font-size: 20px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.status-info-item .info-value {
|
|
.status-info-item .info-value {
|
|
|
- font-size: 14px;
|
|
|
|
|
|
|
+ font-size: 24px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .info-value {
|
|
|
|
|
+ font-size: 22px !important;
|
|
|
|
|
+ }
|
|
|
|
|
+ .text-error {
|
|
|
|
|
+ font-size: 19px !important;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .device-section {
|
|
|
|
|
+ gap: 30px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.device-card {
|
|
.device-card {
|
|
|
- padding: 15px;
|
|
|
|
|
|
|
+ padding: 30px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .card-header-icon {
|
|
|
|
|
+ gap: 20px;
|
|
|
|
|
+ margin-bottom: 30px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.icon-circle {
|
|
.icon-circle {
|
|
|
- width: 40px;
|
|
|
|
|
- height: 40px;
|
|
|
|
|
- font-size: 18px;
|
|
|
|
|
|
|
+ width: 70px;
|
|
|
|
|
+ height: 70px;
|
|
|
|
|
+ font-size: 32px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.card-title h3 {
|
|
.card-title h3 {
|
|
|
- font-size: 15px;
|
|
|
|
|
|
|
+ font-size: 30px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.card-title p {
|
|
.card-title p {
|
|
|
- font-size: 11px;
|
|
|
|
|
|
|
+ font-size: 20px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .target-device-list,
|
|
|
|
|
+ .identified-device-list {
|
|
|
|
|
+ gap: 20px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.target-device-item,
|
|
.target-device-item,
|
|
|
.identified-device-item {
|
|
.identified-device-item {
|
|
|
- padding: 12px 15px;
|
|
|
|
|
|
|
+ padding: 8px 14px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .device-label {
|
|
|
|
|
+ font-size: 18px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.device-name {
|
|
.device-name {
|
|
|
- font-size: 15px;
|
|
|
|
|
|
|
+ font-size: 28px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.device-code {
|
|
.device-code {
|
|
|
- font-size: 14px;
|
|
|
|
|
|
|
+ font-size: 22px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .device-feedbox {
|
|
|
|
|
+ font-size: 26px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.device-tag {
|
|
.device-tag {
|
|
|
- padding: 4px 12px;
|
|
|
|
|
- font-size: 11px;
|
|
|
|
|
|
|
+ padding: 12px 26px;
|
|
|
|
|
+ font-size: 18px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /* .device-row {
|
|
|
|
|
+ margin-bottom: 15px;
|
|
|
|
|
+ } */
|
|
|
|
|
+
|
|
|
|
|
+ .device-name-row,
|
|
|
|
|
+ .device-feedbox-row {
|
|
|
|
|
+ padding-top: 6px;
|
|
|
|
|
+ gap: 4px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .empty-state-small {
|
|
|
|
|
+ padding: 60px 20px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .empty-state-small i {
|
|
|
|
|
+ font-size: 70px;
|
|
|
|
|
+ margin-bottom: 25px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .empty-state-small p {
|
|
|
|
|
+ font-size: 24px;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
</style>
|
|
</style>
|