更新导出协议

This commit is contained in:
2022-07-29 18:01:37 +08:00
parent 1db6d56719
commit 7be750398e
6 changed files with 664 additions and 0 deletions

View File

@@ -351,4 +351,27 @@ public class DeviceController {
return new ResponseEntity<>(HttpStatus.CREATED);
}
@GetMapping({"/queryDBInfoByDriverCode/{driverCode}"})
@Log("根据驱动编码获取db信息")
@ApiOperation("根据驱动编码获取db信息")
public ResponseEntity<Object> queryDBInfoByDriverCode(@PathVariable String driverCode) {
return new ResponseEntity(deviceService.queryDBInfoByDriverCode(driverCode), HttpStatus.OK);
}
@Log("导出设备db")
@ApiOperation("导出设备")
@PostMapping(value = "/downloadProtocolConfig")
//@PreAuthorize("@el.check('device:list')")
public void downloadProtocolConfig(HttpServletResponse response, @RequestBody JSONObject whereJson) throws IOException {
deviceService.downloadProtocolConfig(whereJson, response);
}
@GetMapping("/getAllDriverCodeList")
@Log("协议配置下拉选设备驱动")
@ApiOperation("协议配置下拉选设备驱动")
//@PreAuthorize("@el.check('routePlan:list')")
public ResponseEntity<Object> getAllDriverCodeList() {
return new ResponseEntity<>(DriverTypeEnum.getList(), HttpStatus.OK);
}
}

View File

@@ -269,4 +269,20 @@ public interface DeviceService {
List<Device> findCacheDevice();
void updateBarcode(JSONObject json) throws Exception;
/**
* 根据驱动编码获取db信息
*
* @param driver_code
*/
JSONObject queryDBInfoByDriverCode(String driver_code);
/**
* 导出数据
*
* @param whereJson 待导出的数据
* @param response /
* @throws IOException /
*/
void downloadProtocolConfig(JSONObject whereJson, HttpServletResponse response) throws IOException;
}

View File

@@ -13,6 +13,7 @@ import com.alibaba.fastjson.JSONObject;
import io.swagger.models.auth.In;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.map.ListOrderedMap;
import org.nl.acs.config.server.AcsConfigService;
import org.nl.acs.device.device_driver.standard_inspect.ItemDto;
import org.nl.acs.device.device_driver.standard_inspect.ReadUtil;
@@ -1591,4 +1592,226 @@ public class DeviceServiceImpl implements DeviceService, ApplicationAutoInitial
}
@Override
public JSONObject queryDBInfoByDriverCode(String driver_code) {
//处理设备扩展属性
JSONObject result = new JSONObject();
//根据设备驱动定义获取OPC读写数据
DeviceDriverDefination deviceDriverDefination = deviceDriverDefinationAppService.getDeviceDriverDefination(driver_code);
if (deviceDriverDefination instanceof OpcDeviceDriverDefination) {
OpcDeviceDriverDefination opcDeviceDriverDefination = (OpcDeviceDriverDefination) deviceDriverDefination;
//处理DB读和写属性
result.put("rs", opcDeviceDriverDefination.getReadableItemDtos());
result.put("ws", opcDeviceDriverDefination.getWriteableItemDtos());
}
return result;
}
@Override
public void downloadProtocolConfig(JSONObject param, HttpServletResponse response) throws IOException {
JSONObject form = param.getJSONObject("form");
String type = form.getString("type");
Integer device_code = Integer.parseInt(form.getString("device_code"));
int db_interval = Integer.parseInt(form.getString("db_interval"));
JSONArray rss = param.getJSONArray("rs");
JSONArray wss = param.getJSONArray("ws");
int numberSize = Integer.parseInt(form.getString("device_number"));
List<Map<String,Object>> list = new LinkedList<>();
if (type.equals("db")){
for (int i = 0; i < numberSize; i++) {
int dbInterval = db_interval * i;
Integer deviceCode = device_code + i;
for (int j = 0; j <= rss.size(); j++) {
Map<String,Object> map = new ListOrderedMap<>();
if (j == rss.size()){
map.put("设备编码","");
map.put("读取地址","");
map.put("读取意义","");
map.put("","");
map.put("写入地址","");
map.put("写入意义","");
list.add(map);
continue;
}
if (i == 0 && j ==0){
map.put("设备编码","");
}else {
map.put("设备编码",deviceCode);
}
JSONObject rs = rss.getJSONObject(j);
String db = rs.getString("db");
String name = rs.getString("name");
if (i > 0){
if (name.equals("心跳")){
continue;
}
}
String[] dbs = db.split("\\.");
String startDB = dbs[0];
String endDB = dbs[1];
String endDBFirst = endDB.substring(0, 1);
Integer endDBEnd =Integer.parseInt(endDB.substring(1, endDB.length())) ;
endDBEnd = endDBEnd + dbInterval;
db = startDB + "." + endDBFirst + endDBEnd;
map.put("读取地址",db);
map.put("读取意义",name);
Map<String, Object> value = getValue(wss, j, dbInterval,i);
map.putAll(value);
list.add(map);
System.out.println(map);
}
}
}else if (type.equals("v")){
for (int i = 0; i < numberSize; i++) {
int dbInterval = db_interval * i;
Integer deviceCode = device_code + i;
for (int j = 0; j <= rss.size(); j++) {
Map<String,Object> map = new ListOrderedMap<>();
if (j == rss.size()){
map.put("设备编码","");
map.put("读取地址","");
map.put("读取意义","");
map.put("","");
map.put("写入地址","");
map.put("写入意义","");
list.add(map);
continue;
}
if (i == 0 && j ==0){
map.put("设备编码","");
}else {
map.put("设备编码",deviceCode);
}
JSONObject rs = rss.getJSONObject(j);
String db = rs.getString("db");
String name = rs.getString("name");
if (i > 0){
if (name.equals("心跳")){
continue;
}
}
//String[] dbs = db.split("\\.");
String startDB = db.substring(0,2);
String endDB = db.substring(2,db.length());
Integer endDBEnd =Integer.parseInt(endDB) ;
endDBEnd = endDBEnd + dbInterval;
db = startDB + endDBEnd + "";
map.put("读取地址",db);
map.put("读取意义",name);
Map<String, Object> value = getValue1(wss, j, dbInterval,i);
map.putAll(value);
list.add(map);
System.out.println(map);
}
}
}
response.setContentType("application/octet-stream");
FileUtil.downloadExcel(list, response);
}
public Map<String,Object> getValue(JSONArray wss, int j, Integer dbInterval, int i){
int size = wss.size();
Map<String,Object> map = new ListOrderedMap<>();
if (i == 0 && j == 0){
map.put("","");
map.put("写入地址","");
map.put("写入意义","");
return map;
}
if (i == 0 && j > 0){
if (j - 1 < size){
JSONObject ws = wss.getJSONObject(j - 1);
String db = ws.getString("db");
String name = ws.getString("name");
String[] dbs = db.split("\\.");
String startDB = dbs[0];
String endDB = dbs[1];
String endDBFirst = endDB.substring(0, 1);
Integer endDBEnd =Integer.parseInt(endDB.substring(1, endDB.length())) ;
endDBEnd = endDBEnd + dbInterval;
db = startDB + "." + endDBFirst + endDBEnd;
map.put("","");
map.put("写入地址",db);
map.put("写入意义",name);
return map;
}
}
if ( i > 0){
j = j -1;
}
if (j < size){
JSONObject ws = wss.getJSONObject(j);
String db = ws.getString("db");
String name = ws.getString("name");
String[] dbs = db.split("\\.");
String startDB = dbs[0];
String endDB = dbs[1];
String endDBFirst = endDB.substring(0, 1);
Integer endDBEnd =Integer.parseInt(endDB.substring(1, endDB.length())) ;
endDBEnd = endDBEnd + dbInterval;
db = startDB + "." + endDBFirst + endDBEnd;
map.put("","");
map.put("写入地址",db);
map.put("写入意义",name);
return map;
} else {
map.put("","");
map.put("写入地址","");
map.put("写入意义","");
return map;
}
}
public Map<String,Object> getValue1(JSONArray wss, int j, Integer dbInterval, int i){
int size = wss.size();
Map<String,Object> map = new ListOrderedMap<>();
if (i == 0 && j == 0){
map.put("","");
map.put("写入地址","");
map.put("写入意义","");
return map;
}
if (i == 0 && j > 0){
if (j - 1 < size){
JSONObject ws = wss.getJSONObject(j - 1);
String db = ws.getString("db");
String name = ws.getString("name");
//String[] dbs = db.split("\\.");
String startDB = db.substring(0, 2);
String endDB = db.substring(2,db.length());
Integer endDBEnd =Integer.parseInt(endDB) ;
endDBEnd = endDBEnd + dbInterval;
db = startDB + endDBEnd + "";
map.put("","");
map.put("写入地址",db);
map.put("写入意义",name);
return map;
}
}
if ( i > 0){
j = j -1;
}
if (j < size){
JSONObject ws = wss.getJSONObject(j);
String db = ws.getString("db");
String name = ws.getString("name");
String startDB = db.substring(0, 2);
String endDB = db.substring(2,db.length());
Integer endDBEnd =Integer.parseInt(endDB) ;
endDBEnd = endDBEnd + dbInterval;
db = startDB + endDBEnd + "";
map.put("","");
map.put("写入地址",db);
map.put("写入意义",name);
return map;
} else {
map.put("","");
map.put("写入地址","");
map.put("写入意义","");
return map;
}
}
}

View File

@@ -64,3 +64,26 @@ export function testwrite(dbItems, opc_id) {
})
}
export function queryDBInfoByDriverCode(driverCode) {
return request({
url: 'api/device/queryDBInfoByDriverCode/' + driverCode,
method: 'get'
})
}
export function downloadProtocolConfig(data) {
return request({
url: 'api/device/downloadProtocolConfig',
method: 'post',
data,
responseType: 'blob'
})
}
export function getAllDriverCodeList() {
return request({
url: 'api/device/getAllDriverCodeList',
method: 'get'
})
}

View File

@@ -0,0 +1,237 @@
<template>
<!--标准版-输送机-控制点-->
<div>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span class="role-span">设备协议</span>
</div>
</el-card>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span class="role-span">PLC读取协议</span>
</div>
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="78px">
<el-table
v-loading="false"
:data="data1"
:max-height="550"
size="small"
style="width: 100%;margin-bottom: 15px"
>
<el-table-column prop="name" label="意义" />
<el-table-column prop="db" label="地址">
<template slot-scope="scope">
<el-input
v-model="data1[scope.$index].db"
size="mini"
class="edit-input"
@input="finishReadEdit(data1[scope.$index])"
/>
</template>
</el-table-column>
</el-table>
</el-form>
</el-card>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span class="role-span">PLC写入协议</span>
</div>
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="78px">
<el-table
v-loading="false"
:data="data2"
:max-height="550"
size="small"
style="width: 100%;margin-bottom: 15px"
>
<el-table-column prop="name" label="意义" />
<el-table-column prop="db" label="地址">
<template slot-scope="scope">
<el-input
v-model="data2[scope.$index].db"
size="mini"
class="edit-input"
@input="finishWriteEdit(data2[scope.$index])"
/>
</template>
</el-table-column>
</el-table>
</el-form>
</el-card>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span class="role-span" />
<el-button
:loading="false"
icon="el-icon-download"
size="mini"
style="float: right; padding: 6px 9px"
type="primary"
@click="doSubmit"
>导出协议
</el-button>
</div>
</el-card>
</div>
</template>
<script>
import {
downloadProtocolConfig,
queryDBInfoByDriverCode
} from '@/api/acs/device/driverConfig'
import crud from '@/mixins/crud'
import { downloadFile } from '@/utils'
export default {
name: 'StandardConveyorControl',
mixins: [crud],
props: {
parentForm: {
type: Object,
require: true
}
},
data() {
return {
device_code: '',
device_id: '',
plc_id: '',
plc_code: '',
address: '',
opc_id: '',
opc_code: '',
configLoading: false,
dataOpcservers: [],
dataOpcPlcs: [],
deviceList: [],
data1: [],
data2: [],
rules: {}
}
},
created() {
this.$nextTick(() => {
queryDBInfoByDriverCode(this.$props.parentForm.driver_code).then(data => {
console.log(data)
this.data1 = data.rs
this.data2 = data.ws
this.sliceItem()
})
})
},
methods: {
finishReadEdit(data) {
// 编辑的是code列,并且值包含mode
if (data.code.indexOf('mode') !== -1) {
const dbValue = data.db
// .之前的字符串
const beforeStr = dbValue.match(/(\S*)\./)[1]
// .之后的字符串
const afterStr = dbValue.match(/\.(\S*)/)[1]
// 取最后数字
const endNumber = afterStr.substring(1)
// 最后为非数字
if (isNaN(parseInt(endNumber))) {
return
}
for (const val in this.data1) {
if (this.data1[val].code.indexOf('move') !== -1) {
this.data1[val].db = beforeStr + '.' + afterStr.substring(0, 1) + (parseInt(endNumber) + 1)
}
if (this.data1[val].code.indexOf('action') !== -1) {
this.data1[val].db = beforeStr + '.' + afterStr.substring(0, 1) + (parseInt(endNumber) + 2)
}
if (this.data1[val].code.indexOf('ioaction') !== -1) {
this.data1[val].db = beforeStr + '.' + afterStr.substring(0, 1) + (parseInt(endNumber) + 3)
}
if (this.data1[val].code.indexOf('height') !== -1) {
this.data1[val].db = beforeStr + '.' + afterStr.substring(0, 1) + (parseInt(endNumber) + 4)
}
if (this.data1[val].code.indexOf('error') !== -1) {
this.data1[val].db = beforeStr + '.' + afterStr.substring(0, 1) + (parseInt(endNumber) + 5)
}
if (this.data1[val].code.indexOf('direction') !== -1) {
this.data1[val].db = beforeStr + '.' + afterStr.substring(0, 1) + (parseInt(endNumber) + 6)
}
if (this.data1[val].code.indexOf('operation_type') !== -1) {
this.data1[val].db = beforeStr + '.' + afterStr.substring(0, 1) + (parseInt(endNumber) + 7)
}
if (this.data1[val].code.indexOf('task') !== -1) {
this.data1[val].db = beforeStr + '.' + 'D' + (parseInt(endNumber) + 21)
}
}
}
},
finishWriteEdit(data) {
// 编辑的是code列,并且值包含mode
if (data.code.indexOf('to_command') !== -1) {
const dbValue = data.db
// .之前的字符串
const beforeStr = dbValue.match(/(\S*)\./)[1]
// .之后的字符串
const afterStr = dbValue.match(/\.(\S*)/)[1]
// 取最后数字
const endNumber = afterStr.substring(1)
// 最后为非数字
if (isNaN(parseInt(endNumber))) {
return
}
for (const val in this.data2) {
if (this.data2[val].code.indexOf('to_target') !== -1) {
this.data2[val].db = beforeStr + '.' + afterStr.substring(0, 1) + (parseInt(endNumber) + 2)
}
if (this.data2[val].code.indexOf('to_task') !== -1) {
this.data2[val].db = beforeStr + '.' + 'D' + (parseInt(endNumber) + 6)
}
}
}
},
doSubmit() {
const param = {
'form': this.parentForm,
'rs': this.data1,
'ws': this.data2
}
this.$refs['form'].validate((valid) => {
if (valid) {
downloadProtocolConfig(param).then(res => {
downloadFile(res, '', 'xlsx')
})
}
})
},
sliceItem() { // 拼接DB的Item值
this.data1.forEach(item => {
const str = item.code
// 是否包含.
if (str.search('.') !== -1) {
// 截取最后一位
item.code = this.opc_code + '.' + this.plc_code + '.' + this.device_code + '.' + str.slice(str.lastIndexOf('.') + 1)
} else {
item.code = this.opc_code + '.' + this.plc_code + '.' + this.device_code + '.' + item.code
}
})
this.data2.forEach(item => {
const str = item.code
// 是否包含.
if (str.search('.') !== -1) {
// 截取最后一位
item.code = this.opc_code + '.' + this.plc_code + '.' + this.device_code + '.' + str.slice(str.lastIndexOf('.') + 1)
} else {
item.code = this.opc_code + '.' + this.plc_code + '.' + this.device_code + '.' + item.code
}
})
}
}
}
</script>
<style scoped>
</style>

View File

@@ -0,0 +1,142 @@
<template>
<div class="app-container">
<el-row :gutter="15">
<el-col>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span class="role-span">基本信息</span>
</div>
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="78px">
<el-row>
<el-col :span="8">
<el-form-item label="起始设备" prop="device_code">
<el-input v-model="form.device_code" />
<span style="color: #C0C0C0;margin-left: 10px;" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="数量" prop="device_number">
<el-input v-model="form.device_number" />
<span style="color: #C0C0C0;margin-left: 10px;" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="间隔" prop="db_interval">
<el-input v-model="form.db_interval" />
<span style="color: #C0C0C0;margin-left: 10px;" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="DB类型" prop="type">
<el-select
v-model="form.type"
placeholder=""
filterable
>
<el-option value="db" label="DB" />
<el-option value="v" label="V" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="设备驱动" prop="driver_code">
<el-select
v-model="form.driver_code"
placeholder=""
filterable
@change="changeDriver"
>
<el-option
v-for="item in deviceDriverList"
:key="item.code"
:label="item.name"
:value="item.code"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
</el-col>
<!-- 组件-->
<component :is="currentComponent" v-if="componentDio" :parent-form="form" />
</el-row>
</div>
</template>
<script>
import crud from '@/mixins/crud'
import { getAllDriverCodeList } from '@/api/acs/device/driverConfig'
import { getDicts } from '@/api/system/dict'
import config from './config'
export default {
name: 'ProtocolConfig',
components: { config },
dicts: ['device_type'],
mixins: [crud],
data() {
return {
componentDio: false,
currentComponent: '',
activeName: 'first',
tableHeight: 550,
columnLoading: false,
configLoading: false,
dicts: [],
syncLoading: false,
genLoading: false,
form: { device_code: '', device_number: '', db_interval: '', driver_code: '', type: '' },
deviceDriverList: [],
rules: {
driver_code: [
{ required: true, message: '设备驱动不能为空', trigger: 'blur' }
]
}
}
},
created() {
this.tableHeight = document.documentElement.clientHeight - 385
this.device_code = this.$route.params.device_code
this.$nextTick(() => {
getAllDriverCodeList().then(data => {
this.deviceDriverList = data
})
getDicts().then(data => {
this.dicts = data
})
})
},
methods: {
changeDriver() {
this.componentDio = false
this.$nextTick(() => {
this.reloadCom()
})
},
reloadCom() {
this.componentDio = true
this.currentComponent = 'config'
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss">
.edit-input {
.el-input__inner {
border: 1px solid #e5e6e7;
}
}
</style>
<style scoped>
::v-deep .input-with-select .el-input-group__prepend {
background-color: #fff;
}
</style>