Commit 8e597b2ec289fab341397b3ad020afa20f97d43b

Authored by xp.Huang
2 parents 3f0216b6 ce74b1e2

Merge branch 'local_dev_ft' into 'main'

feat:产品详情新增设备类型数量跳转到设备列表

See merge request huang/yun-teng-iot-front!454
... ... @@ -155,6 +155,7 @@ export interface DeviceRecord {
155 155 transportType: string;
156 156 provisionType: string;
157 157 deviceType: string;
  158 + deviceCount: number;
158 159 tbProfileId: string;
159 160 profileData: ProfileData;
160 161 defaultQueueName: string;
... ...
... ... @@ -13,4 +13,5 @@ export const PageEnum = {
13 13 MESSAGE_CONFIG: '/message/config',
14 14 //设备配置
15 15 DEVICE_PROFILE: '/product/profiles',
  16 + DEVICE_LIST: '/device/list',
16 17 };
... ...
... ... @@ -2,6 +2,7 @@ import { formatToDate } from '/@/utils/dateUtil';
2 2 import { BasicColumn } from '/@/components/Table';
3 3 import { FormSchema } from '/@/components/Table';
4 4 import { DeviceTypeEnum, DeviceState } from '/@/api/device/model/deviceModel';
  5 +import { deviceProfile } from '/@/api/device/deviceManager';
5 6
6 7 // 表格列数据
7 8 export const columns: BasicColumn[] = [
... ... @@ -105,4 +106,39 @@ export const searchFormSchema: FormSchema[] = [
105 106 },
106 107 colProps: { span: 6 },
107 108 },
  109 + {
  110 + field: 'deviceProfileId',
  111 + label: '产品',
  112 + component: 'ApiSearchSelect',
  113 + colProps: { span: 6 },
  114 + componentProps: () => {
  115 + return {
  116 + showSearch: true,
  117 + labelField: 'name',
  118 + valueField: 'id',
  119 + resultField: 'data',
  120 + placeholder: '请选择产品',
  121 + api: async () => {
  122 + const data = await deviceProfile({ params: '' });
  123 + const returnData = data.map((m) => {
  124 + return {
  125 + name: m.name,
  126 + id: m.id,
  127 + };
  128 + });
  129 + return returnData;
  130 + },
  131 + searchApi: async (params: Recordable) => {
  132 + const data = await deviceProfile({ textSearch: params.text });
  133 + const returnData = data.map((m) => {
  134 + return {
  135 + name: m.name,
  136 + id: m.id,
  137 + };
  138 + });
  139 + return returnData;
  140 + },
  141 + };
  142 + },
  143 + },
108 144 ];
... ...
... ... @@ -164,7 +164,7 @@
164 164 </div>
165 165 </template>
166 166 <script lang="ts">
167   - import { defineComponent, reactive, unref, nextTick, h } from 'vue';
  167 + import { defineComponent, reactive, unref, nextTick, h, onUnmounted, ref } from 'vue';
168 168 import { DeviceState, DeviceTypeEnum } from '/@/api/device/model/deviceModel';
169 169 import { BasicTable, useTable, TableAction, TableImg } from '/@/components/Table';
170 170 import { columns, searchFormSchema } from './config/device.data';
... ... @@ -215,6 +215,7 @@
215 215 setup(_) {
216 216 const { createMessage } = useMessage();
217 217 const go = useGo();
  218 + const immediateStatus = ref(false);
218 219 const searchInfo = reactive<Recordable>({});
219 220 const { organizationIdTreeRef, resetFn } = useResetOrganizationTree(searchInfo);
220 221 const [registerModal, { openModal }] = useModal();
... ... @@ -223,29 +224,31 @@
223 224 const [registerTbDetailDrawer, { openDrawer: openTbDeviceDrawer }] = useDrawer();
224 225 const [registerGatewayDetailDrawer, { openDrawer: openGatewayDetailDrawer }] = useDrawer();
225 226
226   - const [registerTable, { reload, setSelectedRowKeys, setProps }] = useTable({
227   - title: '设备列表',
228   - api: devicePage,
229   - columns,
230   - formConfig: {
231   - labelWidth: 100,
232   - schemas: searchFormSchema,
233   - resetFunc: resetFn,
234   - },
235   - useSearchForm: true,
236   - showTableSetting: true,
237   - bordered: true,
238   - showIndexColumn: false,
239   - rowKey: 'id',
240   - searchInfo: searchInfo,
241   - clickToRowSelect: false,
242   - actionColumn: {
243   - width: 200,
244   - title: '操作',
245   - slots: { customRender: 'action' },
246   - fixed: 'right',
247   - },
248   - });
  227 + const [registerTable, { reload, setSelectedRowKeys, setProps, setTableData, getForm }] =
  228 + useTable({
  229 + title: '设备列表',
  230 + api: devicePage,
  231 + immediate: immediateStatus.value,
  232 + columns,
  233 + formConfig: {
  234 + labelWidth: 100,
  235 + schemas: searchFormSchema,
  236 + resetFunc: resetFn,
  237 + },
  238 + useSearchForm: true,
  239 + showTableSetting: true,
  240 + bordered: true,
  241 + showIndexColumn: false,
  242 + rowKey: 'id',
  243 + searchInfo: searchInfo,
  244 + clickToRowSelect: false,
  245 + actionColumn: {
  246 + width: 200,
  247 + title: '操作',
  248 + slots: { customRender: 'action' },
  249 + fixed: 'right',
  250 + },
  251 + });
249 252 const { hasBatchDelete, handleDeleteOrBatchDelete, selectionOptions, resetSelectedRowKeys } =
250 253 useBatchDelete(deleteDevice, handleSuccess, setProps);
251 254 selectionOptions.rowSelection.getCheckboxProps = (record: Recordable) => {
... ... @@ -260,6 +263,49 @@
260 263 setProps(selectionOptions);
261 264 });
262 265
  266 + function getParams(keyword) {
  267 + const reg = new RegExp('(^|&)' + keyword + '=([^&]*)(&|$)', 'i');
  268 + const r = window.location.search.substr(1).match(reg);
  269 + if (r != null) return unescape(r[2]);
  270 + return null; //注意此处参数是中文,解码使用的方法是unescape ,那么在传值的时候如果是中文,需要使用escape('曲浩')方法来编码。
  271 + }
  272 +
  273 + const count = ref(0);
  274 + const onCloseVal = ref(0);
  275 + const deviceProfileId = ref('');
  276 + count.value = Number(getParams('count'));
  277 + deviceProfileId.value = getParams('deviceProfileId') || '';
  278 + console.log(deviceProfileId.value);
  279 + const setRowClassName = async () => {
  280 + if (deviceProfileId.value !== undefined) {
  281 + const { items } = await devicePage({
  282 + page: 1,
  283 + pageSize: count.value === 0 ? 10 : count.value,
  284 + deviceProfileId: deviceProfileId.value,
  285 + });
  286 + nextTick(() => {
  287 + setTableData(items);
  288 + const { setFieldsValue, resetFields } = getForm();
  289 + setFieldsValue({
  290 + deviceProfileId: deviceProfileId.value,
  291 + });
  292 + if (onCloseVal.value == 1) {
  293 + resetFields();
  294 + }
  295 + });
  296 + } else {
  297 + setTimeout(() => {
  298 + reload();
  299 + }, 80);
  300 + }
  301 + };
  302 + setRowClassName();
  303 + onUnmounted(() => {
  304 + deviceProfileId.value = '';
  305 + count.value = 10;
  306 + onCloseVal.value = 1;
  307 + });
  308 +
263 309 const userInfo: any = getAuthCache(USER_INFO_KEY);
264 310 const role: string = userInfo.roles[0];
265 311
... ...
... ... @@ -44,8 +44,8 @@
44 44 const DevConStRef = ref<InstanceType<typeof ProductDescription>>();
45 45 const TransConStRef = ref<InstanceType<typeof TransportConfigurationStep>>();
46 46
47   - const setDeviceConfFormData = async () => {
48   - unref(DevConStRef)?.renderProductInfo();
  47 + const setDeviceConfFormData = async (record) => {
  48 + unref(DevConStRef)?.renderProductInfo(record);
49 49 };
50 50 const setTransConfFormData = async (res: Recordable) => {
51 51 await nextTick();
... ... @@ -56,7 +56,7 @@
56 56 activeKey.value = 'product';
57 57 record.value = data.record;
58 58 record.value = await deviceConfigGetDetail(data.record.id);
59   - setDeviceConfFormData();
  59 + setDeviceConfFormData(record.value);
60 60 });
61 61
62 62 const handlePanelChange = (activeKey: ActiveKey) => {
... ...
... ... @@ -9,12 +9,16 @@
9 9 import { Description, useDescription } from '/@/components/Description';
10 10 import { to } from '/@/utils/to';
11 11 import productDefaultImage from '/@/assets/icons/product-default.svg';
  12 + import { Button } from '/@/components/Button';
  13 + import { useGo } from '/@/hooks/web/usePage';
  14 + import { PageEnum } from '/@/enums/pageEnum';
12 15
13 16 const loading = ref(false);
14 17
15 18 const props = defineProps<{
16 19 record: DeviceRecord;
17 20 }>();
  21 + const go = useGo();
18 22
19 23 const data = ref<DeviceRecord>({} as unknown as DeviceRecord);
20 24
... ... @@ -33,6 +37,27 @@
33 37 {
34 38 field: 'deviceType',
35 39 label: '设备类型',
  40 + render: (_, data) => {
  41 + console.log(data);
  42 + return h(
  43 + Button,
  44 + {
  45 + type: 'link',
  46 + style: { marginLeft: -8 + 'px' },
  47 + size: 'small',
  48 + onClick: () => {
  49 + go(
  50 + PageEnum.DEVICE_LIST +
  51 + '?count=' +
  52 + data.deviceCount +
  53 + '&deviceProfileId=' +
  54 + data.id
  55 + );
  56 + },
  57 + },
  58 + () => `${data.deviceType}(${data.deviceCount})`
  59 + );
  60 + },
36 61 },
37 62 {
38 63 field: 'name',
... ... @@ -87,19 +112,30 @@
87 112 return {};
88 113 };
89 114
  115 + async function getValues() {
  116 + const { defaultRuleChainId, deviceType, defaultQueueName } = props.record;
  117 + return await Promise.all([
  118 + findDeviceType(deviceType),
  119 + findHandleQueue(defaultQueueName),
  120 + findRuleChain(defaultRuleChainId),
  121 + ]);
  122 + }
  123 +
90 124 const renderProductInfo = async () => {
91 125 try {
92 126 data.value = {} as unknown as DeviceRecord;
93 127 loading.value = true;
94   - const { defaultRuleChainId, deviceType, defaultQueueName } = props.record;
95   - data.value = props.record;
96   - const values = await Promise.all([
97   - findDeviceType(deviceType),
98   - findHandleQueue(defaultQueueName),
99   - findRuleChain(defaultRuleChainId),
100   - ]);
  128 + const values = await getValues();
  129 + // const { defaultRuleChainId, deviceType, defaultQueueName } = props.record;
  130 + // data.value = props.record;
  131 + // const values = await Promise.all([
  132 + // findDeviceType(deviceType),
  133 + // findHandleQueue(defaultQueueName),
  134 + // findRuleChain(defaultRuleChainId),
  135 + // ]);
101 136 const value = values.reduce((prev, next) => ({ ...prev, ...next }), {});
102   - data.value = Object.assign(unref(data), value);
  137 + data.value = Object.assign(unref(data), props.record, value);
  138 + console.log(data.value);
103 139 setDescProps({ data: unref(data) });
104 140 } catch (error) {
105 141 throw error;
... ...
... ... @@ -40,6 +40,8 @@
40 40 import { FileItem } from '/@/components/Upload/src/typing';
41 41 import { upload } from '/@/api/oss/ossFileUploader';
42 42 import { getTenantRoles, updateOrCreateTenant } from '/@/api/tenant/tenantApi';
  43 + import { useMessage } from '/@/hooks/web/useMessage';
  44 +
43 45 export default defineComponent({
44 46 name: 'TenantDrawer',
45 47 components: {
... ... @@ -52,6 +54,7 @@
52 54 emits: ['success', 'register'],
53 55 setup(_, { emit }) {
54 56 const loading = ref(false);
  57 + const { createMessage } = useMessage();
55 58
56 59 const isUpdate = ref(true);
57 60 const tenantLogo = ref('');
... ... @@ -141,6 +144,7 @@
141 144 };
142 145 await updateOrCreateTenant(req);
143 146 emit('success');
  147 + createMessage.success(`${unref(isUpdate) ? '编辑' : '新增'}成功`);
144 148 closeDrawer(); //关闭侧框
145 149 } catch (e) {
146 150 if ((e as { code: string }).code === 'ECONNABORTED') {
... ...