From ac62778a2fdaea68fb896feaebc7d2eeb42d30bd Mon Sep 17 00:00:00 2001 From: blp <2962632571@qq.com> Date: Mon, 30 Jan 2023 18:12:42 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E7=89=A9=E8=81=94?= =?UTF-8?q?=E5=8D=A1=E5=88=97=E8=A1=A8=E5=8D=A1=E7=89=87=E3=80=81=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E3=80=81=E5=AF=BC=E5=85=A5=E3=80=81=E7=BB=91=E5=AE=9A?= =?UTF-8?q?=E8=AE=BE=E5=A4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/images/iot-card/iot-card-bg.png | Bin 0 -> 3944 bytes src/api/iot-card/cardManagement.ts | 35 ++- src/components/CardBox/index.vue | 11 + src/utils/utils.ts | 11 + .../iot-card/CardManagement/BindDevice.vue | 155 +++++++++++++ src/views/iot-card/CardManagement/Export.vue | 65 ++++++ src/views/iot-card/CardManagement/Import.vue | 157 +++++++++++++ src/views/iot-card/CardManagement/index.vue | 210 +++++++++++++++++- src/views/iot-card/CardManagement/typing.d.ts | 20 ++ 9 files changed, 657 insertions(+), 7 deletions(-) create mode 100644 public/images/iot-card/iot-card-bg.png create mode 100644 src/views/iot-card/CardManagement/BindDevice.vue create mode 100644 src/views/iot-card/CardManagement/Export.vue create mode 100644 src/views/iot-card/CardManagement/Import.vue create mode 100644 src/views/iot-card/CardManagement/typing.d.ts diff --git a/public/images/iot-card/iot-card-bg.png b/public/images/iot-card/iot-card-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..7b47b0e0df202175dc94d5e5ff6b474c33695141 GIT binary patch literal 3944 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 server.get(`/network/card/state/_sync`); * 批量删除物联卡 * @param data */ -export const removeCards = (data: any) => server.post(`/network/card/batch/_delete`, data); \ No newline at end of file +export const removeCards = (data: any) => server.post(`/network/card/batch/_delete`, data); + +/** + * 解绑设备 + * @param cardId + */ +export const unbind = (cardId: string) => server.get(`/network/card/${cardId}/_unbind`); + +/** + * 分页查询未绑定设备列表 + * @param data +*/ +export const queryUnbounded = (data: any) => server.post(`/network/card/unbounded/device/_query`, data); + +/** + * 绑定设备 + * @param cardId + * @param deviceId 选择的设备id + */ +export const bind = (cardId: string | any, deviceId: string) => server.get(`/network/card/${cardId}/${deviceId}/_bind`); + +/** + * 导入物联卡实例 + * @param configId 对接平台id + * @param params + */ +export const _import = (configId: any, params: any) => server.get(`/network/card/${configId}/_import`, params); + +/** + * 根据id批量导出 + * @param format 类型 xlsx、csv + * @param params + */ +export const _export = (format: string, data: any) => server.post(`/network/card/download.${format}/_query`, data, 'blob'); \ No newline at end of file diff --git a/src/components/CardBox/index.vue b/src/components/CardBox/index.vue index b3449223..cb958ce7 100644 --- a/src/components/CardBox/index.vue +++ b/src/components/CardBox/index.vue @@ -232,6 +232,17 @@ const handleClick = () => { :deep(.card-item-content-title) { cursor: pointer; } + + :deep(.card-item-heard-name) { + font-weight: 700; + font-size: 16px; + margin-bottom: 12px; + } + + :deep(.card-item-content-text) { + color: rgba(0, 0, 0, 0.75); + font-size: 12px; + } } .card-mask { diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 239ee90f..d9d3e290 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -54,6 +54,17 @@ export const downloadObject = (record: Record, fileName: string, fo formElement.submit(); document.body.removeChild(formElement); }; + +export const downloadFileByUrl = (url: string, name: string, type: string) => { + const downNode = document.createElement('a'); + downNode.style.display = 'none'; + downNode.download = `${name}.${type}`; + downNode.href = url; + document.body.appendChild(downNode); + downNode.click(); + document.body.removeChild(downNode); +}; + // 是否不是community版本 export const isNoCommunity = !(localStorage.getItem(SystemConst.VERSION_CODE) === 'community'); diff --git a/src/views/iot-card/CardManagement/BindDevice.vue b/src/views/iot-card/CardManagement/BindDevice.vue new file mode 100644 index 00000000..cdf48031 --- /dev/null +++ b/src/views/iot-card/CardManagement/BindDevice.vue @@ -0,0 +1,155 @@ + + + + + + diff --git a/src/views/iot-card/CardManagement/Export.vue b/src/views/iot-card/CardManagement/Export.vue new file mode 100644 index 00000000..5f20c55f --- /dev/null +++ b/src/views/iot-card/CardManagement/Export.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/src/views/iot-card/CardManagement/Import.vue b/src/views/iot-card/CardManagement/Import.vue new file mode 100644 index 00000000..0ca75bca --- /dev/null +++ b/src/views/iot-card/CardManagement/Import.vue @@ -0,0 +1,157 @@ + + + + + diff --git a/src/views/iot-card/CardManagement/index.vue b/src/views/iot-card/CardManagement/index.vue index 6ab563d4..3cf85c36 100644 --- a/src/views/iot-card/CardManagement/index.vue +++ b/src/views/iot-card/CardManagement/index.vue @@ -103,6 +103,113 @@ + + @@ -204,16 +325,25 @@ import { resumptionBatch, sync, removeCards, + unbind, } from '@/api/iot-card/cardManagement'; import { message } from 'ant-design-vue'; +import type { CardManagement } from './typing'; +import { getImage } from '@/utils/comm'; +import BindDevice from './BindDevice.vue'; +import Import from './Import.vue'; +import Export from './Export.vue'; const cardManageRef = ref>({}); const params = ref>({}); const _selectedRowKeys = ref([]); const _selectedRow = ref([]); +const bindDeviceVisible = ref(false); const visible = ref(false); const exportVisible = ref(false); const importVisible = ref(false); +const cardId = ref(); +const current = ref>({}); const columns = [ { @@ -239,9 +369,10 @@ const columns = [ }, { title: '绑定设备', - dataIndex: 'deviceName', - key: 'deviceName', + dataIndex: 'deviceId', + key: 'deviceId', ellipsis: true, + scopedSlots: true, width: 200, }, { @@ -360,7 +491,10 @@ const columns = [ }, ]; -const getActions = (data: Partial>): ActionsType[] => { +const getActions = ( + data: Partial>, + type: 'card' | 'table', +): ActionsType[] => { if (!data) return []; return [ { @@ -386,6 +520,25 @@ const getActions = (data: Partial>): ActionsType[] => { title: data.deviceId ? '解绑设备' : '绑定设备', }, icon: data.deviceId ? 'DisconnectOutlined' : 'LinkOutlined', + popConfirm: data.deviceId + ? { + title: '确认解绑设备?', + onConfirm: async () => { + unbind(data.id).then((resp: any) => { + if (resp.status === 200) { + message.success('操作成功'); + cardManageRef.value?.reload(); + } + }); + }, + } + : undefined, + onClick: () => { + if (!data.deviceId) { + bindDeviceVisible.value = true; + cardId.value = data.id; + } + }, }, { key: 'activation', @@ -479,11 +632,38 @@ const cancelSelect = () => { _selectedRowKeys.value = []; }; +const handleClick = (dt: any) => { + if (_selectedRowKeys.value.includes(dt.id)) { + const _index = _selectedRowKeys.value.findIndex((i) => i === dt.id); + _selectedRowKeys.value.splice(_index, 1); + } else { + _selectedRowKeys.value = [..._selectedRowKeys.value, dt.id]; + } +}; + +/** + * 查看 + */ +const handleView = (id: string) => { + message.warn(id + '暂未开发'); +}; + /** * 新增 */ const handleAdd = () => {}; +/** + * 绑定设备关闭窗口 + */ +const bindDevice = (val: boolean) => { + bindDeviceVisible.value = false; + cardId.value = ''; + if (val) { + cardManageRef.value?.reload(); + } +}; + /** * 批量激活 */ @@ -565,7 +745,25 @@ const handelRemove = async () => { diff --git a/src/views/iot-card/CardManagement/typing.d.ts b/src/views/iot-card/CardManagement/typing.d.ts new file mode 100644 index 00000000..b661a226 --- /dev/null +++ b/src/views/iot-card/CardManagement/typing.d.ts @@ -0,0 +1,20 @@ +export type CardManagement = { + id: string; + name: string; + iccId: string; + deviceId: string; + deviceName: string; + platformConfigId: string; + operatorName: string; + cardType: any; + totalFlow: number; + usedFlow: number; + residualFlow: number; + activationDate: string; + updateTime: string; + cardStateType: any; + cardState: any; + describe: string; + platformConfigName: string; + operatorPlatformType: any; +};