From b6fee5c05b23d692e053a353713c91b9540835c6 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 10 Oct 2025 20:22:33 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat=EF=BC=9A=E3=80=90mall=20=E5=95=86?= =?UTF-8?q?=E5=9F=8E=E3=80=91=E5=88=86=E9=94=80=E7=94=A8=E6=88=B7=E7=9A=84?= =?UTF-8?q?=20form=20=E8=BF=81=E7=A7=BB=EF=BC=88ele=20100%=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/mall/trade/brokerage/record/index.ts | 33 +-- .../api/mall/trade/brokerage/user/index.ts | 68 +++--- .../mall/trade/brokerage/withdraw/index.ts | 63 ++---- .../views/mall/trade/brokerage/user/data.ts | 1 + .../views/mall/trade/brokerage/user/index.vue | 2 +- .../api/mall/trade/brokerage/record/index.ts | 33 +-- .../api/mall/trade/brokerage/user/index.ts | 68 +++--- .../mall/trade/brokerage/withdraw/index.ts | 63 ++---- .../views/mall/trade/brokerage/user/data.ts | 30 +++ .../views/mall/trade/brokerage/user/index.vue | 4 +- .../brokerage/user/modules/create-form.vue | 211 +++++++++--------- .../brokerage/user/modules/update-form.vue | 127 ++++++----- 12 files changed, 340 insertions(+), 363 deletions(-) diff --git a/apps/web-antd/src/api/mall/trade/brokerage/record/index.ts b/apps/web-antd/src/api/mall/trade/brokerage/record/index.ts index 86ce41baf..1b6e8b3a4 100644 --- a/apps/web-antd/src/api/mall/trade/brokerage/record/index.ts +++ b/apps/web-antd/src/api/mall/trade/brokerage/record/index.ts @@ -5,28 +5,17 @@ import { requestClient } from '#/api/request'; export namespace MallBrokerageRecordApi { /** 佣金记录 */ export interface BrokerageRecord { - /** 编号 */ - id: number; - /** 用户编号 */ - userId: number; - /** 用户昵称 */ - userNickname: string; - /** 用户头像 */ - userAvatar: string; - /** 佣金金额,单位:分 */ - price: number; - /** 佣金类型 */ - type: number; - /** 关联订单编号 */ - orderId: number; - /** 关联订单号 */ - orderNo: string; - /** 创建时间 */ - createTime: Date; - /** 状态 */ - status: number; - /** 结算时间 */ - settlementTime: Date; + id: number; // 编号 + userId: number; // 用户编号 + userNickname: string; // 用户昵称 + userAvatar: string; // 用户头像 + price: number; // 佣金金额,单位:分 + type: number; // 佣金类型 + orderId: number; // 关联订单编号 + orderNo: string; // 关联订单号 + createTime: Date; // 创建时间 + status: number; // 状态 + settlementTime: Date; // 结算时间 } } diff --git a/apps/web-antd/src/api/mall/trade/brokerage/user/index.ts b/apps/web-antd/src/api/mall/trade/brokerage/user/index.ts index 51c24f25a..4ef235af8 100644 --- a/apps/web-antd/src/api/mall/trade/brokerage/user/index.ts +++ b/apps/web-antd/src/api/mall/trade/brokerage/user/index.ts @@ -5,59 +5,45 @@ import { requestClient } from '#/api/request'; export namespace MallBrokerageUserApi { /** 分销用户 */ export interface BrokerageUser { - /** 编号 */ - id: number; - /** 推广员编号 */ - bindUserId: number; - /** 推广员绑定时间 */ - bindUserTime: Date; - /** 是否启用分销 */ - brokerageEnabled: boolean; - /** 分销资格时间 */ - brokerageTime: Date; - /** 可提现金额,单位:分 */ - price: number; - /** 冻结金额,单位:分 */ - frozenPrice: number; - /** 用户昵称 */ - nickname: string; - /** 用户头像 */ - avatar: string; + id: number; // 编号 + bindUserId: number; // 推广员编号 + bindUserTime: Date; // 推广员绑定时间 + brokerageEnabled: boolean; // 是否启用分销 + brokerageTime: Date; // 分销资格时间 + price: number; // 可提现金额,单位:分 + frozenPrice: number; // 冻结金额,单位:分 + nickname: string; // 用户昵称 + avatar: string; // 用户头像 } /** 创建分销用户请求 */ - export interface CreateRequest { - /** 用户编号 */ - userId: number; - /** 推广员编号 */ - bindUserId: number; + export interface BrokerageUserCreateReqVO { + userId: number; // 用户编号 + bindUserId: number; // 推广员编号 } /** 修改推广员请求 */ - export interface UpdateBindUserRequest { - /** 用户编号 */ - id: number; - /** 推广员编号 */ - bindUserId: number; + export interface BrokerageUserUpdateReqVO { + id: number; // 用户编号 + bindUserId: number; // 推广员编号 } /** 清除推广员请求 */ - export interface ClearBindUserRequest { - /** 用户编号 */ - id: number; + export interface BrokerageUserClearBrokerageUserReqVO { + id: number; // 用户编号 } /** 修改推广资格请求 */ - export interface UpdateBrokerageEnabledRequest { - /** 用户编号 */ - id: number; - /** 是否启用分销 */ - enabled: boolean; + export interface BrokerageUserUpdateBrokerageEnabledReqVO { + id: number; // 用户编号 + enabled: boolean; // 是否启用分销 } } /** 创建分销用户 */ -export function createBrokerageUser(data: MallBrokerageUserApi.CreateRequest) { +export function createBrokerageUser( + data: MallBrokerageUserApi.BrokerageUserCreateReqVO, +) { return requestClient.post('/trade/brokerage-user/create', data); } @@ -78,19 +64,21 @@ export function getBrokerageUser(id: number) { /** 修改推广员 */ export function updateBindUser( - data: MallBrokerageUserApi.UpdateBindUserRequest, + data: MallBrokerageUserApi.BrokerageUserUpdateReqVO, ) { return requestClient.put('/trade/brokerage-user/update-bind-user', data); } /** 清除推广员 */ -export function clearBindUser(data: MallBrokerageUserApi.ClearBindUserRequest) { +export function clearBindUser( + data: MallBrokerageUserApi.BrokerageUserClearBrokerageUserReqVO, +) { return requestClient.put('/trade/brokerage-user/clear-bind-user', data); } /** 修改推广资格 */ export function updateBrokerageEnabled( - data: MallBrokerageUserApi.UpdateBrokerageEnabledRequest, + data: MallBrokerageUserApi.BrokerageUserUpdateBrokerageEnabledReqVO, ) { return requestClient.put( '/trade/brokerage-user/update-brokerage-enable', diff --git a/apps/web-antd/src/api/mall/trade/brokerage/withdraw/index.ts b/apps/web-antd/src/api/mall/trade/brokerage/withdraw/index.ts index 08acdb4fc..12af60518 100644 --- a/apps/web-antd/src/api/mall/trade/brokerage/withdraw/index.ts +++ b/apps/web-antd/src/api/mall/trade/brokerage/withdraw/index.ts @@ -5,52 +5,31 @@ import { requestClient } from '#/api/request'; export namespace MallBrokerageWithdrawApi { /** 佣金提现 */ export interface BrokerageWithdraw { - /** 编号 */ - id: number; - /** 用户编号 */ - userId: number; - /** 提现金额,单位:分 */ - price: number; - /** 手续费,单位:分 */ - feePrice: number; - /** 总金额,单位:分 */ - totalPrice: number; - /** 提现类型 */ - type: number; - /** 用户名称 */ - userName: string; - /** 用户账号 */ - userAccount: string; - /** 银行名称 */ - bankName: string; - /** 银行地址 */ - bankAddress: string; - /** 收款码地址 */ - qrCodeUrl: string; - /** 状态 */ - status: number; - /** 审核备注 */ - auditReason: string; - /** 审核时间 */ - auditTime: Date; - /** 备注 */ - remark: string; - /** 支付转账编号 */ - payTransferId?: number; - /** 转账渠道编码 */ - transferChannelCode?: string; - /** 转账时间 */ - transferTime?: Date; - /** 转账错误信息 */ - transferErrorMsg?: string; + id: number; // 编号 + userId: number; // 用户编号 + price: number; // 提现金额,单位:分 + feePrice: number; // 手续费,单位:分 + totalPrice: number; // 总金额,单位:分 + type: number; // 提现类型 + userName: string; // 用户名称 + userAccount: string; // 用户账号 + bankName: string; // 银行名称 + bankAddress: string; // 银行地址 + qrCodeUrl: string; // 收款码地址 + status: number; // 状态 + auditReason: string; // 审核备注 + auditTime: Date; // 审核时间 + remark: string; // 备注 + payTransferId?: number; // 支付转账编号 + transferChannelCode?: string; // 转账渠道编码 + transferTime?: Date; // 转账时间 + transferErrorMsg?: string; // 转账错误信息 } /** 驳回申请请求 */ export interface RejectRequest { - /** 编号 */ - id: number; - /** 驳回原因 */ - auditReason: string; + id: number; // 编号 + auditReason: string; // 驳回原因 } } diff --git a/apps/web-antd/src/views/mall/trade/brokerage/user/data.ts b/apps/web-antd/src/views/mall/trade/brokerage/user/data.ts index 1c9856e4d..bf7a66a72 100644 --- a/apps/web-antd/src/views/mall/trade/brokerage/user/data.ts +++ b/apps/web-antd/src/views/mall/trade/brokerage/user/data.ts @@ -196,6 +196,7 @@ export function useUserListFormSchema(): VbenFormSchema[] { { label: '一级推广人', value: '1' }, { label: '二级推广人', value: '2' }, ], + allowClear: true, }, }, { diff --git a/apps/web-antd/src/views/mall/trade/brokerage/user/index.vue b/apps/web-antd/src/views/mall/trade/brokerage/user/index.vue index 68f123899..b0e4217ed 100644 --- a/apps/web-antd/src/views/mall/trade/brokerage/user/index.vue +++ b/apps/web-antd/src/views/mall/trade/brokerage/user/index.vue @@ -74,7 +74,7 @@ async function handleClearBindUser(row: MallBrokerageUserApi.BrokerageUser) { duration: 0, }); try { - await clearBindUser({ id: row.id as number }); + await clearBindUser({ id: row.id! }); message.success($t('ui.actionMessage.deleteSuccess', [row.nickname])); handleRefresh(); } finally { diff --git a/apps/web-ele/src/api/mall/trade/brokerage/record/index.ts b/apps/web-ele/src/api/mall/trade/brokerage/record/index.ts index 86ce41baf..1b6e8b3a4 100644 --- a/apps/web-ele/src/api/mall/trade/brokerage/record/index.ts +++ b/apps/web-ele/src/api/mall/trade/brokerage/record/index.ts @@ -5,28 +5,17 @@ import { requestClient } from '#/api/request'; export namespace MallBrokerageRecordApi { /** 佣金记录 */ export interface BrokerageRecord { - /** 编号 */ - id: number; - /** 用户编号 */ - userId: number; - /** 用户昵称 */ - userNickname: string; - /** 用户头像 */ - userAvatar: string; - /** 佣金金额,单位:分 */ - price: number; - /** 佣金类型 */ - type: number; - /** 关联订单编号 */ - orderId: number; - /** 关联订单号 */ - orderNo: string; - /** 创建时间 */ - createTime: Date; - /** 状态 */ - status: number; - /** 结算时间 */ - settlementTime: Date; + id: number; // 编号 + userId: number; // 用户编号 + userNickname: string; // 用户昵称 + userAvatar: string; // 用户头像 + price: number; // 佣金金额,单位:分 + type: number; // 佣金类型 + orderId: number; // 关联订单编号 + orderNo: string; // 关联订单号 + createTime: Date; // 创建时间 + status: number; // 状态 + settlementTime: Date; // 结算时间 } } diff --git a/apps/web-ele/src/api/mall/trade/brokerage/user/index.ts b/apps/web-ele/src/api/mall/trade/brokerage/user/index.ts index 51c24f25a..4ef235af8 100644 --- a/apps/web-ele/src/api/mall/trade/brokerage/user/index.ts +++ b/apps/web-ele/src/api/mall/trade/brokerage/user/index.ts @@ -5,59 +5,45 @@ import { requestClient } from '#/api/request'; export namespace MallBrokerageUserApi { /** 分销用户 */ export interface BrokerageUser { - /** 编号 */ - id: number; - /** 推广员编号 */ - bindUserId: number; - /** 推广员绑定时间 */ - bindUserTime: Date; - /** 是否启用分销 */ - brokerageEnabled: boolean; - /** 分销资格时间 */ - brokerageTime: Date; - /** 可提现金额,单位:分 */ - price: number; - /** 冻结金额,单位:分 */ - frozenPrice: number; - /** 用户昵称 */ - nickname: string; - /** 用户头像 */ - avatar: string; + id: number; // 编号 + bindUserId: number; // 推广员编号 + bindUserTime: Date; // 推广员绑定时间 + brokerageEnabled: boolean; // 是否启用分销 + brokerageTime: Date; // 分销资格时间 + price: number; // 可提现金额,单位:分 + frozenPrice: number; // 冻结金额,单位:分 + nickname: string; // 用户昵称 + avatar: string; // 用户头像 } /** 创建分销用户请求 */ - export interface CreateRequest { - /** 用户编号 */ - userId: number; - /** 推广员编号 */ - bindUserId: number; + export interface BrokerageUserCreateReqVO { + userId: number; // 用户编号 + bindUserId: number; // 推广员编号 } /** 修改推广员请求 */ - export interface UpdateBindUserRequest { - /** 用户编号 */ - id: number; - /** 推广员编号 */ - bindUserId: number; + export interface BrokerageUserUpdateReqVO { + id: number; // 用户编号 + bindUserId: number; // 推广员编号 } /** 清除推广员请求 */ - export interface ClearBindUserRequest { - /** 用户编号 */ - id: number; + export interface BrokerageUserClearBrokerageUserReqVO { + id: number; // 用户编号 } /** 修改推广资格请求 */ - export interface UpdateBrokerageEnabledRequest { - /** 用户编号 */ - id: number; - /** 是否启用分销 */ - enabled: boolean; + export interface BrokerageUserUpdateBrokerageEnabledReqVO { + id: number; // 用户编号 + enabled: boolean; // 是否启用分销 } } /** 创建分销用户 */ -export function createBrokerageUser(data: MallBrokerageUserApi.CreateRequest) { +export function createBrokerageUser( + data: MallBrokerageUserApi.BrokerageUserCreateReqVO, +) { return requestClient.post('/trade/brokerage-user/create', data); } @@ -78,19 +64,21 @@ export function getBrokerageUser(id: number) { /** 修改推广员 */ export function updateBindUser( - data: MallBrokerageUserApi.UpdateBindUserRequest, + data: MallBrokerageUserApi.BrokerageUserUpdateReqVO, ) { return requestClient.put('/trade/brokerage-user/update-bind-user', data); } /** 清除推广员 */ -export function clearBindUser(data: MallBrokerageUserApi.ClearBindUserRequest) { +export function clearBindUser( + data: MallBrokerageUserApi.BrokerageUserClearBrokerageUserReqVO, +) { return requestClient.put('/trade/brokerage-user/clear-bind-user', data); } /** 修改推广资格 */ export function updateBrokerageEnabled( - data: MallBrokerageUserApi.UpdateBrokerageEnabledRequest, + data: MallBrokerageUserApi.BrokerageUserUpdateBrokerageEnabledReqVO, ) { return requestClient.put( '/trade/brokerage-user/update-brokerage-enable', diff --git a/apps/web-ele/src/api/mall/trade/brokerage/withdraw/index.ts b/apps/web-ele/src/api/mall/trade/brokerage/withdraw/index.ts index 08acdb4fc..12af60518 100644 --- a/apps/web-ele/src/api/mall/trade/brokerage/withdraw/index.ts +++ b/apps/web-ele/src/api/mall/trade/brokerage/withdraw/index.ts @@ -5,52 +5,31 @@ import { requestClient } from '#/api/request'; export namespace MallBrokerageWithdrawApi { /** 佣金提现 */ export interface BrokerageWithdraw { - /** 编号 */ - id: number; - /** 用户编号 */ - userId: number; - /** 提现金额,单位:分 */ - price: number; - /** 手续费,单位:分 */ - feePrice: number; - /** 总金额,单位:分 */ - totalPrice: number; - /** 提现类型 */ - type: number; - /** 用户名称 */ - userName: string; - /** 用户账号 */ - userAccount: string; - /** 银行名称 */ - bankName: string; - /** 银行地址 */ - bankAddress: string; - /** 收款码地址 */ - qrCodeUrl: string; - /** 状态 */ - status: number; - /** 审核备注 */ - auditReason: string; - /** 审核时间 */ - auditTime: Date; - /** 备注 */ - remark: string; - /** 支付转账编号 */ - payTransferId?: number; - /** 转账渠道编码 */ - transferChannelCode?: string; - /** 转账时间 */ - transferTime?: Date; - /** 转账错误信息 */ - transferErrorMsg?: string; + id: number; // 编号 + userId: number; // 用户编号 + price: number; // 提现金额,单位:分 + feePrice: number; // 手续费,单位:分 + totalPrice: number; // 总金额,单位:分 + type: number; // 提现类型 + userName: string; // 用户名称 + userAccount: string; // 用户账号 + bankName: string; // 银行名称 + bankAddress: string; // 银行地址 + qrCodeUrl: string; // 收款码地址 + status: number; // 状态 + auditReason: string; // 审核备注 + auditTime: Date; // 审核时间 + remark: string; // 备注 + payTransferId?: number; // 支付转账编号 + transferChannelCode?: string; // 转账渠道编码 + transferTime?: Date; // 转账时间 + transferErrorMsg?: string; // 转账错误信息 } /** 驳回申请请求 */ export interface RejectRequest { - /** 编号 */ - id: number; - /** 驳回原因 */ - auditReason: string; + id: number; // 编号 + auditReason: string; // 驳回原因 } } diff --git a/apps/web-ele/src/views/mall/trade/brokerage/user/data.ts b/apps/web-ele/src/views/mall/trade/brokerage/user/data.ts index 1bdeb63f0..12d01cc0a 100644 --- a/apps/web-ele/src/views/mall/trade/brokerage/user/data.ts +++ b/apps/web-ele/src/views/mall/trade/brokerage/user/data.ts @@ -153,6 +153,36 @@ export function useGridColumns( ]; } +/** 创建分销员表单配置 */ +export function useCreateFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'userId', + label: '分销员编号', + component: 'Input', + rules: 'required', + }, + { + fieldName: 'bindUserId', + label: '上级推广员编号', + component: 'Input', + rules: 'required', + }, + ]; +} + +/** 修改分销用户表单配置 */ +export function useUpdateFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'bindUserId', + label: '上级推广员编号', + component: 'Input', + rules: 'required', + }, + ]; +} + /** 用户列表弹窗搜索表单配置 */ export function useUserListFormSchema(): VbenFormSchema[] { return [ diff --git a/apps/web-ele/src/views/mall/trade/brokerage/user/index.vue b/apps/web-ele/src/views/mall/trade/brokerage/user/index.vue index ab5977642..d66be3c56 100644 --- a/apps/web-ele/src/views/mall/trade/brokerage/user/index.vue +++ b/apps/web-ele/src/views/mall/trade/brokerage/user/index.vue @@ -73,7 +73,7 @@ async function handleClearBindUser(row: MallBrokerageUserApi.BrokerageUser) { text: $t('ui.actionMessage.deleting', [row.nickname]), }); try { - await clearBindUser({ id: row.id as number }); + await clearBindUser({ id: row.id! }); ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.nickname])); handleRefresh(); } finally { @@ -203,7 +203,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ type: 'primary', link: true, auth: ['trade:brokerage-user:clear-bind-user'], - ifShow: !!row.bindUserId, + ifShow: row.bindUserId > 0, onClick: handleClearBindUser.bind(null, row), }, ]" diff --git a/apps/web-ele/src/views/mall/trade/brokerage/user/modules/create-form.vue b/apps/web-ele/src/views/mall/trade/brokerage/user/modules/create-form.vue index f73b37dc0..0ceb8bc98 100644 --- a/apps/web-ele/src/views/mall/trade/brokerage/user/modules/create-form.vue +++ b/apps/web-ele/src/views/mall/trade/brokerage/user/modules/create-form.vue @@ -1,9 +1,10 @@ + -
- - - - - - - {{ userInfo.user?.nickname }} - - - - - - - - - {{ userInfo.bindUser?.nickname }} - - - - 有 - - - - - {{ formatDate(userInfo.bindUser?.brokerageTime) }} - - -
+ + + + + + + + {{ user?.nickname }} + + + + + + + + + + {{ bindUser?.nickname }} + + + + + + {{ formatDate(bindUser?.brokerageTime) }} + + - \ No newline at end of file + diff --git a/apps/web-ele/src/views/mall/trade/brokerage/user/modules/update-form.vue b/apps/web-ele/src/views/mall/trade/brokerage/user/modules/update-form.vue index b5c7d4f07..f89a7e1c4 100644 --- a/apps/web-ele/src/views/mall/trade/brokerage/user/modules/update-form.vue +++ b/apps/web-ele/src/views/mall/trade/brokerage/user/modules/update-form.vue @@ -4,39 +4,57 @@ import type { MallBrokerageUserApi } from '#/api/mall/trade/brokerage/user'; import { ref } from 'vue'; import { useVbenModal } from '@vben/common-ui'; +import { DICT_TYPE } from '@vben/constants'; import { IconifyIcon } from '@vben/icons'; import { $t } from '@vben/locales'; -import { formatDate } from '@vben/utils'; +import { formatDate, isEmpty } from '@vben/utils'; import { ElAvatar, ElDescriptions, ElDescriptionsItem, + ElDivider, ElInput, ElMessage, - ElTag, } from 'element-plus'; +import { useVbenForm } from '#/adapter/form'; import { getBrokerageUser, updateBindUser, } from '#/api/mall/trade/brokerage/user'; +import { DictTag } from '#/components/dict-tag'; + +import { useUpdateFormSchema } from '../data'; /** 修改分销用户 */ defineOptions({ name: 'BrokerageUserUpdateForm' }); const emit = defineEmits(['success']); -const formData = ref(); +const formData = ref({ + id: undefined, + bindUserId: undefined, +}); + +const [Form, formApi] = useVbenForm({ + commonConfig: { + componentProps: { + class: 'w-full', + }, + formItemClass: 'col-span-2', + labelWidth: 120, + }, + layout: 'horizontal', + schema: useUpdateFormSchema(), + showDefaultActions: false, +}); const [Modal, modalApi] = useVbenModal({ async onConfirm() { - if (!formData.value) { - return; - } - // 未查找到合适的上级 - if (!bindUser.value) { - ElMessage.error('请先查询并确认推广人'); + await formApi.setValues(formData.value); + const { valid } = await formApi.validate(); + if (!valid) { return; } modalApi.lock(); @@ -52,10 +70,6 @@ const [Modal, modalApi] = useVbenModal({ }, onOpenChange: async (isOpen: boolean) => { if (!isOpen) { - formData.value = { - id: 0, - bindUserId: 0, - }; return; } const data = modalApi.getData(); @@ -68,8 +82,9 @@ const [Modal, modalApi] = useVbenModal({ id: data.id, bindUserId: data.bindUserId, }; + await formApi.setValues(formData.value); if (data.bindUserId) { - await handleGetUser(); + await handleSearchUser(data.bindUserId, '上级分销员'); } } finally { modalApi.unlock(); @@ -77,60 +92,70 @@ const [Modal, modalApi] = useVbenModal({ }, }); -const bindUser = ref(); +/** 绑定用户信息 */ +const bindUser = ref(); -/** 查询推广员 */ -async function handleGetUser() { - if (!formData.value) { +/** 查询分销员 */ +async function handleSearchUser(id: number, userType: string) { + if (isEmpty(id)) { + ElMessage.warning(`请先输入${userType}编号后重试!!!`); return; } - if (formData.value.bindUserId === formData.value.id) { + if (formData.value?.bindUserId === formData.value?.id) { ElMessage.error('不能绑定自己为推广人'); return; } - try { - bindUser.value = await getBrokerageUser(formData.value.bindUserId); - if (!bindUser.value) { - ElMessage.warning('推广员不存在'); - } - } catch { - ElMessage.warning('推广员不存在'); + + const userData = await getBrokerageUser(id); + if (!userData) { + ElMessage.warning(`${userType}不存在`); + return; } + bindUser.value = userData as MallBrokerageUserApi.BrokerageUser; } \ No newline at end of file + From f740461c2a1a31c16532f30c3ca7f7c4e58d5cfc Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 10 Oct 2025 20:26:17 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix=EF=BC=9A=E3=80=90iot=20=E7=89=A9?= =?UTF-8?q?=E8=81=94=E7=BD=91=E3=80=91linter=20=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/api/iot/alert/config/index.ts | 5 +- .../src/api/iot/alert/record/index.ts | 1 - .../src/api/iot/device/device/index.ts | 3 +- .../src/api/iot/device/group/index.ts | 1 - apps/web-antd/src/api/iot/ota/task/index.ts | 1 - .../src/api/iot/ota/task/record/index.ts | 1 - .../src/api/iot/product/category/index.ts | 1 - .../src/api/iot/product/product/index.ts | 4 +- .../src/api/iot/rule/data/rule/index.ts | 1 - .../src/api/iot/rule/data/sink/index.ts | 5 +- apps/web-antd/src/api/iot/rule/scene/index.ts | 3 +- apps/web-antd/src/api/iot/thingmodel/index.ts | 6 +- .../src/views/iot/alert/config/index.vue | 2 +- .../iot/alert/modules/AlertConfigForm.vue | 4 +- .../src/views/iot/alert/record/index.vue | 29 +- .../src/views/iot/device/device/data.ts | 12 +- .../src/views/iot/device/device/index.vue | 62 +- .../device/device/modules/DeviceCardView.vue | 101 ++- .../iot/device/device/modules/DeviceForm.vue | 12 +- .../device/device/modules/DeviceGroupForm.vue | 3 +- .../device/modules/DeviceImportForm.vue | 27 +- .../modules/components/DeviceTableSelect.vue | 455 +++++----- .../modules/detail/DeviceDetailConfig.vue | 240 ++--- .../modules/detail/DeviceDetailsHeader.vue | 110 ++- .../modules/detail/DeviceDetailsInfo.vue | 173 ++-- .../modules/detail/DeviceDetailsMessage.vue | 345 +++---- .../modules/detail/DeviceDetailsSimulator.vue | 764 +++++++++------- .../detail/DeviceDetailsThingModel.vue | 33 +- .../detail/DeviceDetailsThingModelEvent.vue | 264 +++--- .../DeviceDetailsThingModelProperty.vue | 289 +++--- ...DeviceDetailsThingModelPropertyHistory.vue | 739 +++++++-------- .../detail/DeviceDetailsThingModelService.vue | 277 +++--- .../device/device/modules/detail/index.vue | 167 ++-- .../group/modules/device-group-form.vue | 26 +- .../src/views/iot/home/chartOptions.ts | 25 +- apps/web-antd/src/views/iot/home/data.ts | 25 +- apps/web-antd/src/views/iot/home/index.vue | 28 +- .../views/iot/home/modules/ComparisonCard.vue | 76 +- .../iot/home/modules/DeviceCountCard.vue | 61 +- .../iot/home/modules/DeviceStateCountCard.vue | 83 +- .../iot/home/modules/MessageTrendCard.vue | 161 ++-- .../src/views/iot/ota/firmware/index.vue | 2 +- .../views/iot/ota/modules/OtaFirmwareForm.vue | 4 +- .../views/iot/ota/modules/detail/index.vue | 106 ++- .../iot/ota/modules/firmware-detail/index.vue | 106 ++- .../iot/ota/modules/task/OtaTaskDetail.vue | 137 ++- .../iot/ota/modules/task/OtaTaskForm.vue | 44 +- .../iot/ota/modules/task/OtaTaskList.vue | 20 +- apps/web-antd/src/views/iot/plugin/index.vue | 6 +- .../src/views/iot/product/category/data.ts | 11 +- .../src/views/iot/product/category/index.vue | 11 +- .../src/views/iot/product/product/data.ts | 8 +- .../src/views/iot/product/product/index.vue | 23 +- .../product/modules/ProductCardView.vue | 78 +- .../product/product/modules/ProductForm.vue | 11 +- .../modules/components/ProductTableSelect.vue | 14 +- .../modules/detail/ProductDetailsHeader.vue | 18 +- .../modules/detail/ProductDetailsInfo.vue | 16 +- .../product/product/modules/detail/index.vue | 28 +- .../views/iot/rule/data/rule/DataRuleForm.vue | 8 +- .../data/rule/components/SourceConfigForm.vue | 12 +- .../src/views/iot/rule/data/rule/data.ts | 1 - .../views/iot/rule/data/sink/DataSinkForm.vue | 7 +- .../rule/data/sink/config/HttpConfigForm.vue | 9 +- .../data/sink/config/KafkaMQConfigForm.vue | 5 +- .../rule/data/sink/config/MqttConfigForm.vue | 5 +- .../data/sink/config/RabbitMQConfigForm.vue | 5 +- .../sink/config/RedisStreamConfigForm.vue | 5 +- .../data/sink/config/RocketMQConfigForm.vue | 5 +- .../sink/config/components/KeyValueEditor.vue | 118 +-- .../views/iot/rule/data/sink/config/index.ts | 21 +- .../src/views/iot/rule/data/sink/data.ts | 1 - .../src/views/iot/rule/databridge/index.vue | 6 +- .../iot/rule/scene/form/RuleSceneForm.vue | 328 ++++--- .../rule/scene/form/configs/AlertConfig.vue | 103 +-- .../scene/form/configs/ConditionConfig.vue | 340 +++---- .../configs/CurrentTimeConditionConfig.vue | 321 +++---- .../form/configs/DeviceControlConfig.vue | 639 ++++++------- .../form/configs/DeviceTriggerConfig.vue | 246 ++--- .../form/configs/MainConditionInnerConfig.vue | 393 ++++---- .../form/configs/SubConditionGroupConfig.vue | 192 ++-- .../scene/form/inputs/JsonParamsInput.vue | 856 ++++++++++-------- .../iot/rule/scene/form/inputs/ValueInput.vue | 337 +++---- .../scene/form/sections/ActionSection.vue | 356 ++++---- .../scene/form/sections/BasicInfoSection.vue | 56 +- .../scene/form/sections/TriggerSection.vue | 289 +++--- .../scene/form/selectors/DeviceSelector.vue | 155 ++-- .../scene/form/selectors/OperatorSelector.vue | 183 ++-- .../scene/form/selectors/ProductSelector.vue | 103 ++- .../scene/form/selectors/PropertySelector.vue | 625 +++++++------ .../src/views/iot/rule/scene/index.vue | 5 +- .../src/views/iot/rule/scene/modules/form.vue | 5 +- .../src/views/iot/thingmodel/index.vue | 9 +- .../thingmodel/modules/ThingModelEvent.vue | 60 +- .../iot/thingmodel/modules/ThingModelForm.vue | 353 ++++---- .../modules/ThingModelInputOutputParam.vue | 234 ++--- .../thingmodel/modules/ThingModelProperty.vue | 203 +++-- .../thingmodel/modules/ThingModelService.vue | 56 +- .../iot/thingmodel/modules/ThingModelTSL.vue | 74 +- .../modules/components/DataDefinition.vue | 46 +- .../thingmodel/modules/components/index.ts | 4 +- .../dataSpecs/ThingModelArrayDataSpecs.vue | 51 +- .../dataSpecs/ThingModelEnumDataSpecs.vue | 246 ++--- .../dataSpecs/ThingModelNumberDataSpecs.vue | 170 ++-- .../dataSpecs/ThingModelStructDataSpecs.vue | 254 +++--- .../iot/thingmodel/modules/dataSpecs/index.ts | 15 +- .../web-antd/src/views/iot/utils/constants.ts | 283 +++--- 107 files changed, 7161 insertions(+), 5905 deletions(-) diff --git a/apps/web-antd/src/api/iot/alert/config/index.ts b/apps/web-antd/src/api/iot/alert/config/index.ts index ef4414f23..8281cf6c8 100644 --- a/apps/web-antd/src/api/iot/alert/config/index.ts +++ b/apps/web-antd/src/api/iot/alert/config/index.ts @@ -51,7 +51,9 @@ export function getAlertConfig(id: number) { /** 查询所有告警配置列表 */ export function getAlertConfigList() { - return requestClient.get('/iot/alert-config/list'); + return requestClient.get( + '/iot/alert-config/list', + ); } /** 新增告警配置 */ @@ -92,4 +94,3 @@ export function getSimpleAlertConfigList() { } export { AlertConfigApi }; - diff --git a/apps/web-antd/src/api/iot/alert/record/index.ts b/apps/web-antd/src/api/iot/alert/record/index.ts index 02e8768f1..7ca2b8df9 100644 --- a/apps/web-antd/src/api/iot/alert/record/index.ts +++ b/apps/web-antd/src/api/iot/alert/record/index.ts @@ -82,4 +82,3 @@ export function deleteAlertRecordList(ids: number[]) { } export { AlertRecordApi }; - diff --git a/apps/web-antd/src/api/iot/device/device/index.ts b/apps/web-antd/src/api/iot/device/device/index.ts index 26770f975..b45f3b42a 100644 --- a/apps/web-antd/src/api/iot/device/device/index.ts +++ b/apps/web-antd/src/api/iot/device/device/index.ts @@ -79,8 +79,8 @@ export namespace IotDeviceApi { /** IoT 设备状态枚举 */ export enum DeviceStateEnum { INACTIVE = 0, // 未激活 - ONLINE = 1, // 在线 OFFLINE = 2, // 离线 + ONLINE = 1, // 在线 } /** 查询设备分页 */ @@ -221,4 +221,3 @@ export type DeviceVO = IotDeviceApi.Device; export type IotDeviceAuthInfoVO = IotDeviceApi.DeviceAuthInfo; export type IotDevicePropertyDetailRespVO = IotDeviceApi.DevicePropertyDetail; export type IotDevicePropertyRespVO = IotDeviceApi.DeviceProperty; - diff --git a/apps/web-antd/src/api/iot/device/group/index.ts b/apps/web-antd/src/api/iot/device/group/index.ts index 0b7da965f..18cac3097 100644 --- a/apps/web-antd/src/api/iot/device/group/index.ts +++ b/apps/web-antd/src/api/iot/device/group/index.ts @@ -49,4 +49,3 @@ export function getSimpleDeviceGroupList() { '/iot/device-group/simple-list', ); } - diff --git a/apps/web-antd/src/api/iot/ota/task/index.ts b/apps/web-antd/src/api/iot/ota/task/index.ts index 7747b9f92..bd003caf8 100644 --- a/apps/web-antd/src/api/iot/ota/task/index.ts +++ b/apps/web-antd/src/api/iot/ota/task/index.ts @@ -98,4 +98,3 @@ export function resumeOtaTask(id: number) { } export { IoTOtaTaskApi }; - diff --git a/apps/web-antd/src/api/iot/ota/task/record/index.ts b/apps/web-antd/src/api/iot/ota/task/record/index.ts index d857a6aa9..8ab8b0b1e 100644 --- a/apps/web-antd/src/api/iot/ota/task/record/index.ts +++ b/apps/web-antd/src/api/iot/ota/task/record/index.ts @@ -101,4 +101,3 @@ export function getOtaTaskRecordStatusStatistics( } export { IoTOtaTaskRecordApi }; - diff --git a/apps/web-antd/src/api/iot/product/category/index.ts b/apps/web-antd/src/api/iot/product/category/index.ts index 66faa6083..72f04b6b3 100644 --- a/apps/web-antd/src/api/iot/product/category/index.ts +++ b/apps/web-antd/src/api/iot/product/category/index.ts @@ -55,4 +55,3 @@ export function getSimpleProductCategoryList() { '/iot/product-category/simple-list', ); } - diff --git a/apps/web-antd/src/api/iot/product/product/index.ts b/apps/web-antd/src/api/iot/product/product/index.ts index 586487ed9..6eeba04cd 100644 --- a/apps/web-antd/src/api/iot/product/product/index.ts +++ b/apps/web-antd/src/api/iot/product/product/index.ts @@ -30,15 +30,15 @@ export namespace IotProductApi { /** IOT 产品设备类型枚举类 */ export enum DeviceTypeEnum { DEVICE = 0, // 直连设备 - GATEWAY_SUB = 1, // 网关子设备 GATEWAY = 2, // 网关设备 + GATEWAY_SUB = 1, // 网关子设备 } /** IOT 产品定位类型枚举类 */ export enum LocationTypeEnum { IP = 1, // IP 定位 - MODULE = 2, // 设备定位 MANUAL = 3, // 手动定位 + MODULE = 2, // 设备定位 } /** IOT 数据格式(编解码器类型)枚举类 */ diff --git a/apps/web-antd/src/api/iot/rule/data/rule/index.ts b/apps/web-antd/src/api/iot/rule/data/rule/index.ts index a8120e6c3..55e50184a 100644 --- a/apps/web-antd/src/api/iot/rule/data/rule/index.ts +++ b/apps/web-antd/src/api/iot/rule/data/rule/index.ts @@ -81,4 +81,3 @@ export function updateDataRuleStatus(id: number, status: number) { status, }); } - diff --git a/apps/web-antd/src/api/iot/rule/data/sink/index.ts b/apps/web-antd/src/api/iot/rule/data/sink/index.ts index 9ec0307ee..59ffdbc3b 100644 --- a/apps/web-antd/src/api/iot/rule/data/sink/index.ts +++ b/apps/web-antd/src/api/iot/rule/data/sink/index.ts @@ -29,11 +29,11 @@ export interface DataSinkVO { /** IoT 数据目的类型枚举 */ export enum IotDataSinkTypeEnum { HTTP = 'HTTP', - MQTT = 'MQTT', KAFKA = 'KAFKA', + MQTT = 'MQTT', RABBITMQ = 'RABBITMQ', - ROCKETMQ = 'ROCKETMQ', REDIS_STREAM = 'REDIS_STREAM', + ROCKETMQ = 'ROCKETMQ', } /** HTTP 配置 */ @@ -148,4 +148,3 @@ export function updateDataSinkStatus(id: number, status: number) { } export { DataSinkApi }; - diff --git a/apps/web-antd/src/api/iot/rule/scene/index.ts b/apps/web-antd/src/api/iot/rule/scene/index.ts index 36f968066..3746a4622 100644 --- a/apps/web-antd/src/api/iot/rule/scene/index.ts +++ b/apps/web-antd/src/api/iot/rule/scene/index.ts @@ -156,8 +156,7 @@ export function getSimpleRuleSceneList() { // 别名导出(兼容旧代码) export { - getSceneRulePage as getRuleScenePage, deleteSceneRule as deleteRuleScene, + getSceneRulePage as getRuleScenePage, updateSceneRuleStatus as updateRuleSceneStatus, }; - diff --git a/apps/web-antd/src/api/iot/thingmodel/index.ts b/apps/web-antd/src/api/iot/thingmodel/index.ts index eac8bea39..e4bb75767 100644 --- a/apps/web-antd/src/api/iot/thingmodel/index.ts +++ b/apps/web-antd/src/api/iot/thingmodel/index.ts @@ -115,10 +115,10 @@ export interface ThingModelFormRules { /** 验证布尔型名称 */ export const validateBoolName = (_rule: any, value: any, callback: any) => { - if (!value) { - callback(new Error('枚举描述不能为空')); - } else { + if (value) { callback(); + } else { + callback(new Error('枚举描述不能为空')); } }; diff --git a/apps/web-antd/src/views/iot/alert/config/index.vue b/apps/web-antd/src/views/iot/alert/config/index.vue index bae250661..9e47eaf1f 100644 --- a/apps/web-antd/src/views/iot/alert/config/index.vue +++ b/apps/web-antd/src/views/iot/alert/config/index.vue @@ -10,8 +10,8 @@ import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { deleteAlertConfig, getAlertConfigPage } from '#/api/iot/alert/config'; import { $t } from '#/locales'; -import { useGridColumns, useGridFormSchema } from './data'; import AlertConfigForm from '../modules/AlertConfigForm.vue'; +import { useGridColumns, useGridFormSchema } from './data'; defineOptions({ name: 'IoTAlertConfig' }); diff --git a/apps/web-antd/src/views/iot/alert/modules/AlertConfigForm.vue b/apps/web-antd/src/views/iot/alert/modules/AlertConfigForm.vue index af90da10a..76172f8f5 100644 --- a/apps/web-antd/src/views/iot/alert/modules/AlertConfigForm.vue +++ b/apps/web-antd/src/views/iot/alert/modules/AlertConfigForm.vue @@ -49,7 +49,9 @@ const [Modal, modalApi] = useVbenModal({ // 提交表单 const data = (await formApi.getValues()) as AlertConfigApi.AlertConfig; try { - await (formData.value?.id ? updateAlertConfig(data) : createAlertConfig(data)); + await (formData.value?.id + ? updateAlertConfig(data) + : createAlertConfig(data)); // 关闭并提示 await modalApi.close(); emit('success'); diff --git a/apps/web-antd/src/views/iot/alert/record/index.vue b/apps/web-antd/src/views/iot/alert/record/index.vue index 0cdb9b513..316053da3 100644 --- a/apps/web-antd/src/views/iot/alert/record/index.vue +++ b/apps/web-antd/src/views/iot/alert/record/index.vue @@ -1,14 +1,14 @@ + - - diff --git a/apps/web-antd/src/views/iot/device/device/modules/detail/DeviceDetailConfig.vue b/apps/web-antd/src/views/iot/device/device/modules/detail/DeviceDetailConfig.vue index 167380ffb..ca73d8473 100644 --- a/apps/web-antd/src/views/iot/device/device/modules/detail/DeviceDetailConfig.vue +++ b/apps/web-antd/src/views/iot/device/device/modules/detail/DeviceDetailConfig.vue @@ -1,4 +1,118 @@ + + - - diff --git a/apps/web-antd/src/views/iot/device/device/modules/detail/DeviceDetailsHeader.vue b/apps/web-antd/src/views/iot/device/device/modules/detail/DeviceDetailsHeader.vue index 2465707ea..b2859a058 100644 --- a/apps/web-antd/src/views/iot/device/device/modules/detail/DeviceDetailsHeader.vue +++ b/apps/web-antd/src/views/iot/device/device/modules/detail/DeviceDetailsHeader.vue @@ -1,4 +1,55 @@ + - diff --git a/apps/web-antd/src/views/iot/device/device/modules/detail/DeviceDetailsInfo.vue b/apps/web-antd/src/views/iot/device/device/modules/detail/DeviceDetailsInfo.vue index 3d758332b..118f56650 100644 --- a/apps/web-antd/src/views/iot/device/device/modules/detail/DeviceDetailsInfo.vue +++ b/apps/web-antd/src/views/iot/device/device/modules/detail/DeviceDetailsInfo.vue @@ -1,4 +1,64 @@ + - diff --git a/apps/web-antd/src/views/iot/device/device/modules/detail/DeviceDetailsMessage.vue b/apps/web-antd/src/views/iot/device/device/modules/detail/DeviceDetailsMessage.vue index 86e55975d..e870b4d3d 100644 --- a/apps/web-antd/src/views/iot/device/device/modules/detail/DeviceDetailsMessage.vue +++ b/apps/web-antd/src/views/iot/device/device/modules/detail/DeviceDetailsMessage.vue @@ -1,10 +1,178 @@ + +