CustomParams.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  1. <script setup lang="ts">
  2. import { computed, onMounted, reactive, ref } from 'vue';
  3. import { message } from 'ant-design-vue';
  4. import { useDictData } from '@/hooks/dict-data';
  5. import { useRequest } from '@/hooks/request';
  6. import { useViewVisible } from '@/hooks/view-visible';
  7. import { t } from '@/i18n';
  8. import { addProtocolParam, updateProtocolParam } from '@/api';
  9. import { DictCode } from '@/constants';
  10. import type { FormInstance } from 'ant-design-vue';
  11. import type { DefaultOptionType, SelectValue } from 'ant-design-vue/es/select';
  12. import type { FormRules, ProtocolParamInfo } from '@/types';
  13. interface Props {
  14. protocolId?: number;
  15. paramId?: number;
  16. isModbusRtuProtocol?: boolean;
  17. isModbusTcpProtocol?: boolean;
  18. isS7Protocol?: boolean;
  19. }
  20. const props = defineProps<Props>();
  21. const emit = defineEmits<{
  22. refreshList: [];
  23. }>();
  24. const { visible, showView, hideView } = useViewVisible();
  25. const { handleRequest } = useRequest();
  26. const { dictData: readWriteTypes, getDictData: getReadWriteTypes } = useDictData(DictCode.ReadWriteType);
  27. const { dictData: registerTypes, getDictData: getRegisterTypes } = useDictData(DictCode.RegisterType);
  28. const { dictData: wordLength, getDictData: getWordLength } = useDictData(DictCode.WordLength);
  29. const { dictData: parsingTypes, getDictData: getParsingTypes } = useDictData(DictCode.ParsingType);
  30. const { dictData: writeFuncCode, getDictData: getWriteFuncCode } = useDictData(DictCode.WriteFuncCode);
  31. const { dictData: readFuncCode, getDictData: getReadFuncCode } = useDictData(DictCode.ReadFuncCode);
  32. const { dictData: isHighFreqParam, getDictData: getIsHighFreqParam } = useDictData(DictCode.IsHighFreqParam);
  33. const customParamsForm = reactive<Partial<ProtocolParamInfo>>({
  34. gatewayParamName: '',
  35. gatewayParamCode: '',
  36. unit: '',
  37. module: '',
  38. readWriteType: undefined,
  39. readWriteTypeCode: undefined,
  40. parsingType: undefined,
  41. parsingTypeCode: undefined,
  42. writeFuncCode: undefined,
  43. readFuncCode: undefined,
  44. addrLength: undefined,
  45. addrNumber: '',
  46. registerAddr: '',
  47. registerType: undefined,
  48. registerTypeCode: undefined,
  49. wordLength: undefined,
  50. wordLengthCode: undefined,
  51. quantity: undefined,
  52. coefficient: undefined,
  53. isHighFreqParam: undefined,
  54. isHighFreqParamCode: undefined,
  55. readCalcFormula: '',
  56. writeCalcFormula: '',
  57. decimalPlace: undefined,
  58. });
  59. const rules = computed<FormRules<ProtocolParamInfo>>(() => {
  60. return {
  61. gatewayParamName: [
  62. {
  63. required: true,
  64. message: t('common.plzEnter', { name: t('setupProtocol.protocolParamFields.gatewayParamName') }),
  65. trigger: 'blur',
  66. },
  67. ],
  68. gatewayParamCode: [
  69. {
  70. required: true,
  71. message: t('common.plzEnter', { name: t('setupProtocol.protocolParamFields.gatewayParamCode') }),
  72. trigger: 'blur',
  73. },
  74. ],
  75. readWriteType: [
  76. {
  77. required: true,
  78. message: t('common.plzSelect', { name: t('setupProtocol.protocolParamFields.readWriteType') }),
  79. trigger: 'blur',
  80. },
  81. ],
  82. parsingType: [
  83. {
  84. required: true,
  85. message: t('common.plzSelect', { name: t('setupProtocol.protocolParamFields.parsingType') }),
  86. trigger: 'blur',
  87. },
  88. ],
  89. addrLength: [
  90. {
  91. required: true,
  92. message: t('common.plzEnter', { name: t('setupProtocol.protocolParamFields.addressLength') }),
  93. trigger: 'blur',
  94. },
  95. ],
  96. addrNumber: [
  97. {
  98. required: true,
  99. message: t('common.plzEnter', { name: t('setupProtocol.protocolParamFields.addrNumber') }),
  100. trigger: 'blur',
  101. },
  102. ],
  103. registerType: [
  104. {
  105. required: true,
  106. message: t('common.plzSelect', { name: t('setupProtocol.protocolParamFields.registerType') }),
  107. trigger: 'blur',
  108. },
  109. ],
  110. registerAddr: [
  111. {
  112. required: true,
  113. message: t('common.plzEnter', { name: t('setupProtocol.protocolParamFields.registerAddress') }),
  114. trigger: 'blur',
  115. },
  116. ],
  117. wordLength: [
  118. {
  119. required: true,
  120. message: t('common.plzSelect', { name: t('setupProtocol.protocolParamFields.wordLength') }),
  121. trigger: 'blur',
  122. },
  123. ],
  124. };
  125. });
  126. const isModbusProtocol = computed(() => {
  127. return props.isModbusRtuProtocol || props.isModbusTcpProtocol;
  128. });
  129. const isAddParams = ref(true);
  130. const modalTitle = computed(() => {
  131. return isAddParams.value ? t('setupProtocol.addCustomParams') : t('setupProtocol.updateCustomParams');
  132. });
  133. const setIsAddParams = (isAdd: boolean) => {
  134. isAddParams.value = isAdd;
  135. };
  136. const setParamsForm = (params: ProtocolParamInfo) => {
  137. Object.keys(customParamsForm).forEach((key) => {
  138. const value = params[key];
  139. if (value !== undefined && value !== null) {
  140. customParamsForm[key] = value;
  141. }
  142. });
  143. };
  144. onMounted(() => {
  145. handleRequest(async () => {
  146. await getReadWriteTypes();
  147. await getRegisterTypes();
  148. await getWordLength();
  149. await getParsingTypes();
  150. await getWriteFuncCode();
  151. await getReadFuncCode();
  152. await getIsHighFreqParam();
  153. });
  154. });
  155. const handleReadWriteTypeChange = (_value: SelectValue, option: DefaultOptionType) => {
  156. customParamsForm.readWriteTypeCode = option.key;
  157. };
  158. const handleRegisterTypeChange = (_value: SelectValue, option: DefaultOptionType) => {
  159. customParamsForm.registerTypeCode = option.key;
  160. };
  161. const handleWordLengthChange = (_value: SelectValue, option: DefaultOptionType) => {
  162. customParamsForm.wordLengthCode = option.key;
  163. };
  164. const handleParsingTypeChange = (_value: SelectValue, option: DefaultOptionType) => {
  165. customParamsForm.parsingTypeCode = option.key;
  166. };
  167. const handleIsHighFreqParamChange = (_value: SelectValue, option: DefaultOptionType) => {
  168. customParamsForm.isHighFreqParamCode = option.key;
  169. };
  170. const formRef = ref<FormInstance>();
  171. const handleOk = () => {
  172. formRef.value
  173. ?.validate()
  174. .then(() => {
  175. handleRequest(async () => {
  176. if (isAddParams.value) {
  177. await addProtocolParam({
  178. baseInfoId: props.protocolId,
  179. ...customParamsForm,
  180. });
  181. message.success(t('setupProtocol.addCustomParamsSuccessful'));
  182. } else {
  183. await updateProtocolParam({
  184. ...customParamsForm,
  185. id: props.paramId,
  186. });
  187. message.success(t('setupProtocol.updateCustomParamsSuccessful'));
  188. }
  189. hideView();
  190. emit('refreshList');
  191. });
  192. })
  193. .catch((err) => {
  194. console.error(err);
  195. });
  196. };
  197. const handleClose = () => {
  198. formRef.value?.resetFields();
  199. };
  200. defineExpose({
  201. showView,
  202. hideView,
  203. setIsAddParams,
  204. setParamsForm,
  205. });
  206. </script>
  207. <template>
  208. <AModal v-model:open="visible" :title="modalTitle" :width="920" centered :after-close="handleClose" @ok="handleOk">
  209. <AForm ref="formRef" :model="customParamsForm" :rules="rules" layout="vertical">
  210. <ARow :gutter="30">
  211. <ACol :span="8">
  212. <AFormItem :label="$t('setupProtocol.protocolParamFields.gatewayParamName')" name="gatewayParamName">
  213. <AInput
  214. v-model:value="customParamsForm.gatewayParamName"
  215. class="protocol-input"
  216. :placeholder="$t('common.plzEnter')"
  217. />
  218. </AFormItem>
  219. </ACol>
  220. <ACol :span="8">
  221. <AFormItem :label="$t('setupProtocol.protocolParamFields.gatewayParamCode')" name="gatewayParamCode">
  222. <AInput
  223. v-model:value="customParamsForm.gatewayParamCode"
  224. class="protocol-input"
  225. :placeholder="$t('common.plzEnter')"
  226. />
  227. </AFormItem>
  228. </ACol>
  229. <ACol :span="8">
  230. <AFormItem :label="$t('setupProtocol.protocolParamFields.unit')" name="unit">
  231. <AInput v-model:value="customParamsForm.unit" class="protocol-input" :placeholder="$t('common.plzEnter')" />
  232. </AFormItem>
  233. </ACol>
  234. <ACol :span="8">
  235. <AFormItem :label="$t('setupProtocol.protocolParamFields.module')" name="module">
  236. <AInput
  237. v-model:value="customParamsForm.module"
  238. class="protocol-input"
  239. :placeholder="$t('common.plzEnter')"
  240. />
  241. </AFormItem>
  242. </ACol>
  243. <ACol :span="8">
  244. <AFormItem :label="$t('setupProtocol.protocolParamFields.readWriteType')" name="readWriteType">
  245. <ASelect
  246. v-model:value="customParamsForm.readWriteType"
  247. class="protocol-input"
  248. :placeholder="$t('common.plzSelect')"
  249. @change="handleReadWriteTypeChange"
  250. >
  251. <ASelectOption v-for="item in readWriteTypes" :key="item.dictEngValue" :value="item.dictValue">
  252. {{ item.dictValue }}
  253. </ASelectOption>
  254. </ASelect>
  255. </AFormItem>
  256. </ACol>
  257. <ACol :span="8">
  258. <AFormItem :label="$t('setupProtocol.protocolParamFields.parsingType')" name="parsingType">
  259. <ASelect
  260. v-model:value="customParamsForm.parsingType"
  261. class="protocol-input"
  262. :placeholder="$t('common.plzSelect')"
  263. @change="handleParsingTypeChange"
  264. >
  265. <ASelectOption v-for="item in parsingTypes" :key="item.dictEngValue" :value="item.dictValue">
  266. {{ item.dictValue }}
  267. </ASelectOption>
  268. </ASelect>
  269. </AFormItem>
  270. </ACol>
  271. <ACol v-if="isModbusProtocol" :span="8">
  272. <AFormItem :label="$t('setupProtocol.protocolParamFields.writeFunctionCode')" name="writeFuncCode">
  273. <ASelect
  274. v-model:value="customParamsForm.writeFuncCode"
  275. class="protocol-input"
  276. :placeholder="$t('common.plzSelect')"
  277. >
  278. <ASelectOption v-for="item in writeFuncCode" :key="item.dictEngValue" :value="item.dictValue">
  279. {{ item.dictValue }}
  280. </ASelectOption>
  281. </ASelect>
  282. </AFormItem>
  283. </ACol>
  284. <ACol v-if="isModbusProtocol" :span="8">
  285. <AFormItem :label="$t('setupProtocol.protocolParamFields.readFunctionCode')" name="readFuncCode">
  286. <ASelect
  287. v-model:value="customParamsForm.readFuncCode"
  288. class="protocol-input"
  289. :placeholder="$t('common.plzSelect')"
  290. >
  291. <ASelectOption v-for="item in readFuncCode" :key="item.dictEngValue" :value="item.dictValue">
  292. {{ item.dictValue }}
  293. </ASelectOption>
  294. </ASelect>
  295. </AFormItem>
  296. </ACol>
  297. <ACol v-if="isModbusProtocol" :span="8">
  298. <AFormItem :label="$t('setupProtocol.protocolParamFields.addressLength')" name="addrLength">
  299. <AInputNumber
  300. v-model:value="customParamsForm.addrLength"
  301. class="protocol-input"
  302. :placeholder="$t('common.plzEnter')"
  303. :min="0"
  304. :precision="0"
  305. />
  306. </AFormItem>
  307. </ACol>
  308. <ACol v-if="isS7Protocol" :span="8">
  309. <AFormItem :label="$t('setupProtocol.protocolParamFields.addrNumber')" name="addrNumber">
  310. <AInput
  311. v-model:value="customParamsForm.addrNumber"
  312. class="protocol-input"
  313. :placeholder="$t('common.plzEnter')"
  314. />
  315. </AFormItem>
  316. </ACol>
  317. <ACol v-if="isS7Protocol" :span="8">
  318. <AFormItem :label="$t('setupProtocol.protocolParamFields.registerType')" name="registerType">
  319. <ASelect
  320. v-model:value="customParamsForm.registerType"
  321. class="protocol-input"
  322. :placeholder="$t('common.plzSelect')"
  323. @change="handleRegisterTypeChange"
  324. >
  325. <ASelectOption v-for="item in registerTypes" :key="item.dictEngValue" :value="item.dictValue">
  326. {{ item.dictValue }}
  327. </ASelectOption>
  328. </ASelect>
  329. </AFormItem>
  330. </ACol>
  331. <ACol :span="8">
  332. <AFormItem :label="$t('setupProtocol.protocolParamFields.registerAddress')" name="registerAddr">
  333. <AInput
  334. v-model:value="customParamsForm.registerAddr"
  335. class="protocol-input"
  336. :placeholder="$t('common.plzEnter')"
  337. />
  338. </AFormItem>
  339. </ACol>
  340. <ACol v-if="isS7Protocol" :span="8">
  341. <AFormItem :label="$t('setupProtocol.protocolParamFields.wordLength')" name="wordLength">
  342. <ASelect
  343. v-model:value="customParamsForm.wordLength"
  344. class="protocol-input"
  345. :placeholder="$t('common.plzSelect')"
  346. @change="handleWordLengthChange"
  347. >
  348. <ASelectOption v-for="item in wordLength" :key="item.dictEngValue" :value="item.dictValue">
  349. {{ item.dictValue }}
  350. </ASelectOption>
  351. </ASelect>
  352. </AFormItem>
  353. </ACol>
  354. <ACol v-if="isS7Protocol" :span="8">
  355. <AFormItem :label="$t('setupProtocol.protocolParamFields.quantity')" name="quantity">
  356. <AInputNumber
  357. v-model:value="customParamsForm.quantity"
  358. class="protocol-input"
  359. :placeholder="$t('common.plzEnter')"
  360. :min="0"
  361. :precision="0"
  362. />
  363. </AFormItem>
  364. </ACol>
  365. <ACol :span="8">
  366. <AFormItem :label="$t('setupProtocol.protocolParamFields.coefficient')" name="coefficient">
  367. <AInputNumber
  368. v-model:value="customParamsForm.coefficient"
  369. class="protocol-input"
  370. :placeholder="$t('common.plzEnter')"
  371. :min="0"
  372. />
  373. </AFormItem>
  374. </ACol>
  375. <ACol :span="8">
  376. <AFormItem :label="$t('setupProtocol.protocolParamFields.isHighFrequencyParameter')" name="isHighFreqParam">
  377. <ASelect
  378. v-model:value="customParamsForm.isHighFreqParam"
  379. class="protocol-input"
  380. :placeholder="$t('common.plzSelect')"
  381. @change="handleIsHighFreqParamChange"
  382. >
  383. <ASelectOption v-for="item in isHighFreqParam" :key="item.dictEngValue" :value="item.dictValue">
  384. {{ item.dictValue }}
  385. </ASelectOption>
  386. </ASelect>
  387. </AFormItem>
  388. </ACol>
  389. <ACol :span="8">
  390. <AFormItem :label="$t('setupProtocol.protocolParamFields.readCalculationFormula')" name="readCalcFormula">
  391. <AInput
  392. v-model:value="customParamsForm.readCalcFormula"
  393. class="protocol-input"
  394. :placeholder="$t('common.plzEnter')"
  395. />
  396. </AFormItem>
  397. </ACol>
  398. <ACol :span="8">
  399. <AFormItem :label="$t('setupProtocol.protocolParamFields.writeCalculationFormula')" name="writeCalcFormula">
  400. <AInput
  401. v-model:value="customParamsForm.writeCalcFormula"
  402. class="protocol-input"
  403. :placeholder="$t('common.plzEnter')"
  404. />
  405. </AFormItem>
  406. </ACol>
  407. <ACol :span="8">
  408. <AFormItem :label="$t('setupProtocol.protocolParamFields.decimalPlaces')" name="decimalPlace">
  409. <AInputNumber
  410. v-model:value="customParamsForm.decimalPlace"
  411. class="protocol-input"
  412. :placeholder="$t('common.plzEnter')"
  413. :min="0"
  414. :precision="0"
  415. />
  416. </AFormItem>
  417. </ACol>
  418. </ARow>
  419. </AForm>
  420. </AModal>
  421. </template>
  422. <style lang="scss" scoped>
  423. .protocol-input {
  424. width: 100%;
  425. }
  426. </style>