From 630dfddc59754c5bb1334f7afd45716e7457f879 Mon Sep 17 00:00:00 2001 From: freeboss Date: Sat, 1 Aug 2026 14:48:22 +0800 Subject: [PATCH] =?UTF-8?q?feat(manage):=20=E5=AE=8C=E5=96=84=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E7=AE=A1=E7=90=86/=E6=94=AF=E4=BB=98=E9=85=8D?= =?UTF-8?q?=E7=BD=AE/=E8=AE=A2=E5=8D=95/=E5=AE=A1=E8=AE=A1=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 设备管理: 自营设备固定 source=DIRECT, 第三方设备固定 source=PARTNER, 门店终端管理跳转带 storeOrgId 筛选 - 支付配置: 支持平台全局/渠道/代理商/门店四个层级, 列表显示层级标签与所属组织 - 订单管理: 显示渠道/代理商/门店名称, 设备列显示MAC地址 - 审计日志: 新增审计日志和橘视厅调用日志页面及菜单图标SQL - 门店管理: 兼容 manage 接口统一返回格式 data:{page:{list}} --- db/add-menu-icons.sql | 50 ++++ src/api/manage/auditLog.ts | 50 ++++ src/api/manage/daycard.ts | 7 + src/api/manage/device.ts | 24 +- src/api/manage/index.ts | 2 + src/api/manage/jstCallLog.ts | 50 ++++ src/api/manage/payConfig.ts | 24 +- src/views/modules/manage/audit-log.vue | 159 +++++++++++ src/views/modules/manage/card-order.vue | 66 +++-- src/views/modules/manage/device.vue | 48 +++- src/views/modules/manage/jst-call-log.vue | 161 +++++++++++ src/views/modules/manage/pay-config.vue | 256 ++++++++++-------- .../org/components/shop-store-list.vue | 2 +- src/views/modules/org/shop.vue | 12 +- 14 files changed, 761 insertions(+), 150 deletions(-) create mode 100644 db/add-menu-icons.sql create mode 100644 src/api/manage/auditLog.ts create mode 100644 src/api/manage/jstCallLog.ts create mode 100644 src/views/modules/manage/audit-log.vue create mode 100644 src/views/modules/manage/jst-call-log.vue diff --git a/db/add-menu-icons.sql b/db/add-menu-icons.sql new file mode 100644 index 0000000..894e6bd --- /dev/null +++ b/db/add-menu-icons.sql @@ -0,0 +1,50 @@ +-- ============================================================ +-- 为所有菜单补齐图标(只更新 icon 为空的,已有的保留) +-- 图标使用 Element Plus 图标名(PascalCase),侧边栏通过 iconMap[icon] 渲染 +-- 执行前建议先跑:SELECT id,name,icon FROM sys_menu WHERE type IN(0,1) ORDER BY parent_id,order_num; +-- 若菜单 name 与下方不一致,请按实际 name 调整 WHERE 条件 +-- ============================================================ + +-- ===== 一级目录 ===== +UPDATE `sys_menu` SET `icon`='Briefcase' WHERE `name`='业务管理' AND (`icon` IS NULL OR `icon`=''); +UPDATE `sys_menu` SET `icon`='Connection' WHERE `name`='第三方接口管理' AND (`icon` IS NULL OR `icon`=''); +UPDATE `sys_menu` SET `icon`='VideoCamera' WHERE `name`='媒资管理' AND (`icon` IS NULL OR `icon`=''); +UPDATE `sys_menu` SET `icon`='Setting' WHERE `name`='系统管理' AND (`icon` IS NULL OR `icon`=''); +UPDATE `sys_menu` SET `icon`='OfficeBuilding' WHERE `name`='组织管理' AND (`icon` IS NULL OR `icon`=''); + +-- ===== 业务管理 下 ===== +UPDATE `sys_menu` SET `icon`='Share' WHERE `name`='渠道管理' AND (`icon` IS NULL OR `icon`=''); +UPDATE `sys_menu` SET `icon`='Shop' WHERE `name`='门店管理' AND (`icon` IS NULL OR `icon`=''); +UPDATE `sys_menu` SET `icon`='Monitor' WHERE `name`='设备管理' AND (`icon` IS NULL OR `icon`=''); +UPDATE `sys_menu` SET `icon`='PriceTag' WHERE `name`='定价策略' AND (`icon` IS NULL OR `icon`=''); +UPDATE `sys_menu` SET `icon`='Wallet' WHERE `name`='支付配置' AND (`icon` IS NULL OR `icon`=''); +UPDATE `sys_menu` SET `icon`='Tickets' WHERE `name`='天卡池管理' AND (`icon` IS NULL OR `icon`=''); +UPDATE `sys_menu` SET `icon`='Document' WHERE `name`='天卡订单' AND (`icon` IS NULL OR `icon`=''); +UPDATE `sys_menu` SET `icon`='Key' WHERE `name`='天卡激活码' AND (`icon` IS NULL OR `icon`=''); +UPDATE `sys_menu` SET `icon`='Coin' WHERE `name`='分润规则' AND (`icon` IS NULL OR `icon`=''); +UPDATE `sys_menu` SET `icon`='Wallet' WHERE `name`='分账记录' AND (`icon` IS NULL OR `icon`=''); +UPDATE `sys_menu` SET `icon`='RefreshLeft' WHERE `name`='退款记录' AND (`icon` IS NULL OR `icon`=''); + +-- ===== 第三方接口管理 下 ===== +UPDATE `sys_menu` SET `icon`='UserFilled' WHERE `name`='合作伙伴管理' AND (`icon` IS NULL OR `icon`=''); +UPDATE `sys_menu` SET `icon`='Files' WHERE `name`='内容包配置' AND (`icon` IS NULL OR `icon`=''); +UPDATE `sys_menu` SET `icon`='ShoppingCart' WHERE `name`='天卡库存' AND (`icon` IS NULL OR `icon`=''); +UPDATE `sys_menu` SET `icon`='Document' WHERE `name`='审计日志' AND (`icon` IS NULL OR `icon`=''); +UPDATE `sys_menu` SET `icon`='Monitor' WHERE `name`='设备列表' AND (`icon` IS NULL OR `icon`=''); + +-- ===== 媒资管理 下 ===== +UPDATE `sys_menu` SET `icon`='Film' WHERE `name`='橘视厅媒资' AND (`icon` IS NULL OR `icon`=''); + +-- ===== 系统管理 下 ===== +UPDATE `sys_menu` SET `icon`='User' WHERE `name`='用户管理' AND (`icon` IS NULL OR `icon`=''); +UPDATE `sys_menu` SET `icon`='UserFilled'WHERE `name`='角色管理' AND (`icon` IS NULL OR `icon`=''); +UPDATE `sys_menu` SET `icon`='Menu' WHERE `name`='菜单管理' AND (`icon` IS NULL OR `icon`=''); +UPDATE `sys_menu` SET `icon`='Tools' WHERE `name`='参数配置' AND (`icon` IS NULL OR `icon`=''); +UPDATE `sys_menu` SET `icon`='Memo' WHERE `name`='日志管理' AND (`icon` IS NULL OR `icon`=''); +UPDATE `sys_menu` SET `icon`='Memo' WHERE `name`='操作日志' AND (`icon` IS NULL OR `icon`=''); +UPDATE `sys_menu` SET `icon`='Memo' WHERE `name`='审计日志记录' AND (`icon` IS NULL OR `icon`=''); +UPDATE `sys_menu` SET `icon`='Timer' WHERE `name`='定时任务' AND (`icon` IS NULL OR `icon`=''); +UPDATE `sys_menu` SET `icon`='Document' WHERE `name`='定时日志' AND (`icon` IS NULL OR `icon`=''); + +-- ===== 通用兜底:仍为空的菜单统一给一个默认图标 ===== +UPDATE `sys_menu` SET `icon`='Menu' WHERE (`icon` IS NULL OR `icon`='') AND `type` IN (0,1); diff --git a/src/api/manage/auditLog.ts b/src/api/manage/auditLog.ts new file mode 100644 index 0000000..9697610 --- /dev/null +++ b/src/api/manage/auditLog.ts @@ -0,0 +1,50 @@ +import http from '@/utils/httpRequest' +import type { ManageListResponse, ManagePageParams } from './types' + +/** + * 审计日志(管理后台操作审计) + */ +export interface AuditLogItem { + id: number + /** 操作人ID */ + actorUserId: number + /** 操作人名 */ + name?: string + /** 请求方法 */ + method?: string + /** 接口路径 */ + api?: string + /** 请求参数 */ + param?: string + /** 中文描述 */ + paramDesc?: string + /** 操作结果 */ + result?: string + /** 变更前 */ + before?: string + /** 变更后 */ + after?: string + /** 操作原因 */ + reason?: string + ip?: string + /** 设备信息 */ + deviceInfo?: string + /** 工单号 */ + ticketNo?: string + createdAt: string +} + +/** + * 审计日志查询参数 + */ +export interface AuditLogListParams extends ManagePageParams { + actorUserId?: number + api?: string + method?: string + ticketNo?: string +} + +/** 审计日志列表 */ +export function getAuditLogList(params?: AuditLogListParams): Promise> { + return http.get(http.adornUrl('/manage/audit-log/list'), { params: http.adornParams(params || {}) }).then(res => res.data) +} diff --git a/src/api/manage/daycard.ts b/src/api/manage/daycard.ts index fca6880..860ff76 100644 --- a/src/api/manage/daycard.ts +++ b/src/api/manage/daycard.ts @@ -114,6 +114,13 @@ export interface DayCardOrderItem { /** 非表字段 */ partnerName?: string deviceMac?: string + /** 设备MAC(deviceMac 为空时用此字段) */ + mac?: string + deviceSn?: string + agentOrgId?: number + /** 组织路径快照 */ + orgPathSnapshot?: string + channelOrderNo?: string } /** 订单列表参数 */ diff --git a/src/api/manage/device.ts b/src/api/manage/device.ts index b706fe6..2790580 100644 --- a/src/api/manage/device.ts +++ b/src/api/manage/device.ts @@ -32,21 +32,21 @@ export interface DeviceInfo { channelOrgId?: number channelName?: string agentOrgName?: string - /** 设备来源:PLATFORM-平台 / PARTNER-第三方接口注册 */ + /** 设备来源:DIRECT-自营 / PARTNER-第三方接口注册 */ source?: string /** 合作伙伴UUID(source=PARTNER 时) */ partnerId?: string } /** - * 终端列表查询参数 + * 终端保存/更新数据 */ export interface DeviceListParams extends ManagePageParams { storeOrgId?: number status?: string deviceName?: string mac?: string - /** 设备来源:PLATFORM / PARTNER */ + /** 设备来源:DIRECT / PARTNER */ source?: string /** 合作伙伴UUID(source=PARTNER 时筛选) */ partnerId?: string @@ -68,9 +68,25 @@ export interface DeviceSaveData { remark?: string } +/** 下划线转驼峰(兼容后端返回 snake_case 字段,统一为前端驼峰访问) */ +function toCamelCase (obj: any): any { + if (!obj || typeof obj !== 'object' || Array.isArray(obj)) return obj + const result: any = {} + for (const key in obj) { + result[key.replace(/_([a-z])/g, (_, c) => c.toUpperCase())] = obj[key] + } + return result +} + /** 终端分页列表 */ export function getDeviceList(params?: DeviceListParams): Promise> { - return http.get(http.adornUrl('/manage/device/list'), { params: http.adornParams(params || {}) }).then(res => res.data) + return http.get(http.adornUrl('/manage/device/list'), { params: http.adornParams(params || {}) }).then(res => { + const body = res.data as any + if (body && body.data && body.data.page && Array.isArray(body.data.page.list)) { + body.data.page.list = body.data.page.list.map(toCamelCase) + } + return body + }) } /** 终端详情 */ diff --git a/src/api/manage/index.ts b/src/api/manage/index.ts index 473cc32..9f33a60 100644 --- a/src/api/manage/index.ts +++ b/src/api/manage/index.ts @@ -26,3 +26,5 @@ export * from './partner' export * from './content-package' export * from './partner-card' export * from './openapiCallLog' +export * from './auditLog' +export * from './jstCallLog' diff --git a/src/api/manage/jstCallLog.ts b/src/api/manage/jstCallLog.ts new file mode 100644 index 0000000..8ef4433 --- /dev/null +++ b/src/api/manage/jstCallLog.ts @@ -0,0 +1,50 @@ +import http from '@/utils/httpRequest' +import type { ManageListResponse, ManagePageParams } from './types' + +/** + * 橘视厅调用日志(设备调用橘视厅 API 的日志) + */ +export interface JstCallLogItem { + id: number + /** 请求URL */ + apiPath: string + /** 请求方法 */ + requestMethod?: string + /** 请求体 */ + requestBody?: string + /** 响应体 */ + responseBody?: string + /** HTTP状态码 */ + responseCode?: number + /** 是否成功(1=成功,0=失败) */ + success: number + /** 耗时(ms) */ + duration?: number + /** 错误信息 */ + errorMessage?: string + /** 关联设备MAC */ + mac?: string + /** 关联设备SN */ + deviceSn?: string + /** 关联设备UID */ + deviceUid?: string + /** 设备所属门店 */ + storeOrgName?: string + createTime: string +} + +/** + * 橘视厅调用日志查询参数 + */ +export interface JstCallLogListParams extends ManagePageParams { + mac?: string + beginTime?: string + endTime?: string + apiPath?: string + requestBody?: string +} + +/** 橘视厅调用日志列表 */ +export function getJstCallLogList(params?: JstCallLogListParams): Promise> { + return http.get(http.adornUrl('/manage/jst/call-log/list'), { params: http.adornParams(params || {}) }).then(res => res.data) +} diff --git a/src/api/manage/payConfig.ts b/src/api/manage/payConfig.ts index 0666718..3fa6a0e 100644 --- a/src/api/manage/payConfig.ts +++ b/src/api/manage/payConfig.ts @@ -2,11 +2,16 @@ import http from '@/utils/httpRequest' import type { ManageListResponse, ManageResponse, ManagePageParams } from './types' /** - * 微信支付配置信息 + * 微信支付配置(按层级:平台全局/渠道/代理商/门店,三选一留空=全局) */ export interface PayConfigInfo { id: number - partnerId: number | null + /** 渠道组织ID(渠道级配置) */ + channelOrgId?: number + /** 代理商组织ID(代理商级配置) */ + agentOrgId?: number + /** 门店组织ID(门店级配置) */ + storeOrgId?: number appId: string mchId: string apiV3Key: string @@ -15,22 +20,31 @@ export interface PayConfigInfo { notifyUrl: string status: string remark: string + /** join 名称(后端返回) */ + channelName?: string + agentOrgName?: string + storeName?: string } /** * 支付配置列表查询参数 */ export interface PayConfigListParams extends ManagePageParams { - partnerId?: number + channelOrgId?: number + agentOrgId?: number + storeOrgId?: number status?: string } /** * 支付配置保存/更新数据 + * 配置层级三选一:channelOrgId/agentOrgId/storeOrgId,都留空=平台全局 */ export interface PayConfigSaveData { id?: number - partnerId?: number + channelOrgId?: number + agentOrgId?: number + storeOrgId?: number appId: string mchId: string apiV3Key: string @@ -47,7 +61,7 @@ export function getPayConfigList(params?: PayConfigListParams): Promise> { +export function getPayConfigInfo(id: number): Promise> { return http.get(http.adornUrl(`/manage/payconfig/info/${id}`), { params: http.adornParams() }).then(res => res.data) } diff --git a/src/views/modules/manage/audit-log.vue b/src/views/modules/manage/audit-log.vue new file mode 100644 index 0000000..90e66cf --- /dev/null +++ b/src/views/modules/manage/audit-log.vue @@ -0,0 +1,159 @@ + + + + + diff --git a/src/views/modules/manage/card-order.vue b/src/views/modules/manage/card-order.vue index ca2f42c..8cd3013 100644 --- a/src/views/modules/manage/card-order.vue +++ b/src/views/modules/manage/card-order.vue @@ -13,9 +13,6 @@ - - - - - - - - + + + + + + + + + + + +