Showing
6 changed files
with
276 additions
and
0 deletions
src/locales/lang/zh-CN/equipment/category.ts
0 → 100644
1 | +<template> | ||
2 | + <div> | ||
3 | + <BasicModal | ||
4 | + v-bind="$attrs" | ||
5 | + width="35rem" | ||
6 | + :title="getTitle" | ||
7 | + @register="register" | ||
8 | + @cancel="handleCancel" | ||
9 | + @ok="handleOk" | ||
10 | + destroyOnClose | ||
11 | + > | ||
12 | + <div> | ||
13 | + <BasicForm @register="registerForm" /> | ||
14 | + </div> | ||
15 | + </BasicModal> | ||
16 | + </div> | ||
17 | +</template> | ||
18 | +<script setup lang="ts"> | ||
19 | +import {BasicModal, useModalInner} from "/@/components/Modal"; | ||
20 | +import {BasicForm, useForm} from "/@/components/Form"; | ||
21 | +import {computed, ref, unref} from "vue"; | ||
22 | +import {useI18n} from "/@/hooks/web/useI18n"; | ||
23 | +import {schemas} from "/@/views/equipment/category/index"; | ||
24 | +import {ipRegex} from "/@/utils/rules"; | ||
25 | +import {deleteFormField} from "/@/views/device/deviceaccess/index"; | ||
26 | +import { | ||
27 | + deviceProfileAccessInformation, | ||
28 | + updateDeviceProfileAccessInformation | ||
29 | +} from "/@/api/device/deviceAccess"; | ||
30 | +import {useMessage} from "/@/hooks/web/useMessage"; | ||
31 | +const isUpdate = ref<Boolean>(false); | ||
32 | +const { t } = useI18n(); | ||
33 | +const emit = defineEmits(['handleReload', 'register']); | ||
34 | +const { createMessage } = useMessage(); | ||
35 | + | ||
36 | +const [registerForm, { getFieldsValue, setFieldsValue, validate, resetFields }] = useForm({ | ||
37 | + labelWidth: 150, | ||
38 | + schemas, | ||
39 | + actionColOptions: { | ||
40 | + span: 14, | ||
41 | + }, | ||
42 | + showActionButtonGroup: false, | ||
43 | +}); | ||
44 | + | ||
45 | +const recordInfo = ref<Recordable>({}); | ||
46 | + | ||
47 | +const [register, { closeModal, setModalProps }] = useModalInner(async (data) => { | ||
48 | + await resetFields(); | ||
49 | + setModalProps({ confirmLoading: false, loading: true }); | ||
50 | + isUpdate.value = data?.isUpdate; | ||
51 | + recordInfo.value = data?.record; | ||
52 | + if (data?.record) { | ||
53 | + const intranetIpAndPort = { | ||
54 | + inputIp: data?.record.intranetIp, | ||
55 | + inputPort: data?.record.intranetPort, | ||
56 | + }; | ||
57 | + const outerIpAndPort = { | ||
58 | + inputIp: data?.record.outerNetIp, | ||
59 | + inputPort: data?.record.outerNetPort, | ||
60 | + }; | ||
61 | + setFieldsValue(data?.record); | ||
62 | + setFieldsValue({ ...data?.record?.sipExtend }); | ||
63 | + setFieldsValue({ intranetIpAndPort, outerIpAndPort }); | ||
64 | + } | ||
65 | + setModalProps({ loading: false }); | ||
66 | +}); | ||
67 | + | ||
68 | +const getTitle = computed(() => | ||
69 | + !unref(isUpdate) | ||
70 | + ? t('equipment.category.createCategoryText') | ||
71 | + : t('equipment.category.editCategoryText') | ||
72 | +); | ||
73 | + | ||
74 | +const handleCancel = () => closeModal(); | ||
75 | + | ||
76 | +const handleOk = async () => { | ||
77 | + await validate(); | ||
78 | + let values = getFieldsValue(); | ||
79 | + const { intranetIpAndPort, outerIpAndPort } = values; | ||
80 | + // values.intranetIp = intranetIpAndPort.inputIp; | ||
81 | + // values.intranetPort = intranetIpAndPort.inputPort; | ||
82 | + // values.outerNetIp = outerIpAndPort.inputIp; | ||
83 | + // values.outerNetPort = outerIpAndPort.inputPort; | ||
84 | + // if (!ipRegex.test(values.intranetIp)) { | ||
85 | + // return createMessage.error(t('deviceManagement.deviceAccess.ipRuleText')); | ||
86 | + // } | ||
87 | + | ||
88 | + const sipExtend = { | ||
89 | + serverId: values['serverId'], | ||
90 | + serverDomain: values['serverDomain'], | ||
91 | + serverPassword: values['serverPassword'], | ||
92 | + }; | ||
93 | + values.sipExtend = sipExtend; | ||
94 | + deleteFormField.forEach((deleteItem) => { | ||
95 | + Reflect.deleteProperty(values, deleteItem); | ||
96 | + }); | ||
97 | + if (unref(isUpdate)) { | ||
98 | + // 更新 | ||
99 | + values = { ...values, id: unref(recordInfo).id }; | ||
100 | + // await updateDeviceProfileAccessInformation(values); | ||
101 | + } else { | ||
102 | + // await deviceProfileAccessInformation(values); | ||
103 | + } | ||
104 | + createMessage.success(t('equipment.category.operationSuccessText')); | ||
105 | + emit('handleReload'); | ||
106 | + handleCancel(); | ||
107 | +}; | ||
108 | + | ||
109 | +</script> |
src/views/equipment/category/index.less
0 → 100644
1 | +.category-tree { | ||
2 | + flex: 1 1 auto; | ||
3 | + margin: 16px; | ||
4 | + padding: 32px; | ||
5 | + max-width: 100%; | ||
6 | + background: #ffffff; | ||
7 | + border-radius: 2px; | ||
8 | + &-search { | ||
9 | + width: 50%; | ||
10 | + margin-bottom: 20px; | ||
11 | + } | ||
12 | + .ant-tree-treenode-switcher-close:hover { | ||
13 | + background-color: #f4f4f5 !important; | ||
14 | + border-radius: 4px !important; | ||
15 | + } | ||
16 | + .ant-tree-node-content-wrapper { | ||
17 | + width: 100%; | ||
18 | + } | ||
19 | + .ant-tree-title { | ||
20 | + display: flex; | ||
21 | + } | ||
22 | + .tree-node { | ||
23 | + align-items: center; | ||
24 | + justify-content: space-between; | ||
25 | + width: 100%; | ||
26 | + | ||
27 | + .but_operation { | ||
28 | + display: none; // 默认隐藏按钮 | ||
29 | + } | ||
30 | + | ||
31 | + | ||
32 | + } | ||
33 | + .tree-node:hover { | ||
34 | + &:hover .but_operation { | ||
35 | + display: inline-block; // 悬停时显示按钮 | ||
36 | + .but_type { | ||
37 | + margin-left: 32px; | ||
38 | + color: red; | ||
39 | + } | ||
40 | + } | ||
41 | + } | ||
42 | +} |
src/views/equipment/category/index.ts
0 → 100644
1 | + | ||
2 | +import { useI18n } from '/@/hooks/web/useI18n'; | ||
3 | + | ||
4 | +const { t } = useI18n(); | ||
5 | +import { FormSchema } from '/@/components/Table'; | ||
6 | + | ||
7 | +//表单字段 | ||
8 | +export const schemas: FormSchema[] = [ | ||
9 | + { | ||
10 | + field: 'intranetIpAndPort', | ||
11 | + label: t('deviceManagement.deviceAccess.intranetIPWithPortText'), | ||
12 | + component: 'FormInputGroup', | ||
13 | + required: true, | ||
14 | + componentProps: { | ||
15 | + inputPlaceholder: t('deviceManagement.deviceAccess.intranetIPPlaceholderText'), | ||
16 | + inputNumberPlaceholder: t('deviceManagement.deviceAccess.intranetPortPlaceholderText'), | ||
17 | + }, | ||
18 | + colProps: { span: 24 }, | ||
19 | + }, | ||
20 | + { | ||
21 | + field: 'outerIpAndPort', | ||
22 | + label: t('deviceManagement.deviceAccess.outernetIPWithPortText'), | ||
23 | + component: 'FormInputGroup', | ||
24 | + required: true, | ||
25 | + componentProps: { | ||
26 | + inputPlaceholder: t('deviceManagement.deviceAccess.outernetIPPlaceholderText'), | ||
27 | + inputNumberPlaceholder: t('deviceManagement.deviceAccess.outernetPortPlaceholderText'), | ||
28 | + }, | ||
29 | + colProps: { span: 24 }, | ||
30 | + } | ||
31 | +]; |
src/views/equipment/category/index.vue
0 → 100644
1 | +<template> | ||
2 | + | ||
3 | + <PageWrapper dense contentFullHeight contentClass="flex"> | ||
4 | + <div class="category-tree"> | ||
5 | + <div class="category-tree-search"> | ||
6 | + <a-input-search | ||
7 | + placeholder="请输入关键字搜索" | ||
8 | + enter-button | ||
9 | + size="large" | ||
10 | + /> | ||
11 | + </div> | ||
12 | + <a-tree :tree-data="treeData" default-expand-all show-icon :default-selected-keys="['0-0']"> | ||
13 | + <template #custom="{ title }"> | ||
14 | + <div class="tree-node"> | ||
15 | + <span>{{ title }}</span> | ||
16 | + <div class="but_operation"> | ||
17 | + <span class="but_type" @click="handleAdd(key)">新增</span> | ||
18 | + <span class="but_type">编辑</span> | ||
19 | + <span class="but_type">删除</span> | ||
20 | + </div> | ||
21 | + </div> | ||
22 | + </template> | ||
23 | + </a-tree> | ||
24 | + <categoryModal @register="registerModal" @handleReload="handleReload"/> | ||
25 | + </div> | ||
26 | + </PageWrapper> | ||
27 | + | ||
28 | +</template> | ||
29 | +<script setup lang="ts"> | ||
30 | +import {PageWrapper} from "/@/components/Page"; | ||
31 | +import './index.less'; | ||
32 | +import {categoryModal} from './components/index'; | ||
33 | +import {useModal} from "/@/components/Modal"; | ||
34 | + | ||
35 | +const [registerModal, {openModal}] = useModal(); | ||
36 | +const treeData = [ | ||
37 | + { | ||
38 | + title: '全部', | ||
39 | + key: '0-0', | ||
40 | + slots: {title: 'custom'}, // 添加 title: 'custom' | ||
41 | + children: [ | ||
42 | + { | ||
43 | + title: '德风石化有限公司', | ||
44 | + key: '0-0-0', | ||
45 | + slots: {title: 'custom'}, // 添加 title: 'custom' | ||
46 | + children: [ | ||
47 | + { | ||
48 | + title: '公共工程', | ||
49 | + key: '0-0-0-0', | ||
50 | + slots: {title: 'custom'}, // 添加 title: 'custom' | ||
51 | + children: [ | ||
52 | + { | ||
53 | + title: '中心控制室', | ||
54 | + key: '0-0-0-0-0', | ||
55 | + slots: {title: 'custom'} | ||
56 | + }, | ||
57 | + {title: '辅料管区', key: '0-0-0-0-1', slots: {title: 'custom'}}, | ||
58 | + {title: 'PSA伐区', key: '0-0-0-0-2', slots: {title: 'custom'}}, | ||
59 | + {title: '导热油房区', key: '0-0-0-0-3', slots: {title: 'custom'}}, | ||
60 | + {title: '甲醇裂解区', key: '0-0-0-0-4', slots: {title: 'custom'}}, | ||
61 | + {title: '机柜间', key: '0-0-0-0-5', slots: {title: 'custom'}} | ||
62 | + ] | ||
63 | + }, | ||
64 | + {title: '污水处理站', key: '0-0-0-1', slots: {title: 'custom'}} // 添加 title: 'custom' | ||
65 | + ] | ||
66 | + } | ||
67 | + ] | ||
68 | + } | ||
69 | +]; | ||
70 | + | ||
71 | +// 处理新建按钮点击事件 | ||
72 | +const handleAdd = (key: string) => { | ||
73 | + openModal(true, { | ||
74 | + isUpdate: false, // 表示是新建操作 | ||
75 | + parentKey: key, // 传递当前节点的 key | ||
76 | + }); | ||
77 | +}; | ||
78 | + | ||
79 | + | ||
80 | +const handleReload = () => { | ||
81 | + | ||
82 | +}; | ||
83 | +</script> |