Commit 851f4a84aec9c1dad1d2b75ed775c53ed322a86a

Authored by sqy
1 parent 4cfebeff

'feat:设备详情子设备开发,wip:租户管理:租户配置回显待完成'

@@ -5,7 +5,7 @@ import { @@ -5,7 +5,7 @@ import {
5 DeviceProfileQueryParam, 5 DeviceProfileQueryParam,
6 DeviceQueryParam, 6 DeviceQueryParam,
7 } from '/@/api/device/model/deviceModel'; 7 } from '/@/api/device/model/deviceModel';
8 - 8 +import { ChildDeviceParams } from './model/deviceModel';
9 enum DeviceManagerApi { 9 enum DeviceManagerApi {
10 /** 10 /**
11 * 设备URL 11 * 设备URL
@@ -180,8 +180,18 @@ export const getGATEWAYdevice = async (params: { organization: string }) => { @@ -180,8 +180,18 @@ export const getGATEWAYdevice = async (params: { organization: string }) => {
180 ); 180 );
181 }; 181 };
182 182
  183 +// 获取网关设备
183 export const getGATEWAY = (tbDeviceId: string) => { 184 export const getGATEWAY = (tbDeviceId: string) => {
184 return defHttp.get({ 185 return defHttp.get({
185 url: '/device/gateway/' + tbDeviceId, 186 url: '/device/gateway/' + tbDeviceId,
186 }); 187 });
187 }; 188 };
  189 +
  190 +// 获取子设备的分页
  191 +export const getChildDevicePage = (params: ChildDeviceParams) => {
  192 + console.log(params);
  193 + return defHttp.get({
  194 + url: '/device/relation',
  195 + params,
  196 + });
  197 +};
@@ -41,3 +41,7 @@ export interface DeviceProfileModel { @@ -41,3 +41,7 @@ export interface DeviceProfileModel {
41 createTime: string; 41 createTime: string;
42 description: string; 42 description: string;
43 } 43 }
  44 +
  45 +export type ChildDeviceParams = BasicPageParams & {
  46 + formId: string;
  47 +};
@@ -48,10 +48,18 @@ export async function deleteTenantProfileApi(params?: DeleteTenantProfilesParam) @@ -48,10 +48,18 @@ export async function deleteTenantProfileApi(params?: DeleteTenantProfilesParam)
48 48
49 export const getTableTenantProfileApi = (params?: QueryTenantProfilesParam) => { 49 export const getTableTenantProfileApi = (params?: QueryTenantProfilesParam) => {
50 return defHttp.get({ 50 return defHttp.get({
51 - params: params,  
52 url: Api.getTenantProfile, 51 url: Api.getTenantProfile,
  52 + params,
53 }); 53 });
54 }; 54 };
  55 +export const selectTenantProfileApi = async (params?: QueryTenantProfilesParam) => {
  56 + const { items } = await getTableTenantProfileApi(params);
  57 + items.forEach((item) => {
  58 + item.label = item.name;
  59 + item.value = item.id.id;
  60 + });
  61 + return Promise.resolve<any[]>(items);
  62 +};
55 63
56 export async function saveTenantProfileApi(params: tenantProfileDTO) { 64 export async function saveTenantProfileApi(params: tenantProfileDTO) {
57 await defHttp.post( 65 await defHttp.post(
@@ -75,33 +83,33 @@ export function getTenantAdminPage(params: TenantAdminPageRequestParams) { @@ -75,33 +83,33 @@ export function getTenantAdminPage(params: TenantAdminPageRequestParams) {
75 83
76 export async function saveTenantAdmin(params: UserDTO) { 84 export async function saveTenantAdmin(params: UserDTO) {
77 await defHttp.post({ 85 await defHttp.post({
78 - params: params, 86 + params,
79 url: Api.saveTenantAdmin, 87 url: Api.saveTenantAdmin,
80 }); 88 });
81 } 89 }
82 90
83 export async function updateOrCreateTenant(params: TenantRequestDTO) { 91 export async function updateOrCreateTenant(params: TenantRequestDTO) {
84 await defHttp.post({ 92 await defHttp.post({
85 - params: params,  
86 url: Api.updateOrCreateTenant, 93 url: Api.updateOrCreateTenant,
  94 + params,
87 }); 95 });
88 } 96 }
89 97
90 export async function deleteTenant(tenantIds: Array<string>) { 98 export async function deleteTenant(tenantIds: Array<string>) {
91 await defHttp.delete({ 99 await defHttp.delete({
  100 + url: Api.deleteTenant,
92 data: { 101 data: {
93 ids: tenantIds, 102 ids: tenantIds,
94 }, 103 },
95 - url: Api.deleteTenant,  
96 }); 104 });
97 } 105 }
98 106
99 export async function deleteTenantAdmin(adminIds: Array<string>) { 107 export async function deleteTenantAdmin(adminIds: Array<string>) {
100 await defHttp.delete({ 108 await defHttp.delete({
  109 + url: Api.deleteTenantAdmin,
101 data: { 110 data: {
102 ids: adminIds, 111 ids: adminIds,
103 }, 112 },
104 - url: Api.deleteTenantAdmin,  
105 }); 113 });
106 } 114 }
107 115
@@ -113,7 +121,7 @@ export async function resetPassword(params: string) { @@ -113,7 +121,7 @@ export async function resetPassword(params: string) {
113 121
114 export async function sendMessageOrEmail(params: SendResetPasswordEmailMsg) { 122 export async function sendMessageOrEmail(params: SendResetPasswordEmailMsg) {
115 await defHttp.post({ 123 await defHttp.post({
116 - params: params, 124 + params,
117 url: Api.sendMessageOrEmail, 125 url: Api.sendMessageOrEmail,
118 }); 126 });
119 } 127 }
@@ -216,16 +216,22 @@ export const alarmSchemasForm: FormSchema[] = [ @@ -216,16 +216,22 @@ export const alarmSchemasForm: FormSchema[] = [
216 // 子设备 216 // 子设备
217 export const childDeviceSchemas: FormSchema[] = [ 217 export const childDeviceSchemas: FormSchema[] = [
218 { 218 {
219 - field: 'icon',  
220 - label: '设备配置',  
221 - component: 'Select', 219 + field: 'deviceState',
  220 + label: '设备状态',
222 colProps: { span: 6 }, 221 colProps: { span: 6 },
  222 + component: 'Select',
223 componentProps: { 223 componentProps: {
  224 + size: 'small',
224 maxLength: 255, 225 maxLength: 255,
  226 + options: [
  227 + { label: '待激活', value: 'INACTIVE' },
  228 + { label: '在线', value: 'ONLINE' },
  229 + { label: '离线', value: 'OFFLINE' },
  230 + ],
225 }, 231 },
226 }, 232 },
227 { 233 {
228 - field: 'icon', 234 + field: 'name',
229 label: '设备名称', 235 label: '设备名称',
230 component: 'Input', 236 component: 'Input',
231 colProps: { span: 6 }, 237 colProps: { span: 6 },
@@ -238,32 +244,30 @@ export const childDeviceSchemas: FormSchema[] = [ @@ -238,32 +244,30 @@ export const childDeviceSchemas: FormSchema[] = [
238 export const childDeviceColumns: BasicColumn[] = [ 244 export const childDeviceColumns: BasicColumn[] = [
239 { 245 {
240 title: '名称', 246 title: '名称',
241 - dataIndex: 'name', 247 + dataIndex: 'tbDeviceName',
242 width: 120, 248 width: 120,
243 }, 249 },
244 { 250 {
245 - title: '设备配置',  
246 - dataIndex: 'label',  
247 - width: 100,  
248 - },  
249 - {  
250 title: '标签', 251 title: '标签',
251 - dataIndex: 'aaa', 252 + dataIndex: 'label',
252 width: 160, 253 width: 160,
253 }, 254 },
254 { 255 {
255 title: '状态', 256 title: '状态',
256 - dataIndex: 'bbb', 257 + dataIndex: 'deviceState',
  258 + slots: { customRender: 'deviceState' },
257 width: 160, 259 width: 160,
258 }, 260 },
259 { 261 {
260 title: '最后连接时间', 262 title: '最后连接时间',
261 - dataIndex: 'ccc', 263 + dataIndex: 'lastOnlineTime',
  264 + format: (text) => formatToDateTime(text, 'YYYY-MM-DD HH:mm:ss'),
262 width: 160, 265 width: 160,
263 }, 266 },
264 { 267 {
265 - title: '创建时间',  
266 - dataIndex: 'ddd', 268 + title: '更新时间',
  269 + dataIndex: 'createdTime',
  270 + format: (text) => formatToDateTime(text, 'YYYY-MM-DD HH:mm:ss'),
267 width: 160, 271 width: 160,
268 }, 272 },
269 ]; 273 ];
@@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
7 centered 7 centered
8 @ok="dispatchCustomer" 8 @ok="dispatchCustomer"
9 @cancel="resetFields" 9 @cancel="resetFields"
10 - :minHeight="150" 10 + :minHeight="100"
11 okText="分配" 11 okText="分配"
12 > 12 >
13 <BasicForm @register="registerForm" /> 13 <BasicForm @register="registerForm" />
@@ -17,8 +17,8 @@ @@ -17,8 +17,8 @@
17 /></TabPane> 17 /></TabPane>
18 <TabPane key="3" tab="告警"><Alarm :id="deviceDetail.id" /></TabPane> 18 <TabPane key="3" tab="告警"><Alarm :id="deviceDetail.id" /></TabPane>
19 <TabPane key="4" tab="子设备" v-if="deviceDetail?.deviceType === 'GATEWAY'" 19 <TabPane key="4" tab="子设备" v-if="deviceDetail?.deviceType === 'GATEWAY'"
20 - ><ChildDevice  
21 - /></TabPane> 20 + ><ChildDevice :fromId="deviceDetail?.tbDeviceId" />
  21 + </TabPane>
22 </Tabs> 22 </Tabs>
23 </BasicDrawer> 23 </BasicDrawer>
24 </template> 24 </template>
@@ -61,6 +61,7 @@ @@ -61,6 +61,7 @@
61 deviceDetailRef.value.initMap(longitude, latitude, address); 61 deviceDetailRef.value.initMap(longitude, latitude, address);
62 } 62 }
63 }); 63 });
  64 +
64 const closeDrawer = () => { 65 const closeDrawer = () => {
65 activeKey.value = '1'; 66 activeKey.value = '1';
66 }; 67 };
@@ -10,9 +10,9 @@ @@ -10,9 +10,9 @@
10 centered 10 centered
11 > 11 >
12 <div class="step-form-form"> 12 <div class="step-form-form">
13 - <Steps :current="current">  
14 - <Step title="填写设备信息" v-if="!isUpdate" />  
15 - <Step title="添加设备凭证" v-if="!isUpdate" /> 13 + <Steps :current="current" v-if="!isUpdate">
  14 + <Step title="填写设备信息" />
  15 + <Step title="添加设备凭证" />
16 </Steps> 16 </Steps>
17 </div> 17 </div>
18 <div class="mt-5"> 18 <div class="mt-5">
1 <template> 1 <template>
2 - <BasicTable @register="registerTable" /> 2 + <BasicTable @register="registerTable">
  3 + <template #deviceState="{ record }">
  4 + <Tag
  5 + :color="
  6 + record.deviceState == DeviceState.INACTIVE
  7 + ? 'warning'
  8 + : record.deviceState == DeviceState.ONLINE
  9 + ? 'success'
  10 + : 'error'
  11 + "
  12 + class="ml-2"
  13 + >
  14 + {{
  15 + record.deviceState == DeviceState.INACTIVE
  16 + ? '待激活'
  17 + : record.deviceState == DeviceState.ONLINE
  18 + ? '在线'
  19 + : '离线'
  20 + }}
  21 + </Tag>
  22 + </template>
  23 + </BasicTable>
3 </template> 24 </template>
4 <script lang="ts"> 25 <script lang="ts">
5 - import { defineComponent } from 'vue'; 26 + import { defineComponent, onMounted } from 'vue';
  27 + import { Tag } from 'ant-design-vue';
  28 + import { DeviceState } from '/@/api/device/model/deviceModel';
6 import { BasicTable, useTable } from '/@/components/Table'; 29 import { BasicTable, useTable } from '/@/components/Table';
7 import { childDeviceColumns, childDeviceSchemas } from '../../config/detail.config'; 30 import { childDeviceColumns, childDeviceSchemas } from '../../config/detail.config';
8 - 31 + import { getChildDevicePage } from '/@/api/device/deviceManager.ts';
9 export default defineComponent({ 32 export default defineComponent({
10 name: 'DeviceManagement', 33 name: 'DeviceManagement',
11 components: { 34 components: {
12 BasicTable, 35 BasicTable,
  36 + Tag,
  37 + },
  38 + props: {
  39 + fromId: {
  40 + type: String,
  41 + required: true,
  42 + },
13 }, 43 },
14 - setup(_) { 44 + setup(props) {
  45 + console.log(123);
  46 + onMounted(() => {
  47 + console.log(props.fromId);
  48 + });
15 const [registerTable] = useTable({ 49 const [registerTable] = useTable({
  50 + api: getChildDevicePage,
16 columns: childDeviceColumns, 51 columns: childDeviceColumns,
17 formConfig: { 52 formConfig: {
18 labelWidth: 120, 53 labelWidth: 120,
19 schemas: childDeviceSchemas, 54 schemas: childDeviceSchemas,
20 }, 55 },
  56 + beforeFetch: (data) => {
  57 + console.log(props.fromId);
  58 + Reflect.set(data, 'fromId', props.fromId);
  59 + },
21 useSearchForm: true, 60 useSearchForm: true,
22 showTableSetting: true, 61 showTableSetting: true,
23 bordered: true, 62 bordered: true,
@@ -26,6 +65,7 @@ @@ -26,6 +65,7 @@
26 65
27 return { 66 return {
28 registerTable, 67 registerTable,
  68 + DeviceState,
29 }; 69 };
30 }, 70 },
31 }); 71 });
@@ -207,7 +207,7 @@ @@ -207,7 +207,7 @@
207 } 207 }
208 208
209 function handleDelete(record: Recordable) { 209 function handleDelete(record: Recordable) {
210 - let ids = [record.id]; 210 + const ids = [record.id];
211 deleteDevice(ids).then(() => { 211 deleteDevice(ids).then(() => {
212 createMessage.success('删除设备成功'); 212 createMessage.success('删除设备成功');
213 handleSuccess(); 213 handleSuccess();
@@ -97,9 +97,7 @@ @@ -97,9 +97,7 @@
97 getTenantRoles(data.record.tenantId).then((result) => { 97 getTenantRoles(data.record.tenantId).then((result) => {
98 Reflect.set(data.record, 'roleIds', result); 98 Reflect.set(data.record, 'roleIds', result);
99 //为表单赋值 99 //为表单赋值
100 - setFieldsValue({  
101 - ...data.record,  
102 - }); 100 + setFieldsValue(data.record);
103 tenantLogo.value = data.record.icon; 101 tenantLogo.value = data.record.icon;
104 //编辑模式,菜单名称为不可用 102 //编辑模式,菜单名称为不可用
105 updateSchema({ field: 'title', componentProps: { disabled: true } }); 103 updateSchema({ field: 'title', componentProps: { disabled: true } });
@@ -130,6 +128,10 @@ @@ -130,6 +128,10 @@
130 typeof values.tenantExpireTime != 'undefined' && values.tenantExpireTime != null 128 typeof values.tenantExpireTime != 'undefined' && values.tenantExpireTime != null
131 ? values.tenantExpireTime.format('YYYY-MM-DD HH:mm:ss') 129 ? values.tenantExpireTime.format('YYYY-MM-DD HH:mm:ss')
132 : null, 130 : null,
  131 + tenantProfileId: {
  132 + id: values.tenantProfileId,
  133 + entityType: 'TENANT_PROFILE',
  134 + },
133 }; 135 };
134 updateOrCreateTenant(req).then(() => { 136 updateOrCreateTenant(req).then(() => {
135 closeDrawer(); //关闭侧框 137 closeDrawer(); //关闭侧框
1 import { BasicColumn } from '/@/components/Table/src/types/table'; 1 import { BasicColumn } from '/@/components/Table/src/types/table';
2 import { FormSchema } from '/@/components/Form'; 2 import { FormSchema } from '/@/components/Form';
3 import { getAllRoleList } from '/@/api/system/system'; 3 import { getAllRoleList } from '/@/api/system/system';
  4 +import { selectTenantProfileApi } from '/@/api/tenant/tenantApi';
4 import { RoleEnum } from '/@/enums/roleEnum'; 5 import { RoleEnum } from '/@/enums/roleEnum';
5 6
6 export function getBasicColumns(): BasicColumn[] { 7 export function getBasicColumns(): BasicColumn[] {
@@ -49,7 +50,6 @@ export const tenantFormSchema: FormSchema[] = [ @@ -49,7 +50,6 @@ export const tenantFormSchema: FormSchema[] = [
49 componentProps: { 50 componentProps: {
50 maxLength: 36, 51 maxLength: 36,
51 }, 52 },
52 -  
53 show: false, 53 show: false,
54 }, 54 },
55 { 55 {
@@ -76,7 +76,7 @@ export const tenantFormSchema: FormSchema[] = [ @@ -76,7 +76,7 @@ export const tenantFormSchema: FormSchema[] = [
76 }, 76 },
77 { 77 {
78 field: 'icon', 78 field: 'icon',
79 - label: '租户图标: ', 79 + label: '租户图标',
80 slot: 'iconSelect', 80 slot: 'iconSelect',
81 component: 'Input', 81 component: 'Input',
82 componentProps: { 82 componentProps: {
@@ -98,7 +98,7 @@ export const tenantFormSchema: FormSchema[] = [ @@ -98,7 +98,7 @@ export const tenantFormSchema: FormSchema[] = [
98 }, 98 },
99 { 99 {
100 field: 'name', 100 field: 'name',
101 - label: '租户名称:', 101 + label: '租户名称',
102 required: true, 102 required: true,
103 component: 'Input', 103 component: 'Input',
104 componentProps: { 104 componentProps: {
@@ -107,7 +107,7 @@ export const tenantFormSchema: FormSchema[] = [ @@ -107,7 +107,7 @@ export const tenantFormSchema: FormSchema[] = [
107 }, 107 },
108 { 108 {
109 field: 'roleIds', 109 field: 'roleIds',
110 - label: '租户角色:', 110 + label: '租户角色',
111 component: 'ApiSelect', 111 component: 'ApiSelect',
112 required: true, 112 required: true,
113 componentProps: { 113 componentProps: {
@@ -121,6 +121,20 @@ export const tenantFormSchema: FormSchema[] = [ @@ -121,6 +121,20 @@ export const tenantFormSchema: FormSchema[] = [
121 }, 121 },
122 }, 122 },
123 { 123 {
  124 + field: 'tenantProfileId',
  125 + label: '租户配置',
  126 + component: 'ApiSelect',
  127 + required: true,
  128 + componentProps: {
  129 + api: selectTenantProfileApi,
  130 + showSearch: true,
  131 + params: {
  132 + page: 1,
  133 + pageSize: 100,
  134 + },
  135 + },
  136 + },
  137 + {
124 field: 'enabled', 138 field: 'enabled',
125 label: '状态', 139 label: '状态',
126 component: 'RadioButtonGroup', 140 component: 'RadioButtonGroup',
@@ -134,7 +148,7 @@ export const tenantFormSchema: FormSchema[] = [ @@ -134,7 +148,7 @@ export const tenantFormSchema: FormSchema[] = [
134 }, 148 },
135 { 149 {
136 field: 'tenantExpireTime', 150 field: 'tenantExpireTime',
137 - label: '有效期: ', 151 + label: '有效期',
138 component: 'DatePicker', 152 component: 'DatePicker',
139 componentProps: { 153 componentProps: {
140 showTime: true, 154 showTime: true,
@@ -142,7 +156,7 @@ export const tenantFormSchema: FormSchema[] = [ @@ -142,7 +156,7 @@ export const tenantFormSchema: FormSchema[] = [
142 }, 156 },
143 }, 157 },
144 { 158 {
145 - label: '备注: ', 159 + label: '备注',
146 field: 'description', 160 field: 'description',
147 component: 'InputTextArea', 161 component: 'InputTextArea',
148 componentProps: { 162 componentProps: {