|
@@ -0,0 +1,426 @@
|
|
|
|
+<script setup lang="ts">
|
|
|
|
+import { onMounted, ref, useTemplateRef } from 'vue';
|
|
|
|
+import { debounce } from 'lodash-es';
|
|
|
|
+
|
|
|
|
+import { useDictData } from '@/hooks/dict-data';
|
|
|
|
+import { useRequest } from '@/hooks/request';
|
|
|
|
+import { getProtocolParamList } from '@/api';
|
|
|
|
+import { DictCode } from '@/constants';
|
|
|
|
+
|
|
|
|
+import CustomParams from './CustomParams.vue';
|
|
|
|
+
|
|
|
|
+import type { DefaultOptionType, SelectValue } from 'ant-design-vue/es/select';
|
|
|
|
+import type { Key } from 'ant-design-vue/es/table/interface';
|
|
|
|
+import type { CheckedType, PageParams, ProtocolBaseInfo, ProtocolParamInfo } from '@/types';
|
|
|
|
+
|
|
|
|
+interface Props {
|
|
|
|
+ info: ProtocolBaseInfo;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+const props = defineProps<Props>();
|
|
|
|
+
|
|
|
|
+const { handleRequest } = useRequest();
|
|
|
|
+const { dictData: protocolTypes, getDictData: getProtocolTypes } = useDictData(DictCode.AllProtocolType);
|
|
|
|
+const { dictData: baudRateList, getDictData: getBaudRateList } = useDictData(DictCode.BaudRate);
|
|
|
|
+const { dictData: readContinuousAddr, getDictData: getReadContinuousAddr } = useDictData(DictCode.ReadContinuousAddr);
|
|
|
|
+const { dictData: byteOrderList, getDictData: getByteOrderList } = useDictData(DictCode.ByteOrder);
|
|
|
|
+const { dictData: addrOrderList, getDictData: getAddrOrderList } = useDictData(DictCode.AddrOrder);
|
|
|
|
+
|
|
|
|
+onMounted(() => {
|
|
|
|
+ handleRequest(async () => {
|
|
|
|
+ await getProtocolTypes();
|
|
|
|
+ await getBaudRateList();
|
|
|
|
+ await getReadContinuousAddr();
|
|
|
|
+ await getByteOrderList();
|
|
|
|
+ await getAddrOrderList();
|
|
|
|
+ await getCurrentProtocolParams();
|
|
|
|
+ });
|
|
|
|
+});
|
|
|
|
+
|
|
|
|
+const handleReadContinuousAddrChange = (checked: CheckedType) => {
|
|
|
|
+ const [first, second] = readContinuousAddr.value;
|
|
|
|
+
|
|
|
|
+ if (checked === first?.dictValue) {
|
|
|
|
+ props.info.readContinuousAddrCode = Number(first?.dictEngValue);
|
|
|
|
+ } else {
|
|
|
|
+ props.info.readContinuousAddrCode = Number(second?.dictEngValue);
|
|
|
|
+ }
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+const handleByteOrderChange = (_value: SelectValue, option: DefaultOptionType) => {
|
|
|
|
+ props.info.byteOrderCode = option.key;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+const handleAddrOrderChange = (_value: SelectValue, option: DefaultOptionType) => {
|
|
|
|
+ props.info.addrOrderCode = option.key;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+const paramList = ref<ProtocolParamInfo[]>([]);
|
|
|
|
+const paramTotal = ref(0);
|
|
|
|
+const paramNameOrCode = ref('');
|
|
|
|
+const pageParams = ref<PageParams>({
|
|
|
|
+ pageIndex: 1,
|
|
|
|
+ pageSize: 10,
|
|
|
|
+ pageSorts: [
|
|
|
|
+ {
|
|
|
|
+ column: 'id',
|
|
|
|
+ asc: true,
|
|
|
|
+ },
|
|
|
|
+ ],
|
|
|
|
+});
|
|
|
|
+
|
|
|
|
+const getCurrentProtocolParams = async () => {
|
|
|
|
+ const { id } = props.info;
|
|
|
|
+
|
|
|
|
+ if (!id) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const { records, total } = await getProtocolParamList({
|
|
|
|
+ ...pageParams.value,
|
|
|
|
+ baseInfoId: id,
|
|
|
|
+ paramName: paramNameOrCode.value,
|
|
|
|
+ paramCode: paramNameOrCode.value,
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ paramList.value = records;
|
|
|
|
+ paramTotal.value = total;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+const handleParamNameOrCodeChange = debounce(() => {
|
|
|
|
+ pageParams.value.pageIndex = 1;
|
|
|
|
+ getCurrentProtocolParams();
|
|
|
|
+}, 300);
|
|
|
|
+
|
|
|
|
+const handlePageChange = (page: number, pageSize: number) => {
|
|
|
|
+ pageParams.value.pageIndex = page;
|
|
|
|
+ pageParams.value.pageSize = pageSize;
|
|
|
|
+ getCurrentProtocolParams();
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+const selectedParamIds = ref<Key[]>([]);
|
|
|
|
+
|
|
|
|
+const handleParamSelectChange = (selectedRowKeys: Key[]) => {
|
|
|
|
+ selectedParamIds.value = selectedRowKeys;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+const customParamsRef = useTemplateRef('customParams');
|
|
|
|
+</script>
|
|
|
|
+
|
|
|
|
+<template>
|
|
|
|
+ <div>
|
|
|
|
+ <AForm class="protocol-container" layout="vertical">
|
|
|
|
+ <div class="protocol-label">{{ $t('common.basicInfo') }}</div>
|
|
|
|
+ <ARow>
|
|
|
|
+ <ACol :span="6">
|
|
|
|
+ <AFormItem :label="$t('setupProtocol.protocolName')" name="protocolName">
|
|
|
|
+ <AInput v-model:value="info.protocolName" class="protocol-input" :placeholder="$t('common.plzEnter')" />
|
|
|
|
+ </AFormItem>
|
|
|
|
+ </ACol>
|
|
|
|
+ <ACol :span="6">
|
|
|
|
+ <AFormItem :label="$t('setupProtocol.protocolType')" name="protocolType">
|
|
|
|
+ <ASelect
|
|
|
|
+ v-model:value="info.protocolType"
|
|
|
|
+ class="protocol-input"
|
|
|
|
+ :placeholder="$t('common.plzSelect')"
|
|
|
|
+ disabled
|
|
|
|
+ >
|
|
|
|
+ <ASelectOption v-for="item in protocolTypes" :key="item.dictValueId" :value="item.dictValue">
|
|
|
|
+ {{ item.dictValue }}
|
|
|
|
+ </ASelectOption>
|
|
|
|
+ </ASelect>
|
|
|
|
+ </AFormItem>
|
|
|
|
+ </ACol>
|
|
|
|
+ <ACol :span="6">
|
|
|
|
+ <AFormItem :label="$t('setupProtocol.deviceType')" name="deviceType">
|
|
|
|
+ <ASelect
|
|
|
|
+ v-model:value="info.deviceType"
|
|
|
|
+ class="protocol-input"
|
|
|
|
+ :placeholder="$t('common.plzSelect')"
|
|
|
|
+ disabled
|
|
|
|
+ >
|
|
|
|
+ <!-- <ASelectOption :value=""></ASelectOption> -->
|
|
|
|
+ </ASelect>
|
|
|
|
+ </AFormItem>
|
|
|
|
+ </ACol>
|
|
|
|
+ <ACol :span="6">
|
|
|
|
+ <AFormItem :label="$t('setupProtocol.dataBit')" name="dataBit">
|
|
|
|
+ <ARadioGroup v-model:value="info.dataBit">
|
|
|
|
+ <ARadio :value="5">5</ARadio>
|
|
|
|
+ <ARadio :value="6">6</ARadio>
|
|
|
|
+ <ARadio :value="7">7</ARadio>
|
|
|
|
+ <ARadio :value="8">8</ARadio>
|
|
|
|
+ </ARadioGroup>
|
|
|
|
+ </AFormItem>
|
|
|
|
+ </ACol>
|
|
|
|
+ <ACol :span="6">
|
|
|
|
+ <AFormItem :label="$t('setupProtocol.parityBit')" name="parityBit">
|
|
|
|
+ <ARadioGroup v-model:value="info.parityBit">
|
|
|
|
+ <ARadio value="N">N</ARadio>
|
|
|
|
+ <ARadio value="O">O</ARadio>
|
|
|
|
+ <ARadio value="E">E</ARadio>
|
|
|
|
+ </ARadioGroup>
|
|
|
|
+ </AFormItem>
|
|
|
|
+ </ACol>
|
|
|
|
+ <ACol :span="6">
|
|
|
|
+ <AFormItem :label="$t('setupProtocol.stopBit')" name="stopBit">
|
|
|
|
+ <ARadioGroup v-model:value="info.stopBit">
|
|
|
|
+ <ARadio value="1">1</ARadio>
|
|
|
|
+ <ARadio value="1.5">1.5</ARadio>
|
|
|
|
+ <ARadio value="2">2</ARadio>
|
|
|
|
+ </ARadioGroup>
|
|
|
|
+ </AFormItem>
|
|
|
|
+ </ACol>
|
|
|
|
+ <ACol :span="6">
|
|
|
|
+ <AFormItem :label="$t('setupProtocol.baudRate')" name="baudRate">
|
|
|
|
+ <ASelect v-model:value="info.baudRate" class="protocol-input" :placeholder="$t('common.plzSelect')">
|
|
|
|
+ <ASelectOption v-for="item in baudRateList" :key="item.dictValueId" :value="Number(item.dictValue)">
|
|
|
|
+ {{ item.dictValue }}
|
|
|
|
+ </ASelectOption>
|
|
|
|
+ </ASelect>
|
|
|
|
+ </AFormItem>
|
|
|
|
+ </ACol>
|
|
|
|
+ <ACol :span="6">
|
|
|
|
+ <AFormItem :label="$t('setupProtocol.dataSendInterval')" name="dataSendInterval">
|
|
|
|
+ <AInputNumber
|
|
|
|
+ v-model:value="info.dataSendInterval"
|
|
|
|
+ class="protocol-input"
|
|
|
|
+ addon-after="s"
|
|
|
|
+ :min="0"
|
|
|
|
+ :precision="0"
|
|
|
|
+ />
|
|
|
|
+ </AFormItem>
|
|
|
|
+ </ACol>
|
|
|
|
+ <ACol :span="6">
|
|
|
|
+ <AFormItem :label="$t('setupProtocol.highFreqSendInterval')" name="highFreqSendInterval">
|
|
|
|
+ <AInputNumber
|
|
|
|
+ v-model:value="info.highFreqSendInterval"
|
|
|
|
+ class="protocol-input"
|
|
|
|
+ addon-after="s"
|
|
|
|
+ :min="0"
|
|
|
|
+ :precision="0"
|
|
|
|
+ />
|
|
|
|
+ </AFormItem>
|
|
|
|
+ </ACol>
|
|
|
|
+ <ACol :span="6">
|
|
|
|
+ <AFormItem :label="$t('setupProtocol.readTimeout')" name="readTimeout">
|
|
|
|
+ <AInputNumber
|
|
|
|
+ v-model:value="info.readTimeout"
|
|
|
|
+ class="protocol-input"
|
|
|
|
+ addon-after="ms"
|
|
|
|
+ :min="0"
|
|
|
|
+ :precision="0"
|
|
|
|
+ />
|
|
|
|
+ </AFormItem>
|
|
|
|
+ </ACol>
|
|
|
|
+ <ACol :span="6">
|
|
|
|
+ <AFormItem :label="$t('setupProtocol.nextDataReadDelay')" name="nextDataReadDelay">
|
|
|
|
+ <AInputNumber
|
|
|
|
+ v-model:value="info.nextDataReadDelay"
|
|
|
|
+ class="protocol-input"
|
|
|
|
+ addon-after="ms"
|
|
|
|
+ :min="0"
|
|
|
|
+ :precision="0"
|
|
|
|
+ />
|
|
|
|
+ </AFormItem>
|
|
|
|
+ </ACol>
|
|
|
|
+ <ACol :span="6">
|
|
|
|
+ <AFormItem :label="$t('setupProtocol.nextRoundDataReadDelay')" name="nextRoundDataReadDelay">
|
|
|
|
+ <AInputNumber
|
|
|
|
+ v-model:value="info.nextRoundDataReadDelay"
|
|
|
|
+ class="protocol-input"
|
|
|
|
+ addon-after="ms"
|
|
|
|
+ :min="0"
|
|
|
|
+ :precision="0"
|
|
|
|
+ />
|
|
|
|
+ </AFormItem>
|
|
|
|
+ </ACol>
|
|
|
|
+ <ACol :span="6">
|
|
|
|
+ <AFormItem :label="$t('setupProtocol.readContinuousAddr')" name="readContinuousAddr">
|
|
|
|
+ <ASwitch
|
|
|
|
+ v-model:checked="info.readContinuousAddr"
|
|
|
|
+ :checked-value="readContinuousAddr[1]?.dictValue"
|
|
|
|
+ :un-checked-value="readContinuousAddr[0]?.dictValue"
|
|
|
|
+ :checked-children="$t('common.on')"
|
|
|
|
+ :un-checked-children="$t('common.off')"
|
|
|
|
+ @change="handleReadContinuousAddrChange"
|
|
|
|
+ />
|
|
|
|
+ </AFormItem>
|
|
|
|
+ </ACol>
|
|
|
|
+ <ACol :span="6">
|
|
|
|
+ <AFormItem :label="$t('setupProtocol.readContinuousAddrLength')" name="readContinuousAddrLength">
|
|
|
|
+ <AInputNumber
|
|
|
|
+ v-model:value="info.readContinuousAddrLength"
|
|
|
|
+ class="protocol-input"
|
|
|
|
+ :min="0"
|
|
|
|
+ :precision="0"
|
|
|
|
+ />
|
|
|
|
+ </AFormItem>
|
|
|
|
+ </ACol>
|
|
|
|
+ </ARow>
|
|
|
|
+ <div class="protocol-label advanced-label">{{ $t('common.advancedSettings') }}</div>
|
|
|
|
+ <ARow :gutter="[4, 30]">
|
|
|
|
+ <ACol :span="6">
|
|
|
|
+ <AFormItem :label="$t('setupProtocol.byteOrder')" name="byteOrder">
|
|
|
|
+ <ASelect
|
|
|
|
+ v-model:value="info.byteOrder"
|
|
|
|
+ class="protocol-input"
|
|
|
|
+ :placeholder="$t('common.plzSelect')"
|
|
|
|
+ @change="handleByteOrderChange"
|
|
|
|
+ >
|
|
|
|
+ <ASelectOption v-for="item in byteOrderList" :key="item.dictEngValue" :value="item.dictValue">
|
|
|
|
+ {{ item.dictValue }}
|
|
|
|
+ </ASelectOption>
|
|
|
|
+ </ASelect>
|
|
|
|
+ </AFormItem>
|
|
|
|
+ </ACol>
|
|
|
|
+ <ACol :span="6">
|
|
|
|
+ <AFormItem :label="$t('setupProtocol.addrOrder')" name="addrOrder">
|
|
|
|
+ <ASelect
|
|
|
|
+ v-model:value="info.addrOrder"
|
|
|
|
+ class="protocol-input"
|
|
|
|
+ :placeholder="$t('common.plzSelect')"
|
|
|
|
+ @change="handleAddrOrderChange"
|
|
|
|
+ >
|
|
|
|
+ <ASelectOption v-for="item in addrOrderList" :key="item.dictEngValue" :value="item.dictValue">
|
|
|
|
+ {{ item.dictValue }}
|
|
|
|
+ </ASelectOption>
|
|
|
|
+ </ASelect>
|
|
|
|
+ </AFormItem>
|
|
|
|
+ </ACol>
|
|
|
|
+ </ARow>
|
|
|
|
+ </AForm>
|
|
|
|
+ <div class="protocol-label params-label">
|
|
|
|
+ {{ $t('setupProtocol.protocolParams') }}
|
|
|
|
+ <span class="protocol-params-tip">{{ $t('setupProtocol.protocolTypeTipForPlc') }}</span>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="protocol-container protocol-params-query">
|
|
|
|
+ <AInput
|
|
|
|
+ v-model:value="paramNameOrCode"
|
|
|
|
+ class="protocol-input"
|
|
|
|
+ :placeholder="$t('setupProtocol.plzEnterParamOrCode')"
|
|
|
|
+ allow-clear
|
|
|
|
+ @change="handleParamNameOrCodeChange"
|
|
|
|
+ />
|
|
|
|
+ <div>
|
|
|
|
+ <AButton danger :disabled="selectedParamIds.length === 0">{{ $t('setupProtocol.deleteSelected') }}</AButton>
|
|
|
|
+ <AButton @click="customParamsRef?.showView">{{ $t('setupProtocol.addCustomParams') }}</AButton>
|
|
|
|
+ <AButton type="primary">{{ $t('setupProtocol.addStandardParams') }}</AButton>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <ATable
|
|
|
|
+ :data-source="paramList"
|
|
|
|
+ row-key="id"
|
|
|
|
+ :row-selection="{ selectedRowKeys: selectedParamIds, onChange: handleParamSelectChange }"
|
|
|
|
+ :scroll="{ x: 2800 }"
|
|
|
|
+ :pagination="{
|
|
|
|
+ current: pageParams.pageIndex,
|
|
|
|
+ pageSize: pageParams.pageSize,
|
|
|
|
+ total: paramTotal,
|
|
|
|
+ showSizeChanger: true,
|
|
|
|
+ hideOnSinglePage: false,
|
|
|
|
+ showTotal: (total) => $t('common.pageTotal', { total }),
|
|
|
|
+ onChange: handlePageChange,
|
|
|
|
+ }"
|
|
|
|
+ >
|
|
|
|
+ <ATableColumn
|
|
|
|
+ :title="$t('setupProtocol.protocolParamFields.customParamName')"
|
|
|
|
+ data-index="paramName"
|
|
|
|
+ :width="180"
|
|
|
|
+ fixed="left"
|
|
|
|
+ />
|
|
|
|
+ <ATableColumn :title="$t('setupProtocol.protocolParamFields.result')" data-index="result" :width="110" />
|
|
|
|
+ <ATableColumn
|
|
|
|
+ :title="$t('setupProtocol.protocolParamFields.platformParamName')"
|
|
|
|
+ data-index="platformParamName"
|
|
|
|
+ :width="170"
|
|
|
|
+ />
|
|
|
|
+ <ATableColumn
|
|
|
|
+ :title="$t('setupProtocol.protocolParamFields.platformParamCode')"
|
|
|
|
+ data-index="platformParamCode"
|
|
|
|
+ :width="280"
|
|
|
|
+ />
|
|
|
|
+ <ATableColumn
|
|
|
|
+ :title="$t('setupProtocol.protocolParamFields.gatewayParamName')"
|
|
|
|
+ data-index="gatewayParamName"
|
|
|
|
+ :width="200"
|
|
|
|
+ />
|
|
|
|
+ <ATableColumn
|
|
|
|
+ :title="$t('setupProtocol.protocolParamFields.gatewayParamCode')"
|
|
|
|
+ data-index="gatewayParamCode"
|
|
|
|
+ :width="200"
|
|
|
|
+ />
|
|
|
|
+ <ATableColumn :title="$t('setupProtocol.protocolParamFields.unit')" data-index="unit" />
|
|
|
|
+ <ATableColumn :title="$t('setupProtocol.protocolParamFields.module')" data-index="module" />
|
|
|
|
+ <ATableColumn :title="$t('setupProtocol.protocolParamFields.readWriteType')" data-index="readWriteType" />
|
|
|
|
+ <ATableColumn :title="$t('setupProtocol.protocolParamFields.readFunctionCode')" data-index="readFuncCode" />
|
|
|
|
+ <ATableColumn :title="$t('setupProtocol.protocolParamFields.writeFunctionCode')" data-index="writeFuncCode" />
|
|
|
|
+ <ATableColumn :title="$t('setupProtocol.protocolParamFields.registerAddress')" data-index="registerAddr" />
|
|
|
|
+ <ATableColumn
|
|
|
|
+ :title="$t('setupProtocol.protocolParamFields.parsingType')"
|
|
|
|
+ data-index="parsingType"
|
|
|
|
+ :width="150"
|
|
|
|
+ />
|
|
|
|
+ <ATableColumn :title="$t('setupProtocol.protocolParamFields.addressLength')" data-index="addrLength" />
|
|
|
|
+ <ATableColumn :title="$t('setupProtocol.protocolParamFields.dataType')" data-index="dataType" />
|
|
|
|
+ <ATableColumn :title="$t('setupProtocol.protocolParamFields.coefficient')" data-index="coefficient" />
|
|
|
|
+ <ATableColumn
|
|
|
|
+ :title="$t('setupProtocol.protocolParamFields.isHighFrequencyParameter')"
|
|
|
|
+ data-index="isHighFreqParam"
|
|
|
|
+ :width="150"
|
|
|
|
+ />
|
|
|
|
+ <ATableColumn
|
|
|
|
+ :title="$t('setupProtocol.protocolParamFields.writeCalculationFormula')"
|
|
|
|
+ data-index="writeCalcFormula"
|
|
|
|
+ />
|
|
|
|
+ <ATableColumn
|
|
|
|
+ :title="$t('setupProtocol.protocolParamFields.readCalculationFormula')"
|
|
|
|
+ data-index="readCalcFormula"
|
|
|
|
+ />
|
|
|
|
+ <ATableColumn :title="$t('setupProtocol.protocolParamFields.decimalPlaces')" data-index="decimalPlaces" />
|
|
|
|
+ </ATable>
|
|
|
|
+ <CustomParams ref="customParams" />
|
|
|
|
+ </div>
|
|
|
|
+</template>
|
|
|
|
+
|
|
|
|
+<style lang="scss" scoped>
|
|
|
|
+.protocol-container {
|
|
|
|
+ width: 62%;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+.protocol-label {
|
|
|
|
+ margin-bottom: 24px;
|
|
|
|
+ font-size: 14px;
|
|
|
|
+ font-weight: 600;
|
|
|
|
+ line-height: 22px;
|
|
|
|
+ color: var(--antd-color-text);
|
|
|
|
+
|
|
|
|
+ &.advanced-label {
|
|
|
|
+ margin-top: 46px;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ &.params-label {
|
|
|
|
+ margin-top: 56px;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+.protocol-input {
|
|
|
|
+ width: 224px;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+.protocol-params-tip {
|
|
|
|
+ font-size: 11px;
|
|
|
|
+ font-weight: normal;
|
|
|
|
+ color: var(--antd-color-text-tertiary);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+.protocol-params-query {
|
|
|
|
+ display: flex;
|
|
|
|
+ justify-content: space-between;
|
|
|
|
+ margin-bottom: 24px;
|
|
|
|
+
|
|
|
|
+ button + button {
|
|
|
|
+ margin-left: 23px;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+</style>
|