Commit 5cb42289 by 周田

feat:添加指令

parent 93ed262e
......@@ -4,7 +4,6 @@
<div class="left">
<div class="mr-4">协议版本</div>
<el-select v-model="currentVersion" @change="changeProtocolVersion">
<!-- TODO: 选择协议版本 -->
<el-option
v-for="option in options"
:key="option.value"
......@@ -29,7 +28,8 @@
<el-button>上传原始文件</el-button>
</el-upload>
<el-button v-else @click="downloadFile"> 下载原始文件 </el-button>
<el-button @click="addCmd = true">新增指令</el-button>
<el-button @click="addCmdDialog = true">新增指令</el-button>
<el-button @click="deleteProtocol">删除该版本协议</el-button>
</div>
</div>
......@@ -47,37 +47,34 @@
</el-collapse-item>
</el-collapse>
<el-dialog v-model="addCmd" title="新增指令">
<el-form>
<el-form-item label="协议名称" :label-width="formLabelWidth">
<el-input autocomplete="off" />
<el-dialog v-model="addCmdDialog" title="新增指令">
<el-form v-model="addCmdData">
<el-form-item prop="cmd_name" label="指令名称" :label-width="formLabelWidth">
<el-input v-model="addCmdData.cmd_name" autocomplete="off" />
</el-form-item>
<el-form-item label="指令名称" :label-width="formLabelWidth">
<el-input autocomplete="off" />
</el-form-item>
<el-form-item label="指令类型" :label-width="formLabelWidth">
<el-select>
<el-form-item prop="cmd_type" label="指令类型" :label-width="formLabelWidth">
<el-select v-model="addCmdData.cmd_type">
<el-option label="TX" value="TX"></el-option>
<el-option label="RX" value="RX"></el-option>
</el-select>
</el-form-item>
<el-form-item label="协议类型" :label-width="formLabelWidth">
<el-select>
<el-form-item prop="encode" label="协议类型" :label-width="formLabelWidth">
<el-select v-model="addCmdData.encode">
<el-option label="ASCII" value="ASCII"></el-option>
<el-option label="HEX" value="HEX"></el-option>
</el-select>
</el-form-item>
<el-form-item label="定时发送" :label-width="formLabelWidth">
<el-input autocomplete="off" />
<el-form-item prop="timing_cmd_cycle_period" label="定时发送(单位s)" :label-width="formLabelWidth">
<el-input v-model="addCmdData.timing_cmd_cycle_period" autocomplete="off" />
</el-form-item>
<el-form-item label="说明" :label-width="formLabelWidth">
<el-input autocomplete="off" />
<el-form-item prop="cmd_explain" label="说明" :label-width="formLabelWidth">
<el-input v-model="addCmdData.cmd_explain" autocomplete="off" />
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="addCmd = false">取消</el-button>
<el-button type="primary" @click="open">
<el-button @click="addCmdDialog = false">取消</el-button>
<el-button type="primary" @click="addCmd">
确定
</el-button>
</span>
......@@ -87,7 +84,7 @@
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { ref, onMounted, reactive } from 'vue'
import { ElMessage, ElMessageBox } from "element-plus";
import { ProtocolInit } from "@/dao/protocol"
import ProtocolTable from "./ProtocolTable.vue";
......@@ -95,7 +92,7 @@ import type { DeviceProtocolResponse, ProtocolCmdResponse } from './types';
import { useProtocolVersionStore } from '@/stores/allProtocolVersion';
import axios from 'axios';
const addCmd = ref<boolean>(false)
const addCmdDialog = ref<boolean>(false)
const currentVersion = ref('')
type OptionType = {
value: string
......@@ -110,31 +107,6 @@ type propsType = {
protocolCmd: ProtocolCmdResponse
}
const props = defineProps<propsType>()
const open = () => {
ElMessageBox.confirm(
'是否确认增加?',
'Warning',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}
)
.then(() => {
ElMessage({
type: 'success',
message: '增加成功',
})
addCmd.value = false
})
.catch(() => {
ElMessage({
type: 'info',
message: '已取消',
})
})
}
function Init(){
ProtocolInit({protocol_name: props.name})
......@@ -274,6 +246,81 @@ const downloadFile = () => {
console.log("downloadFile");
};
// 删除协议的某个版本
const deleteProtocol = () => {
console.log(currentVersion.value, props.name);
axios.post('/api/protocol_vesrion_manage/delete_protocol_vesrion/',
{
version: currentVersion.value,
protocol_name: props.name,
})
.then(() => {
ElMessage({
type: 'success',
message: '删除成功',
})
options.value = options.value.filter((item) => item.value !== currentVersion.value)
currentVersion.value = options.value[0].value
changeProtocolVersion()
})
.catch((err) => {
console.log(err);
ElMessage.error('删除失败')
})
}
// 新增协议指令
const addCmdData = reactive({
cmd_name: '',
cmd_type: '',
encode: '',
timing_cmd_cycle_period: '',
cmd_explain: '',
})
const addCmd = () => {
ElMessageBox.confirm(
'是否确认增加?',
'Warning',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}
)
.then(() => {
axios.post('/api/protocol_vesrion_manage/add_protocol_cmd/', {
protocol_name: props.name,
cmd_name: addCmdData.cmd_name,
cmd_type: addCmdData.cmd_type,
encode: addCmdData.encode,
timing_cmd_cycle_period: addCmdData.timing_cmd_cycle_period,
cmd_explain: addCmdData.cmd_explain,
version: currentVersion.value,
})
.then(() => {
ElMessage({
type: 'success',
message: '操作成功',
})
changeProtocolVersion()
})
.catch(() => {
ElMessage({
type: 'error',
message: '操作失败',
})
})
addCmdDialog.value = false
})
.catch(() => {
ElMessage({
type: 'info',
message: '已取消',
})
})
}
</script>
<style>
......
......@@ -12,7 +12,7 @@
<el-dialog title="新增协议" v-model="isShow">
<el-form>
<el-form-item label="协议名称" :label-width="formLabelWidth">
<el-input autocomplete="off" />
<el-input v-model="protocolName" autocomplete="off" />
</el-form-item>
</el-form>
<template #footer>
......@@ -48,10 +48,10 @@ onMounted(() => {
})
})
// TODO:添加协议
const protocolName = ref<string>('')
const addProtocol = () => {
isShow.value = false
console.log('addProtocol')
console.log(protocolName.value)
}
</script>
......
......@@ -22,6 +22,9 @@ class AllDevCmdDefineAndVersion(models.Model):
lua_script_out = models.TextField() # Field name made lowercase.
version = models.TextField()
def __hash__(self) -> int:
return super().__hash__()
def __eq__(self, __value: object) -> bool:
if not isinstance(__value, AllDevCmdDefineAndVersion):
return False
......@@ -66,6 +69,9 @@ class AllProtocolDefinAndVersion(models.Model):
cmd_explain = models.TextField() # Field name made lowercase.
version = models.TextField()
def __hash__(self) -> int:
return super().__hash__()
def __eq__(self, __value: object) -> bool:
if not isinstance(__value, AllProtocolDefinAndVersion):
return False
......@@ -87,6 +93,10 @@ class AllProtocolDefinAndVersion(models.Model):
class CurrentDevVersion(models.Model):
protocol_name = models.TextField(primary_key=True) # Field name made lowercase.
version = models.TextField()
def __hash__(self) -> int:
return super().__hash__()
class Meta:
db_table = 'CurrentDevVersion'
......
......@@ -15,6 +15,8 @@ urlpatterns = [
re_path(r'^protocol_version_manage/file_download/(?P<protocol_name>.+)/(?P<version>.+)/$',
views.raw_file_download),
re_path(r'^all_protocol_version/$', views.AllProtocolVersionViewSet.as_view({'get': 'list'})),
re_path(r'^protocol_vesrion_manage/delete_protocol_vesrion/$', views.delete_protocol_vesrion),
re_path(r'^protocol_vesrion_manage/add_protocol_cmd/$', views.add_protocol_cmd),
]
urlpatterns += router.urls
......@@ -197,5 +197,99 @@ def raw_file_download(request, protocol_name, version):
class CurrentDevVersionViewSet(GenericViewSet, ListModelMixin):
"""
获取所有协议当前的版本
"""
queryset = CurrentDevVersion.objects.all()
serializer_class = CurrentDevVersionSerializer
@swagger_auto_schema(methods=['POST'], request_body=openapi.Schema(
type=openapi.TYPE_OBJECT,
properties={
'protocol_name': openapi.Schema(type=openapi.TYPE_STRING),
'version': openapi.Schema(type=openapi.TYPE_STRING),
}
))
@api_view(['POST'])
def delete_protocol_vesrion(request):
"""
删除特定版本的协议
"""
protocol_name = request.data.get('protocol_name')
version = request.data.get('version')
print(version, protocol_name)
if protocol_name is None or version is None:
return Response(status=status.HTTP_400_BAD_REQUEST)
all_cmds = AllProtocolDefinAndVersion.objects.filter(protocol_name=protocol_name).all()
for cmd in all_cmds:
cmd_vesrions = json.loads(cmd.version)
if len(cmd_vesrions) == 1 and version in cmd_vesrions:
# 这个命令是这个版本独有的
cmd.delete()
elif version in cmd_vesrions:
cmd_vesrions.remove(version)
cmd.version = json.dumps(cmd_vesrions)
cmd.save()
else:
# 这个命令不在这个版本中
continue
all_fields = AllDevCmdDefineAndVersion.objects.filter(cmd_name=cmd.cmd_name).all()
for field in all_fields:
field_versions = json.loads(field.version)
if len(field_versions) == 1 and version in field_versions:
# 这个字段是这个版本独有的
field.delete()
elif version in field_versions:
field_versions.remove(version)
field.version = json.dumps(field_versions)
field.save()
else:
# 这个字段不在这个版本中
continue
protocol_vesrions = AllProtocolVersion.objects.filter(protocol_name=protocol_name).first()
protocol_vesrions_l: list = json.loads(protocol_vesrions.version_paths)
vesrions_l: list = [version_paths['version'] for version_paths in protocol_vesrions_l]
if len(vesrions_l) == 1:
# 这个版本是这个协议独有的
protocol_vesrions.delete()
elif version in vesrions_l:
protocol_vesrions_l.pop(vesrions_l.index(version))
protocol_vesrions.version_paths = json.dumps(protocol_vesrions_l)
protocol_vesrions.save()
return Response(status=status.HTTP_200_OK)
@swagger_auto_schema(methods=['POST'], request_body=openapi.Schema(
type=openapi.TYPE_OBJECT,
properties={
'protocol_name': openapi.Schema(type=openapi.TYPE_STRING),
'cmd_name': openapi.Schema(type=openapi.TYPE_STRING),
'cmd_type': openapi.Schema(type=openapi.TYPE_STRING),
'encode': openapi.Schema(type=openapi.TYPE_STRING),
'timing_cmd_cycle_period': openapi.Schema(type=openapi.TYPE_INTEGER),
'cmd_explain': openapi.Schema(type=openapi.TYPE_STRING),
'version': openapi.Schema(type=openapi.TYPE_STRING),
}
))
@api_view(['POST'])
def add_protocol_cmd(request):
data = request.data
if (data.get('protocol_name') is None or
data.get('cmd_name') is None or
data.get('cmd_type') is None or
data.get('encode') is None or
data.get('timing_cmd_cycle_period') is None or
data.get('cmd_explain') is None or
data.get('version') is None):
return Response(status=status.HTTP_400_BAD_REQUEST)
data['version'] = json.dumps([data['version']])
obj = AllProtocolDefinAndVersion.objects.create(**data)
if obj is not None:
return Response(status=status.HTTP_200_OK)
return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)
No preview for this file type
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment