This commit is contained in:
JayJiaJun 2025-02-11 16:14:44 +08:00
parent 3eac2eed00
commit 1c87c36f81
2 changed files with 190 additions and 175 deletions

View File

@ -135,12 +135,14 @@
<el-button type="primary" @click="showAddPlanDialog">新增方案</el-button>
</div>
</div>
<el-table :data="plans" empty-text="暂无数据" border style="width: 100%; margin-bottom: 20px;">
<el-table-column type="index" label="序号" width="60" align="center"></el-table-column>
<el-table-column prop="name" label="方案名称" min-width="15%" align="center"></el-table-column>
<el-table-column prop="timeRange" label="时间段" min-width="15%" align="center"></el-table-column>
<el-table-column prop="selectedMode" label="车道模式" min-width="15%" align="center"></el-table-column>
<el-table-column prop="timeRange" label="时间段" min-width="15%"
align="center"></el-table-column>
<el-table-column prop="selectedMode" label="车道模式" min-width="15%"
align="center"></el-table-column>
<el-table-column prop="lanes" label="开放车道" min-width="15%" align="center">
<template #default="scope">
<span v-for="(lane, index) in scope.row.lanes" :key="index">
@ -158,10 +160,8 @@
</el-table-column>
<el-table-column label="使能" width="80" align="center">
<template #default="scope">
<el-switch
v-model="scope.row.enabled"
@change="(val) => handleStatusChange(val, scope.row)"
></el-switch>
<el-switch v-model="scope.row.enabled"
@change="(val) => handleStatusChange(val, scope.row)"></el-switch>
</template>
</el-table-column>
<el-table-column label="操作" width="120" align="center">
@ -181,20 +181,14 @@
<el-form-item label="车道模式">
<el-select v-model="newPlan.selectedMode" placeholder="请选择车道模式">
<el-option label="左转 直行" value="0"></el-option>
<el-option label="右转 直行" value="1"></el-option>
<el-option label="左转 直行" :value="1"></el-option>
<el-option label="右转 直行" :value="2"></el-option>
</el-select>
</el-form-item>
<el-form-item label="时间段设置">
<el-time-picker
v-model="newPlan.timeRange"
is-range
range-separator="至"
start-placeholder="开始时间"
end-placeholder="结束时间"
style="width: 350px;"
/>
<el-time-picker v-model="newPlan.timeRange" is-range range-separator=""
start-placeholder="开始时间" end-placeholder="结束时间" style="width: 350px;" />
</el-form-item>
<el-form-item label="开放车道">
@ -273,7 +267,7 @@ export default {
endTime: '',
lanes: [],
timeRange: [], //
selectedMode: '', //
selectedMode: null, // null
repeatDays: [], //
},
plans: [
@ -281,16 +275,16 @@ export default {
// id: 1,
// name: '',
// timeRange: '07:30 - 09:30',
// selectedMode: '0', //
// selectedMode: 0, //
// lanes: ['1', '2'],
// repeatDays: [0, 1, 2, 3, 4], //
// repeatDays: [0, 1, 2, 3, 4],
// enabled: true
// },
// {
// id: 2,
// name: '',
// timeRange: '17:00 - 19:00',
// selectedMode: '1', //
// selectedMode: 1, //
// lanes: ['2', '3', '4'],
// repeatDays: [0, 1, 2, 3, 4],
// enabled: false
@ -299,7 +293,7 @@ export default {
// id: 3,
// name: '',
// timeRange: '09:00 - 18:00',
// selectedMode: '0',
// selectedMode: 0, //
// lanes: ['1', '2', '3'],
// repeatDays: [5, 6], //
// enabled: true
@ -341,7 +335,7 @@ export default {
resetNewPlan() {
this.newPlan = {
name: '',
selectedMode: '',
selectedMode: null,
timeRange: [],
lanes: [],
repeatDays: []
@ -406,9 +400,18 @@ export default {
}
},
//
//
async addPlan() {
try {
// 30
if (this.plans.length >= 30) {
ElMessage({
message: '无法添加新方案方案数量已达到上限30个',
type: 'error'
});
return; //
}
//
if (!this.newPlan.name) {
ElMessage({
@ -418,7 +421,7 @@ export default {
return;
}
if (!this.newPlan.selectedMode) {
if (this.newPlan.selectedMode === null) {
ElMessage({
message: '请选择车道模式',
type: 'error'
@ -435,29 +438,46 @@ export default {
let startTime, endTime;
if (Array.isArray(this.newPlan.timeRange)) {
[startTime, endTime] = this.newPlan.timeRange;
} else if (typeof this.newPlan.timeRange === 'string') {
[startTime, endTime] = this.newPlan.timeRange.split(' - ');
}
//
const lanes = (this.newPlan.lanes || []).map(lane => {
return String(lane.replace('车道', '') - 1);
// -
const lanesBinary = [0, 0, 0, 0]; // 0000
(this.newPlan.lanes || []).forEach(lane => {
const laneIndex = parseInt(lane.replace('车道', '')) - 1; //
if (laneIndex >= 0 && laneIndex < 4) {
lanesBinary[laneIndex] = 1; // 1
}
});
const lanesBinaryString = lanesBinary.join(''); //
// -
const repeatDaysBinary = Array(7).fill(0); // 0000000
(this.newPlan.repeatDays || []).forEach(day => {
repeatDaysBinary[day] = 1; // 1
});
const repeatDaysBinaryString = repeatDaysBinary.join(''); //
// ID
const existingIds = this.plans.map(plan => plan.id);
let newId = 0; // 0
while (existingIds.includes(newId)) {
newId++; // 使 ID
}
const planData = {
JSON_id: getNextJsonId(),
command: "set_scheme",
command: "add_scheme",
parameters: {
scheme: [{
id: this.isEdit ? this.currentEditId : (this.plans.length + 1),
id: newId, // 使 ID
name: this.newPlan.name,
selectedMode: this.newPlan.selectedMode,
timeRange: {
start: formatTime(startTime),
end: formatTime(endTime)
},
lanes: lanes,
repeatDays: this.newPlan.repeatDays.map(day => Number(day))
lanes: lanesBinaryString, // 使
repeatDays: repeatDaysBinaryString // 使
}]
}
};
@ -474,7 +494,7 @@ export default {
if (response.data?.parameters?.status === 0) {
const newPlanData = {
id: planData.parameters.scheme[0].id,
id: newId, // 使 ID
name: this.newPlan.name,
timeRange: `${formatTime(startTime)} - ${formatTime(endTime)}`,
selectedMode: this.newPlan.selectedMode,
@ -483,14 +503,7 @@ export default {
enabled: true
};
if (this.isEdit) {
const index = this.plans.findIndex(p => p.id === this.currentEditId);
if (index !== -1) {
this.plans.splice(index, 1, newPlanData);
}
} else {
this.plans.push(newPlanData);
}
this.plans.push(newPlanData); //
this.planDialogVisible = false;
this.resetNewPlan();
@ -564,22 +577,34 @@ export default {
//
if (response.data.parameters.scheme) {
this.plans = response.data.parameters.scheme.map(scheme => ({
name: scheme.name,
timeRange: `${scheme.timeRange.start} - ${scheme.timeRange.end}`,
selectedMode: scheme.selectedMode,
lanes: scheme.lanes.map(lane => `车道${parseInt(lane) + 1}`),
repeatDays: scheme.repeatDays || [] //
}));
this.plans = response.data.parameters.scheme.map(scheme => {
// lanes
const lanesBinary = scheme.lanes.split('').map(Number); //
const lanes = lanesBinary.map((lane, index) => lane === 1 ? `车道${index + 1}` : null).filter(Boolean); //
// repeatDays
const repeatDaysBinary = scheme.repeatDays.split('').map(Number); //
const repeatDays = repeatDaysBinary.map((day, index) => day === 1 ? index : null).filter(Boolean); //
return {
id: parseInt(scheme.id),
name: scheme.name,
timeRange: `${scheme.timeRange.start} - ${scheme.timeRange.end}`,
selectedMode: parseInt(scheme.selectedMode),
lanes: lanes, // 使
repeatDays: repeatDays, // 使
enabled: Boolean(scheme.en)
};
});
}
//
if (response.data.parameters.laneSetting) {
this.laneDefaults = {
lane1: response.data.parameters.laneSetting.lane1 || [],
lane2: response.data.parameters.laneSetting.lane2 || [],
lane3: response.data.parameters.laneSetting.lane3 || [],
lane4: response.data.parameters.laneSetting.lane4 || []
lane1: response.data.parameters.laneSetting.lane1 || 0,
lane2: response.data.parameters.laneSetting.lane2 || 0,
lane3: response.data.parameters.laneSetting.lane3 || 0,
lane4: response.data.parameters.laneSetting.lane4 || 0
};
}
@ -726,21 +751,21 @@ export default {
this.isEdit = true;
this.dialogTitle = '编辑方案';
this.currentEditId = plan.id;
//
let [startTime, endTime] = plan.timeRange.split(' - ');
//
const today = new Date();
const [startHour, startMinute] = startTime.split(':');
const [endHour, endMinute] = endTime.split(':');
const startDate = new Date(today);
startDate.setHours(parseInt(startHour), parseInt(startMinute), 0);
const endDate = new Date(today);
endDate.setHours(parseInt(endHour), parseInt(endMinute), 0);
this.newPlan = {
name: plan.name,
selectedMode: plan.selectedMode,
@ -748,7 +773,7 @@ export default {
lanes: [...(plan.lanes || [])],
repeatDays: [...(plan.repeatDays || [])].map(String)
};
this.planDialogVisible = true;
},
@ -766,14 +791,26 @@ export default {
[startTime, endTime] = this.newPlan.timeRange;
}
//
const lanes = (this.newPlan.lanes || []).map(lane => {
return String(lane.replace('车道', '') - 1);
// -
const lanesBinary = [0, 0, 0, 0]; // 0000
(this.newPlan.lanes || []).forEach(lane => {
const laneIndex = parseInt(lane.replace('车道', '')) - 1; //
if (laneIndex >= 0 && laneIndex < 4) {
lanesBinary[laneIndex] = 1; // 1
}
});
const lanesBinaryString = lanesBinary.join(''); //
// -
const repeatDaysBinary = Array(7).fill(0); // 0000000
(this.newPlan.repeatDays || []).forEach(day => {
repeatDaysBinary[day] = 1; // 1
});
const repeatDaysBinaryString = repeatDaysBinary.join(''); //
const editedPlan = {
JSON_id: getNextJsonId(),
command: "set_scheme",
command: "add_scheme",
parameters: {
scheme: [{
id: this.currentEditId,
@ -783,8 +820,8 @@ export default {
start: formatTime(startTime),
end: formatTime(endTime)
},
lanes: lanes,
repeatDays: this.newPlan.repeatDays.map(day => Number(day))
lanes: lanesBinaryString, // 使
repeatDays: repeatDaysBinaryString // 使
}]
}
};
@ -814,10 +851,10 @@ export default {
if (index !== -1) {
this.plans.splice(index, 1, newPlanData);
}
this.planDialogVisible = false;
this.resetNewPlan();
ElMessage({
message: response.data?.parameters?.message || '方案编辑成功',
type: 'success'
@ -842,10 +879,10 @@ export default {
JSON_id: getNextJsonId(),
command: "default_lane_setting",
parameters: {
lane1: this.laneDefaults.lane1 || [],
lane2: this.laneDefaults.lane2 || [],
lane3: this.laneDefaults.lane3 || [],
lane4: this.laneDefaults.lane4 || []
lane1: parseInt(this.laneDefaults.lane1) || 0,
lane2: parseInt(this.laneDefaults.lane2) || 0,
lane3: parseInt(this.laneDefaults.lane3) || 0,
lane4: parseInt(this.laneDefaults.lane4) || 0
}
};
@ -888,6 +925,15 @@ export default {
//
handlePlanSubmit() {
//
if (this.newPlan.selectedMode === null) {
ElMessage({
message: '请选择车道模式',
type: 'error'
});
return; //
}
if (this.isEdit) {
this.saveEditPlan();
} else {
@ -900,7 +946,7 @@ export default {
try {
const statusData = {
JSON_id: getNextJsonId(),
command: "set_scheme_status",
command: "add_scheme_status",
parameters: {
id: row.id,
enabled: val
@ -1062,7 +1108,7 @@ export default {
}
/* 调整按钮间距 */
.el-button + .el-button {
.el-button+.el-button {
margin-left: 8px;
}
</style>

View File

@ -1,70 +1,60 @@
JSON
(Web )
{
json{
"command": "login",
"parameters": {
"username": "string",
"password": "string"
}
}
( Web)
{
json{
"command": "login_response",
"parameters": {
"status": 0, // 0: , 1:
"message": "Login successful" //
"status": 0, // 0: , 1:
"message": "Login successful" //
}
}
()
(Web )
{
json{
"JSON_id": 2,
"command": "change_password",
"parameters": {
"old_password": "",
"new_password": ""
}
}
( Web)
{
"command": "change_password_response",
"parameters": {
"status": 0, // 0: , 1:
"message": "Psword changed successfully"
"old_password": "",
"new_password": ""
}
}
JSON
( Web)
json{
"command": "change_password_response",
"parameters": {
"status": 0, // 0: , 1:
"message": "Password changed successfully"
}
}
(Web )
{
json{
"command": "set_time",
"parameters": {
"timestamp": "2025-01-13T12:00:00Z"
}
}
( Web)
{
json{
"command": "set_time_response",
"parameters": {
"status": 0, // 0: , 1:
"status": 0, // 0: , 1:
"message": "Time set successfully"
}
}
(Web
{
(Web )
json{
"command": "set_mode",
"parameters": {
"mode": 0, //
"mode": 0, //
"data": {
"param1": "value1",
"param2": "value2",
@ -72,167 +62,146 @@
}
}
}
( Web)
{
json{
"command": "set_mode_response",
"parameters": {
"status": 0, // 0: , 1:
"status": 0, // 0: , 1:
"message": "Mode set successfully"
}
}
(Web )
{
"command": "set_scheme",
json{
"command": "add_scheme",
"parameters": {
"scheme": [
{
"id": 1,
"en": 1,
"name": "方案1",
"selectedMode": "1", // 1:2:3:4:
"selectedMode": 1, // 1:2:3:4:
"timeRange": {
"start": "08:00",
"end": "10:00"
},
"lanes": [
"0",
"1"
],
"repeatDays": [0, 1, 2, 3, 4, 5, 6] //
"lanes": "0100", //
"repeatDays": "0000001" //
}
]
}
}
( Web)
{
"command": "set_scheme_response",
json{
"command": "add_scheme_response",
"parameters": {
"status": 0, // 0: , 1:
"status": 0, // 0: , 1:
"message": "Add Plan successfully"
}
}
(Web )
{
json{
"command": "get_device_info",
"parameters": {}
}
( Web)
{
json{
"command": "get_device_info_response",
"parameters": {
"version": "1.0.3", //
"version": "1.0.3", //
"compileTime": "2025-01-14T10:30:00Z"
}
}
(Web )
{
json{
"command": "get_all_info",
"parameters": {}
}
( Web)
{
json{
"command": "get_all_info_response",
"parameters": {
"set_mode": 0, //
"set_mode": 0, //
"scheme": [
{
"id": 1,
"en": 1,
"name": "方案1",
"selectedMode": "1", // 1:2:3:4:
"selectedMode": 1, // 1:2:3:4:
"timeRange": {
"start": "08:00",
"end": "10:00"
},
"lanes": [
"0",
"1"
],
"repeatDays": [0, 1, 2, 3, 4, 5, 6] //
"lanes": "0100", //
"repeatDays": "0000001" //
}
],
"laneSetting": {
"lane1": "0", //0 1
"lane2": "1",
"lane3": "0",
"lane4": "1"
"lane1": 0, //0 1
"lane2": 1,
"lane3": 0,
"lane4": 1
},
"deviceInfo": {
"version": "1.0.3",
"compileTime": "2025-01-14 10:30:00"
}
}
}
(Web )
{
json{
"command": "default_lane_setting",
"parameters": {
"lane1": "0", //0 1
"lane2": "1",
"lane3": "2",
"lane4": "3"
"lane1": 0, //0 1
"lane2": 1,
"lane3": 0,
"lane4": 1
}
}
( Web)
{
"command": "default_lane_setting",
json{
"command": "default_lane_setting_response",
"parameters": {
"status": 0, // 0: , 1:
"status": 0, // 0: , 1:
"message": "Set successfully"
}
}
使
(Web )
{
json{
"JSON_id": 30,
"command": "set_scheme_status",
"parameters": {
"id": 1,
"enabled": false
"id": 1,
"enable": false
}
}
}
( Web)
{
json{
"command": "set_scheme_status_response",
"parameters": {
"status": 0, // 0: , 1:
"status": 0, // 0: , 1:
"message": "Set successfully"
}
}
(Web )
{
json{
"command": "delete_scheme",
"parameters": {
"id": 1
}
}
( Web)
{
json{
"command": "delete_scheme_response",
"parameters": {
"status": 0, // 0: , 1:
"parameters": {
"status": 0, // 0: , 1:
"message": "Delete successfully"
}
}
}