Commit de0d52c8 by 周田

feat:增加协议版本和修改版本

parent 2d17d729
...@@ -2,7 +2,7 @@ from rest_framework.routers import SimpleRouter ...@@ -2,7 +2,7 @@ from rest_framework.routers import SimpleRouter
from .views import (TableAllDevCmdDefineView, TableDevCmdNamePollView, from .views import (TableAllDevCmdDefineView, TableDevCmdNamePollView,
TableSoftLimitAngleView, TableXproAllDevinfoView, TableSoftLimitAngleView, TableXproAllDevinfoView,
TableAllDevCmdDefineView_1, TableDevCmdNamePollView_1) TableAllDevCmdDefineView_1, TableDevCmdNamePollView_1)
from .views import test, remove_protocol from .views import test, remove_protocol, protocol_add_version
from django.urls import re_path from django.urls import re_path
router = SimpleRouter() router = SimpleRouter()
...@@ -16,6 +16,7 @@ router.register(r'dev_cmd_name_poll_1', TableDevCmdNamePollView_1) ...@@ -16,6 +16,7 @@ router.register(r'dev_cmd_name_poll_1', TableDevCmdNamePollView_1)
urlpatterns = [ urlpatterns = [
re_path(r'^test/$', test), re_path(r'^test/$', test),
re_path(r'^protocol/protocol_add_version/$', protocol_add_version),
re_path(r'^protocol/(?P<protocol_name>.+)/$', remove_protocol), re_path(r'^protocol/(?P<protocol_name>.+)/$', remove_protocol),
] ]
......
...@@ -270,7 +270,7 @@ def test(request): ...@@ -270,7 +270,7 @@ def test(request):
return Response(status=status.HTTP_201_CREATED) return Response(status=status.HTTP_201_CREATED)
@api_view(['delete']) @api_view(['DELETE'])
def remove_protocol(request, protocol_name): def remove_protocol(request, protocol_name):
""" """
删除协议 删除协议
...@@ -290,8 +290,130 @@ def remove_protocol(request, protocol_name): ...@@ -290,8 +290,130 @@ def remove_protocol(request, protocol_name):
cmds = AllProtocolDefinAndVersion.objects.filter(protocol_name=protocol_name).all() cmds = AllProtocolDefinAndVersion.objects.filter(protocol_name=protocol_name).all()
for cmd in cmds: for cmd in cmds:
cmd_name = cmd.cmd_name cmd_name = cmd.cmd_name
TableAllDevCmdDefine.objects.filter(cmd_name=cmd_name).delete() AllDevCmdDefineAndVersion.objects.filter(cmd_name=cmd_name).delete()
cmd.delete() cmd.delete()
return Response(status=status.HTTP_204_NO_CONTENT) return Response(status=status.HTTP_204_NO_CONTENT)
@swagger_auto_schema(method='post', request_body=openapi.Schema(
type=openapi.TYPE_OBJECT,
properties={
'protocol_name': openapi.Schema(type=openapi.TYPE_STRING),
'version_name': openapi.Schema(type=openapi.TYPE_STRING),
'is_extend': openapi.Schema(type=openapi.TYPE_BOOLEAN),
'extend_version_name': openapi.Schema(type=openapi.TYPE_STRING),
}
))
@api_view(['POST'])
def protocol_add_version(request):
"""
协议添加版本
"""
protocol_name = request.data.get('protocol_name')
version_name = request.data.get('version_name')
is_extend = request.data.get('is_extend')
extend_version_name = request.data.get('extend_version_name')
if version_name is None or protocol_name is None:
return Response(status=status.HTTP_400_BAD_REQUEST)
if is_extend:
# 如果是继承版本,则需要判断继承的版本是否存在
if extend_version_name is None:
return Response(status=status.HTTP_400_BAD_REQUEST)
# current_version = CurrentDevVersion.objects.filter(protocol_name=protocol_name).first().version
# if current_version != extend_version_name:
# # 继承的版本和当前的版本不一样,需要将当前版本的指令和字段删除
# cmds = TableDevCmdNamePoll.objects.filter(protocol_name=protocol_name).all()
# for cmd in cmds:
# TableAllDevCmdDefine.objects.filter(cmd_name=cmd.cmd_name).delete()
# cmd.delete()
# # 获取继承版本的字段
# cmds = AllProtocolDefinAndVersion.objects.filter(protocol_name=protocol_name,
# version=extend_version_name).all()
# for cmd in cmds:
# TableDevCmdNamePoll(protocol_name=_cmd.protocol_name,
# cmd_name=_cmd.cmd_name,
# cmd_type=_cmd.cmd_type,
# encode=_cmd.encode,
# timing_cmd_cycle_period=_cmd.timing_cmd_cycle_period,
# cmd_explain=_cmd.cmd_explain).save()
# fields = AllDevCmdDefineAndVersion.objects.filter(cmd_name=cmd.cmd_name,
# version=extend_version_name).all()
# # 新增字段
# for field in fields:
# TableAllDevCmdDefine(cmd_name=_field.cmd_name,
# cmd_type=_field.cmd_type,
# fieldindex=_field.fieldindex,
# fieldname=_field.fieldname,
# fieldsize=_field.fieldsize,
# value=_field.value,
# minvalue=_field.minvalue,
# maxvalue=_field.maxvalue,
# datatype=_field.datatype,
# operation_in=_field.operation_in,
# operation_in_num=_field.operation_in_num,
# operation_out=_field.operation_out,
# operation_out_num=_field.operation_out_num,
# operabo_in=_field.operabo_in,
# operabo_out=_field.operabo_out,
# lua_script_in=_field.lua_script_in,
# lua_script_out=_field.lua_script_out).save()
# 获取继承版本的字段
cmds = AllProtocolDefinAndVersion.objects.filter(protocol_name=protocol_name,
version=extend_version_name).all()
for cmd in cmds:
# 给当前版本的指令和字段创建记录
_cmd = AllProtocolDefinAndVersion(protocol_name=protocol_name,
cmd_name=cmd.cmd_name,
cmd_type=cmd.cmd_type,
encode=cmd.encode,
timing_cmd_cycle_period=cmd.timing_cmd_cycle_period,
cmd_explain=cmd.cmd_explain,
version=version_name)
_cmd.save()
fields = AllDevCmdDefineAndVersion.objects.filter(cmd_name=cmd.cmd_name,
version=extend_version_name).all()
# 新增字段
for field in fields:
_field = AllDevCmdDefineAndVersion(cmd_name=field.cmd_name,
cmd_type=field.cmd_type,
fieldindex=field.fieldindex,
fieldname=field.fieldname,
fieldsize=field.fieldsize,
value=field.value,
minvalue=field.minvalue,
maxvalue=field.maxvalue,
datatype=field.datatype,
operation_in=field.operation_in,
operation_in_num=field.operation_in_num,
operation_out=field.operation_out,
operation_out_num=field.operation_out_num,
operabo_in=field.operabo_in,
operabo_out=field.operabo_out,
lua_script_in=field.lua_script_in,
lua_script_out=field.lua_script_out,
version=version_name)
_field.save()
else:
# 如果不用继承版本,先直接删除两张表上所有的记录
cmds = TableDevCmdNamePoll.objects.filter(protocol_name=protocol_name).all()
for cmd in cmds:
cmd_name = cmd.cmd_name
TableAllDevCmdDefine.objects.filter(cmd_name=cmd_name).delete()
cmd.delete()
# 添加版本
protoocl_version = AllProtocolVersion.objects.filter(protocol_name=protocol_name).first()
version = json.loads(protoocl_version.version_paths)
version.append({"version": version_name})
protoocl_version.version_paths = json.dumps(version)
protoocl_version.save()
return Response(status=status.HTTP_200_OK)
...@@ -28,8 +28,9 @@ ...@@ -28,8 +28,9 @@
<el-button>上传原始文件</el-button> <el-button>上传原始文件</el-button>
</el-upload> </el-upload>
<el-button v-else @click="downloadFile"> 下载原始文件 </el-button> <el-button v-else @click="downloadFile"> 下载原始文件 </el-button>
<el-button @click="newVersionDialog = true">新增版本</el-button>
<el-button @click="addCmdDialog = true">新增指令</el-button> <el-button @click="addCmdDialog = true">新增指令</el-button>
<el-button @click="deleteProtocol">删除该版本协议</el-button> <!-- <el-button @click="deleteProtocol">删除该版本协议</el-button> -->
</div> </div>
</div> </div>
...@@ -41,7 +42,7 @@ ...@@ -41,7 +42,7 @@
<template #title> <template #title>
<div>{{ cmd.cmd_name + ' ' + cmd.cmd_explain + ' ' + cmd.cmd_type }}</div> <div>{{ cmd.cmd_name + ' ' + cmd.cmd_explain + ' ' + cmd.cmd_type }}</div>
<div> <div>
<el-button type="primary" text @click="removeCmd(cmd.id)">删除</el-button> <el-button type="danger" text @click="removeCmd(cmd.id)">删除</el-button>
</div> </div>
</template> </template>
<protocol-table <protocol-table
...@@ -87,6 +88,33 @@ ...@@ -87,6 +88,33 @@
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
<el-dialog v-model="newVersionDialog" :width="500" title="新增协议版本">
<el-form :model="newVersionForm">
<el-form-item prop="versionName" label="版本名称" :label-width="formLabelWidth">
<el-input v-model="newVersionForm.versionName" autocomplete="off" />
</el-form-item>
<el-form-item prop="isExtend" label="是否继承版本" :label-width="formLabelWidth">
<el-switch v-model="newVersionForm.isExtend" />
</el-form-item>
<el-form-item v-show="newVersionForm.isExtend" prop="extendVersionName" label="继承版本名称" :label-width="formLabelWidth">
<el-select v-model="newVersionForm.extendVersionName">
<el-option
v-for="option in options"
:label="option.label"
:value="option.value"
>
</el-option>
</el-select>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="newVersionDialog = false">取消</el-button>
<el-button type="primary" @click="addNewVersion"> 确定 </el-button>
</span>
</template>
</el-dialog>
</div> </div>
</template> </template>
...@@ -98,6 +126,7 @@ import ProtocolTable from "./ProtocolTable.vue"; ...@@ -98,6 +126,7 @@ import ProtocolTable from "./ProtocolTable.vue";
import type { DeviceProtocolResponse, ProtocolCmdResponse } from './types'; import type { DeviceProtocolResponse, ProtocolCmdResponse } from './types';
import { useProtocolVersionStore } from '@/stores/allProtocolVersion'; import { useProtocolVersionStore } from '@/stores/allProtocolVersion';
import axios from 'axios'; import axios from 'axios';
import request from '@/plugins/axios/requests';
const addCmdDialog = ref<boolean>(false) const addCmdDialog = ref<boolean>(false)
const currentVersion = ref('') const currentVersion = ref('')
...@@ -190,6 +219,8 @@ const changeProtocolVersion = () => { ...@@ -190,6 +219,8 @@ const changeProtocolVersion = () => {
protocol_name: props.name, protocol_name: props.name,
}) })
.then((res) => { .then((res) => {
console.log(res);
const { cmds } = res.data const { cmds } = res.data
cmdInfos.value = cmds cmdInfos.value = cmds
// 转成和上面 ProtocolCmdResponse 一样的类型 // 转成和上面 ProtocolCmdResponse 一样的类型
...@@ -337,6 +368,40 @@ const removeCmd = (id: number) => { ...@@ -337,6 +368,40 @@ const removeCmd = (id: number) => {
}) })
} }
// ===================================================
// 新增协议版本
const newVersionDialog = ref<boolean>(false)
const newVersionForm = reactive({
versionName: '',
isExtend: false,
extendVersionName: '',
})
const addNewVersion = () => {
// 继承版本问题
const body = {
protocol_name: props.name,
version_name: newVersionForm.versionName,
is_extend: newVersionForm.isExtend,
extend_version_name: newVersionForm.extendVersionName,
}
console.log(body);
request.post('/api/protocol/protocol_add_version/', body)
.then((res) => {
newVersionDialog.value = false
console.log(res);
ElMessage({
type: 'success',
message: '操作成功',
})
options.value.push({value: newVersionForm.versionName, label: newVersionForm.versionName})
currentVersion.value = newVersionForm.versionName
changeProtocolVersion()
})
}
</script> </script>
<style> <style>
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<template #title> <template #title>
<div> {{ item }} </div> <div> {{ item }} </div>
<div> <div>
<el-button type="primary" text @click="removeProtocol(item)">删除</el-button> <el-button type="danger" text @click="removeProtocol(item)">删除</el-button>
</div> </div>
</template> </template>
<div style="margin: auto; width: 90%"> <div style="margin: auto; width: 90%">
......
...@@ -66,19 +66,17 @@ def update_device_protocol_and_cmds(protocol_name: str, version: str) -> Respons ...@@ -66,19 +66,17 @@ def update_device_protocol_and_cmds(protocol_name: str, version: str) -> Respons
CurrentDevVersion.objects.filter(protocol_name=protocol_name).update(version=version) CurrentDevVersion.objects.filter(protocol_name=protocol_name).update(version=version)
# 更新协议版本信息 # 更新协议版本信息
all_protocol = AllProtocolDefinAndVersion.objects.filter(protocol_name=protocol_name).all() current_version_protocols = AllProtocolDefinAndVersion.objects.filter(protocol_name=protocol_name,
current_version_protocols = [protocol for protocol in all_protocol version=version).all()
if version in json.loads(protocol.version)]
cmd_fields = [] cmd_fields = []
for current_version_protocol in current_version_protocols: for current_version_protocol in current_version_protocols:
cmd_name = current_version_protocol.cmd_name cmd_name = current_version_protocol.cmd_name
cmd_fields.extend([item for item in AllDevCmdDefineAndVersion.objects.filter(cmd_name=cmd_name).all() cmd_fields.extend(AllDevCmdDefineAndVersion.objects.filter(cmd_name=cmd_name, version=version).all())
if version in json.loads(item.version)])
current_version_protocol_serializer = AllProtocolDefinAndVersionSerializer(current_version_protocols, many=True) current_version_protocol_serializer = AllProtocolDefinAndVersionSerializer(current_version_protocols, many=True)
cmd_fields_serializer = AllDevCmdDefineAndVersionSerializer(cmd_fields, many=True) cmd_fields_serializer = AllDevCmdDefineAndVersionSerializer(cmd_fields, many=True)
# 更新 device 所使用的命令表数据 # 要先删除这,因为它使用的是 TableDevCmdNamePoll 的旧数据,更新 device 所使用的字段表数据
try: try:
TableAllDevCmdDefine.objects.filter(cmd_name__in=[cmd.cmd_name TableAllDevCmdDefine.objects.filter(cmd_name__in=[cmd.cmd_name
for cmd in TableDevCmdNamePoll.objects.filter(protocol_name=protocol_name).all()]).delete() for cmd in TableDevCmdNamePoll.objects.filter(protocol_name=protocol_name).all()]).delete()
...@@ -88,7 +86,8 @@ def update_device_protocol_and_cmds(protocol_name: str, version: str) -> Respons ...@@ -88,7 +86,8 @@ def update_device_protocol_and_cmds(protocol_name: str, version: str) -> Respons
except Exception as e: except Exception as e:
print(e) print(e)
return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR) return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)
# 更新 device 所使用的协议表数据
# 更新 device 所使用的指令表数据
try: try:
TableDevCmdNamePoll.objects.filter(protocol_name=protocol_name).delete() TableDevCmdNamePoll.objects.filter(protocol_name=protocol_name).delete()
TableDevCmdNamePoll.objects.bulk_create([TableDevCmdNamePoll( TableDevCmdNamePoll.objects.bulk_create([TableDevCmdNamePoll(
...@@ -98,10 +97,14 @@ def update_device_protocol_and_cmds(protocol_name: str, version: str) -> Respons ...@@ -98,10 +97,14 @@ def update_device_protocol_and_cmds(protocol_name: str, version: str) -> Respons
print(e) print(e)
return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR) return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)
# 返回数据 # 返回数据,需要返回生成之后的数据,特别是 id,因此需要重新请求一次
cmds = [] cmds = []
for protocol in current_version_protocol_serializer.data: new_cmds = TableDevCmdNamePoll.objects.filter(protocol_name=protocol_name).all()
protocol['fields'] = sorted([item for item in cmd_fields_serializer.data new_cmds_serializer = TableDevCmdNamePollSerializer(new_cmds, many=True)
new_cmd_fields = TableAllDevCmdDefine.objects.filter(cmd_name__in=[cmd.cmd_name for cmd in new_cmds]).all()
new_cmd_fields_serializer = TableAllDevCmdDefineSerializer(new_cmd_fields, many=True)
for protocol in new_cmds_serializer.data:
protocol['fields'] = sorted([item for item in new_cmd_fields_serializer.data
if item['cmd_name'] == protocol['cmd_name']], if item['cmd_name'] == protocol['cmd_name']],
key=lambda item: item['fieldindex']) key=lambda item: item['fieldindex'])
cmds.append(protocol) cmds.append(protocol)
......
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