You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

478 lines
14 KiB

7 months ago
<!-- @format -->
<template>
<a-spin :spinning="spinning">
<div class="ns-skeleton">
<ns-page-header class="ns-page-header">
<template #title>
<div class="title" @click="onBack()">
<ns-icon name="left" /> <div class="text">配置</div>
</div>
</template>
</ns-page-header>
<div class="ns-config">
<div v-for="(configGroup, index) in getConfig" :key="index">
<a-descriptions style="height: 46px" :style="{ 'margin-top': index ? '16px' : '0px' }">
<template #title>
<div class="descriptions-title config-name">
<span>{{ configGroup.name }}</span>
<div class="titleFloor"></div>
<ns-button
v-if="paramsValue?.deviceName"
style="float: right"
type="primary"
@click="updateSubmit(paramsValue)"
:disabled="!paramsValue"
>保存</ns-button
>
</div>
</template>
</a-descriptions>
<NsBasicTable
ref="dataRef"
:data-source="configGroup.getBindValues"
:columns="configGroup.columns"
:pagination="false"
:rowKey="configGroup.getBindValues.key">
<template #bodyCell="{ record, column, text }">
<template v-if="column.dataIndex == 'expectedValue'">
<!-- //文本编辑 -->
<div
class="editable-cell"
v-if="configGroup.getBindValues[record.key - 1].childDataType === 'TEXT'">
<!-- 日期组件 -->
<div v-if="configGroup.getBindValues[record.key - 1].sign == 'timeRange'">
<configDate
v-model:timeValue="configGroup.getBindValues[record.key - 1]"
:index="index"
:listKey="record.key"
:text="text"
@changeDate="changeData" />
</div>
<!-- 普通文本 -->
<div v-else>
<configInput
v-model:configValue="configGroup.getBindValues[record.key - 1]"
:index="index"
:listKey="record.key"
@changeInput="changeData" />
</div>
</div>
<!-- 枚举 -->
<div
v-else-if="
configGroup.getBindValues[record.key - 1].childDataType == 'ENUM' ||
configGroup.getBindValues[record.key - 1].list?.[0].dataType == 'ENUM'
">
<configEnum
v-model:configValue="configGroup.getBindValues[record.key - 1]"
:index="index"
:listKey="record.key"
@changeEnum="changeData" />
</div>
<!-- 开关 -->
<div v-else-if="configGroup.getBindValues[record.key - 1].childDataType == 'BOOL'">
<configSwitch
v-model:configValue="configGroup.getBindValues[record.key - 1]"
:index="index"
:listKey="record.key"
@changeSwitch="changeData" />
</div>
<!-- 校验float/int/double -->
<div
v-else-if="
configGroup.getBindValues[record.key - 1].childDataType == 'FLOAT' ||
'INT' ||
'DOUBLE'
">
<configInput
v-model:configValue="configGroup.getBindValues[record.key - 1]"
:index="index"
:listKey="record.key"
@changeInput="changeData" />
</div>
<!-- else -->
<div v-else> </div>
</template>
</template>
</NsBasicTable>
</div>
</div>
</div>
</a-spin>
</template>
<script lang="ts">
import { computed, defineComponent, ref, watch, PropType, UnwrapRef, reactive } from 'vue';
import { http } from '/nerv-lib/util/http';
import { useRouter } from 'vue-router';
import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
import { message } from 'ant-design-vue';
import configDate from './configDate.vue';
import configInput from './configInput.vue';
import configEnum from './configEnum.vue';
import configSwitch from './configSwitch.vue';
import { Handle } from '@antv/x6/lib/addon/common';
export interface DetailItem {
label: string;
name: string;
value?: string;
format?: Function;
type?: string; // 现支持image
}
export interface ConfigGroup {
title: string;
items: Array<DetailItem>;
}
export interface ComponentValueItem {
configValue: object | string;
key: number;
index: number;
}
export default defineComponent({
name: 'NsViewConfig',
props: {
config: {
type: Array as unknown as PropType<ConfigGroup>,
default: () => [],
},
api: {
type: String,
},
updateApi: {
type: String,
},
params: {
type: Object,
},
columns: {
type: Array,
},
},
// eslint-disable-next-line vue/order-in-components
components: {
ExclamationCircleOutlined,
configDate,
configInput,
configEnum,
configSwitch,
},
setup(props) {
const checked = ref<boolean>(true);
const tableData = ref([]);
const router = useRouter();
const dataRef = ref([]);
const spinning = ref(false);
let hasTypeEight = ref();
let paramsValue = ref();
//接收子组件传过来的数据并处理
const changeData = (value: ComponentValueItem) => {
console.log(value);
getConfig.value[value.index].getBindValues[value.key - 1].expectedValue = value.configValue;
if (getConfig.value[value.index].getBindValues[value.key - 1].configItemList) {
hasTypeEight.value = true;
getConfig.value[value.index].getBindValues[value.key - 1].configItemList.value =
value.configValue;
} else {
hasTypeEight.value = false;
getConfig.value[value.index].getBindValues[value.key - 1].itemList.value =
value.configValue;
}
updateConfig(value.index, hasTypeEight.value);
};
function request() {
const { query } = router.currentRoute.value;
http.get(props.api, query).then((res) => {
dataRef.value = res.data;
});
}
request();
//所有类型修改后数据提交
const updateConfig = (index: number, isTrue) => {
///api/objs/Device/ConfigUpdate
console.log(index);
console.log(getConfig.value[index].getBindValues);
let configItemList = [];
let itemList = [];
for (const iterator of getConfig.value[index].getBindValues) {
configItemList.push(iterator.configItemList);
itemList.push(iterator.itemList);
}
let params = {};
if (isTrue) {
params = {
deviceName: props.params.deviceName,
itemStructList: [
{
configItemList: configItemList,
structIdentifier: getConfig.value[index].identifier,
},
],
uuid: props.params.uuid,
};
paramsValue.value = params;
return;
} else {
params = {
deviceName: props.params.deviceName,
itemList: itemList,
uuid: props.params.uuid,
};
}
updateSubmit(params);
// http.post(props.updateApi, params).then((res) => {
// if (res.code == '200') {
// spinning.value = true;
// message.success('操作成功');
// getConfig;
// setTimeout(() => {
// request();
// spinning.value = false;
// }, 3000);
// }
// });
return 1;
};
const updateSubmit = (params) => {
http.post(props.updateApi, params).then((res) => {
if (res.code == '200') {
spinning.value = true;
message.success('操作成功');
getConfig;
setTimeout(() => {
request();
spinning.value = false;
}, 3000);
}
});
};
//处理后端传过来的数据
const getConfig = computed(() => {
if (dataRef.value) {
return dataRef.value.map((item) => {
if (!item.dataSpecsList) {
item.dataSpecsList = item.dataSpecs;
}
let bindValues = JSON.parse(item.dataSpecsList);
if (item.dataType == 4) {
bindValues = [{ list: bindValues, remark: item.remark, childName: item.name }];
}
if (!Array.isArray(bindValues)) {
bindValues = [
{ childSpecsDTO: bindValues, remark: item.remark, childName: item.name },
];
}
let i = 1;
for (const iterator of bindValues) {
if (
iterator.childDataType == 'INT' ||
iterator.childDataType == 'BOOL' ||
iterator.childDataType == 'ENUM'
) {
if (item.dataType == 8) {
iterator.expectedValue = parseInt(iterator.configValue);
} else {
iterator.expectedValue = parseInt(item.expectedValue);
}
} else {
if (item.dataType == 8) {
iterator.expectedValue = iterator.configValue;
} else {
iterator.expectedValue = item.expectedValue;
}
}
if (item.dataType == 8) {
let demo = {
identifier: iterator.identifier,
value: iterator.expectedValue,
};
iterator.configItemList = demo;
} else {
let demoCopy = {
identifier: item.identifier,
value: iterator.expectedValue,
};
iterator.itemList = demoCopy;
}
iterator.key = i + '';
i += 1;
}
return {
// title: group.title,
name: item.name,
identifier: item.identifier,
getBindValues: bindValues,
columns: props.columns,
};
});
}
return [];
});
return {
getConfig,
tableData,
checked,
updateConfig,
changeData,
spinning,
paramsValue,
updateSubmit,
};
},
methods: {
onBack() {
this.$router.go(-1);
},
},
});
</script>
<style lang="less" scoped>
:deep(.ant-skeleton-paragraph) {
display: inline;
// display: flex;
// flex-wrap: wrap;
}
:deep(.ant-skeleton-paragraph li:nth-child(n)) {
float: left;
display: inline;
margin-right: 130px;
margin-top: 16px;
margin-bottom: 4px;
}
:deep(.ant-skeleton-paragraph li:nth-child(3n + 1)) {
clear: both;
display: inline;
}
:deep(.ant-skeleton-content) {
padding: 0px 8px 10px 10px;
}
.ns-detail {
padding: 0px 8px 10px 10px;
}
:deep(.ant-table) {
border: 1px solid #ededed;
border-bottom: none;
}
:deep(.editable-cell-input-wrapper input) {
width: 150px;
}
:deep(.ant-modal-content) {
border: 1px solid #dcdfe2;
box-shadow: none;
}
.config-input {
width: 100px;
}
.config-name {
color: rgba(0, 0, 0, 0.85);
font-weight: bold;
font-size: 16px;
margin: 16px 0;
height: 30px;
}
.config-message {
color: red;
}
.config-message span svg {
color: red;
}
.ns-config {
padding: 16px;
border-top: 16px solid #e5ebf0;
div:first-child {
.config-name {
margin-top: 0px;
}
}
:deep(.ns-basic-table) {
padding-top: 0px;
}
}
// .ns-skeleton .ns-page-header {
// margin-bottom: 0 !important;
// }
.ns-view {
min-height: 100%;
height: 100%;
background: #e5ebf0;
}
:deep(.ant-spin-nested-loading) {
min-height: 100%;
height: 100%;
}
:deep(.ant-spin-container) {
min-height: 100%;
height: 100%;
}
:deep(.ant-divider) {
display: none;
}
.ns-page-header {
margin-bottom: 0 !important;
padding: 7px 16px !important;
width: calc(100% + 32px);
margin-left: -16px;
.title {
cursor: pointer;
font-size: 18px !important;
display: flex;
align-items: center;
.text {
margin-left: 6px;
}
}
}
.config-name {
// span:after {
// content: '';
// width: 75px;
// height: 7px;
// display: block;
// background: linear-gradient(90deg, @primary-color 0%, #fff 82.67%);
// margin-left: 2px;
// margin-top: -7px;
// }
}
.ns-add-form {
border-top: 16px solid #e5ebf0;
padding: 16px 21px;
background: #fff;
height: calc(100% - 47px);
:deep(.ns-form) {
.ns-form-item .ns-form-body .ns-child-form-title {
padding-top: 0;
}
&:after {
display: none;
}
}
}
:deep(.ns-form.ns-vertical-form) {
padding-top: 16px !important;
}
</style>