Merge branch 'main' of https://git.jsspisoft.com/ry-das
This commit is contained in:
commit
9b6cc13e00
@ -93,6 +93,10 @@ public class SysIotModelController {
|
||||
/** 获取物模型属性列表 */
|
||||
@PostMapping("/attribute/list")
|
||||
public PageDataInfo<SysIotModelFieldVo> querySysIotModelField(@RequestBody SysIotModelFieldDto sysIotModelFieldDto) {
|
||||
boolean hasPermission = StpUtil.hasPermission(SysAuthorityIds.SYS_AUTHORITY_ID_VIEW_CONFIDENTIAL_DATA.toString());
|
||||
if (!hasPermission){
|
||||
sysIotModelFieldDto.setConfidential(0);
|
||||
}
|
||||
if (sysIotModelFieldDto.getPageNum() == null && sysIotModelFieldDto.getPageSize() == null){
|
||||
List<SysIotModelFieldVo> sysIotModelFieldVos = sysIotModelService.queryAllModelField(sysIotModelFieldDto);
|
||||
return PageDataInfo.build(sysIotModelFieldVos,sysIotModelFieldVos.size());
|
||||
|
@ -19,7 +19,7 @@ public interface FaultRecorderService {
|
||||
|
||||
void download(String path, HttpServletResponse httpServletResponse) throws IOException;
|
||||
|
||||
Map<String, List<Object>> getDataCurve(String url, String deviceCode) throws IOException;
|
||||
Map<String, List<Object>> getDataCurve(String url, String deviceCode);
|
||||
|
||||
void updateFdrConfig(SysEquipment sysEquipment);
|
||||
|
||||
|
@ -168,30 +168,31 @@ public class FaultRecorderServiceImpl implements FaultRecorderService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, List<Object>> getDataCurve(String url, String deviceCode) throws IOException {
|
||||
public Map<String, List<Object>> getDataCurve(String url, String deviceCode) {
|
||||
Map<String, List<Object>> resultMap = null;
|
||||
try (InputStream fileStream = minioViewsServcie.getFileStream(url)) {
|
||||
//根据device Code查询故障录波格式
|
||||
QueryWrapper<SysEquipment> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.eq("CODE", deviceCode);
|
||||
SysEquipment sysEquipment = sysEquipmentMapper.selectOne(queryWrapper);
|
||||
if (sysEquipment == null) {
|
||||
throw new ServiceException("设备不存在,请选择正确设备");
|
||||
}
|
||||
//根据device Code查询故障录波格式
|
||||
QueryWrapper<SysEquipment> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.eq("CODE", deviceCode);
|
||||
SysEquipment sysEquipment = sysEquipmentMapper.selectOne(queryWrapper);
|
||||
if (sysEquipment == null) {
|
||||
throw new ServiceException("设备不存在,请选择正确设备");
|
||||
}
|
||||
|
||||
if (StringUtils.isBlank(sysEquipment.getOptions())){
|
||||
throw new ServiceException("请添加设备文件解析配置");
|
||||
}
|
||||
FileParseConfig fileParseConfig = JSON.parseObject(sysEquipment.getOptions(), FileParseConfig.class);
|
||||
FdrFormatVo fdrFormatVo = fileParseConfig.getFdrFormat();
|
||||
if (fdrFormatVo == null){
|
||||
throw new ServiceException("请添加故障录波配置");
|
||||
}
|
||||
if (StringUtils.isBlank(sysEquipment.getOptions())){
|
||||
throw new ServiceException("请添加设备文件解析配置");
|
||||
}
|
||||
FileParseConfig fileParseConfig = JSON.parseObject(sysEquipment.getOptions(), FileParseConfig.class);
|
||||
FdrFormatVo fdrFormatVo = fileParseConfig.getFdrFormat();
|
||||
if (fdrFormatVo == null){
|
||||
throw new ServiceException("请添加故障录波配置");
|
||||
}
|
||||
try (InputStream fileStream = minioViewsServcie.getFileStream(url)) {
|
||||
// 解析文件内容
|
||||
resultMap = parseFile(fileStream, fdrFormatVo.getTimeFormat(), fdrFormatVo.getDelimiter(), fdrFormatVo.getValidStartLine());
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
throw new ServiceException("配置解析异常");
|
||||
}
|
||||
return resultMap;
|
||||
}
|
||||
|
@ -14,7 +14,7 @@ public interface PlcLogService {
|
||||
|
||||
List<FileNode> getDirOrFileList(String fileType, String name, String startTime, String endTime);
|
||||
|
||||
Map<String, List<Object>> getDataCurve(String url, String deviceCode) throws IOException;
|
||||
Map<String, List<Object>> getDataCurve(String url, String deviceCode);
|
||||
|
||||
void updatePlcConfig(SysEquipment sysEquipment);
|
||||
|
||||
|
@ -63,30 +63,31 @@ public class PlcLogsServiceImpl implements PlcLogService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, List<Object>> getDataCurve(String url, String deviceCode) throws IOException {
|
||||
public Map<String, List<Object>> getDataCurve(String url, String deviceCode){
|
||||
Map<String, List<Object>> resultMap = null;
|
||||
try (InputStream fileStream = minioViewsServcie.getFileStream(url)) {
|
||||
//根据device Code查询故障录波格式
|
||||
QueryWrapper<SysEquipment> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.eq("CODE", deviceCode);
|
||||
SysEquipment sysEquipment = sysEquipmentMapper.selectOne(queryWrapper);
|
||||
if (sysEquipment == null) {
|
||||
throw new ServiceException("设备不存在,请选择正确设备");
|
||||
}
|
||||
//根据device Code查询故障录波格式
|
||||
QueryWrapper<SysEquipment> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.eq("CODE", deviceCode);
|
||||
SysEquipment sysEquipment = sysEquipmentMapper.selectOne(queryWrapper);
|
||||
if (sysEquipment == null) {
|
||||
throw new ServiceException("设备不存在,请选择正确设备");
|
||||
}
|
||||
|
||||
if (StringUtils.isBlank(sysEquipment.getOptions())){
|
||||
throw new ServiceException("请添加设备文件解析配置");
|
||||
}
|
||||
FileParseConfig fileParseConfig = JSON.parseObject(sysEquipment.getOptions(), FileParseConfig.class);
|
||||
FdrFormatVo fdrFormatVo = fileParseConfig.getPlcFormat();
|
||||
if (fdrFormatVo == null){
|
||||
throw new ServiceException("请添加plclog配置");
|
||||
}
|
||||
if (StringUtils.isBlank(sysEquipment.getOptions())){
|
||||
throw new ServiceException("请添加设备文件解析配置");
|
||||
}
|
||||
FileParseConfig fileParseConfig = JSON.parseObject(sysEquipment.getOptions(), FileParseConfig.class);
|
||||
FdrFormatVo fdrFormatVo = fileParseConfig.getPlcFormat();
|
||||
if (fdrFormatVo == null){
|
||||
throw new ServiceException("请添加plclog配置");
|
||||
}
|
||||
try (InputStream fileStream = minioViewsServcie.getFileStream(url)) {
|
||||
// 解析文件内容
|
||||
resultMap = parseFile(fileStream, fdrFormatVo.getTimeFormat(), fdrFormatVo.getDelimiter(), fdrFormatVo.getValidStartLine());
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
throw new ServiceException("配置解析异常");
|
||||
}
|
||||
return resultMap;
|
||||
}
|
||||
|
@ -31,6 +31,9 @@
|
||||
<if test="info.subSystem != null and info.subSystem != ''">
|
||||
and t.subsystem = #{info.subSystem}
|
||||
</if>
|
||||
<if test="info.subSystem != null and info.subSystem != ''">
|
||||
and t.confidential = #{info.confidential}
|
||||
</if>
|
||||
</where>
|
||||
<if test="info.orderColumn != null and info.orderType != ''">
|
||||
order by ${info.orderColumn} ${info.orderType}
|
||||
|
@ -178,4 +178,11 @@ export function queryfaultCodeDict(params: object = {}) {
|
||||
{
|
||||
showErrorMessage: false
|
||||
})
|
||||
}
|
||||
|
||||
export function getAllSubSystemReq() {
|
||||
return createAxios({
|
||||
url: '/api/equipment/model/attribute/getAllSubsystem',
|
||||
method: 'post'
|
||||
})
|
||||
}
|
BIN
ui/dasadmin/src/assets/SystemParam/style01.png
Normal file
BIN
ui/dasadmin/src/assets/SystemParam/style01.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 8.6 KiB |
BIN
ui/dasadmin/src/assets/SystemParam/style02.png
Normal file
BIN
ui/dasadmin/src/assets/SystemParam/style02.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 7.3 KiB |
BIN
ui/dasadmin/src/assets/SystemParam/style03.png
Normal file
BIN
ui/dasadmin/src/assets/SystemParam/style03.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 12 KiB |
@ -12,9 +12,10 @@ export const useAdminInfo = defineStore('adminInfo', {
|
||||
last_login_time: '',
|
||||
token: '',
|
||||
refresh_token: '',
|
||||
authorities: [],
|
||||
// 是否是superAdmin,用于判定是否显示终端按钮等,不做任何权限判断
|
||||
super: false,
|
||||
orgid:0
|
||||
orgid: 0,
|
||||
}
|
||||
},
|
||||
actions: {
|
||||
|
@ -51,6 +51,7 @@ export interface AdminInfo {
|
||||
username: string
|
||||
nickname: string
|
||||
avatar: string
|
||||
authorities: Number[]
|
||||
last_login_time: string
|
||||
token: string
|
||||
refresh_token: string
|
||||
|
298
ui/dasadmin/src/views/backend/SystemParam/index.vue
Normal file
298
ui/dasadmin/src/views/backend/SystemParam/index.vue
Normal file
@ -0,0 +1,298 @@
|
||||
<template>
|
||||
<div class="SystemParam">
|
||||
<el-container class="mainContainer">
|
||||
<div class="mainHeader">
|
||||
<el-text class="mx-1 title">风机矩阵设置</el-text>
|
||||
</div>
|
||||
<el-main class="defaultMain">
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<div class="tablePart">
|
||||
<el-table :data="paramData" style="width: 100%">
|
||||
<el-table-column prop="paramNmae" label="参数名称" />
|
||||
<el-table-column prop="namedes" label="中文" />
|
||||
<!-- <el-table-column prop="paramValue" label="参数值" />-->
|
||||
<el-table-column label="操作" width="100">
|
||||
<template #default="scope">
|
||||
<span style="color: #0064aa; cursor: pointer"
|
||||
v-if="scope.row.paramNmae=='ParamColor'"
|
||||
@click="Editcolor(scope)"
|
||||
>编辑</span>
|
||||
<span style="color: #0064aa; cursor: pointer"
|
||||
v-else
|
||||
@click="EditLayout(scope)"
|
||||
>编辑</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-main>
|
||||
</el-container>
|
||||
<el-dialog v-model="visibleColor" title="状态颜色" width="1000" :before-close="handleClose" class="ColorPart">
|
||||
<div class="tablePart">
|
||||
<el-table :data="tableData" style="width: 100%">
|
||||
<el-table-column prop="porder" label="状态" />
|
||||
<el-table-column prop="attributeCode" label="颜色">
|
||||
<template #default="scope">
|
||||
<div class="color-box" :style="{ backgroundColor: scope.row.attributeCode }"></div>
|
||||
<!-- <el-color-picker v-model="scope.row.attributeCode" show-alpha></el-color-picker>-->
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="100">
|
||||
<template #default="scope">
|
||||
<span style="color: #0064aa; cursor: pointer" @click="selectColor(scope)">选择颜色</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button type="primary" @click="onSubmitType">保存</el-button>
|
||||
<el-button @click="visibleColor = false">取消</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<el-dialog v-model="visibleselectColor" title="颜色选择" width="500" :before-close="handleCloselayout" class="selectColorPart">
|
||||
<div class="layoutmain">
|
||||
<el-row :gutter="10">
|
||||
<el-col :span="4">
|
||||
<div class="demo-color-box" style="background: rgb(2, 119, 179);">
|
||||
<div class="value" text="xs">#0277B3</div>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<div class="demo-color-box" style="background: rgb(255, 126, 0)">
|
||||
<div class="value" text="xs">#FF7E00</div>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<div class="demo-color-box" style="background: rgb(6, 180, 41)">
|
||||
<div class="value" text="xs">#FE3731</div>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<div class="demo-color-box" style="background: rgb(0, 160, 150);">
|
||||
<div class="value" text="xs">#00A096</div>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<div class="demo-color-box" style="background: rgb(153, 153, 153);">
|
||||
<div class="value" text="xs">#999999</div>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<div class="demo-color-box" style="background: rgb(48, 89, 236);">
|
||||
<div class="value" text="xs">#67C23A</div>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<div class="demo-color-box" style="background: rgb(254, 55, 49);">
|
||||
<div class="value" text="xs">#67C23A</div>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<div class="demo-color-box" style="background: rgb(48, 89, 236);">
|
||||
<div class="value" text="xs">#67C23A</div>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<div class="demo-color-box" style="background: rgb(48, 89, 236);">
|
||||
<div class="value" text="xs">#67C23A</div>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</div>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button type="primary" @click="onSubmitType">确定</el-button>
|
||||
<el-button @click="visibleselectColor = false">取消</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<el-dialog v-model="visibleLayout" title="选择布局" width="765" :before-close="handleCloselayout" class="LayoutPart">
|
||||
<div class="layoutmain">
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="8">
|
||||
<div class="demo-color-box">
|
||||
<div class="style01 selected"><img src="~assets/SystemParam/style01.png" alt="" /></div>
|
||||
<div>风格1</div>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<div class="demo-color-box">
|
||||
<div class="style01"><img src="~assets/SystemParam/style02.png" alt="" /></div>
|
||||
<div>风格2</div>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<div class="demo-color-box">
|
||||
<div class="style01"><img src="~assets/SystemParam/style03.png" alt="" /></div>
|
||||
<div>风格3</div>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</div>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button type="primary" @click="onSubmitType">保存</el-button>
|
||||
<el-button @click="visibleLayout = false">取消</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref} from 'vue'
|
||||
const paramData=ref([
|
||||
{paramNmae:'ParamColor',namedes:'颜色',paramValue:'0.5'},
|
||||
{paramNmae:'ParamLayout',namedes:'布局',paramValue:'0.5'}
|
||||
])
|
||||
const tableData = ref([
|
||||
{ porder: '并网', attributeCode: 'rgb(2, 119, 179)' },
|
||||
{ porder: '待机', attributeCode: 'rgb(255, 126, 0)' },
|
||||
{ porder: '启动', attributeCode: 'rgb(6, 180, 41)' },
|
||||
{ porder: '维护', attributeCode: 'rgb(0, 160, 150)' },
|
||||
{ porder: '离线', attributeCode: 'rgb(153, 153, 153)' },
|
||||
{ porder: '限功率运行', attributeCode: 'rgb(48, 89, 236)' },
|
||||
{ porder: '正常停机', attributeCode: 'rgb(254, 55, 49)' },
|
||||
{ porder: '通讯中断', attributeCode: 'rgb(153, 153, 153)' },
|
||||
{ porder: '停机', attributeCode: 'rgb(153, 153, 153)' },
|
||||
{ porder: '解缆状态', attributeCode: 'rgb(48, 89, 236)' },
|
||||
{ porder: '电网故障停机', attributeCode: 'rgb(254, 55, 49)' },
|
||||
{ porder: '安全链停机', attributeCode: 'rgb(254, 55, 49)' },
|
||||
])
|
||||
|
||||
const selectLayout=ref([
|
||||
{value:'0',label:'风格1'},
|
||||
{value:'1',label:'风格2'},
|
||||
{value:'2',label:'风格3'},
|
||||
])
|
||||
const visibleColor=ref(false)
|
||||
const Editcolor = (data: any) => {
|
||||
debugger
|
||||
visibleColor.value=true
|
||||
}
|
||||
const handleClose = () => {
|
||||
debugger
|
||||
visibleColor.value=false
|
||||
}
|
||||
const visibleLayout=ref(false)
|
||||
const EditLayout = (data: any) => {
|
||||
debugger
|
||||
visibleLayout.value=true
|
||||
}
|
||||
const handleCloselayout = () => {
|
||||
debugger
|
||||
visibleLayout.value=false
|
||||
}
|
||||
const visibleselectColor=ref(false)
|
||||
const selectColor = () => {
|
||||
visibleselectColor.value=true
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
$headerHeight: 60px;
|
||||
.SystemParam{
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
.mainContainer {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
width: 100%;
|
||||
padding: 20px;
|
||||
.mainHeader {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
height: $headerHeight;
|
||||
.title {
|
||||
border-left: 4px solid rgb(77, 147, 196);
|
||||
border-bottom: 4px solid transparent;
|
||||
border-right: 4px solid transparent;
|
||||
border-top: 4px solid transparent;
|
||||
padding: 4px;
|
||||
}
|
||||
}
|
||||
.defaultMain{
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
.ColorPart{
|
||||
.header{
|
||||
padding: 10px 0;
|
||||
}
|
||||
.color-box{
|
||||
width: 100px;
|
||||
height: 20px;
|
||||
}
|
||||
}
|
||||
.selectColorPart{
|
||||
.demo-color-box{
|
||||
div{
|
||||
width: 100%;
|
||||
height: 30px;
|
||||
line-height: 30px;
|
||||
margin-top: 10px;
|
||||
text-align: center;
|
||||
color: #FFFFFF;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
}
|
||||
.LayoutPart{
|
||||
.demo-color-box{
|
||||
text-align: center;
|
||||
.style01.selected:before {
|
||||
opacity: 1;
|
||||
}
|
||||
.style01.selected img {
|
||||
box-shadow: 0 0 0 4px #00c09e;
|
||||
animation: selected 0.3s cubic-bezier(0.250, 0.100, 0.250, 1.000);
|
||||
-o-animation:selected 0.3s cubic-bezier(0.250, 0.100, 0.250, 1.000);
|
||||
-ms-animation:selected 0.3s cubic-bezier(0.250, 0.100, 0.250, 1.000);
|
||||
-moz-animation:selected 0.3s cubic-bezier(0.250, 0.100, 0.250, 1.000);
|
||||
-webkit-animation:selected 0.3s cubic-bezier(0.250, 0.100, 0.250, 1.000);
|
||||
}
|
||||
.style01.selected:before {
|
||||
content: "2714";
|
||||
display: block;
|
||||
position: absolute;
|
||||
margin: auto;
|
||||
top: 0; left: 0; bottom: 0; right: 0;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
line-height: 40px;
|
||||
background: #00c09e;
|
||||
border-radius: 50px;
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
font-size: 16px;
|
||||
z-index: 10;
|
||||
opacity: 0;
|
||||
transition: 0.3s linear;
|
||||
-o-transition: 0.3s linear;
|
||||
-ms-transition: 0.3s linear;
|
||||
-moz-transition: 0.3s linear;
|
||||
-webkit-transition: 0.3s linear;
|
||||
-o-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-webkit-user-select: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes selected {
|
||||
0% { border-color: #fff; }
|
||||
50% { transform: scale(0.5); opacity: 0.8; box-shadow: 0 0 0 4px #00c09e; }
|
||||
80%,100% { width: 100%; height: 100%; box-shadow: 0 0 0 4px #00c09e; }
|
||||
}
|
||||
</style>
|
@ -277,6 +277,9 @@
|
||||
<el-form-item :label="ModelAttributeFieldsEnums['visible']" prop="visible">
|
||||
<el-checkbox v-model="attributeForm.visible"></el-checkbox>
|
||||
</el-form-item>
|
||||
<el-form-item :label="ModelAttributeFieldsEnums['confidential']" prop="confidential">
|
||||
<el-checkbox v-model="attributeForm.confidential"></el-checkbox>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button type="primary" @click="submitAttributeForm">保存</el-button>
|
||||
@ -692,6 +695,7 @@ const getAttributeList = ({
|
||||
: item.attributeType!,
|
||||
highSpeed: item.highSpeed === 1,
|
||||
visible: item.visible === 1,
|
||||
confidential: item.confidential === 1,
|
||||
}
|
||||
})
|
||||
pageTotal.value = res.total
|
||||
@ -807,6 +811,7 @@ const originAttributeForm: AddModelAttributeType & UpdateModelAttributeType = {
|
||||
unit: '',
|
||||
stateDesc: '',
|
||||
level: undefined,
|
||||
confidential: false,
|
||||
revision: 1,
|
||||
createdBy: undefined,
|
||||
createdTime: undefined,
|
||||
@ -835,6 +840,7 @@ const submitAttributeForm = () => {
|
||||
const copyFormData = JSON.parse(JSON.stringify(attributeForm.value))
|
||||
copyFormData.highSpeed = copyFormData.highSpeed ? 1 : 0
|
||||
copyFormData.visible = copyFormData.visible ? 1 : 0
|
||||
copyFormData.confidential = copyFormData.confidential ? 1 : 0
|
||||
if (copyFormData.stateDesc0 || copyFormData.stateDesc1) {
|
||||
copyFormData.stateDesc = (copyFormData?.stateDesc0 ?? '') + '|' + (copyFormData?.stateDesc1 ?? '')
|
||||
}
|
||||
|
@ -73,7 +73,8 @@ export enum ModelAttributeFieldsEnums {
|
||||
'createdTime' = '创建时间',
|
||||
'updatedBy' = '更新人',
|
||||
'updatedTime' = '更新时间',
|
||||
'stateDesc' = '状态描述'
|
||||
'stateDesc' = '状态描述',
|
||||
'confidential'='敏感数据'
|
||||
}
|
||||
|
||||
export enum ModelServiceFieldsEnums {
|
||||
@ -115,6 +116,7 @@ export type AddModelAttributeType = {
|
||||
unit: string
|
||||
level?: 0 | 1 | 2
|
||||
visible: 0 | 1 | boolean
|
||||
confidential:0 | 1 | boolean
|
||||
stateDesc:string
|
||||
stateDesc0?:string
|
||||
stateDesc1?:string
|
||||
|
@ -192,7 +192,7 @@
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<el-dialog v-model="realDataLineChartVisible" title="实时曲线" @close="closeLineChart" width="1000">
|
||||
<el-dialog v-model="realDataLineChartVisible" title="实时曲线" @close="closeLineChart" width="1200">
|
||||
<RealDataChart
|
||||
ref="realDataChartRef"
|
||||
:visible="realDataLineChartVisible"
|
||||
@ -432,28 +432,28 @@ const dynamicColumn: TableColumnType[] = [
|
||||
width: 100,
|
||||
},
|
||||
{
|
||||
label: '有功功率 (KW)',
|
||||
label: '有功功率 (kW)',
|
||||
prop: 'igenpower',
|
||||
align: 'center',
|
||||
custom: 'header',
|
||||
width: 100,
|
||||
},
|
||||
{
|
||||
label: '有功给定 (KW)',
|
||||
label: '有功给定 (kW)',
|
||||
prop: 'iactivepowersetpointvalue',
|
||||
align: 'center',
|
||||
custom: 'header',
|
||||
width: 100,
|
||||
},
|
||||
{
|
||||
label: '无功功率 (KVar)',
|
||||
label: '无功功率 (kVar)',
|
||||
prop: 'ireactivepower',
|
||||
align: 'center',
|
||||
custom: 'header',
|
||||
width: 100,
|
||||
},
|
||||
{
|
||||
label: '无功给定 (KVar)',
|
||||
label: '无功给定 (kVar)',
|
||||
prop: 'ireactivepowersetpointvalue',
|
||||
align: 'center',
|
||||
custom: 'header',
|
||||
|
@ -13,7 +13,7 @@
|
||||
</div>
|
||||
<div class="leftMain">
|
||||
<el-scrollbar>
|
||||
<el-checkbox-group v-model="selectList" @change="changeCheck">
|
||||
<el-checkbox-group v-model="selectList" @change="changeCheck" :max="selectPointNum">
|
||||
<el-checkbox
|
||||
v-for="item in realDataList"
|
||||
:key="item.prop"
|
||||
@ -146,8 +146,10 @@ const getRealData = () => {
|
||||
})
|
||||
return []
|
||||
}
|
||||
const selectPointNum = ref(10)
|
||||
let realDataXAxis: any = []
|
||||
let realDataSeries: any = []
|
||||
let realDataYAxis: any = []
|
||||
const getRandomDarkColor = () => {
|
||||
let r = Math.floor(Math.random() * 200) // 限制在0到127之间,以生成较深的颜色
|
||||
let g = Math.floor(Math.random() * 200)
|
||||
@ -171,8 +173,9 @@ const createChartData = (data: { [k: string]: number }, time: string) => {
|
||||
let clearState = null
|
||||
lastSeriesId.forEach((item: any) => {
|
||||
if (!attrCode.includes(item)) {
|
||||
const cur = realDataSeries.find((val: any) => val.id === item)
|
||||
delete cur.id
|
||||
const cur = realDataSeries.findIndex((val: any) => val.id === item)
|
||||
// delete cur.id
|
||||
realDataSeries.splice(cur, 1)
|
||||
clearState = true
|
||||
}
|
||||
})
|
||||
@ -201,7 +204,7 @@ const createChartData = (data: { [k: string]: number }, time: string) => {
|
||||
fillData.push(curVal)
|
||||
return {
|
||||
id: item,
|
||||
name: info.name + info.unit,
|
||||
name: info.name +' '+ (info?.unit ?? ''),
|
||||
type: 'line',
|
||||
barWidth: 20,
|
||||
itemStyle: {
|
||||
@ -221,19 +224,82 @@ const createChart = () => {
|
||||
const chart = chartInstance ?? echarts.init(chartRef.value)
|
||||
let option = null
|
||||
if (chartInstance && realDataXAxis.length > 1) {
|
||||
const nameMap: any = {}
|
||||
realDataSeries.forEach((item: any) => {
|
||||
const yAxisName = item.name.split(' ')[1]
|
||||
if (nameMap[yAxisName] || nameMap[yAxisName]===0) {
|
||||
item.yAxisIndex = nameMap[yAxisName]
|
||||
} else {
|
||||
const len = Object.keys(nameMap).length
|
||||
item.yAxisIndex = len
|
||||
nameMap[yAxisName] = len
|
||||
}
|
||||
})
|
||||
|
||||
const nameMapKeys = Object.keys(nameMap)
|
||||
if (realDataSeries.length >= 4 && nameMapKeys.length === 4) {
|
||||
selectPointNum.value = realDataSeries.length
|
||||
}
|
||||
const yAxisData = nameMapKeys.map((item, index) => {
|
||||
const offset = Math.floor(index / 2) * 50
|
||||
const position = index % 2 == 0 ? 'left' : 'right'
|
||||
const yAxisName = item
|
||||
const cacheYAxis = realDataYAxis.find((item: any) => item.name === yAxisName)
|
||||
if (cacheYAxis) {
|
||||
return {
|
||||
...cacheYAxis,
|
||||
offset,
|
||||
position,
|
||||
}
|
||||
} else {
|
||||
return {
|
||||
type: 'value',
|
||||
name: item,
|
||||
nameTextStyle: {
|
||||
color: '#4E5969',
|
||||
},
|
||||
axisLine: {
|
||||
show: false,
|
||||
onZero: false,
|
||||
lineStyle: {
|
||||
color: '#dadada',
|
||||
width: 0,
|
||||
type: 'solid',
|
||||
},
|
||||
},
|
||||
axisLabel: {
|
||||
//x轴文字的配置
|
||||
show: true,
|
||||
color: '#4E5969',
|
||||
},
|
||||
axisTick: { show: false },
|
||||
splitLine: {
|
||||
interval: 50,
|
||||
lineStyle: {
|
||||
type: 'dashed',
|
||||
color: '#dadada',
|
||||
},
|
||||
},
|
||||
offset,
|
||||
position,
|
||||
}
|
||||
}
|
||||
})
|
||||
realDataYAxis = yAxisData
|
||||
option = {
|
||||
xAxis: {
|
||||
data: realDataXAxis,
|
||||
},
|
||||
yAxis: realDataYAxis,
|
||||
series: realDataSeries,
|
||||
}
|
||||
} else {
|
||||
option = {
|
||||
grid: {
|
||||
top: 50,
|
||||
right: 23,
|
||||
right: 60,
|
||||
bottom: 50,
|
||||
left: 18,
|
||||
left: 60,
|
||||
containLabel: true,
|
||||
},
|
||||
tooltip: {
|
||||
@ -280,6 +346,7 @@ const createChart = () => {
|
||||
},
|
||||
axisLine: {
|
||||
show: false,
|
||||
onZero: false,
|
||||
lineStyle: {
|
||||
color: '#dadada',
|
||||
width: 0,
|
||||
@ -321,7 +388,7 @@ const createChart = () => {
|
||||
series: realDataSeries,
|
||||
}
|
||||
}
|
||||
chart.setOption(option, { replaceMerge: 'series' })
|
||||
chart.setOption(option, { replaceMerge: ['series', 'yAxis'] })
|
||||
chartInstance = chart
|
||||
}
|
||||
|
||||
@ -338,6 +405,19 @@ const selectPointAttr = computed(() => {
|
||||
const addPoint = () => {
|
||||
selectPointVisible.value = true
|
||||
}
|
||||
const checkShowChart = (data: any) => {
|
||||
console.log(realDataSeries)
|
||||
|
||||
const curCode = data.map((item: any) => item.prop)
|
||||
console.log(curCode, 'curCode')
|
||||
for (let i = selectList.value.length - 1; i >= 0; i--) {
|
||||
if (!curCode.includes(selectList.value[i])) {
|
||||
selectList.value.splice(i, 1)
|
||||
realDataSeries.splice(i, 1)
|
||||
changeCheck()
|
||||
}
|
||||
}
|
||||
}
|
||||
const saveSelectPoint = () => {
|
||||
const data = selectPointRef.value?.getSelectList()
|
||||
if (data) {
|
||||
@ -348,9 +428,10 @@ const saveSelectPoint = () => {
|
||||
unit: item.unit,
|
||||
}
|
||||
})
|
||||
checkShowChart(selectList)
|
||||
realDataList.value = selectList
|
||||
selectPointVisible.value = false
|
||||
ElMessage.success('添加成功')
|
||||
ElMessage.success('修改成功')
|
||||
}
|
||||
}
|
||||
let timer: any = null
|
||||
@ -364,6 +445,7 @@ const clearTimer = () => {
|
||||
timer = null
|
||||
realDataSeries = []
|
||||
realDataXAxis = []
|
||||
realDataYAxis = []
|
||||
pauseState.value = false
|
||||
emits('clearChart')
|
||||
}
|
||||
|
@ -4,12 +4,23 @@
|
||||
<el-col :span="14">
|
||||
<div class="transferLeft">
|
||||
<div class="transferHeader">
|
||||
<span class="transferTitle">可添加的测点</span>
|
||||
<div class="searchPart">
|
||||
<el-radio-group v-model="searchType" class="radio">
|
||||
<el-radio value="attributeName">名称</el-radio>
|
||||
<el-radio value="attributeCode">编码</el-radio>
|
||||
</el-radio-group>
|
||||
</div>
|
||||
<el-input clearable class="searchInput" placeholder="请输入测点信息" v-model="searchInfo" @change="search"></el-input>
|
||||
<!-- <el-button type="primary" @click="search">查询</el-button> -->
|
||||
<el-select v-model="subSystemVal" placeholder="请选择子系统" @change="search">
|
||||
<el-option v-for="item in subSystemList" :key="item.value" :value="item.value" :label="item.label"></el-option>
|
||||
</el-select>
|
||||
<!-- <span class="transferTitle">可添加的测点</span>
|
||||
<el-radio-group v-model="radioActiveName" @change="typeChange">
|
||||
<el-radio :value="138">模拟量</el-radio>
|
||||
<el-radio :value="199">计算量</el-radio>
|
||||
<el-radio :value="140">状态量</el-radio>
|
||||
</el-radio-group>
|
||||
</el-radio-group> -->
|
||||
</div>
|
||||
<el-main class="mainPart">
|
||||
<el-table
|
||||
@ -42,7 +53,7 @@
|
||||
</el-col>
|
||||
<el-col :span="10">
|
||||
<div class="transferRight">
|
||||
<div class="transferHeader">
|
||||
<div class="transferHeader transferHeaderRight">
|
||||
<span class="transferTitle"
|
||||
>已选择<span>{{ Statistic }}</span
|
||||
>项</span
|
||||
@ -70,7 +81,7 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, computed, watch, nextTick, onMounted } from 'vue'
|
||||
import { getModelAttributeListReq } from '/@/api/backend/deviceModel/request'
|
||||
import { getModelAttributeListReq, getAllSubSystemReq } from '/@/api/backend/deviceModel/request'
|
||||
import { ElMessage, TableInstance } from 'element-plus'
|
||||
import { Top, Bottom, Close } from '@element-plus/icons-vue'
|
||||
|
||||
@ -85,9 +96,30 @@ const props = withDefaults(
|
||||
}
|
||||
)
|
||||
|
||||
const radioActiveName = ref<138 | 139 | 140 | 199>(138)
|
||||
const typeChange = () => {
|
||||
getTableData()
|
||||
const searchType = ref('attributeName')
|
||||
|
||||
const searchInfo = ref('')
|
||||
|
||||
// const radioActiveName = ref<138 | 139 | 140 | 199>(138)
|
||||
const search = () => {
|
||||
getTableData({ pageNum: 1 })
|
||||
}
|
||||
|
||||
const subSystemVal = ref('')
|
||||
const subSystemList = ref()
|
||||
|
||||
const getAllSubSystem = () => {
|
||||
getAllSubSystemReq().then((res) => {
|
||||
const data = res.data
|
||||
.filter((item: any) => item)
|
||||
.map((item:any) => {
|
||||
return {
|
||||
label: item,
|
||||
value: item,
|
||||
}
|
||||
})
|
||||
subSystemList.value = [...data, { label: '全部', value: ' ' }]
|
||||
})
|
||||
}
|
||||
|
||||
const attributeTableData = ref<{ attributeName: string; attributeCode: string }[]>([])
|
||||
@ -95,7 +127,7 @@ const selectTable = (section: any) => {
|
||||
const defaultCode = props.defaultAttr.map((item: any) => item.attributeCode)
|
||||
const addSection = section
|
||||
.filter((item: any) => !defaultCode.includes(item.attributeCode.toLowerCase()))
|
||||
.map((item:any) => {
|
||||
.map((item: any) => {
|
||||
return {
|
||||
attributeName: item.attributeName,
|
||||
attributeCode: item.attributeCode.toLowerCase(),
|
||||
@ -108,7 +140,7 @@ const selectAllTable = (section: any) => {
|
||||
const defaultCode = props.defaultAttr.map((item: any) => item.attributeCode)
|
||||
const addSection = section
|
||||
.filter((item: any) => !defaultCode.includes(item.attributeCode.toLowerCase()))
|
||||
.map((item:any) => {
|
||||
.map((item: any) => {
|
||||
return {
|
||||
attributeName: item.attributeName,
|
||||
attributeCode: item.attributeCode.toLowerCase(),
|
||||
@ -158,12 +190,18 @@ const moveRemove = (index: number, item: any) => {
|
||||
})
|
||||
}
|
||||
|
||||
const getTableData = () => {
|
||||
const getTableData = (customData = {}) => {
|
||||
const inputVal: any = {}
|
||||
inputVal[searchType.value] = searchInfo.value
|
||||
|
||||
getModelAttributeListReq({
|
||||
iotModelId: '',
|
||||
attributeType: radioActiveName.value,
|
||||
// attributeType: radioActiveName.value,
|
||||
pageNum: pageSetting.current,
|
||||
pageSize: pageSetting.pageSize,
|
||||
subSystem: (!subSystemVal.value || subSystemVal.value === ' ') ? null : subSystemVal.value,
|
||||
...inputVal,
|
||||
...customData,
|
||||
})
|
||||
.then((res) => {
|
||||
if (res.code === 200) {
|
||||
@ -207,6 +245,7 @@ defineExpose({
|
||||
|
||||
onMounted(() => {
|
||||
getTableData()
|
||||
getAllSubSystem()
|
||||
})
|
||||
</script>
|
||||
|
||||
@ -217,13 +256,35 @@ onMounted(() => {
|
||||
.transferHeader {
|
||||
height: 40px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
// justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 0 10px;
|
||||
color: #333333;
|
||||
background: #f7f9fc;
|
||||
border-bottom: 1px solid #e1edf6;
|
||||
border-radius: 6px 6px 0 0;
|
||||
.searchPart {
|
||||
.radio {
|
||||
width: 110px;
|
||||
.el-radio {
|
||||
margin-right: 5px;
|
||||
width: 50px;
|
||||
}
|
||||
}
|
||||
}
|
||||
.searchInput {
|
||||
width: 200px;
|
||||
margin: 0 20px;
|
||||
}
|
||||
.el-select {
|
||||
width: 200px;
|
||||
}
|
||||
:deep(.el-input__wrapper) {
|
||||
width: 200px;
|
||||
}
|
||||
}
|
||||
.transferHeaderRight {
|
||||
justify-content: space-between;
|
||||
}
|
||||
.transferLeft {
|
||||
width: 550px;
|
||||
|
@ -23,7 +23,7 @@
|
||||
<el-tag v-if="item.attributeMap.processedoperationmode === 10" class="tag-panel is-maintenance" type="primary"
|
||||
>维护</el-tag>
|
||||
<el-tag v-if="item.attributeMap.processedoperationmode === 0" class="tag-panel is-offline" type="primary">离线</el-tag>
|
||||
<el-tag v-if="item.attributeMap.processedoperationmode === 8" class="tag-panel info" type="primary">限功率运行</el-tag>
|
||||
<el-tag v-if="item.attributeMap.processedoperationmode === 8" class="tag-panel is-info" type="primary">限功率运行</el-tag>
|
||||
<el-tag v-if="item.attributeMap.processedoperationmode === 6" class="tag-panel is-danger" type="primary">正常停机</el-tag>
|
||||
<el-tag v-if="item.attributeMap.processedoperationmode === 1" class="tag-panel is-danger" type="primary"
|
||||
>外部因素导致停机</el-tag>
|
||||
@ -114,7 +114,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import {defineProps, defineEmits, onMounted, onUnmounted, ref} from 'vue'
|
||||
import {defineProps, ref} from 'vue'
|
||||
import { useRouter } from 'vue-router'
|
||||
import { adminBaseRoutePath } from '/@/router/static/adminBase'
|
||||
import ContextMenu from '/@/views/backend/auth/model/contextMenu.vue'
|
||||
|
@ -225,6 +225,7 @@ const onSubmit = () => {
|
||||
username: res.data.sysUser.account,
|
||||
nickname: res.data.sysUser.userName,
|
||||
orgid: res.data.sysUser.orgId,
|
||||
authorities: res.data.sysUser.authorities,
|
||||
avatar: res.data.sysUser.headImage,
|
||||
last_login_time: '',
|
||||
token: res.data.token,
|
||||
|
@ -130,8 +130,8 @@ export const excelDefaultConfig: any = {
|
||||
code: 'limit2Low'
|
||||
},
|
||||
{
|
||||
label:'强制归档',
|
||||
code:'forceArchive',
|
||||
label: '强制归档',
|
||||
code: 'forceArchive',
|
||||
}
|
||||
],
|
||||
R0C4: ['03', '04'],
|
||||
@ -247,8 +247,8 @@ export const excelDefaultConfig: any = {
|
||||
code: 'col3',
|
||||
},
|
||||
{
|
||||
label:'强制归档',
|
||||
code:'forceArchive',
|
||||
label: '强制归档',
|
||||
code: 'forceArchive',
|
||||
}
|
||||
],
|
||||
R0C4: ['03', '04'],
|
||||
@ -280,8 +280,8 @@ export const excelDefaultConfig: any = {
|
||||
code: 'col3',
|
||||
},
|
||||
{
|
||||
label:'强制归档',
|
||||
code:'forceArchive',
|
||||
label: '强制归档',
|
||||
code: 'forceArchive',
|
||||
}
|
||||
],
|
||||
R0C4: ['01', '02', '03', '04'],
|
||||
@ -358,8 +358,8 @@ export const excelDefaultConfig: any = {
|
||||
code: 'limit2Low'
|
||||
},
|
||||
{
|
||||
label:'强制归档',
|
||||
code:'forceArchive',
|
||||
label: '强制归档',
|
||||
code: 'forceArchive',
|
||||
}
|
||||
],
|
||||
R0C4: [
|
||||
@ -374,7 +374,7 @@ export const excelDefaultConfig: any = {
|
||||
"8. 16位BCD数据",
|
||||
"9. 8位归一化值"
|
||||
], // 数据类型的提示
|
||||
R0C7:[
|
||||
R0C7: [
|
||||
"0. 不启用",
|
||||
"1. 启用"
|
||||
]
|
||||
@ -420,8 +420,8 @@ export const excelDefaultConfig: any = {
|
||||
name: '累计量',
|
||||
head: [
|
||||
{
|
||||
label:'强制归档',
|
||||
code:'forceArchive',
|
||||
label: '强制归档',
|
||||
code: 'forceArchive',
|
||||
}
|
||||
],
|
||||
},
|
||||
@ -442,8 +442,8 @@ export const excelDefaultConfig: any = {
|
||||
code: 'registerAddr',
|
||||
},
|
||||
{
|
||||
label:'强制归档',
|
||||
code:'forceArchive',
|
||||
label: '强制归档',
|
||||
code: 'forceArchive',
|
||||
}
|
||||
],
|
||||
R0C4: [
|
||||
@ -684,7 +684,7 @@ export const createUpLoadExcelData = (workbookData: any) => {
|
||||
sheetData.protocol = sheets[item].cellData[key][fieldKey].custom.protocol
|
||||
continue
|
||||
}
|
||||
if (fieldKey === '1') {
|
||||
if (['1','2','3'].includes(fieldKey)) {
|
||||
sheetData[sheetkeyMap[fieldKey]] = sheets[item].cellData[key][fieldKey]?.v ?? ''
|
||||
continue
|
||||
}
|
||||
@ -692,8 +692,6 @@ export const createUpLoadExcelData = (workbookData: any) => {
|
||||
}
|
||||
sheetData.params = JSON.stringify(params)
|
||||
data.push(sheetData)
|
||||
console.log(data);
|
||||
|
||||
}
|
||||
})
|
||||
})
|
||||
|
@ -8,7 +8,7 @@
|
||||
<el-option v-for="v in statAnalysisSelectOptions.deviceId" :key="v.value" :label="v.label" :value="v.value"></el-option>
|
||||
</el-select>
|
||||
</div>
|
||||
<div class="selectPart">
|
||||
<div v-if="hasAuthority" class="selectPart">
|
||||
<span>风速来源</span>
|
||||
<el-select v-model="statAnalysisSpeedSource" placeholder="请选择风速来源" class="statAnalysisSelect">
|
||||
<el-option v-for="v in statAnalysisSelectOptions.speedSource" :key="v.value" :label="v.label" :value="v.value"></el-option>
|
||||
@ -79,8 +79,14 @@ const AvgWindSpeedSwitch = ref(false)
|
||||
const chartType = ref('scatter') // 默认散点图
|
||||
const statAnalysisFatory = ref('')
|
||||
const statAnalysisFatoryList: any = ref([])
|
||||
const hasAuthority = ref(false)
|
||||
const statAnalysisSpeedSource = ref('AvgWindSpeed_10min')
|
||||
const statAnalysisDeviceId = ref('')
|
||||
|
||||
import { useAdminInfo } from '/@/stores/adminInfo'
|
||||
const adminInfo = useAdminInfo()
|
||||
|
||||
hasAuthority.value = Object.values(adminInfo.authorities).includes(105)
|
||||
const statAnalysisSelectOptions: any = reactive({
|
||||
speedSource: [
|
||||
{ label: '原始风速', value: 'AvgWindSpeed_10min' },
|
||||
@ -100,13 +106,13 @@ const updateChart = () => {
|
||||
const series = {
|
||||
type: chartType.value,
|
||||
data: chartType.value === 'scatter' ? seriesDataInit.value : calculateData.value,
|
||||
name: '实际值',
|
||||
name: '实际功率',
|
||||
symbolSize: 5,
|
||||
symbol: 'circle',
|
||||
}
|
||||
option.series[0] = series
|
||||
if (!option.legend.data.includes('实际值')) {
|
||||
option.legend.data.push('实际值')
|
||||
if (!option.legend.data.includes('实际功率')) {
|
||||
option.legend.data.push('实际功率')
|
||||
}
|
||||
chart.value.setOption(option)
|
||||
}
|
||||
@ -348,7 +354,7 @@ const statAnalysisOperate = () => {
|
||||
const iGenPower = resData0['AvgActivePower_10min']['values']
|
||||
const iWindSpeed = resData0[statAnalysisSpeedSource.value]['values']
|
||||
if (!iWindSpeed.length) {
|
||||
ElMessage.info(`实时值数据为空`)
|
||||
ElMessage.info(`实际功率数据为空`)
|
||||
} else {
|
||||
const seriesData = iGenPower.map((item: any, index: number) => {
|
||||
return [getCutDecimalsValue(iWindSpeed[index], 2), getCutDecimalsValue(item, 2)]
|
||||
@ -368,15 +374,14 @@ const statAnalysisOperate = () => {
|
||||
const series = {
|
||||
type: 'line',
|
||||
data: seriesData,
|
||||
name: '理论值',
|
||||
name: '理论功率',
|
||||
smooth: true,
|
||||
symbolSize: 0.1,
|
||||
symbol: 'circle',
|
||||
}
|
||||
option.series.push(series)
|
||||
option.legend.data.push('理论值')
|
||||
option.legend.data.push('理论功率')
|
||||
}
|
||||
console.log('🚀 ~ .then ~ option.legend.data:', option.legend.data)
|
||||
chart.value.setOption(option)
|
||||
})
|
||||
.catch((error) => {
|
||||
|
@ -727,7 +727,7 @@ $paginationHeight: 32px;
|
||||
.theoreticalpowerCurve {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: #f2f3f5;
|
||||
// background: transparent;
|
||||
.mainContainer {
|
||||
display: flex;
|
||||
|
Loading…
Reference in New Issue
Block a user