From 2706c52a47fcccfcdcf7837ea831a94f0b59a148 Mon Sep 17 00:00:00 2001 From: luo Date: Tue, 28 Jul 2026 14:00:22 +0800 Subject: [PATCH] =?UTF-8?q?feat:=207=E6=9C=88=E8=BF=AD=E4=BB=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- q | 1520 ----------------- src/api/modules/asset.ts | 10 +- src/api/modules/card.ts | 3 +- src/api/modules/exportTask.ts | 7 - src/api/modules/notification.ts | 8 +- src/api/modules/wecom.ts | 33 +- .../business/CreateRefundDialog.vue | 6 + .../business/ExportTaskCreateDialog.vue | 15 +- .../core/layouts/art-notification/index.vue | 11 +- .../core/layouts/art-notification/style.scss | 9 - src/config/constants/exportTask.ts | 25 +- src/config/constants/julyIteration.ts | 3 + src/locales/langs/en.json | 8 + src/locales/langs/zh.json | 8 + src/router/routes/asyncRoutes.ts | 145 +- src/router/routesAlias.ts | 13 +- src/types/api/agentRecharge.ts | 1 + src/types/api/asset.ts | 45 +- src/types/api/bulkPurchase.ts | 3 +- src/types/api/device.ts | 11 +- src/types/api/exportTask.ts | 11 +- src/types/api/notification.ts | 4 + src/types/api/packageManagement.ts | 2 +- src/types/api/refund.ts | 1 + src/types/api/wecom.ts | 37 +- src/utils/business/notificationNavigation.ts | 45 +- .../account-management/account/index.vue | 173 +- .../components/BasicInfoCard.vue | 6 +- .../components/PackageListCard.vue | 11 +- .../components/dialogs/SpeedLimitDialog.vue | 95 +- .../asset-information/index.vue | 51 +- .../asset-management/device-list/index.vue | 85 +- .../exchange-management/index.vue | 25 + .../expiring-assets/index.vue | 105 +- .../export-agent-recharge/index.vue | 9 + .../export-agent-wallet-transaction/index.vue | 9 + .../export-exchange/index.vue | 9 + .../export-package/index.vue | 9 + .../export-refund/index.vue | 9 + .../export-task-detail/index.vue | 43 +- .../export-task-list/index.vue | 47 +- .../task-management/bulk-purchase/detail.vue | 334 ++++ .../task-management/bulk-purchase/index.vue | 506 ++++++ .../device-batch-allocation/index.vue | 506 ++++++ .../task-management/device-task/index.vue | 352 ++-- .../task-management/task-detail/index.vue | 291 ++-- .../agent-fund-overview/index.vue | 49 +- .../console/widget/ExpiringAssetStats.vue | 12 +- .../agent-recharge/agentRechargeActions.ts | 12 +- src/views/finance/agent-recharge/detail.vue | 53 +- src/views/finance/agent-recharge/index.vue | 78 +- src/views/finance/refund/detail.vue | 57 +- src/views/finance/refund/index.vue | 57 +- src/views/notifications/index.vue | 277 --- .../order-management/bulk-purchase/index.vue | 446 ----- .../series-grants/detail.vue | 20 +- .../series-grants/packages.vue | 359 +++- src/views/settings/system-configs/index.vue | 57 +- .../components/WecomApplicationFormDialog.vue | 244 +++ .../settings/wecom/applications/detail.vue | 253 --- .../settings/wecom/applications/index.vue | 238 +-- src/views/settings/wecom/members/index.vue | 524 +++--- src/views/settings/wecom/scenes/index.vue | 663 ++++--- 63 files changed, 4113 insertions(+), 3945 deletions(-) delete mode 100644 q create mode 100644 src/views/asset-management/export-task-management/export-agent-recharge/index.vue create mode 100644 src/views/asset-management/export-task-management/export-agent-wallet-transaction/index.vue create mode 100644 src/views/asset-management/export-task-management/export-exchange/index.vue create mode 100644 src/views/asset-management/export-task-management/export-package/index.vue create mode 100644 src/views/asset-management/export-task-management/export-refund/index.vue create mode 100644 src/views/asset-management/task-management/bulk-purchase/detail.vue create mode 100644 src/views/asset-management/task-management/bulk-purchase/index.vue create mode 100644 src/views/asset-management/task-management/device-batch-allocation/index.vue delete mode 100644 src/views/notifications/index.vue delete mode 100644 src/views/order-management/bulk-purchase/index.vue create mode 100644 src/views/settings/wecom/applications/components/WecomApplicationFormDialog.vue delete mode 100644 src/views/settings/wecom/applications/detail.vue diff --git a/q b/q deleted file mode 100644 index 22b336c..0000000 --- a/q +++ /dev/null @@ -1,1520 +0,0 @@ -commit d1ff4d5f6c433c3fbdac9141677294a6c4c2a569 (HEAD -> develop, origin/develop) -Author: luo -Date: Fri Jul 24 17:12:29 2026 +0800 - - feat: 顶部通知铃铛与站内通知中心 - -commit 4c6d871c350e19e3989cc22a97e7c8d293e35893 -Author: luo -Date: Fri Jul 24 16:30:58 2026 +0800 - - feat: 退款企微审批详情与业务处理状态 - -commit 9a84cd0d316276f124e0621767ce9f90e3d2c999 -Author: luo -Date: Fri Jul 24 15:45:55 2026 +0800 - - feat: 批量订购上传支付进度与失败明细 - -commit e043fd86d1437426c64bce036835e924005b0111 -Author: luo -Date: Fri Jul 24 12:03:04 2026 +0800 - - feat: 角色默认信用与店铺实际额度管理 - -commit a0c44ff538baa82de9539bb7f55b9efb14c8caf8 -Author: luo -Date: Fri Jul 24 11:48:02 2026 +0800 - - feat: 七月迭代公共状态与异步任务交互 - -commit 15122e225a968fa49ff35b59d2a8fbae6164c453 -Author: luo -Date: Fri Jul 24 09:31:11 2026 +0800 - - feat: 预计最终到期时间展示新增具体 - -commit 127fdb560bbfca6f065e1997bc5a441910f55027 -Author: luo -Date: Thu Jul 23 17:59:07 2026 +0800 - - fix: 样式优化套餐分配生效条件选择 - -commit 5e15127a8976234388db4d2a9a0d63f32459eda8 -Author: luo -Date: Thu Jul 23 17:06:05 2026 +0800 - - feat: 接入新参数:套餐分配生效条件选择,资产详情前代后代换货标识 - -commit d7c2c146fe7303cbb930c6b7b85813565bb99932 -Author: luo -Date: Thu Jul 23 14:10:48 2026 +0800 - - feat: 角色默认信用与店铺实际额度管理 - -commit d5fd8ac564d7607cd3b932e2c62f00390867a27e -Author: luo -Date: Wed Jul 22 18:37:41 2026 +0800 - - feat: 退款充值换货列表提交人与审批摘要 - -commit 7d3352038a5725a31cc9b134170b70a4e569002c -Author: luo -Date: Wed Jul 22 16:57:17 2026 +0800 - - feat: 换货新旧资产展示与独立搜索 - -commit 8faa2ea2efbdb1ba1c1963f094713f9ad57842ed -Author: luo -Date: Wed Jul 22 16:31:01 2026 +0800 - - feat: 预计最终到期时间展示 - -commit 8de4339505f68851ac29d7375f2822c3e83d0f2d -Author: luo -Date: Wed Jul 22 15:44:48 2026 +0800 - - feat: 卡和设备实名状态筛选 - -commit 68aa03b53833092807381a57129e00559d455d8e -Author: luo -Date: Wed Jul 22 14:21:15 2026 +0800 - - feat: 套餐分配生效条件选择 - -commit fbfdd01eec1c2b25077e0418f5217f5630134fd5 -Author: luo -Date: Wed Jul 22 10:14:13 2026 +0800 - - feat: 换货退款拦截错误展示 - -commit 5079f973262c7301f3bffb7da0e133ab7238f3fc -Author: luo -Date: Tue Jul 21 18:20:35 2026 +0800 - - feat: 店铺列表新增条件 - -commit 830476d49d92064819444ad3843bd57852f1bb69 -Author: luo -Date: Tue Jul 21 16:13:40 2026 +0800 - - H5实名购买顺序与后台批量配置 - -commit 47a2d88c9d2507ddfaeae8a7eee140985737507d -Author: luo -Date: Tue Jul 21 14:30:30 2026 +0800 - - 复机实名校验提示适配 - -commit 6febc66eca7e2bf2f22590d9fddf50e8a1af8c13 -Author: luo -Date: Tue Jul 21 11:50:47 2026 +0800 - - feat: 资产同步状态与同步轨迹入口-新 - -commit 45d255cabfa268e37ac05f13d7aa4ded2f2772c0 -Author: luo -Date: Tue Jul 21 11:13:20 2026 +0800 - - feat: 资产详情前代后代换货标识 - -commit eddfd157adab656c130c3d27e9928d638fec987c -Author: luo -Date: Tue Jul 21 09:57:14 2026 +0800 - - feat: 资产同步状态与同步轨迹入口 - -commit 09225dd8bcb038aa841f62c042bf85364be24497 -Author: csxj2026 -Date: Mon Jul 20 15:33:35 2026 +0800 - - 更新 Dockerfile - -commit 563804f67f94d21e28650de1344eaf00e9291090 -Author: csxj2026 -Date: Mon Jul 20 14:46:19 2026 +0800 - - 更新 docker-compose.prod.yml - -commit e95dc8e4f52c6e9ed99eeab7d51bfea66d81fea4 -Author: luo -Date: Mon Jul 20 12:17:02 2026 +0800 - - feat:代理现金余额不足100元展示、店铺业务员选择展示与筛选 - -commit ca338dd345f22cff6d3df02baaca1e5610ed29bb -Author: luo -Date: Mon Jul 20 11:02:05 2026 +0800 - - fix: 测试环境显示develop分支 - -commit fac05db39afc818668193f4928f51f70e5b5554f -Author: luo -Date: Mon Jul 20 10:50:23 2026 +0800 - - feat: 换货新资产归属继承提示 - -commit 2c8524485bd0b76fc472f4dd6da4c0e41e779278 -Author: luo -Date: Mon Jul 13 16:40:35 2026 +0800 - - fix: 资产信息字段显示隐藏根据角色 - -commit 4c0207c6e697cafb752502fe551fb2ab7e64ce4b -Author: luo -Date: Fri Jul 10 18:09:19 2026 +0800 - - fix: 将微信配置改成支付配置 - -commit 5b8d6610ab7f35d2111f6fe504d7e18c4b215775 -Author: luo -Date: Thu Jul 9 17:38:58 2026 +0800 - - fix: 将套餐系列的套餐加滚动条 - -commit a036b106412a480138910529e170665fc6e7f634 -Author: luo -Date: Thu Jul 9 15:59:39 2026 +0800 - - fix: 将权限管理里面的分页去掉 - -commit c1a7118d35bafbdf12d422d71298ca47a43523fb -Author: luo -Date: Thu Jul 9 15:20:28 2026 +0800 - - fix: 将导出列表分成三个模块 - -commit f27bbacb1edf2b423bd88b40a70d19f32e37148e -Author: luo -Date: Mon Jul 6 17:52:08 2026 +0800 - - fix: 设备信息新增的两个流量放到同一行 - -commit acda0d82c840995db0d304e863f14e9a17d91db3 -Author: luo -Date: Fri Jul 3 12:03:52 2026 +0800 - - feat: 新增全部已使用流量和全部总流量字段 - -commit 99de03604d920ccfa20a1a368a2d1353819e937a -Author: break -Date: Fri Jun 26 18:14:37 2026 +0800 - - 驳回 - -commit 1baa6d87cfdcb27b368f45aa4e79e607159bceb7 -Author: break -Date: Fri Jun 26 18:14:26 2026 +0800 - - 驳回 - -commit f604791c69216d09a36fb3340a69ba9c5bb6904d -Author: break -Date: Thu Jun 25 10:30:49 2026 +0800 - - 倒计时没有覆盖复机停机的问题 - -commit cfb6b52cc29e022848cab3864c0a5b9b0688ac37 -Author: break -Date: Wed Jun 24 15:06:05 2026 +0800 - - 倒计时限制 - -commit 0c3065f970763d21704c1b4483cf54e601aa712e -Author: break -Date: Tue Jun 23 09:50:12 2026 +0800 - - 让凭证数组与套餐作废任务进入可联调状态 - - Constraint: 后端订单套餐作废接口使用 /api/admin/order-package-invalidate-tasks,上传 - purpose 只能使用 attachment。 - Rejected: 继续提交逗号拼接凭证字符串 | 新提交路径必须使用 string[],历史字符串只做读取归一化。 - Confidence: high - Scope-risk: broad - Directive: 新增订单套餐作废权限时需同时配置菜单 URL 与 - order_package_invalidate_task:create/detail 按钮权限。 - Tested: bun run build;development 真实后端联调上传、创建、列表、详情通过;复机接口未触发。 - Not-tested: 未逐一手工覆盖所有历史凭证数据、全部角色权限组合和所有文件扩展名预览 - -commit ebf9739f06319fb6ddaffd5e51b27d59138272b4 -Author: luo -Date: Mon Jun 22 11:09:50 2026 +0800 - - fix:sort - -commit d3b5f55c64b774fe994519c06cbbd3f138426dda -Author: luo -Date: Mon Jun 22 10:36:33 2026 +0800 - - feat:更换企业授权 - -commit 866a2587b31e2121f99572e8f0b9b54c6526b3de -Author: luo -Date: Thu Jun 18 10:17:10 2026 +0800 - - feat:export - -commit 85d158dfec727cff7838ca383c8f9dd806b03ddf -Author: luo -Date: Wed Jun 17 17:46:04 2026 +0800 - - feat: order-export,generation,status - -commit 2a8f4e40d65930af4506cfc3882fef2c9c200b7d -Author: luo -Date: Tue Jun 16 11:35:45 2026 +0800 - - feat: 新增导出 - -commit 908367ba5df1bd27ea7dffcc44cb72eb85005a9c -Author: sexygoat <1538832180@qq.com> -Date: Mon Jun 15 10:19:35 2026 +0800 - - fix: new - -commit 2ecab976f5c89161d8565c0568991237439e1136 -Author: sexygoat <1538832180@qq.com> -Date: Sat Jun 13 10:41:10 2026 +0800 - - fix: 新增: 修改资产套餐已用量, 修改资产套餐过期时间 - -commit e04a283319b8bb58648ac58a6a88536dde0d3509 -Author: sexygoat <1538832180@qq.com> -Date: Fri Jun 12 10:41:37 2026 +0800 - - fix: 新增代理系列授权-建议售价使用套餐 - -commit d23e896f97fd2ed475a4eb3a2a68c43c3a51013a -Author: sexygoat <1538832180@qq.com> -Date: Sat Jun 6 15:09:31 2026 +0800 - - fix: 退款审批可以是0 - -commit c5e4082c260a006965c13917250bd9bc22a0b531 -Author: sexygoat <1538832180@qq.com> -Date: Fri Jun 5 16:26:17 2026 +0800 - - fix: 退款审批可以是0 - -commit 0c737a30c12046d2fd60cd97e7d46469e09fa713 -Author: sexygoat <1538832180@qq.com> -Date: Thu Jun 4 10:47:43 2026 +0800 - - fix: 换货 - -commit c5dae2993b0a5547e83855458062f33b4bba1555 -Author: sexygoat <1538832180@qq.com> -Date: Wed Jun 3 17:53:19 2026 +0800 - - fix: 换货 - -commit 3e6b3981f41e5efe591220835a967166e758dd2f -Author: sexygoat <1538832180@qq.com> -Date: Mon Jun 1 14:10:09 2026 +0800 - - fix:订单列表详情实付金额代理/企业不可见 - -commit e563b81b6e8ef49ef70bcbc51e82f2b212cca29b -Author: sexygoat <1538832180@qq.com> -Date: Mon Jun 1 11:41:52 2026 +0800 - - fix:操作审计日志-style - -commit 322cd0dca5baf82d7d4eb7b6c4c223d3006476f9 -Author: sexygoat <1538832180@qq.com> -Date: Sat May 30 15:06:41 2026 +0800 - - fix: 订单列表套餐显示销售价 - -commit ad56b82944abc409dd92f45a84a777fe33327951 -Author: sexygoat <1538832180@qq.com> -Date: Fri May 29 15:44:53 2026 +0800 - - feat: 新增代理流水资产标识 - -commit f62a8d98a4b522695ae7aae1fe5cac97322e1151 -Author: sexygoat <1538832180@qq.com> -Date: Fri May 29 12:11:03 2026 +0800 - - fix: 自动更新提示bug - -commit 76a526643eb090a9ad553e0b7ef6918624621ee8 -Author: sexygoat <1538832180@qq.com> -Date: Fri May 29 10:46:01 2026 +0800 - - fix:修改bug: 虚流量关闭的时候还是显示了 - -commit 9ce48f171420f28f73268b67fe3133033c66d227 -Author: sexygoat <1538832180@qq.com> -Date: Fri May 29 09:40:17 2026 +0800 - - fix:本月已用流量和运营商周期月内已用流量 - -commit a162dcc650399aa3e6ab14235ddb44b7ce71ea8c -Author: sexygoat <1538832180@qq.com> -Date: Fri May 29 09:38:30 2026 +0800 - - fix:本月已用流量和运营商周期月内已用流量代理企业不展示,其他账号新增权限 - -commit 868a3352adb90442baa4511fedaa9fe794e864f2 -Author: sexygoat <1538832180@qq.com> -Date: Thu May 28 18:18:42 2026 +0800 - - fix: 新增套餐新增缩长比例,增长比例 - -commit 61e575194d8cc120591625eac31ec3ac3e1fe57f -Author: sexygoat <1538832180@qq.com> -Date: Thu May 28 18:13:08 2026 +0800 - - fix: 新增套餐新增缩长比例,增长比例 - -commit 69b024b5cc2d7e2b19ee718e37b4dccc169c2144 -Author: sexygoat <1538832180@qq.com> -Date: Thu May 28 11:20:33 2026 +0800 - - fix: 虚流量进度条 - -commit 6654972ddb0081ca9f02ff819a273b4b7da1372d -Author: sexygoat <1538832180@qq.com> -Date: Wed May 27 14:58:37 2026 +0800 - - feat: 新增退款凭证 - -commit fe0093972f7ef2a12c7e8ea5af87976aad447382 -Author: sexygoat <1538832180@qq.com> -Date: Tue May 26 18:07:39 2026 +0800 - - feat: 卡新增IMEI - -commit 878d93a8650368cddafc0712f43694292050b371 -Author: sexygoat <1538832180@qq.com> -Date: Fri May 22 16:07:47 2026 +0800 - - fix: 微信配置 - -commit b364fb4aec5aa27d636d9b153603d94b685c2d48 -Author: sexygoat <1538832180@qq.com> -Date: Thu May 21 15:43:36 2026 +0800 - - fix: 在线 - -commit a69f972766f3b3b6a2011d45b981a6533dd1fde0 -Author: sexygoat <1538832180@qq.com> -Date: Thu May 21 14:53:36 2026 +0800 - - fix: 格式化时间 - -commit dfb78006acf14b71eb268ac2e0ed86ce084d894c -Author: sexygoat <1538832180@qq.com> -Date: Thu May 21 14:39:21 2026 +0800 - - fix: 分页器一直显示和资产信息使用单卡 - -commit 893921007a9e9ad815fc6ce4969aec3d31dc0383 -Author: sexygoat <1538832180@qq.com> -Date: Wed May 20 11:24:52 2026 +0800 - - feat: 设备管理新增imei和虚拟号 - -commit 59167d2630caef5ecbdd8861b83de3312c1f7954 -Author: sexygoat <1538832180@qq.com> -Date: Tue May 19 15:14:39 2026 +0800 - - feat: 卡/设备是否有生效套餐 - -commit 14832f5c6f3d51b53cb16d0b172e229985d0486c -Author: sexygoat <1538832180@qq.com> -Date: Mon May 18 13:11:40 2026 +0800 - - fix: 拖拽上传 - -commit 894aea0e74f118fdf56f9a3c65b36c54984c934f -Author: sexygoat <1538832180@qq.com> -Date: Mon May 18 12:23:35 2026 +0800 - - feat: 新增卡视角以及设备视角的实名同步时间,卡状态同步时间,流量同步时间 - -commit 877c741d728a15902fbc3b96201e4e93f95706f8 -Author: sexygoat <1538832180@qq.com> -Date: Fri May 15 16:53:00 2026 +0800 - - fix: 最后同步时间 - -commit aeb08f2cc159c476c28e2714171a2df88922ad8d -Author: sexygoat <1538832180@qq.com> -Date: Fri May 15 16:11:47 2026 +0800 - - fix: 时区去掉使用本地 - -commit c7e2d6fe533d83a65058d4c9f6be5dca32be05a3 -Author: sexygoat <1538832180@qq.com> -Date: Fri May 15 11:16:57 2026 +0800 - - fix: get-list - -commit f3b5444dd8d56dd06352318ab729fa33be065130 -Author: sexygoat <1538832180@qq.com> -Date: Thu May 14 15:52:38 2026 +0800 - - fix: 换货原因改成下拉 - -commit 38cf7d12e90d406ce13c726da8c868d7c552fda9 -Author: sexygoat <1538832180@qq.com> -Date: Thu May 14 10:52:11 2026 +0800 - - fix: 真流量虚流量权限 - -commit 1690252740a9fc014d445ecdf5356f9f32ef07a4 -Author: sexygoat <1538832180@qq.com> -Date: Tue May 12 14:54:47 2026 +0800 - - feat: 新增设备激活时间 - -commit 471d1196b3062b18d5dd05dd67735f04b566c04f -Author: sexygoat <1538832180@qq.com> -Date: Tue May 12 12:11:53 2026 +0800 - - feat: 新增运营商停机原因 - -commit 5d20d7dd3f103e9cdf5cbc14fde46fc5e4427171 -Author: sexygoat <1538832180@qq.com> -Date: Mon May 11 18:01:22 2026 +0800 - - fix: 订单详情支付凭证, 退款 - -commit 1990a3ccbac7e86439806a61fc037b3c3f29b59e -Author: sexygoat <1538832180@qq.com> -Date: Mon May 11 15:51:50 2026 +0800 - - fix: bug - -commit 766497dc316958a9bcac926489d434d946bbaf0b -Author: sexygoat <1538832180@qq.com> -Date: Mon May 11 14:51:13 2026 +0800 - - fix: bug - -commit e59c75bf9e42050e3794f03749c65a4055b70142 -Author: sexygoat <1538832180@qq.com> -Date: Mon May 11 14:47:07 2026 +0800 - - fix: bug - -commit eeeef931b1547327c510fa979ea416942a3425c1 -Author: sexygoat <1538832180@qq.com> -Date: Mon May 11 14:35:38 2026 +0800 - - fix: bug - -commit 73ce9af11a5c12a5b9cb66eb6b557b31da4033f8 -Author: sexygoat <1538832180@qq.com> -Date: Sat May 9 16:13:11 2026 +0800 - - fix: 代理系列授权店铺 - -commit 3c71ae0004e71e0717dbc0c76003f400dfac1daf -Author: sexygoat <1538832180@qq.com> -Date: Thu May 7 17:48:43 2026 +0800 - - fix:name - -commit 43de0e3e9e6416ed00309aba130c34ab1456915b -Author: sexygoat <1538832180@qq.com> -Date: Thu May 7 17:45:05 2026 +0800 - - fix:name - -commit 78fe35da01d0839790fac967b39fb0d25de4a235 -Author: sexygoat <1538832180@qq.com> -Date: Thu May 7 17:34:06 2026 +0800 - - fix:name - -commit 90d415cfb9a15cbc602ff819ff7728a86956ac56 -Author: sexygoat <1538832180@qq.com> -Date: Thu May 7 09:18:03 2026 +0800 - - fix: bug - -commit 304a5de1d6d2b9a5e7c19c02bf1ea1ea0c6ab1e4 -Author: sexygoat <1538832180@qq.com> -Date: Wed May 6 11:13:51 2026 +0800 - - fix: tips - -commit 883215056253417a09eee93a05ba7ab2f4f6b312 -Author: sexygoat <1538832180@qq.com> -Date: Wed May 6 10:54:43 2026 +0800 - - feat: sn - -commit 950520635da9d3c5ab6da97ca2184291d67811b4 -Author: sexygoat <1538832180@qq.com> -Date: Thu Apr 30 18:04:01 2026 +0800 - - feat: 文件下载 - -commit 81155fd8e442149eac514600ff66a2c24d9966f8 -Author: sexygoat <1538832180@qq.com> -Date: Thu Apr 30 17:01:00 2026 +0800 - - fix:进度条 - -commit 78a41513bd01913f352119b4aa5045b2d08be346 -Author: sexygoat <1538832180@qq.com> -Date: Thu Apr 30 15:16:15 2026 +0800 - - fix: 字段显示和订单详情按钮 - -commit 57ddbe5f8585fa0cdc84a706e21e4d2bbcff83ba -Author: sexygoat <1538832180@qq.com> -Date: Thu Apr 30 12:04:04 2026 +0800 - - fix: order - -commit 044c07fae697d3a3152c0769ebe995aa1d6b9ba9 -Author: sexygoat <1538832180@qq.com> -Date: Thu Apr 30 10:39:51 2026 +0800 - - fix: order - -commit 1a4eb00440765b846db8fa8475966edb783f2e3e -Author: sexygoat <1538832180@qq.com> -Date: Wed Apr 29 17:09:23 2026 +0800 - - fix: 新增代理系列授权 - -commit 1141b6c92daf9ca1c0df3a609cb34d844528ea5e -Author: sexygoat <1538832180@qq.com> -Date: Wed Apr 29 16:11:54 2026 +0800 - - fix: 新增代理系列授权 - -commit 9b4d956032fdf335c0953ddcb29e07aa634211ef -Author: sexygoat <1538832180@qq.com> -Date: Wed Apr 29 12:49:30 2026 +0800 - - del: 激活时间 - -commit 175fe55be79b9222c7e06f6247b6a5586e85cf85 -Author: sexygoat <1538832180@qq.com> -Date: Wed Apr 29 11:40:38 2026 +0800 - - del: 激活时间 - -commit 3d34040bcc77221796a3016cf9060d3885a495ce -Author: sexygoat <1538832180@qq.com> -Date: Wed Apr 29 11:30:25 2026 +0800 - - fix: 套餐 - -commit 1dc4701540738bd7d026db62fd4128cf12ba2259 -Author: sexygoat <1538832180@qq.com> -Date: Wed Apr 29 11:29:53 2026 +0800 - - fix: 套餐 - -commit 686bddad796a96550f10f62ee3d032222bb214d3 -Author: sexygoat <1538832180@qq.com> -Date: Tue Apr 28 18:52:43 2026 +0800 - - fix: 套餐 - -commit b6625748ac661a23c96462fdf4b56395c590f595 -Author: sexygoat <1538832180@qq.com> -Date: Tue Apr 28 18:40:18 2026 +0800 - - fix: 套餐 - -commit 55515410ae9846d0a5517c52777de05137ff466c -Author: sexygoat <1538832180@qq.com> -Date: Tue Apr 28 16:04:13 2026 +0800 - - fix: 设备信息顺序 - -commit c80ff80bf09059349323b82174e6fdb9224a28a9 -Author: sexygoat <1538832180@qq.com> -Date: Tue Apr 28 15:32:33 2026 +0800 - - fix: 账号管理 - -commit 317afd2d23805aa28ca5982d8009ecfa796590bc -Author: sexygoat <1538832180@qq.com> -Date: Tue Apr 28 15:20:22 2026 +0800 - - fix: 账号管理 - -commit a48ce0cb5483a57c1500e46606c851daa97a19d8 -Author: sexygoat <1538832180@qq.com> -Date: Tue Apr 28 14:48:44 2026 +0800 - - fix: 控制台加权限,登录跳转资产信息 - -commit 1ba662de0a9414aca68cf0dbd27ea8b906c74fec -Author: sexygoat <1538832180@qq.com> -Date: Tue Apr 28 12:03:42 2026 +0800 - - fix: 控制台加权限,登录跳转资产信息 - -commit fb10b727600b30129e49f2af25b24f71e9bda06a -Author: sexygoat <1538832180@qq.com> -Date: Tue Apr 28 11:14:13 2026 +0800 - - fix: 手动触发 - -commit b88f2d185ef93688507942f421caac92db029b79 -Author: sexygoat <1538832180@qq.com> -Date: Tue Apr 28 10:18:30 2026 +0800 - - fix: type - -commit 4f1cab614915f7192ea5839b26a638ed82bf7ebd -Author: sexygoat <1538832180@qq.com> -Date: Tue Apr 28 09:56:03 2026 +0800 - - fix: role_type - -commit ffdc6e2bbb1f734ed669268c14ce632918c50259 -Author: sexygoat <1538832180@qq.com> -Date: Tue Apr 28 09:38:52 2026 +0800 - - feat: 添加停机断点 - -commit af3f38aba0a4bdb514f079dba71fe8b253a6b89f -Author: sexygoat <1538832180@qq.com> -Date: Mon Apr 27 18:34:02 2026 +0800 - - fix: 操作 - -commit 030195d609024f58732f1ecd4d664b409855afb2 -Author: sexygoat <1538832180@qq.com> -Date: Mon Apr 27 17:46:20 2026 +0800 - - fix: 操作 - -commit d0c1f1622cd26814c23ea3fe6b4638b6a2110103 -Author: sexygoat <1538832180@qq.com> -Date: Mon Apr 27 17:39:55 2026 +0800 - - fix: 流量显示 - -commit d5c5e07f77084d5422928c3522d04afc8b8a886b -Author: sexygoat <1538832180@qq.com> -Date: Mon Apr 27 16:49:32 2026 +0800 - - feat:操作日志 - -commit a402f2329a6ab218d252c84b57edd95475e41d6d -Author: sexygoat <1538832180@qq.com> -Date: Mon Apr 27 16:05:24 2026 +0800 - - feat:流量展示 - -commit d52efaadcbf5c3c695308330a187f69db690f8f7 -Author: sexygoat <1538832180@qq.com> -Date: Mon Apr 27 15:57:31 2026 +0800 - - feat:流量展示 - -commit a055ff166a64e7601d4b0a6cf448137fea81bd3a -Author: sexygoat <1538832180@qq.com> -Date: Mon Apr 27 15:06:27 2026 +0800 - - feat:log - -commit 853c87b8a2bb61950eb7f2284016855ed3ed608c -Author: sexygoat <1538832180@qq.com> -Date: Mon Apr 27 11:59:20 2026 +0800 - - fix: 隐藏虚比,同步订单号 - -commit 6c9b29c53b63e32b5613af9315c715c41c28fecd -Author: sexygoat <1538832180@qq.com> -Date: Mon Apr 27 11:14:20 2026 +0800 - - fix: 套餐订购,界面优化 - -commit 2a3343400563ac6910b09533003377fbcd79295d -Author: sexygoat <1538832180@qq.com> -Date: Mon Apr 27 09:59:01 2026 +0800 - - fix: set-wifi - -commit 819fe9080a6313f1f724cbe0faf1ad0f617a0563 -Author: sexygoat <1538832180@qq.com> -Date: Sat Apr 25 17:00:11 2026 +0800 - - fix: ui - -commit f0f054390ab63a00d3de1dae33360c14160840cc -Author: sexygoat <1538832180@qq.com> -Date: Sat Apr 25 16:23:17 2026 +0800 - - fix: ui - -commit a770984ef73b9b997cdfbc773dc9be0b38407da5 -Author: sexygoat <1538832180@qq.com> -Date: Sat Apr 25 15:51:24 2026 +0800 - - fix: bug - -commit 9247001643bba7d2c2326c39103d9a2fc6f15e4c -Author: sexygoat <1538832180@qq.com> -Date: Sat Apr 25 12:01:21 2026 +0800 - - fix: bug - -commit 17c299e4ceddccd6ddc287a2e875dedea5a10b0c -Author: sexygoat <1538832180@qq.com> -Date: Fri Apr 24 18:39:39 2026 +0800 - - fix: bug - -commit 2d6b5d79038e6713d4fd17aee0cbfe7778f1dc13 -Author: sexygoat <1538832180@qq.com> -Date: Fri Apr 24 11:48:52 2026 +0800 - - fix: iccid列适配 - -commit ceecc07ffc1f83d2dd3a4f57542c770cfca174f3 -Author: sexygoat <1538832180@qq.com> -Date: Fri Apr 24 11:28:04 2026 +0800 - - fix: 批量分配 - -commit e4ed3784e3d3678af532c98342b4dab3ece32435 -Author: sexygoat <1538832180@qq.com> -Date: Fri Apr 24 11:17:39 2026 +0800 - - fix: pay - -commit 62851342c3c5bfe74e18f97dd74fa55d90f5dd69 -Author: sexygoat <1538832180@qq.com> -Date: Fri Apr 24 09:55:44 2026 +0800 - - fix: permission - -commit aaa648a86d35ca94cdeface523e632b0d82d9f3e -Author: sexygoat <1538832180@qq.com> -Date: Thu Apr 23 18:35:29 2026 +0800 - - feat: 支付凭证 - -commit cd2ca96873646b070f00dd76c523c7a8b5579791 -Author: sexygoat <1538832180@qq.com> -Date: Thu Apr 23 18:13:07 2026 +0800 - - feat: 手动实名和套餐列表退款 - -commit 719db517f2a1b01877b4fc46a93cb7b16ec206e9 -Author: sexygoat <1538832180@qq.com> -Date: Thu Apr 23 16:21:12 2026 +0800 - - fix: bug - -commit 2140efbacf576d8f4480611bdfa87f669e4e29ce -Author: sexygoat <1538832180@qq.com> -Date: Thu Apr 23 16:08:07 2026 +0800 - - fix: bug - -commit 8cc86369a23cd01cb6266f72325875e0b747138f -Author: sexygoat <1538832180@qq.com> -Date: Thu Apr 23 16:03:54 2026 +0800 - - fix: bug - -commit 8ca03ed7ac858e803696eb2e1c6f2508788742aa -Author: sexygoat <1538832180@qq.com> -Date: Thu Apr 23 15:52:18 2026 +0800 - - fix: bug - -commit 0bc2efdf0ea54a49ea81cbb895a7d885de3fa453 -Author: sexygoat <1538832180@qq.com> -Date: Thu Apr 23 15:32:34 2026 +0800 - - fix: bug - -commit a5e76313cb15682b37f09411d32337c5443c3007 -Author: sexygoat <1538832180@qq.com> -Date: Thu Apr 23 14:59:05 2026 +0800 - - fix: bug - -commit a9467e8a0cdd2168e4756d391b75e0a9266d48f0 -Author: sexygoat <1538832180@qq.com> -Date: Wed Apr 22 18:33:52 2026 +0800 - - fix: 修改工单bug - -commit fd22dc7ad41bc733e2b1dad0ef7ec95de9848b76 -Author: sexygoat <1538832180@qq.com> -Date: Wed Apr 22 17:42:36 2026 +0800 - - fix: 修改工单bug - -commit 8378d2228e08b58b122f97decd2e3a3cedc74086 -Author: sexygoat <1538832180@qq.com> -Date: Wed Apr 22 15:26:55 2026 +0800 - - feat: 新增按钮授权 - -commit bce9054b829ef75c843cebff428089e97be502a9 -Author: sexygoat <1538832180@qq.com> -Date: Wed Apr 22 15:00:37 2026 +0800 - - feat: 新增按钮授权 - -commit 936a4f06567faf5622b2fa1113fe9535981e9de6 -Author: sexygoat <1538832180@qq.com> -Date: Mon Apr 20 17:51:03 2026 +0800 - - fix: req:bug - -commit 11bfcadf6585b0180ffb636a5a9a2182c3c48f48 -Author: sexygoat <1538832180@qq.com> -Date: Mon Apr 20 16:28:09 2026 +0800 - - fix: wifi 自动填充 - -commit 9b66b78110417f76d50b75ea29214a0697aa984c -Author: sexygoat <1538832180@qq.com> -Date: Mon Apr 20 15:58:18 2026 +0800 - - feat: 当前生效套餐 - -commit 3acb626a3462306c6e748ba7f76ebb8fbea7ceb8 -Author: sexygoat <1538832180@qq.com> -Date: Mon Apr 20 15:10:23 2026 +0800 - - feat: 新增更新资产实名认证策略 - -commit d721c4b8a90eb4bc4a203b46fd463cbad14041fa -Author: sexygoat <1538832180@qq.com> -Date: Mon Apr 20 11:45:59 2026 +0800 - - fix: 设备分配代理,虚比例,sim顺序 - -commit c5ee690ccd26bcc15fe661ffc5920efeb63c0421 -Author: sexygoat <1538832180@qq.com> -Date: Sat Apr 18 16:40:41 2026 +0800 - - feat: 新增设备切卡模式 - -commit fd583e81e074c588ba58b7ddb528f72a8b08854d -Author: huang -Date: Sat Apr 18 12:24:18 2026 +0800 - - fix: 修复部署后切换页面 JS chunk 404 白屏问题 - - - main.ts 监听 vite:preloadError,chunk 加载失败时自动刷新一次 - - 新增 ChunkErrorBoundary 组件,捕获 Vue 渲染层 chunk 加载异常 - - App.vue 包裹 ChunkErrorBoundary - - docker/nginx.conf 修复缓存策略:index.html 不缓存,/assets/ 长缓存 immutable - -commit b48d6a1894f3ea42976aa8ec96b6492b92b8a1db -Author: sexygoat <1538832180@qq.com> -Date: Fri Apr 17 18:40:54 2026 +0800 - - feat: 新增导入字段,显示实名认证策略字段 - -commit 90b13eb5ec0f795409055ba87a9b9b4ddac016a3 -Author: sexygoat <1538832180@qq.com> -Date: Fri Apr 17 16:37:41 2026 +0800 - - fix: 取消关联,居左,店铺列表 - -commit 5adeade9af5fbbe6fa0e7b9f352b1620e6925ff0 -Author: sexygoat <1538832180@qq.com> -Date: Fri Apr 17 14:56:53 2026 +0800 - - fix: 移除订单详情ID相关参数,新增iccid/VirtualNo - -commit 0e0c3e18d05cd82ccf5a09737142c6d17c4a8d9b -Author: sexygoat <1538832180@qq.com> -Date: Fri Apr 17 10:27:52 2026 +0800 - - feat: 分析页新增权限 - -commit a3bc025636d0aae9915bfb35ca6ea4aa991ae26d -Author: sexygoat <1538832180@qq.com> -Date: Thu Apr 16 16:36:27 2026 +0800 - - fix: 卡列表删除一次性佣金和累计充值 - -commit cb3105504ebe4b1398ca3825e4845f6e62b19b49 -Author: sexygoat <1538832180@qq.com> -Date: Thu Apr 16 10:12:30 2026 +0800 - - fix: 修复排序 - -commit 9617cdd825886b799149e94af01284ef035bd1b7 -Author: sexygoat <1538832180@qq.com> -Date: Wed Apr 15 17:29:53 2026 +0800 - - fix: 注释停用资产 - -commit 209b5342b92d83f1bca097cd537c94e4942218dc -Author: sexygoat <1538832180@qq.com> -Date: Wed Apr 15 17:12:50 2026 +0800 - - feat: ICCID新增设备店铺名称,套餐系列名称 - -commit 1931a096b008a62a4f147d3b3961b99ced2f4087 -Author: sexygoat <1538832180@qq.com> -Date: Wed Apr 15 10:14:53 2026 +0800 - - feat: ICCID新增设备店铺名称,套餐系列名称 - -commit d373c2e70eef1e0730d4d0066ff7ff5b74efa5da -Author: sexygoat <1538832180@qq.com> -Date: Wed Apr 15 09:59:05 2026 +0800 - - feat: ICCID新增复制, 宽度自适应 - -commit b5eb4fdbcec27808a6e32a91b263cf1a5bbc7495 -Author: sexygoat <1538832180@qq.com> -Date: Mon Apr 13 14:35:19 2026 +0800 - - fix: 修复微信配置编辑不传递脱敏 - -commit 1acb9db38e894d99b51636c24e769c8cc88c7b96 -Author: sexygoat <1538832180@qq.com> -Date: Sat Apr 11 17:04:50 2026 +0800 - - fix: 关联账号列表单选框 - -commit 4f02d6faf0984584aff68372713039a192ed9c70 -Author: sexygoat <1538832180@qq.com> -Date: Sat Apr 11 16:51:54 2026 +0800 - - fix: bug - -commit 33e15314ac504fcfec72e9fba4138eeeffde591a -Author: sexygoat <1538832180@qq.com> -Date: Sat Apr 11 12:19:35 2026 +0800 - - bug - -commit 90ae585651ece1536443f494d751768e38a82e84 -Author: sexygoat <1538832180@qq.com> -Date: Fri Apr 10 16:54:53 2026 +0800 - - fix(operator): fix operator edit issue - -commit 8b30341d501f79240ca043a67c1ed5bc351066ef -Author: sexygoat <1538832180@qq.com> -Date: Fri Apr 10 15:06:28 2026 +0800 - - fix(operator): fix operator edit issue - -commit 2b3119c5497f07aec9d2f4f489be6b8b6fd32683 -Author: sexygoat <1538832180@qq.com> -Date: Fri Apr 10 14:00:21 2026 +0800 - - fix(operator): fix operator edit issue - -commit 9a6f085cdead297d5b73bc567307db42cfdb20e2 -Author: sexygoat <1538832180@qq.com> -Date: Fri Apr 10 09:50:00 2026 +0800 - - fix(operator): fix operator edit issue - -commit c2c1644799ccbd05c26001e34b829f8f7dafd512 -Author: sexygoat <1538832180@qq.com> -Date: Thu Apr 9 17:47:32 2026 +0800 - - 修复bug - -commit 472099bf96cc36dd8336226823e8c73a135508d4 -Author: sexygoat <1538832180@qq.com> -Date: Thu Apr 9 16:56:30 2026 +0800 - - 修改bug - -commit 6a46aeea158a67b11a463d619c1570c8440590d7 -Author: sexygoat <1538832180@qq.com> -Date: Thu Apr 9 15:57:51 2026 +0800 - - 修改bug - -commit b171e7cc0389d94843cdd3063ea2275c8d9338e3 -Author: sexygoat <1538832180@qq.com> -Date: Thu Apr 9 15:32:20 2026 +0800 - - 修改bug - -commit 4656d403c21154f970ed80a410828c3fe33ae918 -Author: sexygoat <1538832180@qq.com> -Date: Thu Apr 9 14:08:25 2026 +0800 - - 修改bug - -commit cb3ba061060462add086a4eea18121765a34fdd5 -Author: sexygoat <1538832180@qq.com> -Date: Thu Apr 9 13:48:11 2026 +0800 - - 修改bug - -commit cc9d2a85a2e493785dbe56b5b53011b016020b49 -Merge: d1c6588 6a6d3dd -Author: sexygoat <1538832180@qq.com> -Date: Wed Apr 8 19:35:20 2026 +0800 - - chore: merge main branch from remote - -commit d1c6588d8fc79c2acbb872a7b1b648eee89b1f8c -Author: sexygoat <1538832180@qq.com> -Date: Wed Apr 8 19:31:22 2026 +0800 - - 删除多余代码 - -commit 6a6d3dd3943791ceca28ce6ecfcb0f47dd3d7c4a -Author: huang -Date: Wed Apr 8 11:20:48 2026 +0800 - - 修复: nginx 禁止 index.html 缓存,防止部署后资源 404 - - Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) - - Co-authored-by: Sisyphus - -commit b510b4539f36c2310afbf977fae07d492de5e016 -Author: sexygoat <1538832180@qq.com> -Date: Wed Apr 8 10:19:25 2026 +0800 - - 修复bug - -commit ff087abd44837a51a1e173428f02445b54bfec0f -Author: sexygoat <1538832180@qq.com> -Date: Fri Apr 3 11:47:11 2026 +0800 - - 修复前端bug - -commit ea14ae92cae67f2e813dd1e2cd852db2a680b266 -Author: sexygoat <1538832180@qq.com> -Date: Thu Apr 2 15:17:55 2026 +0800 - - 绑定卡列表操作卡 - -commit 8df7024a454475d6ec30ede3081920df783db02c -Author: sexygoat <1538832180@qq.com> -Date: Thu Apr 2 13:42:57 2026 +0800 - - modify - -commit 411206e039b88c39fdafdca857fe868bee7c14d0 -Author: sexygoat <1538832180@qq.com> -Date: Wed Apr 1 11:10:13 2026 +0800 - - feat(network_status):停机/正常 - -commit afeb1e7c891757d08ddfe52c8edd6b6ccc11e726 -Author: sexygoat <1538832180@qq.com> -Date: Wed Apr 1 10:56:26 2026 +0800 - - style(order): 修改订单管理标题 - -commit 0d3fc5ce7f1c8cdda7cb3ca331c41b34e0a80597 -Author: sexygoat <1538832180@qq.com> -Date: Wed Apr 1 10:41:43 2026 +0800 - - package - -commit 01f81c2178fd95b60cdcbea58ee68985778366c2 -Author: sexygoat <1538832180@qq.com> -Date: Tue Mar 31 16:55:54 2026 +0800 - - 新增运营商 - -commit 3372be99b8d2dc1661dad39f453e6ff1b7e85b04 -Author: sexygoat <1538832180@qq.com> -Date: Tue Mar 31 15:13:19 2026 +0800 - - 修复 - -commit 104d62b17d9c1df99a4f614c640b72a3a3cc44e7 -Author: sexygoat <1538832180@qq.com> -Date: Tue Mar 31 10:15:10 2026 +0800 - - 修复: list->items - -commit 36da079d59fc81dd5407bbe039d45742139fe518 -Author: sexygoat <1538832180@qq.com> -Date: Mon Mar 30 18:16:39 2026 +0800 - - 修复详情404 - -commit a05717c2ed1a507572bd869e96a18b6b5d77342c -Author: sexygoat <1538832180@qq.com> -Date: Mon Mar 30 14:59:56 2026 +0800 - - 新增: 轮询管理 - -commit dbe607020791da8b3ad99ec8f86c328612729ea4 -Author: sexygoat <1538832180@qq.com> -Date: Sat Mar 28 18:31:43 2026 +0800 - - modify-bug - -commit d6c23c8bd1265c5f1a681f16b5a9919ea1b72ef3 -Author: sexygoat <1538832180@qq.com> -Date: Tue Mar 24 16:51:21 2026 +0800 - - 搜索放到重置前面 - -commit 2af0346d04dc60eb9e35cff2c7ca742d2635f3c2 -Author: sexygoat <1538832180@qq.com> -Date: Tue Mar 24 16:47:52 2026 +0800 - - 修改资产信息字段排序 - -commit a805c279022814fcbff6073fbf2bd5f0e77706bf -Author: sexygoat <1538832180@qq.com> -Date: Fri Mar 20 14:18:47 2026 +0800 - - 修改资产详情 - -commit 62f828f3142c244a84b7ec493efb592eb86909a2 -Author: sexygoat <1538832180@qq.com> -Date: Fri Mar 20 10:26:57 2026 +0800 - - 修改资产详情 - -commit f06d8c9133dd7d5687826ea3eefe95b63e6e8b73 -Author: sexygoat <1538832180@qq.com> -Date: Thu Mar 19 18:32:02 2026 +0800 - - 新增 - -commit 407287f5386597b053069825277a9144df21b8da -Author: sexygoat <1538832180@qq.com> -Date: Wed Mar 18 15:33:39 2026 +0800 - - 删除资产信息的进度条 - -commit 9fb3367fd7e6fefa213afe22730cc7d4e3a8d5c0 -Author: sexygoat <1538832180@qq.com> -Date: Wed Mar 18 10:47:25 2026 +0800 - - 完善充值代理 - -commit ff67681c29de9f0ea1adf990e6ebe7ac9dc28c5e -Author: sexygoat <1538832180@qq.com> -Date: Tue Mar 17 14:27:17 2026 +0800 - - 修改布局 - -commit e975e6af4bc9f1ac891e3192e018047c24da1599 -Author: sexygoat <1538832180@qq.com> -Date: Tue Mar 17 14:06:38 2026 +0800 - - 新增: 微信配置-代理充值 - -commit f4ccf9ed24bd5d7f9af96e87e1980f3e994c5aa3 -Author: sexygoat <1538832180@qq.com> -Date: Tue Mar 17 09:31:37 2026 +0800 - - 修改bug - -commit 8f315264998a64d198fe9fe1f269d57db33bb00a -Author: sexygoat <1538832180@qq.com> -Date: Sat Mar 14 15:16:21 2026 +0800 - - fix: bug - -commit d43de4cd06c74b0f4910b43bd53c3cc160e7af28 -Author: sexygoat <1538832180@qq.com> -Date: Wed Mar 11 17:09:35 2026 +0800 - - 修改bug - -commit bd45f7a2246a45aea83a2ba0db5fbefaeaea05b6 -Author: sexygoat <1538832180@qq.com> -Date: Sat Mar 7 11:59:16 2026 +0800 - - 详情添加权限 - -commit e73992d253f82be2abb27ad910fa0b76b35afaf3 -Author: sexygoat <1538832180@qq.com> -Date: Sat Mar 7 11:41:15 2026 +0800 - - 弹窗改为跳转链接 - -commit 8fbc321a5e243db46561f9948d9f5e07e0d9a29e -Author: sexygoat <1538832180@qq.com> -Date: Fri Mar 6 17:51:27 2026 +0800 - - 详情修改 - -commit 1ebc0b8929920a7e966db94fd6139b99fce212c1 -Author: sexygoat <1538832180@qq.com> -Date: Fri Mar 6 16:28:58 2026 +0800 - - 新增代理系列授权 - -commit 4d94f7efa6468a677297d7af4aebaf496365138c -Author: sexygoat <1538832180@qq.com> -Date: Fri Mar 6 14:00:22 2026 +0800 - - 套餐系列:梯度佣金,代理授权 - -commit 08d5043b3fb13e0ee56bfa112d21db72f7b5cd61 -Author: sexygoat <1538832180@qq.com> -Date: Wed Mar 4 17:22:47 2026 +0800 - - 将单套餐分配和套餐系列分配改成代理系列授权 - -commit 237eeed87a9fe7700b2f71212cb3f7e8deaf6f33 -Author: sexygoat <1538832180@qq.com> -Date: Tue Mar 3 16:26:04 2026 +0800 - - 修复:原来的统一去了404, 现在加了403, 和部分bug - -commit 7e9acda1ab7baf8060e59e4c051bce8a8f00583f -Author: sexygoat <1538832180@qq.com> -Date: Sat Feb 28 17:46:42 2026 +0800 - - 修改订单管理 - -commit 7b459b5c8d6c39e94e8195e69128e500fa6a6e52 -Author: sexygoat <1538832180@qq.com> -Date: Sat Feb 28 16:49:28 2026 +0800 - - 修改订单管理 - -commit ce1032c7f9bd3651f9ea67d3e0bdc722feaac42b -Author: sexygoat <1538832180@qq.com> -Date: Sat Feb 28 11:04:32 2026 +0800 - - 完善按钮和详情权限 - -commit 4470a4ef04f43daa82f3e170a7e70975ca2d341d -Author: sexygoat <1538832180@qq.com> -Date: Fri Feb 27 17:40:02 2026 +0800 - - 修改: bug - -commit f1cb1e53c87b7395dbb127933d13f834c1f04ba2 -Author: sexygoat <1538832180@qq.com> -Date: Thu Feb 26 17:34:11 2026 +0800 - - 修改: 权限重复 - -commit 3570b062a1aa898362cd071301a6ab4204484ecd -Author: sexygoat <1538832180@qq.com> -Date: Thu Feb 26 10:06:11 2026 +0800 - - 修改工单: 右键 给角色分配权限 - -commit dccad819cfb23e262e8d5f7a2fee95ac0807bfb9 -Author: sexygoat <1538832180@qq.com> -Date: Wed Feb 25 16:14:38 2026 +0800 - - 修改工单 - -commit ca3184857e6a01a24ca6d583251cb3ca143cefd9 -Author: sexygoat <1538832180@qq.com> -Date: Mon Feb 9 10:49:52 2026 +0800 - - fetch(modify):账号列表合并 - -commit e8700c2585a81ea917aaba01600f2acd990ec5ac -Author: sexygoat <1538832180@qq.com> -Date: Mon Feb 9 10:22:23 2026 +0800 - - fetch(modify):修改账号列表中的分配角色弹窗 - -commit b94c043a56f6b8413329d13748b46a512a0cd0c4 -Author: sexygoat <1538832180@qq.com> -Date: Thu Feb 5 17:22:41 2026 +0800 - - fetch(modify):修改bug - -commit d97dc5f007b6ec336b675f4e5682d12d22fc9467 -Author: sexygoat <1538832180@qq.com> -Date: Wed Feb 4 18:14:52 2026 +0800 - - fetch(modify):修改套餐接口 - -commit 20e8c13e61c3e5d96cfc60568caa3054142255e2 -Author: sexygoat <1538832180@qq.com> -Date: Tue Feb 3 17:58:58 2026 +0800 - - fetch(modify):修改分为元 - -commit 192c6f1d2612997f18bfdd4e172bfe368cf02776 -Author: sexygoat <1538832180@qq.com> -Date: Tue Feb 3 17:20:50 2026 +0800 - - fetch(modify):完善按钮权限 - -commit de9753f42d111db3b59c176a3d79bc2b1fc7695b -Author: sexygoat <1538832180@qq.com> -Date: Tue Feb 3 14:39:45 2026 +0800 - - fetch(modify):修复BUG - -commit 2c6fe4375b072307282462db96a68ed31dd268e6 -Author: sexygoat <1538832180@qq.com> -Date: Tue Feb 3 10:04:59 2026 +0800 - - fetch(modify):修复API的URL - -commit 06cde977ad8382e44a2a884778af098e94fb4969 -Author: sexygoat <1538832180@qq.com> -Date: Mon Feb 2 17:08:49 2026 +0800 - - fetch(modify):修复角色分配权限 - -commit f62437379d2449d2c0bae361f6138ff8f7649f35 -Author: sexygoat <1538832180@qq.com> -Date: Mon Feb 2 14:35:33 2026 +0800 - - fetch(modify):隐藏换卡申请 - -commit c31fdaa74811f5d8e701aab4b2af9fe5f0ca225c -Author: sexygoat <1538832180@qq.com> -Date: Mon Feb 2 14:30:24 2026 +0800 - - fetch(modify):隐藏我的网卡 - -commit 4d2f38c75b58bed72c6f0cf8d7e11ac189430102 -Author: sexygoat <1538832180@qq.com> -Date: Mon Feb 2 11:51:59 2026 +0800 - - fetch(modify):账号管理 - -commit 78bd9fba8531309d3297471731ef4b1e1950732e -Author: sexygoat <1538832180@qq.com> -Date: Mon Feb 2 10:57:31 2026 +0800 - - fetch(modify):完善ioT卡管理 - -commit e08c962c40cd3dbb99b45d7e4b13e7006b89b14d -Author: sexygoat <1538832180@qq.com> -Date: Mon Feb 2 10:27:03 2026 +0800 - - fetch(modify):完善设备管理 - -commit 882feaf3ff8b0ff1967565dbec1d07d9fe8623b9 -Author: sexygoat <1538832180@qq.com> -Date: Sat Jan 31 18:12:58 2026 +0800 - - fetch(modify):修改bug - -commit ecb79dae432e08d658637ef93242d8308fc87dcb -Author: sexygoat <1538832180@qq.com> -Date: Sat Jan 31 16:33:21 2026 +0800 - - fetch(modify):修改bug - -commit 16d53709efc9b029360867dccae740c9ba0f3170 -Author: sexygoat <1538832180@qq.com> -Date: Sat Jan 31 11:37:11 2026 +0800 - - fetch(modify):修改设备和lot卡下载模板 - -commit 31440b29045412a9db357c09d38e7413f1fd9533 -Author: sexygoat <1538832180@qq.com> -Date: Sat Jan 31 11:18:37 2026 +0800 - - fetch(modify):修改原来的bug - -commit 8a1388608c49f2050be060eb8bfd5c2b175fb455 -Author: sexygoat <1538832180@qq.com> -Date: Fri Jan 30 15:39:19 2026 +0800 - - fetch(add): 新增企业设备授权 - -commit 841cf0442bb021ae58c1dd45c3f97bd025a8a83b -Author: sexygoat <1538832180@qq.com> -Date: Thu Jan 29 15:43:45 2026 +0800 - - fetch(add): 订单管理-企业设备 - -commit 1812b7a6c4aa58a009d3d99084e3e7ecd31641e0 -Author: sexygoat <1538832180@qq.com> -Date: Tue Jan 27 16:47:49 2026 +0800 - - fetch(modify): 中英文以及黑屏 - -commit 6127b21c2c0524d61272363257692e8e8dd6cff9 -Author: sexygoat <1538832180@qq.com> -Date: Tue Jan 27 16:06:48 2026 +0800 - - fetch(add): 运营商管理 - -commit c07e481b5babcdc36eb95070602a82373b835a22 -Author: sexygoat <1538832180@qq.com> -Date: Tue Jan 27 10:48:59 2026 +0800 - - chore: remove unused aws-sdk dependency - - Removed aws-sdk as it was not being used in the codebase. - This resolves the Docker build error related to lockfile mismatch. - - 🤖 Generated with [Claude Code](https://claude.com/claude-code) - - Co-Authored-By: Claude - -commit 5c6312c4074ff47e62d7ca2847da2adc6d388947 -Author: sexygoat <1538832180@qq.com> -Date: Tue Jan 27 09:18:45 2026 +0800 - - fetch(add): 新增 - -commit 0eed8244e5c94700915baff6d1b97c333be2dfb2 -Author: sexygoat <1538832180@qq.com> -Date: Sat Jan 24 16:18:30 2026 +0800 - - fetch(add): 分配记录,批量分配/回收, 单卡列表, 任务列表, 导入ICCID - -commit c69124a819671c47896cd4152e1551a545e796b5 -Author: sexygoat <1538832180@qq.com> -Date: Fri Jan 23 17:24:07 2026 +0800 - - fetch(add): 账户管理 - -commit b53fea43c66ed5ad5a80b65db464d519d50ae6ef -Author: sexygoat <1538832180@qq.com> -Date: Fri Jan 23 17:18:24 2026 +0800 - - fetch(add): 账户管理 - -commit 339abca4c035511966e8e9f5ecae3b5fc60410f8 -Author: sexygoat <1538832180@qq.com> -Date: Thu Jan 22 18:04:32 2026 +0800 - - feat(login): 删除还没有账号? 注册 - -commit 13bdee2899cd282aa106c34392a193b4a6a51769 -Author: huang -Date: Thu Jan 22 17:06:34 2026 +0800 - - 忽略类型检测 - -commit 251a8f6a839128146913a2900b52bc2675b3adba -Author: huang -Date: Thu Jan 22 17:00:57 2026 +0800 - - 部署 - -commit 099e3ec78bbec91e56064e939e7e720b0e53b0a2 -Author: sexygoat <1538832180@qq.com> -Date: Thu Jan 22 16:46:50 2026 +0800 - - first-commmit - -commit 222e5bb11a358dc836d3b34ab9273a8f45d7a228 -Author: sexygoat <1538832180@qq.com> -Date: Thu Jan 22 16:35:33 2026 +0800 - - Initial commit: One Pipe System - - 完整的管理系统,包含账户管理、卡片管理、套餐管理、财务管理等功能模块。 - - 🤖 Generated with [Claude Code](https://claude.com/claude-code) - - Co-Authored-By: Claude diff --git a/src/api/modules/asset.ts b/src/api/modules/asset.ts index 88a19c7..fa55000 100644 --- a/src/api/modules/asset.ts +++ b/src/api/modules/asset.ts @@ -32,7 +32,7 @@ import type { AssetPackageUsageRecord, UpdateAssetPackageUsedDataRequest, UpdateAssetPackageExpiresAtRequest, - ExpiringAssetItem, + ExpiringAssetListResponse, ExpiringAssetQueryParams } from '@/types/api' @@ -53,12 +53,8 @@ export class AssetService extends BaseService { */ static getExpiringAssets( params?: ExpiringAssetQueryParams - ): Promise< - BaseResponse<{ items: ExpiringAssetItem[]; total: number; page: number; size: number }> - > { - return this.get< - BaseResponse<{ items: ExpiringAssetItem[]; total: number; page: number; size: number }> - >('/api/admin/expiring-assets', params) + ): Promise> { + return this.get>('/api/admin/expiring-assets', params) } /** * 通过任意标识符查询设备或卡的完整详情 diff --git a/src/api/modules/card.ts b/src/api/modules/card.ts index cd1adfd..dc90861 100644 --- a/src/api/modules/card.ts +++ b/src/api/modules/card.ts @@ -66,7 +66,8 @@ export class CardService extends BaseService { ): Promise> { return this.put>( `/api/admin/iot-cards/${encodeURIComponent(iccid)}/speed-tier`, - { code } + { code }, + { requestOptions: { errorMessageMode: 'none' } } ) } // ========== 号卡商品管理 ========== diff --git a/src/api/modules/exportTask.ts b/src/api/modules/exportTask.ts index db2dee1..fbd6477 100644 --- a/src/api/modules/exportTask.ts +++ b/src/api/modules/exportTask.ts @@ -1,9 +1,7 @@ import { BaseService } from '../BaseService' import type { - CancelExportTaskApiResponse, CreateExportTaskApiResponse, CreateExportTaskRequest, - ExportTaskDetail, ExportTaskDetailApiResponse, ExportTaskListApiResponse, ExportTaskQueryParams @@ -21,9 +19,4 @@ export class ExportTaskService extends BaseService { static getExportTaskDetail(id: number): Promise { return this.get(`/api/admin/export-tasks/${id}`) } - - /** 保留旧页面的取消入口,后端支持时由页面权限控制显示。 */ - static cancelExportTask(id: number): Promise { - return this.post(`/api/admin/export-tasks/${id}/cancel`, {}) - } } diff --git a/src/api/modules/notification.ts b/src/api/modules/notification.ts index da75f5f..9e94a7a 100644 --- a/src/api/modules/notification.ts +++ b/src/api/modules/notification.ts @@ -3,6 +3,7 @@ import type { BaseResponse, NotificationListResponse, NotificationQueryParams, + NotificationReadRequest, NotificationReadAllRequest, NotificationReadAllResponse, NotificationReadResponse, @@ -29,10 +30,9 @@ export class NotificationService extends BaseService { } static markRead(id: number): Promise> { - return this.put>( - `/api/admin/notifications/${id}/read`, - {} - ) + return this.put>(`/api/admin/notifications/${id}/read`, { + id + } satisfies NotificationReadRequest) } static markAllRead( diff --git a/src/api/modules/wecom.ts b/src/api/modules/wecom.ts index 7893e7d..bbb2c4f 100644 --- a/src/api/modules/wecom.ts +++ b/src/api/modules/wecom.ts @@ -7,6 +7,7 @@ import type { WecomApplicationQueryParams, WecomApplicationRequest, WecomApplicationResponse, + WecomBusinessFieldListResponse, WecomBusinessType, WecomMemberListResponse, WecomMemberQueryParams, @@ -14,7 +15,9 @@ import type { WecomSceneQueryParams, WecomSceneRequest, WecomSceneResponse, - WecomSyncMembersApiResponse + WecomSyncMembersApiResponse, + WecomTemplateDetailResponse, + WecomTemplateInspectRequest } from '@/types/api' export class WecomService extends BaseService { @@ -38,14 +41,8 @@ export class WecomService extends BaseService { ) } - static getMembers( - id: number, - params?: WecomMemberQueryParams - ): Promise { - return this.get( - `/api/admin/wecom/applications/${id}/members`, - params - ) + static getMembers(id: number, params?: WecomMemberQueryParams): Promise { + return this.get(`/api/admin/wecom/applications/${id}/members`, params) } static setDefaultCreator(id: number, userid: string): Promise { @@ -66,6 +63,24 @@ export class WecomService extends BaseService { return this.put(`/api/admin/wecom/scenes/${businessType}`, data) } + static inspectTemplate( + applicationId: number, + data: WecomTemplateInspectRequest + ): Promise { + return this.post( + `/api/admin/wecom/applications/${applicationId}/templates/inspect`, + data + ) + } + + static getBusinessFields( + businessType: WecomBusinessType + ): Promise { + return this.get( + `/api/admin/wecom/scenes/${businessType}/fields` + ) + } + static bindAccount( accountId: number, data: WecomAccountBindingRequest diff --git a/src/components/business/CreateRefundDialog.vue b/src/components/business/CreateRefundDialog.vue index 726b326..e43bb62 100644 --- a/src/components/business/CreateRefundDialog.vue +++ b/src/components/business/CreateRefundDialog.vue @@ -97,6 +97,7 @@ modelValue: boolean initialOrderId?: number initialOrderNo?: string + initialPackageUsageId?: number } const props = defineProps() @@ -119,6 +120,7 @@ const formData = reactive<{ order_id: number | null + package_usage_id?: number requested_refund_amount?: number actual_received_amount: number refund_reason: string @@ -127,6 +129,7 @@ attachments: RefundAttachment[] }>({ order_id: null, + package_usage_id: undefined, requested_refund_amount: undefined, actual_received_amount: 0, refund_reason: '', @@ -213,6 +216,7 @@ formRef.value?.resetFields() voucherUploading.value = false formData.order_id = null + formData.package_usage_id = undefined formData.requested_refund_amount = undefined formData.actual_received_amount = 0 formData.refund_reason = '' @@ -239,6 +243,7 @@ requested_refund_amount: yuanToFen(formData.requested_refund_amount) ?? 0, actual_received_amount: formData.actual_received_amount, attachments: formData.attachments, + package_usage_id: formData.package_usage_id, refund_reason: formData.refund_reason || undefined, remark: formData.remark || undefined } @@ -261,6 +266,7 @@ if (hasInitialOrder.value && props.initialOrderId) { formData.order_id = props.initialOrderId } + formData.package_usage_id = props.initialPackageUsageId if (hasInitialOrder.value && props.initialOrderNo) { searchOrders(props.initialOrderNo) } else { diff --git a/src/components/business/ExportTaskCreateDialog.vue b/src/components/business/ExportTaskCreateDialog.vue index 7c673b0..c503d68 100644 --- a/src/components/business/ExportTaskCreateDialog.vue +++ b/src/components/business/ExportTaskCreateDialog.vue @@ -85,13 +85,22 @@ } ) - const getNormalizedQuery = () => { - const query: Record = {} + const getNormalizedQuery = (): Record => { + const query: Record = {} Object.entries(props.query || {}).forEach(([key, value]) => { if (value === undefined || value === null || value === '') return if (Array.isArray(value) && value.length === 0) return - query[key] = value + + if (typeof value === 'string') { + query[key] = value + } else if (typeof value === 'number' || typeof value === 'boolean') { + query[key] = String(value) + } else if (Array.isArray(value)) { + query[key] = value.join(',') + } else { + query[key] = JSON.stringify(value) + } }) return query diff --git a/src/components/core/layouts/art-notification/index.vue b/src/components/core/layouts/art-notification/index.vue index c5796fc..1eca133 100644 --- a/src/components/core/layouts/art-notification/index.vue +++ b/src/components/core/layouts/art-notification/index.vue @@ -40,7 +40,7 @@ {{ item.title }} {{ item.body }} - + @@ -50,9 +50,6 @@

暂无通知

-
- 进入通知中心 -
@@ -68,6 +65,7 @@ import { useAuth } from '@/composables/useAuth' import { NOTIFICATION_PERMISSIONS } from '@/config/constants/notification' import { navigateNotificationTarget } from '@/utils/business/notificationNavigation' + import { formatDateTime } from '@/utils/business/format' const props = defineProps<{ modelValue: boolean }>() const emit = defineEmits<{ 'update:modelValue': [value: boolean] }>() @@ -108,11 +106,6 @@ const close = () => emit('update:modelValue', false) - const handleViewAll = () => { - close() - void router.push('/notifications') - } - const handleMarkAllRead = async () => { try { const response = await notificationStore.markAllRead() diff --git a/src/components/core/layouts/art-notification/style.scss b/src/components/core/layouts/art-notification/style.scss index a2e0b7a..df92bd9 100644 --- a/src/components/core/layouts/art-notification/style.scss +++ b/src/components/core/layouts/art-notification/style.scss @@ -158,15 +158,6 @@ font-size: 42px; } } - - .btn-wrapper { - padding: 12px 16px 16px; - border-top: 1px solid var(--art-border-color); - - .view-all { - width: 100%; - } - } } @media only screen and (max-width: $device-phone) { diff --git a/src/config/constants/exportTask.ts b/src/config/constants/exportTask.ts index 66655e8..613a601 100644 --- a/src/config/constants/exportTask.ts +++ b/src/config/constants/exportTask.ts @@ -3,7 +3,6 @@ import type { ExportTaskScene } from '@/types/api' export interface ExportTaskScenePermissions { detail: string download: string - cancel: string } export interface ExportTaskSceneConfig { @@ -20,8 +19,7 @@ export const EXPORT_TASK_SCENE_CONFIG: Record + target_id?: number } export interface DeviceBatchAllocationResponse { diff --git a/src/types/api/exportTask.ts b/src/types/api/exportTask.ts index 451d746..76e5cf5 100644 --- a/src/types/api/exportTask.ts +++ b/src/types/api/exportTask.ts @@ -69,7 +69,7 @@ export interface ExportTaskListResponse { export interface CreateExportTaskRequest { scene: ExportTaskScene format: ExportTaskFormat - query?: Record + query?: Record } export interface CreateExportTaskResponse { @@ -85,15 +85,6 @@ export interface ExportTaskDetail extends ExportTaskItem { download_expires_at?: string } -export interface CancelExportTaskResponse { - task_id: number - status: ExportTaskStatus - status_name: string - cancel_requested: boolean - message: string -} - export type ExportTaskListApiResponse = BaseResponse export type CreateExportTaskApiResponse = BaseResponse export type ExportTaskDetailApiResponse = BaseResponse -export type CancelExportTaskApiResponse = BaseResponse diff --git a/src/types/api/notification.ts b/src/types/api/notification.ts index 5982311..609fba3 100644 --- a/src/types/api/notification.ts +++ b/src/types/api/notification.ts @@ -49,6 +49,10 @@ export interface NotificationReadResponse { success: boolean } +export interface NotificationReadRequest { + id: number +} + export interface NotificationReadAllRequest { category?: string } diff --git a/src/types/api/packageManagement.ts b/src/types/api/packageManagement.ts index 44cd49d..5285474 100644 --- a/src/types/api/packageManagement.ts +++ b/src/types/api/packageManagement.ts @@ -281,8 +281,8 @@ export interface CommissionTier { * 套餐信息(用于系列授权) */ export interface GrantPackageInfo extends PackageAllocationExpiryBaseFields { - allocation_id?: number package_id: number + allocation_id: number // 套餐分配记录 ID,用于修改生效条件 package_name?: string package_code?: string cost_price: number // 成本价(分) diff --git a/src/types/api/refund.ts b/src/types/api/refund.ts index 044e3df..cf661f5 100644 --- a/src/types/api/refund.ts +++ b/src/types/api/refund.ts @@ -113,6 +113,7 @@ export interface CreateRefundRequest { requested_refund_amount: number // 申请退款金额(分) actual_received_amount: number // 实收金额(分) attachments: RefundAttachment[] + package_usage_id?: number // 关联套餐使用记录 ID refund_reason?: string remark?: string } diff --git a/src/types/api/wecom.ts b/src/types/api/wecom.ts index fd9ce76..578be64 100644 --- a/src/types/api/wecom.ts +++ b/src/types/api/wecom.ts @@ -68,6 +68,37 @@ export interface WecomSceneRequest { status?: 0 | 1 } +export interface WecomTemplateInspectRequest { + template_id: string +} + +export interface WecomTemplateControl { + id: string + option_keys?: string[] | null + required: boolean + title: string + type: string +} + +export interface WecomTemplateDetail { + controls?: WecomTemplateControl[] | null + name: string + template_id: string +} + +export interface WecomBusinessField { + code: string + description: string + name: string + value_type: string +} + +export interface WecomBusinessFieldList { + business_type: WecomBusinessType + business_type_name: string + items?: WecomBusinessField[] | null +} + export interface WecomAccountBindingRequest { application_id: number userid: string @@ -85,11 +116,13 @@ export type WecomSceneListResponse = BaseResponse> export type WecomApplicationResponse = BaseResponse export type WecomSceneResponse = BaseResponse export type WecomSyncMembersApiResponse = BaseResponse +export type WecomTemplateDetailResponse = BaseResponse +export type WecomBusinessFieldListResponse = BaseResponse export interface WecomMemberQueryParams extends PaginationParams { keyword?: string } -export interface WecomApplicationQueryParams extends PaginationParams {} +export type WecomApplicationQueryParams = PaginationParams -export interface WecomSceneQueryParams extends PaginationParams {} +export type WecomSceneQueryParams = PaginationParams diff --git a/src/utils/business/notificationNavigation.ts b/src/utils/business/notificationNavigation.ts index 3d60084..e7a77ea 100644 --- a/src/utils/business/notificationNavigation.ts +++ b/src/utils/business/notificationNavigation.ts @@ -8,13 +8,52 @@ type TargetRoute = { } const resolveTargetRoute = (target: NotificationTarget): TargetRoute | null => { - const targetValues = [target.target_key, target.target_type] + const targetId = target.target_id === null ? undefined : String(target.target_id) + const targetKey = target.target_key || '' - if (targetValues.includes('expiring_assets') || targetValues.includes('expiring_asset_list')) { + if (target.target_type === 'refund_detail' && targetId) { + return { path: `${RoutesAlias.RefundDetail}/${targetId}` } + } + + if (target.target_type === 'agent_recharge_detail' && targetId) { + return { path: `${RoutesAlias.AgentRechargeDetail}/${targetId}` } + } + + if (target.target_type === 'iot_card_detail' && (targetKey || targetId)) { + return { + path: RoutesAlias.AssetInformation, + query: { iccid: targetKey || targetId || '' } + } + } + + if (target.target_type === 'device_detail' && (targetKey || targetId)) { + return { + path: RoutesAlias.AssetInformation, + query: { virtual_no: targetKey || targetId || '' } + } + } + + if ( + target.target_type === 'expiring_asset_list' || + target.target_key === 'expiring_assets' || + target.target_key === 'expiring_asset_list' + ) { return { path: RoutesAlias.ExpiringAssets } } - if (targetValues.includes('notification_center')) return { path: RoutesAlias.Notifications } + if (target.target_type === 'shop_fund_summary') { + return { + path: RoutesAlias.AgentFundOverview, + query: targetId ? { shop_id: targetId } : undefined + } + } + + if (target.target_type === 'system_config') { + return { + path: RoutesAlias.SystemConfigs, + query: targetKey ? { config_key: targetKey } : undefined + } + } return null } diff --git a/src/views/account-management/account/index.vue b/src/views/account-management/account/index.vue index aaacd4b..43d3a2b 100644 --- a/src/views/account-management/account/index.vue +++ b/src/views/account-management/account/index.vue @@ -213,6 +213,75 @@ + + + + + + {{ currentWecomAccount?.username || '-' }} + + + + + + + + + + + + + + @@ -237,11 +306,16 @@ import { useAuth } from '@/composables/useAuth' import { AccountService } from '@/api/modules/account' import { RoleService } from '@/api/modules/role' - import { ShopService, EnterpriseService } from '@/api/modules' + import { ShopService, EnterpriseService, WecomService } from '@/api/modules' import type { SearchFormItem } from '@/types' - import type { PlatformRole } from '@/types/api' + import type { PlatformRole, WecomApplication, WecomMember } from '@/types/api' import { formatDateTime } from '@/utils/business/format' - import { CommonStatus, getStatusText, STATUS_SELECT_OPTIONS } from '@/config/constants' + import { + CommonStatus, + getStatusText, + JULY_PERMISSIONS, + STATUS_SELECT_OPTIONS + } from '@/config/constants' defineOptions({ name: 'Account' }) // 定义组件名称,用于 KeepAlive 缓存控制 @@ -252,6 +326,7 @@ const dialogType = ref('add') const dialogVisible = ref(false) const roleDialogVisible = ref(false) + const wecomBindingDialogVisible = ref(false) const loading = ref(false) const currentAccountId = ref(0) const currentAccountName = ref('') @@ -262,6 +337,21 @@ const roleToAdd = ref(undefined) // 单选时使用 const leftRoleFilter = ref('') const rightRoleFilter = ref('') + const currentWecomAccount = ref(null) + const wecomApplications = ref([]) + const wecomMembers = ref([]) + const wecomApplicationsLoading = ref(false) + const wecomMembersLoading = ref(false) + const wecomBindingSubmitting = ref(false) + const wecomBindingFormRef = ref() + const wecomBindingForm = reactive({ + application_id: undefined as number | undefined, + userid: '' + }) + const wecomBindingRules = reactive({ + application_id: [{ required: true, message: '请选择企微应用', trigger: 'change' }], + userid: [{ required: true, message: '请选择企微成员', trigger: 'change' }] + }) // 是否为平台用户(平台用户可多选,其他单选) const isPlatformUser = computed(() => currentAccountType.value === 2) @@ -541,6 +631,14 @@ const getActions = (row: any) => { const actions: any[] = [] + if (hasAuth(JULY_PERMISSIONS.wecom.binding)) { + actions.push({ + label: '绑定账号', + handler: () => showWecomBindingDialog(row), + type: 'primary' + }) + } + if (hasAuth('account:patch_role')) { actions.push({ label: '分配角色', @@ -568,6 +666,75 @@ return actions } + const showWecomBindingDialog = (row: any) => { + currentWecomAccount.value = row + wecomBindingForm.application_id = undefined + wecomBindingForm.userid = '' + wecomMembers.value = [] + wecomBindingDialogVisible.value = true + void loadWecomApplications() + } + + const loadWecomApplications = async () => { + wecomApplicationsLoading.value = true + try { + const response = await WecomService.getApplications({ page: 1, page_size: 100 }) + if (response.code === 0) wecomApplications.value = response.data.items || [] + } finally { + wecomApplicationsLoading.value = false + } + } + + const handleWecomApplicationChange = async (applicationId?: number) => { + wecomBindingForm.userid = '' + wecomMembers.value = [] + if (!applicationId) return + + wecomMembersLoading.value = true + try { + const response = await WecomService.getMembers(applicationId, { + page: 1, + page_size: 100 + }) + if (response.code === 0) wecomMembers.value = response.data.items || [] + } finally { + wecomMembersLoading.value = false + } + } + + const submitWecomBinding = async () => { + const valid = await wecomBindingFormRef.value?.validate().catch(() => false) + if (!valid || !currentWecomAccount.value || !wecomBindingForm.application_id) return + + const accountId = Number(currentWecomAccount.value.id ?? currentWecomAccount.value.ID) + if (!accountId) { + ElMessage.error('当前账号缺少账号标识,无法绑定企微') + return + } + + wecomBindingSubmitting.value = true + try { + const response = await AccountService.bindWecom(accountId, { + application_id: wecomBindingForm.application_id, + userid: wecomBindingForm.userid + }) + if (response.code === 0) { + ElMessage.success('账号企微绑定成功') + wecomBindingDialogVisible.value = false + } + } finally { + wecomBindingSubmitting.value = false + } + } + + const resetWecomBindingForm = () => { + currentWecomAccount.value = null + wecomBindingForm.application_id = undefined + wecomBindingForm.userid = '' + wecomMembers.value = [] + wecomBindingFormRef.value?.clearValidate() + } + // 表单实例 const formRef = ref() diff --git a/src/views/asset-management/asset-information/components/BasicInfoCard.vue b/src/views/asset-management/asset-information/components/BasicInfoCard.vue index 7cb0949..1cc029f 100644 --- a/src/views/asset-management/asset-information/components/BasicInfoCard.vue +++ b/src/views/asset-management/asset-information/components/BasicInfoCard.vue @@ -10,7 +10,11 @@
@@ -279,12 +280,7 @@ width="30%" @closed="resetUsedDataForm" > - + {{ selectedPackage?.package_name || '-' }} @@ -416,6 +412,7 @@ const createRefundDialogVisible = ref(false) const currentRefundOrderId = ref(undefined) const currentRefundOrderNo = ref(undefined) + const currentRefundPackageUsageId = ref(undefined) const selectedPackage = ref() const usedDataDialogVisible = ref(false) const expiresAtDialogVisible = ref(false) @@ -474,10 +471,12 @@ } currentRefundOrderId.value = row.order_id currentRefundOrderNo.value = row.order_no + currentRefundPackageUsageId.value = row.package_usage_id ?? row.id createRefundDialogVisible.value = true } const handleRefundSuccess = () => { + currentRefundPackageUsageId.value = undefined emit('refresh') } diff --git a/src/views/asset-management/asset-information/components/dialogs/SpeedLimitDialog.vue b/src/views/asset-management/asset-information/components/dialogs/SpeedLimitDialog.vue index 44931e2..6697835 100644 --- a/src/views/asset-management/asset-information/components/dialogs/SpeedLimitDialog.vue +++ b/src/views/asset-management/asset-information/components/dialogs/SpeedLimitDialog.vue @@ -1,39 +1,66 @@ - + diff --git a/src/views/asset-management/asset-information/index.vue b/src/views/asset-management/asset-information/index.vue index 2ecb36f..50158d2 100644 --- a/src/views/asset-management/asset-information/index.vue +++ b/src/views/asset-management/asset-information/index.vue @@ -36,8 +36,8 @@ @show-switch-card="showSwitchCardDialog" @show-switch-mode="showSwitchModeDialog" @show-set-wifi="showSetWiFiDialog" - @show-realname-policy="showRealnamePolicyDialog" - @show-speed-limit="speedLimitDialogVisible = true" + @show-realname-policy="showRealnamePolicyDialog" + @show-speed-limit="speedLimitDialogVisible = true" @show-update-realname-status="showUpdateRealnameStatusDialog" @enable-binding-card="handleEnableBindingCard" @disable-binding-card="handleDisableBindingCard" @@ -174,7 +174,11 @@ :current-realname-status="bindingCardRealnameStatusValue" @success="handleBindingCardRealnameStatusSuccess" /> - +
@@ -183,7 +187,10 @@ import { useRoute, useRouter } from 'vue-router' import { ElMessage, ElCard, ElEmpty } from 'element-plus' import { RoutesAlias } from '@/router/routesAlias' - import { CardService, DeviceService } from '@/api/modules' + import { CardService, DeviceService } from '@/api/modules' + import { JULY_PERMISSIONS } from '@/config/constants' + import { useAuth } from '@/composables/useAuth' + import { normalizeApiError } from '@/utils/business/apiError' import { formatRemainingTime, FrontendRateLimitError, @@ -204,9 +211,9 @@ SwitchModeDialog, WiFiConfigDialog, PackageRechargeDialog, - DailyRecordsDialog, - OrderHistoryDialog, - SpeedLimitDialog + DailyRecordsDialog, + OrderHistoryDialog, + SpeedLimitDialog } from './components/dialogs' import SwitchCardDialog from '@/components/device/SwitchCardDialog.vue' import RealnamePolicyDialog from '@/components/device/RealnamePolicyDialog.vue' @@ -235,6 +242,7 @@ const route = useRoute() const router = useRouter() + const { hasAuth } = useAuth() // ========== 组件引用 ========== const assetSearchCardRef = ref>() @@ -294,6 +302,7 @@ // 绑定卡实名状态更新 const bindingCardRealnameStatusDialogVisible = ref(false) const speedLimitDialogVisible = ref(false) + const speedTierSubmitting = ref(false) const bindingCardRealnameStatusIccid = ref('') const bindingCardRealnameStatusValue = ref(0) @@ -806,12 +815,34 @@ } } const handleSpeedTierConfirm = async (data: { code: -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 }) => { - if (!cardInfo.value?.iccid) return - const response = await CardService.setSpeedTier(cardInfo.value.iccid, data.code) - if (response.code === 0) { + if (!hasAuth(JULY_PERMISSIONS.speedTier.update)) { + ElMessage.error('暂无设置限速权限') + return + } + + const iccid = cardInfo.value?.iccid + if (!iccid) { + ElMessage.error('当前卡缺少 ICCID,无法设置限速') + return + } + if (speedTierSubmitting.value) return + + speedTierSubmitting.value = true + try { + const response = await CardService.setSpeedTier(iccid, data.code) + if (response.code !== 0) { + ElMessage.error(response.msg || '限速设置失败') + return + } + ElMessage.success(`限速设置成功:${response.data.speed_tier_name}`) speedLimitDialogVisible.value = false await handleRefresh() + } catch (error) { + console.error('设置限速失败:', error) + ElMessage.error(normalizeApiError(error).message) + } finally { + speedTierSubmitting.value = false } } diff --git a/src/views/asset-management/device-list/index.vue b/src/views/asset-management/device-list/index.vue index 984cb00..d687e5b 100644 --- a/src/views/asset-management/device-list/index.vue +++ b/src/views/asset-management/device-list/index.vue @@ -17,29 +17,6 @@ @refresh="handleRefresh" > @@ -41,6 +44,14 @@ + + () const createDialogVisible = ref(false) const createLoading = ref(false) + const exportDialogVisible = ref(false) const tableRef = ref() const createFormRef = ref() @@ -438,6 +451,18 @@ created_at_end: '' }) + const exportQuery = computed(() => { + const [startDate, endDate] = searchForm.created_at_range || [] + return { + status: searchForm.status, + flow_type: searchForm.flow_type, + old_asset_keyword: searchForm.old_asset_keyword || undefined, + new_asset_keyword: searchForm.new_asset_keyword || undefined, + created_at_start: startDate || searchForm.created_at_start || undefined, + created_at_end: endDate || searchForm.created_at_end || undefined + } + }) + // 创建换货单表单 const createForm = reactive<{ exchange_reason: string diff --git a/src/views/asset-management/expiring-assets/index.vue b/src/views/asset-management/expiring-assets/index.vue index 9477199..647d8f5 100644 --- a/src/views/asset-management/expiring-assets/index.vue +++ b/src/views/asset-management/expiring-assets/index.vue @@ -5,7 +5,7 @@ v-model:filter="searchForm" :items="searchFormItems" :show-expand="true" - label-width="85" + label-width="100px" @reset="handleReset" @search="handleSearch" /> @@ -17,7 +17,10 @@ @refresh="handleRefresh" > @@ -47,11 +50,12 @@ diff --git a/src/views/asset-management/export-task-management/export-agent-recharge/index.vue b/src/views/asset-management/export-task-management/export-agent-recharge/index.vue new file mode 100644 index 0000000..1628df5 --- /dev/null +++ b/src/views/asset-management/export-task-management/export-agent-recharge/index.vue @@ -0,0 +1,9 @@ + + + diff --git a/src/views/asset-management/export-task-management/export-agent-wallet-transaction/index.vue b/src/views/asset-management/export-task-management/export-agent-wallet-transaction/index.vue new file mode 100644 index 0000000..ff5c53f --- /dev/null +++ b/src/views/asset-management/export-task-management/export-agent-wallet-transaction/index.vue @@ -0,0 +1,9 @@ + + + diff --git a/src/views/asset-management/export-task-management/export-exchange/index.vue b/src/views/asset-management/export-task-management/export-exchange/index.vue new file mode 100644 index 0000000..365352e --- /dev/null +++ b/src/views/asset-management/export-task-management/export-exchange/index.vue @@ -0,0 +1,9 @@ + + + diff --git a/src/views/asset-management/export-task-management/export-package/index.vue b/src/views/asset-management/export-task-management/export-package/index.vue new file mode 100644 index 0000000..c0d2a2b --- /dev/null +++ b/src/views/asset-management/export-task-management/export-package/index.vue @@ -0,0 +1,9 @@ + + + diff --git a/src/views/asset-management/export-task-management/export-refund/index.vue b/src/views/asset-management/export-task-management/export-refund/index.vue new file mode 100644 index 0000000..17e08ee --- /dev/null +++ b/src/views/asset-management/export-task-management/export-refund/index.vue @@ -0,0 +1,9 @@ + + + diff --git a/src/views/asset-management/export-task-management/export-task-detail/index.vue b/src/views/asset-management/export-task-management/export-task-detail/index.vue index 747aa21..339b33b 100644 --- a/src/views/asset-management/export-task-management/export-task-detail/index.vue +++ b/src/views/asset-management/export-task-management/export-task-detail/index.vue @@ -14,7 +14,6 @@ 下载文件 - 取消任务 @@ -41,7 +40,7 @@ + + diff --git a/src/views/asset-management/task-management/bulk-purchase/index.vue b/src/views/asset-management/task-management/bulk-purchase/index.vue new file mode 100644 index 0000000..7857893 --- /dev/null +++ b/src/views/asset-management/task-management/bulk-purchase/index.vue @@ -0,0 +1,506 @@ + + + + + diff --git a/src/views/asset-management/task-management/device-batch-allocation/index.vue b/src/views/asset-management/task-management/device-batch-allocation/index.vue new file mode 100644 index 0000000..6ad86bf --- /dev/null +++ b/src/views/asset-management/task-management/device-batch-allocation/index.vue @@ -0,0 +1,506 @@ + + + + + diff --git a/src/views/asset-management/task-management/device-task/index.vue b/src/views/asset-management/task-management/device-task/index.vue index 2ee4c02..e86559a 100644 --- a/src/views/asset-management/task-management/device-task/index.vue +++ b/src/views/asset-management/task-management/device-task/index.vue @@ -1,14 +1,13 @@ diff --git a/src/views/asset-management/task-management/task-detail/index.vue b/src/views/asset-management/task-management/task-detail/index.vue index 57748b0..5138922 100644 --- a/src/views/asset-management/task-management/task-detail/index.vue +++ b/src/views/asset-management/task-management/task-detail/index.vue @@ -2,7 +2,6 @@
-
返回 -

任务详情

+

{{ taskTitle }}

- - -
+
- 失败记录 ({{ taskDetail.fail_count }}) + {{ resultAction }}失败记录 ({{ taskDetail.fail_count }}) - - + + + +
- -
+
- 跳过记录 ({{ taskDetail.skip_count }}) + {{ resultAction }}跳过记录 ({{ taskDetail.skip_count }}) - - + + + + + +
+ +
+ + {{ resultAction }}警告记录 ({{ warningCount }}) + + + + + + +
@@ -47,16 +70,15 @@ @@ -285,8 +355,8 @@ .task-detail-page { .detail-header { display: flex; - gap: 16px; align-items: center; + gap: 16px; padding-bottom: 16px; .detail-title { @@ -297,8 +367,7 @@ } } - .failure-section, - .skipped-section { + .result-section { margin-top: 20px; .section-title { diff --git a/src/views/commission-management/agent-fund-overview/index.vue b/src/views/commission-management/agent-fund-overview/index.vue index 9c6f022..8f82fa5 100644 --- a/src/views/commission-management/agent-fund-overview/index.vue +++ b/src/views/commission-management/agent-fund-overview/index.vue @@ -269,9 +269,22 @@ 搜索 重置 + + 导出 +
+ { + const [startDate, endDate] = mainWalletSearchForm.date_range || [] + return { + shop_id: currentShop.value?.shop_id, + transaction_type: mainWalletSearchForm.transaction_type, + start_date: startDate || undefined, + end_date: endDate || undefined, + asset_identifier: mainWalletSearchForm.asset_identifier.trim() || undefined + } + }) // 列配置 const columnOptions = [ @@ -878,10 +903,6 @@ } ]) - onMounted(() => { - getTableData() - }) - // 获取代理商资金汇总列表 const getTableData = async () => { loading.value = true @@ -905,6 +926,14 @@ } } + const loadInitialData = async () => { + await getTableData() + const shopId = Number(route.query.shop_id) + if (!shopId) return + const targetShop = summaryList.value.find((item) => item.shop_id === shopId) + if (targetShop) showDetail(targetShop) + } + // 搜索 const handleSearch = () => { pagination.page = 1 @@ -953,6 +982,10 @@ loadCommissionRecords() } + onMounted(() => { + void loadInitialData() + }) + // 获取操作按钮 const getActions = (row: ShopFundSummaryItem) => { const actions: any[] = [] diff --git a/src/views/dashboard/console/widget/ExpiringAssetStats.vue b/src/views/dashboard/console/widget/ExpiringAssetStats.vue index 4dc11af..d6fd430 100644 --- a/src/views/dashboard/console/widget/ExpiringAssetStats.vue +++ b/src/views/dashboard/console/widget/ExpiringAssetStats.vue @@ -23,20 +23,24 @@ import { onMounted, reactive } from 'vue' import { useRouter } from 'vue-router' import { AssetService } from '@/api/modules' - import type { AssetType } from '@/types/api' + import type { AssetType, ExpiringAssetType } from '@/types/api' import { RoutesAlias } from '@/router/routesAlias' defineOptions({ name: 'ExpiringAssetStats' }) const router = useRouter() const counts = reactive>({ card: 0, device: 0 }) + const apiAssetTypes: Record = { + card: 'iot_card', + device: 'device' + } const loadCount = async (assetType: AssetType) => { try { const response = await AssetService.getExpiringAssets({ - asset_type: assetType, + asset_type: apiAssetTypes[assetType], page: 1, - size: 1 + page_size: 1 }) if (response.code === 0 && response.data) counts[assetType] = response.data.total || 0 } catch { @@ -47,7 +51,7 @@ const goToList = (assetType?: AssetType) => { router.push({ path: RoutesAlias.ExpiringAssets, - query: assetType ? { asset_type: assetType } : {} + query: assetType ? { asset_type: apiAssetTypes[assetType] } : {} }) } diff --git a/src/views/finance/agent-recharge/agentRechargeActions.ts b/src/views/finance/agent-recharge/agentRechargeActions.ts index 42c581f..c7b8049 100644 --- a/src/views/finance/agent-recharge/agentRechargeActions.ts +++ b/src/views/finance/agent-recharge/agentRechargeActions.ts @@ -19,6 +19,11 @@ export const buildAgentRechargeActions = ( options: BuildAgentRechargeActionsOptions ): AgentRechargeAction[] => { const actions: AgentRechargeAction[] = [] + const hasApprovalRecord = + row.approval_provider === 'wecom' || + row.approval_source === 'wecom' || + row.approval_source === 'legacy' || + (row.approval_instance_id !== undefined && row.approval_instance_id !== null) if ( row.payment_method === 'offline' && @@ -33,6 +38,7 @@ export const buildAgentRechargeActions = ( } if ( + !hasApprovalRecord && row.status === AgentRechargeStatus.PENDING && row.payment_method === 'offline' && options.hasAuth('agent_recharge:confirm_payment') @@ -44,7 +50,11 @@ export const buildAgentRechargeActions = ( }) } - if (row.status === AgentRechargeStatus.PENDING && options.hasAuth('agent_recharge:reject')) { + if ( + !hasApprovalRecord && + row.status === AgentRechargeStatus.PENDING && + options.hasAuth('agent_recharge:reject') + ) { actions.push({ label: '拒绝', handler: () => options.onReject(row), diff --git a/src/views/finance/agent-recharge/detail.vue b/src/views/finance/agent-recharge/detail.vue index eb1c1fb..74ac517 100644 --- a/src/views/finance/agent-recharge/detail.vue +++ b/src/views/finance/agent-recharge/detail.vue @@ -68,26 +68,12 @@ 2: 'success', // 已支付 3: 'success', // 已完成 4: 'info', // 已关闭 - 5: 'danger', // 已退款 - 6: 'danger' // 已驳回 + 5: 'danger', // 已退款 + 6: 'danger' // 已驳回 } return statusMap[status] || 'info' } - // 获取状态文本(优先使用 status_name,否则使用本地映射) - const getStatusText = (status: AgentRechargeStatus, statusName?: string): string => { - if (statusName) return statusName - const statusMap: Record = { - 1: '待支付', - 2: '已支付', - 3: '已完成', - 4: '已关闭', - 5: '已退款', - 6: '已驳回' - } - return statusMap[status] || '-' - } - // 获取支付方式文本 const getPaymentMethodText = (method: AgentRechargePaymentMethod): string => { const methodMap: Record = { @@ -97,6 +83,12 @@ return methodMap[method] || method } + const getApprovalProviderText = (data: AgentRecharge) => { + if (data.approval_provider === 'wecom' || data.approval_source === 'wecom') return '企微' + if (data.approval_source === 'legacy') return '历史审批' + return data.approval_provider || data.approval_source || '-' + } + // 详情配置 const detailSections = computed((): DetailSection[] => [ { @@ -104,6 +96,7 @@ fields: [ { label: '充值单号', prop: 'recharge_no' }, { label: '店铺名称', prop: 'shop_name' }, + { label: '提交人', prop: 'submitter_name', formatter: (value) => value || '-' }, { label: '充值金额', formatter: (_, data) => formatCurrency(data.amount) @@ -111,9 +104,7 @@ { label: '状态', render: (data) => - h(ElTag, { type: getStatusType(data.status) }, () => - getStatusText(data.status, data.status_name) - ) + h(ElTag, { type: getStatusType(data.status) }, () => data.status_name || '-') }, { label: '驳回原因', @@ -123,6 +114,30 @@ } ] }, + { + title: '企微审批信息', + fields: [ + { label: '审批渠道', formatter: (_, data) => getApprovalProviderText(data) }, + { + label: '审批状态', + formatter: (_, data) => data.approval_status_name || '-' + }, + { + label: '当前审批人摘要', + formatter: (_, data) => data.current_approver_summary || '-', + fullWidth: true + } + ] + }, + { + title: '业务处理结果', + fields: [ + { + label: '处理状态', + formatter: (_, data) => data.processing_status_name || '-' + } + ] + }, { title: '支付信息', fields: [ diff --git a/src/views/finance/agent-recharge/index.vue b/src/views/finance/agent-recharge/index.vue index 958ed36..0aa542e 100644 --- a/src/views/finance/agent-recharge/index.vue +++ b/src/views/finance/agent-recharge/index.vue @@ -24,6 +24,9 @@ v-if="hasAuth('agent_recharge:create')" >创建充值订单 + + 导出 + @@ -66,7 +69,7 @@ placeholder="请输入充值金额(元)" />
- 最小: ¥0.01,最大: 不限制 + 最小: ¥0.01,最大: ¥1,000,000.00
@@ -129,6 +132,15 @@ + + + (null) @@ -336,8 +350,11 @@ placeholder: '请选择状态', options: [ { label: '待支付', value: 1 }, - { label: '已完成', value: 2 }, - { label: '已取消', value: 3 } + { label: '已支付', value: 2 }, + { label: '已完成', value: 3 }, + { label: '已关闭', value: 4 }, + { label: '已退款', value: 5 }, + { label: '已驳回', value: 6 } ], config: { clearable: true @@ -370,16 +387,19 @@ { label: '店铺名称', prop: 'shop_name' }, { label: '充值金额', prop: 'amount' }, { label: '状态', prop: 'status' }, + { label: '审批渠道', prop: 'approval_provider' }, { label: '提交人', prop: 'submitter_name' }, { label: '审批状态', prop: 'approval_status' }, { label: '当前审批人摘要', prop: 'current_approver_summary' }, { label: '业务处理状态', prop: 'processing_status_name' }, { label: '支付方式', prop: 'payment_method' }, { label: '支付通道', prop: 'payment_channel' }, + { label: '运营备注', prop: 'remark' }, { label: '驳回原因', prop: 'rejection_reason' }, { label: '创建时间', prop: 'created_at' }, { label: '支付时间', prop: 'paid_at' }, - { label: '完成时间', prop: 'completed_at' } + { label: '完成时间', prop: 'completed_at' }, + { label: '更新时间', prop: 'updated_at' } ] const createFormRef = ref() @@ -387,6 +407,7 @@ const rejectFormRef = ref() const uploadRef = ref>() const MIN_RECHARGE_AMOUNT = 0.01 + const MAX_RECHARGE_AMOUNT = 1_000_000 const createRules = computed(() => { const rules: FormRules = { @@ -402,6 +423,10 @@ callback(new Error(`充值金额最小为 ¥${MIN_RECHARGE_AMOUNT.toFixed(2)}`)) return } + if (Number(value) > MAX_RECHARGE_AMOUNT) { + callback(new Error(`充值金额最大为 ¥${MAX_RECHARGE_AMOUNT.toFixed(2)}`)) + return + } callback() }, trigger: 'blur' @@ -464,26 +489,12 @@ 2: 'success', // 已支付 3: 'success', // 已完成 4: 'info', // 已关闭 - 5: 'danger', // 已退款 - 6: 'danger' // 已驳回 + 5: 'danger', // 已退款 + 6: 'danger' // 已驳回 } return statusMap[status] || 'info' } - // 获取状态文本(优先使用 status_name,否则使用本地映射) - const getStatusText = (status: AgentRechargeStatus, statusName?: string): string => { - if (statusName) return statusName - const statusMap: Record = { - 1: '待支付', - 2: '已支付', - 3: '已完成', - 4: '已关闭', - 5: '已退款', - 6: '已驳回' - } - return statusMap[status] || '-' - } - // 获取支付方式文本 const getPaymentMethodText = (method: AgentRechargePaymentMethod): string => { const methodMap: Record = { @@ -530,9 +541,17 @@ label: '状态', width: 100, formatter: (row: AgentRecharge) => { - return h(ElTag, { type: getStatusType(row.status) }, () => - getStatusText(row.status, row.status_name) - ) + return h(ElTag, { type: getStatusType(row.status) }, () => row.status_name || '-') + } + }, + { + prop: 'approval_provider', + label: '审批渠道', + width: 110, + formatter: (row: AgentRecharge) => { + if (row.approval_provider === 'wecom' || row.approval_source === 'wecom') return '企微' + if (row.approval_source === 'legacy') return '历史审批' + return row.approval_provider || row.approval_source || '-' } }, { @@ -605,6 +624,12 @@ label: '完成时间', width: 180, formatter: (row: AgentRecharge) => (row.completed_at ? formatDateTime(row.completed_at) : '-') + }, + { + prop: 'updated_at', + label: '更新时间', + width: 180, + formatter: (row: AgentRecharge) => formatDateTime(row.updated_at) } ]) @@ -711,6 +736,13 @@ getTableData() } + const exportQuery = computed(() => ({ + shop_id: searchForm.shop_id, + status: searchForm.status, + start_date: searchForm.start_date || searchForm.dateRange?.[0], + end_date: searchForm.end_date || searchForm.dateRange?.[1] + })) + // 刷新表格 const handleRefresh = () => { getTableData() diff --git a/src/views/finance/refund/detail.vue b/src/views/finance/refund/detail.vue index e83f786..43a2295 100644 --- a/src/views/finance/refund/detail.vue +++ b/src/views/finance/refund/detail.vue @@ -162,6 +162,34 @@ return `¥${(amount / 100).toFixed(2)}` } + const getApprovalProviderText = (item: Refund) => { + const provider = item.approval_provider || item.approval_source || item.approval?.source + if (provider === 'wecom') return '企微' + if (provider === 'legacy') return '历史审批' + if (provider === 'none') return '无' + return provider || '-' + } + + const getRefundApprovalStatusText = (item: Refund) => { + return item.approval_status_name || item.approval?.status_name || item.approval?.status || '-' + } + + const isHiddenIdKey = (key: string) => { + const normalizedKey = key.toLowerCase() + return normalizedKey === 'id' || normalizedKey === 'userid' || normalizedKey.endsWith('_id') + } + + const sanitizeStructuredValue = (value: unknown): unknown => { + if (Array.isArray(value)) return value.map((item) => sanitizeStructuredValue(item)) + if (!value || typeof value !== 'object') return value + + return Object.fromEntries( + Object.entries(value) + .filter(([key]) => !isHiddenIdKey(key)) + .map(([key, item]) => [key, sanitizeStructuredValue(item)]) + ) + } + const formatStructuredValue = (value: unknown) => { if (value === undefined || value === null || value === '') return '-' if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') { @@ -171,7 +199,7 @@ } const renderStructuredValue = (value: unknown) => - h('pre', { class: 'structured-value' }, formatStructuredValue(value)) + h('pre', { class: 'structured-value' }, formatStructuredValue(sanitizeStructuredValue(value))) const renderTimeline = (timeline: unknown) => { if (!Array.isArray(timeline) || timeline.length === 0) return h('span', '-') @@ -181,7 +209,7 @@ { class: 'approval-timeline' }, timeline.map((item: any) => { const title = item.status_name || item.status || item.content || '审批节点' - const operator = item.operator_name || item.operator || '' + const operator = item.operator_name || '' const time = item.time || item.timestamp || '' const comment = item.comment || item.content || '' return h('div', { class: 'approval-timeline__item' }, [ @@ -207,6 +235,8 @@ { label: '订单号', prop: 'order_no' }, { label: '资产标识符', prop: 'asset_identifier' }, { label: '资产类型', prop: 'asset_type' }, + { label: '退款状态', prop: 'status_name', formatter: (value) => value || '-' }, + { label: '提交人', prop: 'submitter_name', formatter: (value) => value || '-' }, { label: '申请退款金额', formatter: (_, data) => formatCurrency(data.requested_refund_amount) @@ -225,6 +255,12 @@ formatter: (value) => value || '-', fullWidth: true }, + { + label: '拒绝原因', + prop: 'reject_reason', + formatter: (value) => value || '-', + fullWidth: true + }, { label: '备注', prop: 'remark', @@ -258,17 +294,30 @@ formatter: (_, data) => (data.commission_deducted ? '是' : '否') }, { label: '创建时间', prop: 'created_at', formatter: (value) => formatDateTime(value) }, + { + label: '审批时间', + prop: 'processed_at', + formatter: (value) => (value ? formatDateTime(value) : '-') + }, { label: '更新时间', prop: 'updated_at', formatter: (value) => formatDateTime(value) } ] }, { title: '企微审批信息', fields: [ - { label: '审批来源', prop: 'approval.source' }, + { label: '审批渠道', formatter: (_, data) => getApprovalProviderText(data) }, + { + label: '审批来源', + formatter: (_, data) => data.approval?.source || data.approval_source || '-' + }, { label: '审批单号', prop: 'approval.sp_no' }, { label: '审批状态', - formatter: (_, data) => data.approval?.status_name || data.approval?.status || '-' + formatter: (_, data) => getRefundApprovalStatusText(data) + }, + { + label: '当前审批人摘要', + formatter: (_, data) => data.current_approver_summary || '-' }, { label: '模板版本', prop: 'approval.template_version' }, { diff --git a/src/views/finance/refund/index.vue b/src/views/finance/refund/index.vue index e378658..9c218fe 100644 --- a/src/views/finance/refund/index.vue +++ b/src/views/finance/refund/index.vue @@ -21,6 +21,9 @@ 创建退款申请 + + 导出 + @@ -48,6 +51,15 @@ + + + >() const createDialogVisible = ref(false) + const exportDialogVisible = ref(false) const resubmitDialogVisible = ref(false) const currentRefund = ref(null) const refundVoucherFileKeys = ref([]) @@ -269,6 +282,7 @@ { label: '实际退款金额', prop: 'approved_refund_amount' }, { label: '实收金额', prop: 'actual_received_amount' }, { label: '状态', prop: 'status' }, + { label: '审批渠道', prop: 'approval_provider' }, { label: '提交人', prop: 'submitter_name' }, { label: '审批状态', prop: 'approval_status' }, { label: '当前审批人摘要', prop: 'current_approver_summary' }, @@ -279,7 +293,8 @@ { label: '资产重置', prop: 'asset_reset' }, { label: '佣金扣除', prop: 'commission_deducted' }, { label: '创建时间', prop: 'created_at' }, - { label: '审批时间', prop: 'processed_at' } + { label: '审批时间', prop: 'processed_at' }, + { label: '更新时间', prop: 'updated_at' } ] const resubmitFormRef = ref() @@ -320,17 +335,6 @@ return statusMap[status] || 'info' } - // 获取状态文本 - const getStatusText = (status: RefundStatus): string => { - const statusMap: Record = { - 1: '待审批', - 2: '已通过', - 3: '已拒绝', - 4: '已退回' - } - return statusMap[status] || '-' - } - // 动态列配置 const { columnChecks, columns } = useCheckedColumns(() => [ { @@ -404,7 +408,17 @@ label: '状态', width: 100, formatter: (row: Refund) => { - return h(ElTag, { type: getStatusType(row.status) }, () => getStatusText(row.status)) + return h(ElTag, { type: getStatusType(row.status) }, () => row.status_name || '-') + } + }, + { + prop: 'approval_provider', + label: '审批渠道', + width: 110, + formatter: (row: Refund) => { + if (row.approval_provider === 'wecom' || row.approval_source === 'wecom') return '企微' + if (row.approval_source === 'legacy') return '历史审批' + return row.approval_provider || row.approval_source || '-' } }, { @@ -418,7 +432,7 @@ prop: 'approval_status', label: '审批状态', width: 120, - formatter: (row: Refund) => getApprovalStatusText(row) + formatter: (row: Refund) => row.approval_status_name || '-' }, { prop: 'current_approver_summary', @@ -483,6 +497,12 @@ label: '审批时间', width: 180, formatter: (row: Refund) => (row.processed_at ? formatDateTime(row.processed_at) : '-') + }, + { + prop: 'updated_at', + label: '更新时间', + width: 180, + formatter: (row: Refund) => formatDateTime(row.updated_at) } ]) @@ -564,6 +584,13 @@ } } + const exportQuery = computed(() => ({ + status: searchForm.status, + order_id: searchForm.order_id, + shop_id: searchForm.shop_id, + asset_identifier: searchForm.asset_identifier?.trim() || undefined + })) + // 重置搜索 const handleReset = () => { Object.assign(searchForm, { ...initialSearchState }) diff --git a/src/views/notifications/index.vue b/src/views/notifications/index.vue deleted file mode 100644 index ddc164b..0000000 --- a/src/views/notifications/index.vue +++ /dev/null @@ -1,277 +0,0 @@ - - - - - diff --git a/src/views/order-management/bulk-purchase/index.vue b/src/views/order-management/bulk-purchase/index.vue deleted file mode 100644 index d30e9d5..0000000 --- a/src/views/order-management/bulk-purchase/index.vue +++ /dev/null @@ -1,446 +0,0 @@ - - - - - diff --git a/src/views/package-management/series-grants/detail.vue b/src/views/package-management/series-grants/detail.vue index 8ca51db..c57cb3c 100644 --- a/src/views/package-management/series-grants/detail.vue +++ b/src/views/package-management/series-grants/detail.vue @@ -274,7 +274,7 @@ }}
- +