From 3c7473f8d1276c6e679ae0ab428064766e5b651d Mon Sep 17 00:00:00 2001 From: wuxichen <17301714657@163.com> Date: Thu, 16 Oct 2025 16:32:59 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=AE=A2=E5=8D=95=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/FUNDING.yml | 12 - .github/ISSUE_TEMPLATE/bug_report.md | 48 -- .github/ISSUE_TEMPLATE/feature_request.md | 28 -- .github/ISSUE_TEMPLATE/question.md | 34 -- .github/dependabot.yml | 11 - .github/workflows/ci.yml | 31 -- .github/workflows/coverage.yml | 21 - .github/workflows/deploy.yml | 30 -- .github/workflows/emoji-helper.yml | 14 - .github/workflows/issue-labeled.yml | 37 -- .github/workflows/issue-open-check.yml | 34 -- .github/workflows/preview-build.yml | 40 -- .github/workflows/preview-deploy.yml | 100 ---- .github/workflows/preview-start.yml | 24 - config/config.ts | 2 +- config/defaultSettings.ts | 21 +- config/proxy.ts | 6 +- config/routes.ts | 69 +-- mock/login.ts | 23 + mock/order.ts | 142 ++++++ package.json | 1 + pnpm-lock.yaml | 3 + src/app.tsx | 2 +- src/components/DrawerForm/index.tsx | 80 ++- src/components/EnhancedProTable/index.tsx | 70 ++- src/components/Footer/index.tsx | 24 +- src/components/PopconfirmForm/index.tsx | 96 ++++ src/constants/index.ts | 1 + src/constants/order.ts | 0 src/global.less | 22 + src/manifest.json | 4 +- src/pages/Welcome.tsx | 4 +- src/pages/ai/sample-tag/config.tsx | 2 +- src/pages/ai/sample-tag/detail.tsx | 4 - src/pages/trade/order/config.tsx | 140 ++++++ .../detail/component/info/basic-info.tsx | 90 ++++ .../order/detail/component/info/config.tsx | 64 +++ .../detail/component/info/index.module.less | 25 + .../order/detail/component/info/prod-info.tsx | 134 +++++ .../detail/component/info/select-info.tsx | 76 +++ .../detail/component/info/service-info.tsx | 98 ++++ .../detail/component/info/surcharge-info.tsx | 49 ++ src/pages/trade/order/detail/index.tsx | 26 + src/pages/trade/order/detail/order-info.tsx | 21 + src/pages/trade/order/index.module.less | 9 + src/pages/trade/order/index.tsx | 37 ++ src/pages/trade/order/list.tsx | 259 ++++++++++ src/services/trade/order/index.ts | 473 ++++++++++++++++++ 48 files changed, 1917 insertions(+), 624 deletions(-) delete mode 100644 .github/FUNDING.yml delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md delete mode 100644 .github/ISSUE_TEMPLATE/question.md delete mode 100644 .github/dependabot.yml delete mode 100644 .github/workflows/ci.yml delete mode 100644 .github/workflows/coverage.yml delete mode 100644 .github/workflows/deploy.yml delete mode 100644 .github/workflows/emoji-helper.yml delete mode 100644 .github/workflows/issue-labeled.yml delete mode 100644 .github/workflows/issue-open-check.yml delete mode 100644 .github/workflows/preview-build.yml delete mode 100644 .github/workflows/preview-deploy.yml delete mode 100644 .github/workflows/preview-start.yml create mode 100644 mock/login.ts create mode 100644 mock/order.ts create mode 100644 src/components/PopconfirmForm/index.tsx create mode 100644 src/constants/order.ts create mode 100644 src/pages/trade/order/config.tsx create mode 100644 src/pages/trade/order/detail/component/info/basic-info.tsx create mode 100644 src/pages/trade/order/detail/component/info/config.tsx create mode 100644 src/pages/trade/order/detail/component/info/index.module.less create mode 100644 src/pages/trade/order/detail/component/info/prod-info.tsx create mode 100644 src/pages/trade/order/detail/component/info/select-info.tsx create mode 100644 src/pages/trade/order/detail/component/info/service-info.tsx create mode 100644 src/pages/trade/order/detail/component/info/surcharge-info.tsx create mode 100644 src/pages/trade/order/detail/index.tsx create mode 100644 src/pages/trade/order/detail/order-info.tsx create mode 100644 src/pages/trade/order/index.module.less create mode 100644 src/pages/trade/order/index.tsx create mode 100644 src/pages/trade/order/list.tsx create mode 100644 src/services/trade/order/index.ts diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index 5760951..0000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1,12 +0,0 @@ -# These are supported funding model platforms - -github: ant-design # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] -patreon: # Replace with a single Patreon username -open_collective: ant-design -ko_fi: # Replace with a single Ko-fi username -tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel -community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -liberapay: # Replace with a single Liberapay username -issuehunt: # Replace with a single IssueHunt username -otechie: # Replace with a single Otechie username -custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 5cb2692..0000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -name: '报告 Bug | Report bug 🐛' -about: 报告 Ant Design Pro 的 bug -title: '🐛 [BUG]' -labels: '🐛 bug' -assignees: '' ---- - -### 🐛 bug 描述 - - - -### 📷 复现步骤 | Recurrence steps - - - -### 🏞 期望结果 | Expected results - - - -### 💻 复现代码 | Recurrence code - - - -### © 版本信息 - -- Ant Design Pro 版本: [e.g. 4.0.0] -- umi 版本 -- 浏览器环境 -- 开发环境 [e.g. mac OS] - -### 🚑 其他信息 - - diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index b2b866a..0000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -name: '功能需求 | Feature Requirements ✨' -about: 对 Ant Design Pro 的需求或建议 -title: '👑 [需求 | Feature]' -labels: '👑 Feature Request' -assignees: '' ---- - -### 🥰 需求描述 | Requirements description - - - -### 🧐 解决方案 | Solution - - - -### 🚑 其他信息 | Other information - - diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md deleted file mode 100644 index f0fbe7d..0000000 --- a/.github/ISSUE_TEMPLATE/question.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -name: '疑问或需要帮助 | Questions or need help ❓' -about: 对 Ant Design Pro 使用的疑问或需要帮助 -title: '🧐[问题 | question]' -labels: '🧐 question' -assignees: '' ---- - -### 🧐 问题描述 | Problem description - - - -### 💻 示例代码 | Sample code - - - -### 🚑 其他信息 | Other information - - - -OS: - -Node: - -浏览器 | browser: diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index d91a92a..0000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,11 +0,0 @@ -# To get started with Dependabot version updates, you'll need to specify which -# package ecosystems to update and where the package manifests are located. -# Please see the documentation for all configuration options: -# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file - -version: 2 -updates: - - package-ecosystem: 'npm' # See documentation for possible values - directory: '/' # Location of package manifests - schedule: - interval: 'weekly' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 024d91d..0000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: CI - -on: [push, pull_request] - -permissions: - contents: read - -jobs: - build: - if: false - runs-on: ${{ matrix.os }} - strategy: - matrix: - node_version: [20] - os: [ubuntu-latest, windows-latest, macOS-latest] - steps: - - uses: actions/checkout@v4 - - name: Use Node.js ${{ matrix.node_version }} - uses: actions/setup-node@v4 - with: - node-version: ${{ matrix.node_version }} - - run: echo ${{github.ref}} - - uses: oven-sh/setup-bun@v2 - - run: bun install - - run: bun run lint - - run: bun run build - env: - CI: true - PROGRESS: none - NODE_ENV: test - NODE_OPTIONS: --max_old_space_size=4096 diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml deleted file mode 100644 index bb6d518..0000000 --- a/.github/workflows/coverage.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: coverage CI - -on: [push, pull_request] - -permissions: - contents: read - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Use Node.js 20 - uses: actions/setup-node@v4 - with: - node-version: 20 - - run: echo ${{github.ref}} - - uses: oven-sh/setup-bun@v2 - - run: bun install - - run: bun run test:coverage - - uses: codecov/codecov-action@v5 diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index 0040301..0000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: Deploy to GitHub Pages - -on: - push: - branches: - - all-blocks - -jobs: - build-and-deploy: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Install Bun - uses: oven-sh/setup-bun@v2 - - - name: Install dependencies with Bun - run: bun install - - - name: Build project - run: bun run build - - - name: Deploy to GitHub Pages - uses: peaceiris/actions-gh-pages@v4 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./dist - cname: preview.pro.ant.design diff --git a/.github/workflows/emoji-helper.yml b/.github/workflows/emoji-helper.yml deleted file mode 100644 index 8965a1a..0000000 --- a/.github/workflows/emoji-helper.yml +++ /dev/null @@ -1,14 +0,0 @@ -name: Emoji Helper - -on: - release: - types: [published] - -jobs: - emoji: - runs-on: ubuntu-latest - steps: - - uses: actions-cool/emoji-helper@v1.0.0 - with: - type: 'release' - emoji: '+1, laugh, heart, hooray, rocket, eyes' diff --git a/.github/workflows/issue-labeled.yml b/.github/workflows/issue-labeled.yml deleted file mode 100644 index a3e8b5f..0000000 --- a/.github/workflows/issue-labeled.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: Issue labeled - -on: - issues: - types: [labeled] - -jobs: - reply-helper: - runs-on: ubuntu-latest - steps: - - name: help wanted - if: github.event.label.name == '❤️ help wanted' || github.event.label.name == '🤝Welcome PR' - uses: actions-cool/issues-helper@v1.11 - with: - actions: 'create-comment' - token: ${{ secrets.GITHUB_TOKEN }} - issue-number: ${{ github.event.issue.number }} - body: | - Hello @${{ github.event.issue.user.login }}. We totally like your proposal/feedback, welcome to [send us a Pull Request](https://help.github.com/en/articles/creating-a-pull-request) for it. Please provide changelog/TypeScript/documentation/test cases if needed and make sure CI passed, we will review it soon. We appreciate your effort in advance and looking forward to your contribution! - - 你好 @${{ github.event.issue.user.login }},我们完全同意你的提议/反馈,欢迎直接在此仓库 [创建一个 Pull Request](https://help.github.com/en/articles/creating-a-pull-request) 来解决这个问题。请务必提供改动所需相应的 changelog、TypeScript 定义、测试用例、文档等,并确保 CI 通过,我们会尽快进行 Review,提前感谢和期待您的贡献。 - - ![giphy](https://user-images.githubusercontent.com/507615/62342668-4735dc00-b51a-11e9-92a7-d46fbb1cc0c7.gif) - - - name: Need Reproduce - if: github.event.label.name == '🤔 Need Reproduce' - uses: actions-cool/issues-helper@v1.11 - with: - actions: 'create-comment' - token: ${{ secrets.GITHUB_TOKEN }} - issue-number: ${{ github.event.issue.number }} - body: | - Hello @${{ github.event.issue.user.login }}. Please provide a online reproduction by forking this link https://codesandbox.io/ or a minimal GitHub repository. - - 你好 @${{ github.event.issue.user.login }}, 我们需要你提供一个在线的重现实例以便于我们帮你排查问题。你可以通过点击 [此处](https://codesandbox.io/) 创建一个 codesandbox 或者提供一个最小化的 GitHub 仓库。 - - ![](https://gw.alipayobjects.com/zos/antfincdn/y9kwg7DVCd/reproduce.gif) diff --git a/.github/workflows/issue-open-check.yml b/.github/workflows/issue-open-check.yml deleted file mode 100644 index 3644213..0000000 --- a/.github/workflows/issue-open-check.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: Issue Open Check - -on: - issues: - types: [opened, edited] - -jobs: - check-issue: - runs-on: ubuntu-latest - steps: - - uses: actions-cool/issues-helper@v2.2.0 - id: check - with: - actions: 'check-issue' - issue-number: ${{ github.event.issue.number }} - title-excludes: '🐛 [BUG], 👑 [需求 | Feature], 🧐[问题 | question]' - - - if: steps.check.outputs.check-result == 'false' && github.event.issue.state == 'open' - uses: actions-cool/issues-helper@v2.2.0 - with: - actions: 'create-comment, close-issue' - issue-number: ${{ github.event.issue.number }} - body: | - 当前 Issue 未检测到标题,请规范填写,谢谢! - - The title of the current issue is not detected, please fill in according to the specifications, thank you! - - - if: steps.check.outputs.check-result == 'true' - uses: actions-cool/issues-similarity-analysis@v1 - with: - filter-threshold: 0.8 - title-excludes: '🐛[BUG], 👑 [需求 | Feature], 🧐[问题 | question]' - comment-title: '### 以下的 Issues 可能会帮助到你 / The following issues may help you' - show-footer: false diff --git a/.github/workflows/preview-build.yml b/.github/workflows/preview-build.yml deleted file mode 100644 index ea65e05..0000000 --- a/.github/workflows/preview-build.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: Preview Build - -on: - pull_request: - types: [opened, synchronize, reopened] - -permissions: - contents: read - -jobs: - build-preview: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.sha }} - - - name: build - run: | - yarn - yarn build - - - name: upload dist artifact - uses: actions/upload-artifact@v4 - with: - name: dist - path: dist/ - retention-days: 5 - - - name: Save PR number - if: ${{ always() }} - run: echo ${{ github.event.number }} > ./pr-id.txt - - - name: Upload PR number - if: ${{ always() }} - uses: actions/upload-artifact@v4 - with: - name: pr - path: ./pr-id.txt diff --git a/.github/workflows/preview-deploy.yml b/.github/workflows/preview-deploy.yml deleted file mode 100644 index 21a07cc..0000000 --- a/.github/workflows/preview-deploy.yml +++ /dev/null @@ -1,100 +0,0 @@ -name: Preview Deploy - -on: - workflow_run: - workflows: ['Preview Build'] - types: - - completed - -permissions: - contents: read - -jobs: - success: - permissions: - actions: read # for dawidd6/action-download-artifact to query and download artifacts - issues: write # for actions-cool/maintain-one-comment to modify or create issue comments - pull-requests: write # for actions-cool/maintain-one-comment to modify or create PR comments - runs-on: ubuntu-latest - if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' - steps: - - name: download pr artifact - uses: dawidd6/action-download-artifact@v6 - with: - workflow: ${{ github.event.workflow_run.workflow_id }} - name: pr - - - name: save PR id - id: pr - run: echo "::set-output name=id::$( - - - body-include: '' - number: ${{ steps.pr.outputs.id }} - - - name: The job failed - if: ${{ failure() }} - uses: actions-cool/maintain-one-comment@v1.2.1 - with: - token: ${{ secrets.GITHUB_TOKEN }} - body: | - 😭 Deploy PR Preview failed. - - - - - body-include: '' - number: ${{ steps.pr.outputs.id }} - - failed: - permissions: - actions: read # for dawidd6/action-download-artifact to query and download artifacts - issues: write # for actions-cool/maintain-one-comment to modify or create issue comments - pull-requests: write # for actions-cool/maintain-one-comment to modify or create PR comments - runs-on: ubuntu-latest - if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'failure' - steps: - - name: download pr artifact - uses: dawidd6/action-download-artifact@v6 - with: - workflow: ${{ github.event.workflow_run.workflow_id }} - name: pr - - - name: save PR id - id: pr - run: echo "::set-output name=id::$( - - - body-include: '' - number: ${{ steps.pr.outputs.id }} diff --git a/.github/workflows/preview-start.yml b/.github/workflows/preview-start.yml deleted file mode 100644 index 39f561d..0000000 --- a/.github/workflows/preview-start.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Preview Start - -on: pull_request_target - -permissions: - contents: read - -jobs: - preview: - permissions: - issues: write # for actions-cool/maintain-one-comment to modify or create issue comments - pull-requests: write # for actions-cool/maintain-one-comment to modify or create PR comments - runs-on: ubuntu-latest - steps: - - name: create - uses: actions-cool/maintain-one-comment@v1.2.1 - with: - token: ${{ secrets.GITHUB_TOKEN }} - body: | - ⚡️ Deploying PR Preview... - - - - body-include: '' diff --git a/config/config.ts b/config/config.ts index 84d9977..40215c6 100644 --- a/config/config.ts +++ b/config/config.ts @@ -83,7 +83,7 @@ export default defineConfig({ * @name layout 插件 * @doc https://umijs.org/docs/max/layout-menu */ - title: 'Ant Design Pro', + title: '百业到家', layout: { locale: true, ...defaultSettings, diff --git a/config/defaultSettings.ts b/config/defaultSettings.ts index be8e4a5..8229df4 100644 --- a/config/defaultSettings.ts +++ b/config/defaultSettings.ts @@ -1,4 +1,4 @@ -import type { ProLayoutProps } from "@ant-design/pro-components"; +import type { ProLayoutProps } from '@ant-design/pro-components'; /** * @name @@ -7,21 +7,26 @@ const Settings: ProLayoutProps & { pwa?: boolean; logo?: string; } = { - navTheme: "light", + navTheme: 'light', // 拂晓蓝 - colorPrimary: "#1890ff", - layout: "mix", - contentWidth: "Fluid", + colorPrimary: '#1890ff', + layout: 'mix', + contentWidth: 'Fluid', fixedHeader: true, fixSiderbar: true, colorWeak: false, - title: "百业到家云控台", + title: '百业到家云控台', pwa: true, - logo: "/logo.svg", - iconfontUrl: "", + logo: '/logo.svg', + iconfontUrl: '', splitMenus: true, token: { // 参见ts声明,demo 见文档,通过token 修改样式 + // 设置内容区域的边距 + pageContainer: { + paddingBlockPageContainerContent: 16, + paddingInlinePageContainerContent: 16, + }, //https://procomponents.ant.design/components/layout#%E9%80%9A%E8%BF%87-token-%E4%BF%AE%E6%94%B9%E6%A0%B7%E5%BC%8F }, }; diff --git a/config/proxy.ts b/config/proxy.ts index 0ac6638..a3cb75d 100644 --- a/config/proxy.ts +++ b/config/proxy.ts @@ -15,7 +15,9 @@ export default { // localhost:8000/api/** -> https://preview.pro.ant.design/api/** '/admin-api/': { // 要代理的地址 - target: 'http://192.168.1.231:48080', + // http://192.168.1.231:48080 伟强 + // https://petshy.tashowz.com/ + target: 'http://192.168.1.231:48080/', // 配置了这个可以从 http 代理到 https // 依赖 origin 的功能可能需要这个,比如 cookie changeOrigin: true, @@ -28,7 +30,7 @@ export default { test: { // localhost:8000/api/** -> https://preview.pro.ant.design/api/** '/api/': { - target: 'https://proapi.azurewebsites.net', + target: 'https://petshy.tashowz.com/', changeOrigin: true, pathRewrite: { '^': '' }, }, diff --git a/config/routes.ts b/config/routes.ts index 70941b3..7da7247 100644 --- a/config/routes.ts +++ b/config/routes.ts @@ -13,70 +13,41 @@ export default [ { - path: "/user", + path: '/user', layout: false, routes: [ { - name: "login", - path: "/user/login", - component: "./user/login", + name: 'login', + path: '/user/login', + component: './user/login', }, ], }, { - path: "/welcome", - name: "welcome", - icon: "smile", - component: "./Welcome", + path: '/welcome', + name: 'welcome', + icon: 'smile', + component: './Welcome', }, - // { - // path: "/system1", - // name: "system1", - // icon: "smile", - // routes: [ - // { - // name: "tenant", - // path: "/system1/tenant", - // routes: [ - // { - // name: "package", - // path: "/system1/tenant/package", - // component: "system/tenant/package", - // }, - // ], - // }, - // ], - // }, + { - path: "/admin", - name: "admin", - icon: "crown", - access: "canAdmin", + path: '/', + redirect: '/welcome', + }, + { + path: '/trade', + name: '交易管理', routes: [ { - path: "/admin", - redirect: "/admin/sub-page", - }, - { - path: "/admin/sub-page", - name: "sub-page", - component: "./Admin", + name: '订单管理', + path: '/trade', + component: './trade/order/index', }, ], }, - // { - // name: 'list.table-list', - // icon: 'table', - // path: '/list', - // component: './table-list', - // }, { - path: "/", - redirect: "/welcome", - }, - { - component: "404", + component: '404', layout: false, - path: "*", + path: '*', }, ]; diff --git a/mock/login.ts b/mock/login.ts new file mode 100644 index 0000000..f91b267 --- /dev/null +++ b/mock/login.ts @@ -0,0 +1,23 @@ +import type { Request, Response } from "express"; +const logout = (_req: Request, res: Response) => { + res.json({ + code: 0, + data: true, + msg: "", + }); +}; + +export default { + "POST /system/auth/logout": logout, + "GET /system/tenant/get-id-by-name": { + data: 1, + }, + "POST /system/auth/login": { + data: { + accessToken: "e0a58d5267d246d3a478e8c4c96051d9", + expiresTime: 1760583658965, + refreshToken: "9667e5f1a1c24c02814284aa116ea769", + userId: 1, + }, + }, +}; diff --git a/mock/order.ts b/mock/order.ts new file mode 100644 index 0000000..f150cf1 --- /dev/null +++ b/mock/order.ts @@ -0,0 +1,142 @@ +import type { Request, Response } from "express"; +const getOrderPage = (_req: Request, res: Response) => { + res.json({ + data: { + list: [ + { + id: 1, + orderNum: "BZ000548787", + createTime: "2025-10-1 14:00:00", + orderCategoryName: "宠物殡葬", // 订单类目 + orderTerminal: 0, // 订单来源 + userId: 0, // 用户编号 + userName: "", // 用户姓名 + userNickName: "张宁清", // 用户昵称 + userAvatar: "", // 用户头像 + userMobile: "18634556151", // 用户手机号 + orderStatus: 2, // 订单状态 + picUrl: "", // 商品图片 + spuName: + "商品主标题商品主标题商品主标题商品主标题商品主题商品主标题商品主标题商品主", // 商品名称 + skuName: "标准,单独火化,基础清洁", // 商品规格 + count: 1, // 购买商品数量 + price: 100, // 单价 + handedPrice: 80, // 到手价 + payPrice: "500", // 应付金额 + unit: "", // 单位 + subTime: "", // 预约时间 + serveAddress: "张宁清,18659156151,福州 台江区 鳌峰路 万达中心甲", + userRemark: "你好呀你好元", // 用户备注 + payType: "wx", // 微信 + financeStatus: "1", // 财务状态 + }, + { + id: 2, + orderNum: "3214421412", + createTime: "", + orderCategoryName: "", + orderTerminal: 0, + userId: 0, + userName: "", + userNickName: "", + userAvatar: "", + userMobile: "", + orderStatus: 0, + picUrl: "", + spuName: "", + skuName: "", + count: 0, + price: 0, + handedPrice: 0, + payPrice: 0, + unit: "", + orderTime: "", + serveAddress: "", + userRemark: "", + payType: "", + financeStatus: "", + }, + ], + total: 0, + }, + code: 0, + }); +}; + +const getOrderDetail = (_req: Request, res: Response) => { + res.json({ + data: { + code: 0, + data: { + tradeOrderInfoBase: { + id: "", + orderNo: "", + orderStatus: "", + orderType: "", + orderCategoryNameAndId: "", + orderTerminal: "", + userInfo: "", + cancelTime: "", + cancelReason: "", + merchantRemark: "", + refundTime: "", + propertyTime: "", + propertyStatus: "", + price: "", + discountPrice: "", + payPrice: 0, + refundPrice: "", + livePrice: "", + payType: "", + payChannelCode: "", + payOrderId: "", + payTime: "", + createTime: "", + finishTime: "", + }, + tradeProductInfo: { + shopLogoUrl: "", + shopName: "", + spuId: 0, + skuId: 0, + skuPicUrl: "", + spuName: "", + skuName: "", + count: 0, + price: 0, + unit: "", + handedPrice: 0, + expensePrice: 0, + properties: [""], + serveContent: "", + totalPrice: 0, + discountPrice: 0, + payPrice: 0, + refundPrice: 0, + refundCount: 0, + }, + tradeServeInfo: { + properties: { + "": {}, + }, + }, + tradeExtendServeInfo: { + properties: { + "": {}, + }, + }, + tradeExtendCostInfo: { + properties: { + "": {}, + }, + }, + }, + msg: "", + }, + code: 0, + }); +}; +export default { + "GET /admin-api/trade/order/page": getOrderPage, + "GET /admin-api/trade/order/get-detail": getOrderDetail, +}; diff --git a/package.json b/package.json index 430245f..7307a38 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "classnames": "^2.5.1", "dayjs": "^1.11.13", "jsencrypt": "^3.5.4", + "rc-resize-observer": "^1.4.3", "react": "^19.1.0", "react-dom": "^19.1.0", "react-infinite-scroll-component": "^6.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 62a038a..3bd9a17 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,6 +35,9 @@ importers: jsencrypt: specifier: ^3.5.4 version: 3.5.4 + rc-resize-observer: + specifier: ^1.4.3 + version: 1.4.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: specifier: ^19.1.0 version: 19.1.1 diff --git a/src/app.tsx b/src/app.tsx index d76f953..3807ed2 100644 --- a/src/app.tsx +++ b/src/app.tsx @@ -193,10 +193,10 @@ export const request: RequestConfig = { return { url, options: { ...options, headers } }; }, ], + // 添加参数序列化配置 paramsSerializer: (params) => { const searchParams = new URLSearchParams(); - const appendParams = (key: string, value: any) => { if (Array.isArray(value)) { // 特殊处理 createTime 数组,转换为 createTime[0] 和 createTime[1] 格式 diff --git a/src/components/DrawerForm/index.tsx b/src/components/DrawerForm/index.tsx index 3a2965d..cee5ab3 100644 --- a/src/components/DrawerForm/index.tsx +++ b/src/components/DrawerForm/index.tsx @@ -1,17 +1,20 @@ import type { ProFormColumnsType } from '@ant-design/pro-components'; import { BetaSchemaForm } from '@ant-design/pro-components'; -import { Button, type ColProps, Drawer, Space, Typography } from 'antd'; +import { Button, type ColProps, Drawer, Space } from 'antd'; import type { FormInstance } from 'antd/lib'; import React, { forwardRef, useImperativeHandle } from 'react'; interface ConfigurableDrawerFormProps { title?: string; - columns: ProFormColumnsType[]; + columns?: ProFormColumnsType[]; onSubmit?: (values: any) => Promise; initialValues?: Record; width?: number | string; labelCol?: ColProps; wrapperCol?: ColProps; + footer: React.ReactNode; + children?: React.ReactNode; + bodyStyle: React.CSSProperties; } export interface ConfigurableDrawerFormRef { @@ -32,6 +35,9 @@ const ConfigurableDrawerForm = forwardRef< onSubmit, initialValues, width = 600, + footer, + children, + bodyStyle = {}, }, ref, ) => { @@ -69,31 +75,7 @@ const ConfigurableDrawerForm = forwardRef< setLoading(false); } }; - // const customHeader = ( - //
- // - // {title} - // - //
- // ); + console.log(footer); return ( - - + {footer ? ( + footer + ) : ( + <> + + + + )} } > - {/* {customHeader} */} - + {columns ? ( + + ) : ( + children + )} ); }, diff --git a/src/components/EnhancedProTable/index.tsx b/src/components/EnhancedProTable/index.tsx index 02755de..f54e36f 100644 --- a/src/components/EnhancedProTable/index.tsx +++ b/src/components/EnhancedProTable/index.tsx @@ -17,25 +17,11 @@ function EnhancedProTable( const { columns, request, - // actions = [], - // permissions = [], - // checkPermission = () => true, + components, + search = {}, toolbarActions, - // showIndex = true, - // showActions = true, - // maxActionCount = 2, - // onAdd, - // onEdit, - // onDelete, - // onView, - // onExport, - // customToolbarRender, - // showSelection = true, rowKey = 'id', - // onRow, - // rowClassName, - // enableRowClick = false, - // clickableRowClassName = "clickable-row", // 添加可点击样式 + pagination = true, ...restProps } = props; @@ -120,25 +106,37 @@ function EnhancedProTable( manualRequest={false} showSorterTooltip scroll={{ x: 'max-content' }} - search={{ - labelWidth: 'auto', - defaultCollapsed: false, - ...restProps.search, - }} - options={{ - fullScreen: true, - reload: true, - setting: true, - density: true, - ...restProps.options, - }} - pagination={{ - showSizeChanger: true, - showQuickJumper: true, - pageSize: 10, - showTotal: formatPaginationTotal, - ...restProps.pagination, - }} + components={components} + search={ + search + ? { + labelWidth: 'auto', + defaultCollapsed: false, + ...search, + } + : false + } + options={ + search + ? { + fullScreen: true, + reload: true, + setting: true, + density: true, + ...restProps.options, + } + : false + } + pagination={ + pagination + ? { + showSizeChanger: true, + showQuickJumper: true, + pageSize: 10, + showTotal: formatPaginationTotal, + } + : false + } /> ); } diff --git a/src/components/Footer/index.tsx b/src/components/Footer/index.tsx index c58c037..4d6e590 100644 --- a/src/components/Footer/index.tsx +++ b/src/components/Footer/index.tsx @@ -1,31 +1,31 @@ -import { GithubOutlined } from "@ant-design/icons"; -import { DefaultFooter } from "@ant-design/pro-components"; -import React from "react"; +import { GithubOutlined } from '@ant-design/icons'; +import { DefaultFooter } from '@ant-design/pro-components'; +import React from 'react'; const Footer: React.FC = () => { return ( , - href: "https://github.com/ant-design/ant-design-pro", + href: 'https://github.com/ant-design/ant-design-pro', blankTarget: true, }, { - key: "Ant Design", - title: "Ant Design", - href: "https://ant.design", + key: 'bydj', + title: '宠悦', + href: 'https://ant.design', blankTarget: true, }, ]} diff --git a/src/components/PopconfirmForm/index.tsx b/src/components/PopconfirmForm/index.tsx new file mode 100644 index 0000000..4328c82 --- /dev/null +++ b/src/components/PopconfirmForm/index.tsx @@ -0,0 +1,96 @@ +import type { ProFormColumnsType } from '@ant-design/pro-components'; +import { BetaSchemaForm } from '@ant-design/pro-components'; +import { type ColProps, Popconfirm } from 'antd'; +import type { FormInstance } from 'antd/lib'; +import React, { forwardRef, useImperativeHandle } from 'react'; + +interface PopconfirmFormProps { + title?: string; + columns?: ProFormColumnsType[]; + onSubmit?: (values: any) => Promise; + initialValues?: Record; + labelCol?: ColProps; + wrapperCol?: ColProps; + children?: React.ReactNode; +} + +export interface PopconfirmFormRef { + open: (data?: Record) => void; + close: () => void; +} + +const PopconfirmForm = forwardRef( + ( + { + labelCol = { span: 4 }, + wrapperCol = { span: 20 }, + columns, + onSubmit, + initialValues, + children, + }, + ref, + ) => { + const [open, setOpen] = React.useState(false); + const [formData, setFormData] = React.useState(initialValues || {}); + // const [loading, setLoading] = React.useState(false); + // 添加表单实例引用 + const formRef = React.useRef(null); + useImperativeHandle(ref, () => ({ + open: (data) => { + if (data) { + setFormData(data); + } + setOpen(true); + }, + close: () => setOpen(false), + })); + + const handleSubmit = async () => { + try { + if (onSubmit) { + await formRef.current?.validateFields(); + // setLoading(true); + const values = formRef.current?.getFieldsValue(); + const success = await onSubmit(values); + if (success) { + setOpen(false); + return true; + } + return false; + } + return true; + } finally { + // setLoading(false); + } + }; + return ( + + } + onConfirm={handleSubmit} + onCancel={() => setOpen(false)} + > + {children} + + ); + }, +); + +export default React.memo(PopconfirmForm); diff --git a/src/constants/index.ts b/src/constants/index.ts index ede1a5d..310fe13 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -2,6 +2,7 @@ export const formStatusType: { [key: string]: string } = { create: '创建', update: '编辑', test: '测试', + detail: '详情', }; export const tenantStatus = [ diff --git a/src/constants/order.ts b/src/constants/order.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/global.less b/src/global.less index a39376d..0d2216c 100644 --- a/src/global.less +++ b/src/global.less @@ -92,3 +92,25 @@ ol { } } } + +.page-container { + background: #fff; + width: 100%; + height: 100%; + padding: 16px; + border-radius: 8px; + .ant-tabs { + .ant-pro-query-filter-container { + form { + padding-left: 0; + padding-right: 0; + padding-bottom: 0; + } + } + .ant-pro-table { + .ant-pro-card-body { + padding: 0px; + } + } + } +} diff --git a/src/manifest.json b/src/manifest.json index 839bc5b..7c02259 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -1,6 +1,6 @@ { - "name": "Ant Design Pro", - "short_name": "Ant Design Pro", + "name": "百业到家", + "short_name": "百业到家", "display": "standalone", "start_url": "./?utm_source=homescreen", "theme_color": "#002140", diff --git a/src/pages/Welcome.tsx b/src/pages/Welcome.tsx index 5216d7f..8f3fd98 100644 --- a/src/pages/Welcome.tsx +++ b/src/pages/Welcome.tsx @@ -116,7 +116,7 @@ const Welcome: React.FC = () => { color: token.colorTextHeading, }} > - 欢迎使用 Ant Design Pro + 欢迎使用 百业到家

{ width: '65%', }} > - Ant Design Pro 是一个整合了 umi,Ant Design 和 ProComponents + 百业到家 是一个整合了 umi,Ant Design 和 ProComponents 的脚手架方案。致力于在设计规范和基础组件的基础上,继续向上构建,提炼出典型模板/业务组件/配套设计资源,进一步提升企业级中后台产品设计研发过程中的『用户』和『设计者』的体验。

[] = [ { title: '标签', hideInTable: true, - dataIndex: 'tag_name', + dataIndex: 'tagIds', valueType: 'select', search: { transform: (value) => { diff --git a/src/pages/ai/sample-tag/detail.tsx b/src/pages/ai/sample-tag/detail.tsx index 40c7811..040b6f8 100644 --- a/src/pages/ai/sample-tag/detail.tsx +++ b/src/pages/ai/sample-tag/detail.tsx @@ -252,10 +252,6 @@ const SampleTagDetail = >( 格式: {value.sampleMineType} - - 时长: - {value.sampleTime} - {type === 'checkbox' && ( <> diff --git a/src/pages/trade/order/config.tsx b/src/pages/trade/order/config.tsx new file mode 100644 index 0000000..b1f092a --- /dev/null +++ b/src/pages/trade/order/config.tsx @@ -0,0 +1,140 @@ +import type { ProColumns } from '@ant-design/pro-components'; +import { Space, Typography } from 'antd'; +import type { TradeOrderPageRespVO } from '@/services/trade/order'; + +const { Text } = Typography; +export const baseOrderColumns: ProColumns[] = [ + { + title: '商品', + dataIndex: 'id', + width: '20%', + hideInSearch: true, + ellipsis: true, + render: (_, record) => + // + // + record.spuName, + // + // {record.spuName} + //
{record.skuName}
+ // + //
+ // 数量: + // {record.count} + //
+ //
+ // 单价: + // + // {record.price}/{record.unit} + // + //
+ //
+ // 到手价: + // + // {record.handedPrice}/{record.unit} + // + //
+ //
+ //
+ //
+ }, + + { + title: '服务', + dataIndex: 'serveAddress', + hideInSearch: true, + render: (_, record) => ( + +
+ 预约时间: + {record.subTime} +
+
+ 服务地址: + {record.serveAddress} +
+
+ 用户备注: + {record.userRemark} +
+
+ ), + }, + { + title: '财务', + dataIndex: 'price', + hideInSearch: true, + render: (_, record) => ( + +
+ 实付金额: + {record.payPrice} +
+
+ 支付方式: + {record.payType} +
+
+ 财务状态: + {record.financeStatus} +
+
+ ), + }, + { + title: '卖家名称', + dataIndex: 'merchantName', + hideInTable: true, + }, + { + title: '买家昵称/手机号', + dataIndex: 'userSearch', + hideInTable: true, + }, + { + title: '订单类目', + dataIndex: 'orderCategoryId', + valueType: 'select', + hideInTable: true, + }, + { + title: '订单来源', + dataIndex: 'orderTerminal', + valueType: 'select', + hideInTable: true, + }, + { + title: '财务状态', + dataIndex: 'financeStatus', + valueType: 'select', + hideInTable: true, + }, + { + title: '售后状态', + dataIndex: 'afterSaleStatus', + valueType: 'select', + hideInTable: true, + }, + { + title: '预约状态', + dataIndex: 'subType', + valueType: 'select', + hideInTable: true, + }, + { + title: '创建时间', + dataIndex: 'createTime', + valueType: 'dateRange', + hideInTable: true, + }, + { + title: '预约时间', + dataIndex: 'subTime', + valueType: 'dateRange', + hideInTable: true, + }, +]; diff --git a/src/pages/trade/order/detail/component/info/basic-info.tsx b/src/pages/trade/order/detail/component/info/basic-info.tsx new file mode 100644 index 0000000..735d5bd --- /dev/null +++ b/src/pages/trade/order/detail/component/info/basic-info.tsx @@ -0,0 +1,90 @@ +import { ProCard } from '@ant-design/pro-components'; +import { Button, Card, Steps, Typography } from 'antd'; +import RcResizeObserver from 'rc-resize-observer'; +import React, { useCallback, useState } from 'react'; +import styles from './index.module.less'; + +const { Title, Text } = Typography; +const BasicInfo: React.FC = () => { + const [responsive, setResponsive] = useState(false); + const renderTitle = useCallback(() => { + return
标题
; + }, []); + return ( +
+ + + +
+ + 等待付款 + + + 剩余 + 4分30秒 + + + + +
+
+ + { + setResponsive(offset.width < 460); + }} + > + + + +
+
+
+ ); +}; + +export default React.memo(BasicInfo); diff --git a/src/pages/trade/order/detail/component/info/config.tsx b/src/pages/trade/order/detail/component/info/config.tsx new file mode 100644 index 0000000..8346504 --- /dev/null +++ b/src/pages/trade/order/detail/component/info/config.tsx @@ -0,0 +1,64 @@ +import type { ProColumns } from '@ant-design/pro-components'; +import { Tag } from 'antd'; +import type { DeptVO } from '@/services/system/dept'; + +export const baseOrderColumns: ProColumns[] = [ + { + title: '商品', + dataIndex: 'name', + width: '33.33%', + render: (_, record) => ( + {record.name} + ), + }, + { + title: '服务', + dataIndex: 'leaderUserId', + hideInSearch: true, + }, + { + title: '财务', + dataIndex: 'sort', + hideInSearch: true, + }, +]; +const sharedOnCell = (_: DeptVO, index?: number) => { + if (index === 3) { + return { colSpan: 0 }; + } + + return {}; +}; +export const surchargeInfoColumns: ProColumns[] = [ + { + title: '服务附加费', + dataIndex: 'name', + width: '33.33%', + render: (_, record, index) => { + if (index === 3) { + return 33333; + } + return ( + {record.name} + ); + }, + onCell: (_, index) => ({ + colSpan: index === 3 ? 4 : 1, + }), + }, + { + title: '费用详情', + dataIndex: 'leaderUserId', + onCell: sharedOnCell, + }, + { + title: '付款信息', + dataIndex: 'sort', + onCell: sharedOnCell, + }, + { + title: '退款信息', + dataIndex: 'leaderUserId1', + onCell: sharedOnCell, + }, +]; diff --git a/src/pages/trade/order/detail/component/info/index.module.less b/src/pages/trade/order/detail/component/info/index.module.less new file mode 100644 index 0000000..59e936a --- /dev/null +++ b/src/pages/trade/order/detail/component/info/index.module.less @@ -0,0 +1,25 @@ +.order-info { + :global { + .ant-pro-card-header { + background: rgba(0, 0, 0, 0.02); + } + .ant-pro-card-col { + flex: 1 auto; + overflow: auto; + } + .order-info-card { + .ant-pro-card-col { + flex: 1 auto; + overflow: auto; + display: flex; + align-items: center; + } + } + .order-paragraph { + margin-bottom: 0; + } + .ant-pro-card-body { + padding: 0px; + } + } +} diff --git a/src/pages/trade/order/detail/component/info/prod-info.tsx b/src/pages/trade/order/detail/component/info/prod-info.tsx new file mode 100644 index 0000000..e2fa080 --- /dev/null +++ b/src/pages/trade/order/detail/component/info/prod-info.tsx @@ -0,0 +1,134 @@ +import { ProCard } from '@ant-design/pro-components'; +import { Button, Card, Image, Space, Tag, Typography } from 'antd'; +import React, { useCallback } from 'react'; +import styles from './index.module.less'; + +const { Text, Paragraph } = Typography; +const ProdInfo: React.FC = () => { + const renderTitle = useCallback(() => { + return ( + + 百业到家 + + 商品 ID: + 8877777 + + + SKU ID: + 8877777 + + + ); + }, []); + return ( +
+ + 交易快照} + > + + + +
+ 商品名称 + + 规格: + 标准,单独火化,基础清洁 + + + + 数量: + 1 + + + 单价: + ¥100 件 + + + 到手价: + ¥80 件 + + + 成本价: + ¥50 件/- + + +
+
+ + 标签 + 标签 + 标签 + 标签 + 标签 + + + 商品描述: + + 商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品 + + +
+ + + 付款信息 + + 商品总价: + ¥500 + + + 商品总价: + ¥500 + + + 商品总价: + ¥500 + + + + + + 退款信息 + + 累计退款金额: + ¥500 + + + 累计退款数量: + 1 + + + +
+
+
+ ); +}; + +export default React.memo(ProdInfo); diff --git a/src/pages/trade/order/detail/component/info/select-info.tsx b/src/pages/trade/order/detail/component/info/select-info.tsx new file mode 100644 index 0000000..2041349 --- /dev/null +++ b/src/pages/trade/order/detail/component/info/select-info.tsx @@ -0,0 +1,76 @@ +import { ProCard } from '@ant-design/pro-components'; +import { Card, Space } from 'antd'; +import React from 'react'; +import EnhancedProTable from '@/components/EnhancedProTable'; +import { + type DeptReqVO, + type DeptVO, + getDeptPage, +} from '@/services/system/dept'; +import { baseOrderColumns } from '../../../config'; +import styles from './index.module.less'; + +const SelectInfo: React.FC = () => { + const onFetch = async ( + params: DeptReqVO & { + pageSize?: number; + current?: number; + }, + ) => { + const data = await getDeptPage({ + ...params, + pageNo: params.current, + pageSize: params.pageSize, + }); + return { + data: data, + success: true, + total: data.total, + }; + }; + return ( +
+ + + + + 1111 + + + 1111 + + + 1111 + + + + + columns={baseOrderColumns} + request={onFetch} + showIndex={false} + size="small" + search={false} + showActions={false} + showSelection={false} + bordered + pagination={false} + /> + + + + 1111 + + + 1111 + + + 1111 + + + + +
+ ); +}; + +export default React.memo(SelectInfo); diff --git a/src/pages/trade/order/detail/component/info/service-info.tsx b/src/pages/trade/order/detail/component/info/service-info.tsx new file mode 100644 index 0000000..93b2280 --- /dev/null +++ b/src/pages/trade/order/detail/component/info/service-info.tsx @@ -0,0 +1,98 @@ +import { ProCard } from '@ant-design/pro-components'; +import { Button, Card, Image, Space, Typography } from 'antd'; +import React from 'react'; +import styles from './index.module.less'; + +const { Text, Paragraph } = Typography; +const ServiceInfo: React.FC = () => { + return ( +
+ + + 修改记录} + size="small" + colSpan="30%" + headerBordered + > + + 姓名: + 钱多多 + + + 宠物品种: + 钱多多 + + + 体型/体重: + 钱多多 + + + 离世时间: + 钱多多 + + + 离世原因: + 钱多多 + + + 遗体照片: + + + + + + + + + + 修改记录} + > + + 离世时间: + 钱多多 + + + 更改规则: + 钱多多 + + + 预约时间: + 钱多多 + + + 用户备注: + 钱多多 + + + 客服备注: + 钱多多 + + + + +
+ ); +}; + +export default React.memo(ServiceInfo); diff --git a/src/pages/trade/order/detail/component/info/surcharge-info.tsx b/src/pages/trade/order/detail/component/info/surcharge-info.tsx new file mode 100644 index 0000000..ca2c478 --- /dev/null +++ b/src/pages/trade/order/detail/component/info/surcharge-info.tsx @@ -0,0 +1,49 @@ +import { Card } from 'antd'; +import React from 'react'; +import EnhancedProTable from '@/components/EnhancedProTable'; +import { + type DeptReqVO, + type DeptVO, + getDeptPage, +} from '@/services/system/dept'; +import { surchargeInfoColumns } from './config'; +import styles from './index.module.less'; + +const SurchargeInfo: React.FC = () => { + const onFetch = async ( + params: DeptReqVO & { + pageSize?: number; + current?: number; + }, + ) => { + const data = await getDeptPage({ + ...params, + pageNo: params.current, + pageSize: params.pageSize, + }); + return { + data: data, + success: true, + total: data.total, + }; + }; + return ( +
+ + + columns={surchargeInfoColumns} + request={onFetch} + showIndex={false} + size="small" + search={false} + showActions={false} + showSelection={false} + bordered + pagination={false} + /> + +
+ ); +}; + +export default React.memo(SurchargeInfo); diff --git a/src/pages/trade/order/detail/index.tsx b/src/pages/trade/order/detail/index.tsx new file mode 100644 index 0000000..c593dad --- /dev/null +++ b/src/pages/trade/order/detail/index.tsx @@ -0,0 +1,26 @@ +import { Tabs, type TabsProps } from 'antd'; +import React from 'react'; +import OrderInfo from './order-info'; + +const DetailCom: React.FC = () => { + const items: TabsProps['items'] = [ + { + key: '1', + label: '订单信息 ', + children: , + }, + { + key: '2', + label: '服务履约', + children: '服务履约', + }, + { + key: '3', + label: '商品配送', + children: '商品配送', + }, + ]; + return ; +}; + +export default React.memo(DetailCom); diff --git a/src/pages/trade/order/detail/order-info.tsx b/src/pages/trade/order/detail/order-info.tsx new file mode 100644 index 0000000..6018640 --- /dev/null +++ b/src/pages/trade/order/detail/order-info.tsx @@ -0,0 +1,21 @@ +import { Space } from 'antd'; +import React from 'react'; +import BasicInfo from './component/info/basic-info'; //基本信息(通版) +import ProdInfo from './component/info/prod-info'; //商品信息(通版) +import SelectInfo from './component/info/select-info'; //可选服务(殡葬专属字段) +import ServiceInfo from './component/info/service-info'; +import SurchargeInfo from './component/info/surcharge-info'; //服务附加费(殡葬专属字段) + +const OrderDetail: React.FC = () => { + return ( + + + + + + + + ); +}; + +export default React.memo(OrderDetail); diff --git a/src/pages/trade/order/index.module.less b/src/pages/trade/order/index.module.less new file mode 100644 index 0000000..d99992c --- /dev/null +++ b/src/pages/trade/order/index.module.less @@ -0,0 +1,9 @@ +.trade-order { + :global { + .expanded-row-top { + order: -1; /* 在 Flex 布局中将元素移到前面 */ + position: relative; + margin: 0 -16px 16px -16px; /* 调整边距以填满整行 */ + } + } +} diff --git a/src/pages/trade/order/index.tsx b/src/pages/trade/order/index.tsx new file mode 100644 index 0000000..5b8a41a --- /dev/null +++ b/src/pages/trade/order/index.tsx @@ -0,0 +1,37 @@ +import type { TabsProps } from 'antd'; +import { Tabs } from 'antd'; +import React from 'react'; +import styles from './index.module.less'; +import OrderListItem from './list'; + +const onChange = (key: string) => { + console.log(key); +}; + +const status: string[] = [ + '所有订单', + '等待付款', + '等待确定', + '等待服务', + '等待验收', + '等待评价', + '已完成', + '已取消', + '已退款', +]; + +const OrderList: React.FC = () => { + const items: TabsProps['items'] = status.map((item, index) => ({ + key: `${index + 1}`, + label: item, + children: , + })); + + return ( +
+ +
+ ); +}; + +export default OrderList; diff --git a/src/pages/trade/order/list.tsx b/src/pages/trade/order/list.tsx new file mode 100644 index 0000000..12418cb --- /dev/null +++ b/src/pages/trade/order/list.tsx @@ -0,0 +1,259 @@ +import { + type ActionType, + ProCard, + type ProColumns, +} from '@ant-design/pro-components'; +import { + Avatar, + Badge, + Button, + Divider, + Input, + message, + Space, + Statistic, +} from 'antd'; +import React, { useCallback, useRef, useState } from 'react'; +import ConfigurableDrawerForm, { + type ConfigurableDrawerFormRef, +} from '@/components/DrawerForm'; +import EnhancedProTable from '@/components/EnhancedProTable'; +import { baseOrderColumns } from './config'; + +const { Search } = Input; + +import { DownOutlined, UpOutlined, UserOutlined } from '@ant-design/icons'; +import PopconfirmForm, { + type PopconfirmFormRef, +} from '@/components/PopconfirmForm'; +import { + getTradeOrderPage, + type TradeOrderPageRespVO, + type TradeReq, +} from '@/services/trade/order'; +import DetailCom from './detail'; + +const OrderListItem: React.FC = () => { + const tableRef = useRef(null); + const configurableDrawerRef = useRef(null); + const [modalTitle, setModalTitle] = useState('订单:BZ000548787'); + const [isShowTotal, setIsShowTotal] = useState(false); + const popconfirmFormRef = useRef(null); + const onFetch = async ( + params: TradeReq & { + pageSize?: number; + current?: number; + }, + ) => { + const data = await getTradeOrderPage({ + ...params, + pageNo: params.current, + pageSize: params.pageSize, + }); + + return { + data: data.list, + success: true, + total: data.total, + }; + }; + + const handleDetail = useCallback((record: TradeOrderPageRespVO) => { + setModalTitle(`订单:${record.orderNum}`); + configurableDrawerRef.current?.open(); + }, []); + + const handleOrder = useCallback((id?: number) => { + console.log(id, '取消订单'); + // await updateTradeOrder(values.id); + }, []); + + const handleUpdate = async (_values: TradeOrderPageRespVO) => { + try { + // await updateTradeOrder(values.id); + return true; + } finally { + message.success('更新成功'); + } + // await updateTradeOrder(values.id); + }; + + const actionColumns: ProColumns = { + title: '操作', + dataIndex: 'option', + valueType: 'option', + fixed: 'right', + width: 100, + render: (_text: React.ReactNode, record: TradeOrderPageRespVO) => [ + , + ], + }; + + const onClose = useCallback(() => { + configurableDrawerRef.current?.close(); + }, []); + const handleRow = (record: TradeOrderPageRespVO) => { + return { + 'data-record': JSON.stringify(record), + className: 'order-row-with-info', + }; + }; + const components = { + body: { + row: (props: any) => { + const { children, ...restProps } = props; + const record = props['data-record'] + ? JSON.parse(props['data-record']) + : {}; + return ( + <> + {record && ( + + + + + + + + {record.orderCategoryName} + {record.createTime} + {record.orderNum} + {record.payType} + + } /> + {/* */} + 百业到家旗舰店 + + + {record.userAvatar ? ( + + ) : ( + } /> + )} + {record.userNickName || record.userName} + {record.userMobile} + + + + + )} + {children} + + ); + }, + }, + }; + const columns = [...baseOrderColumns, actionColumns]; + + const handleIsTotal = useCallback(() => { + setIsShowTotal(!isShowTotal); + }, [isShowTotal]); + + const handleSearch = useCallback((value: string) => { + console.log('搜索', value); + tableRef.current?.reload(); + }, []); + return ( + <> + + + + + {isShowTotal && ( + + + + + + + + + + + + )} + + + ref={tableRef} + columns={columns} + request={onFetch} + headerTitle="销售管理" + showIndex={false} + showSelection={false} + search={{ defaultCollapsed: true }} + onRow={handleRow} + components={components} + /> + + 关闭} + > + + + + ); +}; + +export default OrderListItem; diff --git a/src/services/trade/order/index.ts b/src/services/trade/order/index.ts new file mode 100644 index 0000000..515d9e4 --- /dev/null +++ b/src/services/trade/order/index.ts @@ -0,0 +1,473 @@ +import { request } from "@umijs/max"; +export interface TradeReq { + /** + * 售后状态,示例:1 + */ + afterSaleStatus?: number; + /** + * 创建时间 + */ + createTime?: string[]; + /** + * 财务状态,示例:1 + */ + financeStatus?: number; + /** + * 卖家名称 + */ + merchantName?: string; + /** + * 订单类目id,示例:1 + */ + orderCategoryId?: number; + /** + * 订单状态,示例:1 + */ + orderStatus?: number; + /** + * 订单来源,示例:1 + */ + orderTerminal?: number; + /** + * 页码,从 1 开始", example = "1 + */ + pageNo?: number; + /** + * 每页条数,最大值为 100" + */ + pageSize?: number; + /** + * 聚合检索字段(商品名称,商品id,订单号) + */ + prodSearch?: string; + /** + * 创建时间 + */ + subTime?: string[]; + /** + * 预约类型,示例:1 + */ + subType?: number; + /** + * 聚合检索字段 买家昵称/手机号 + */ + userSearch?: string; +} +export interface TradeOrderPageRespVO { + /** + * 购买的商品数量 + */ + count?: number; + /** + * 下单时间 + */ + createTime?: string; + /** + * 财务状态 + */ + financeStatus?: string; + /** + * 到手价 + */ + handedPrice?: number; + /** + * 订单编号 + */ + id?: number; + /** + * 订单类目 + */ + orderCategoryName?: string; + /** + * 订单流水号 + */ + orderNum?: string; + /** + * 订单状态 + */ + orderStatus?: number; + /** + * 订单来源 + */ + orderTerminal?: number; + /** + * 预约时间 + */ + subTime?: string; + /** + * 到手价 + */ + payPrice?: number; + /** + * 支付方式 + */ + payType?: string; + /** + * 商品图片 + */ + picUrl?: string; + /** + * 单价 + */ + price?: number; + /** + * 服务地址 + */ + serveAddress?: string; + /** + * 商品规格 + */ + skuName?: string; + /** + * 商品名称 + */ + spuName?: string; + /** + * 单位 + */ + unit?: string; + /** + * 用户头像 + */ + userAvatar?: string; + /** + * 用户编号 + */ + userId?: number; + /** + * 用户手机号 + */ + userMobile?: string; + /** + * 用户姓名 + */ + userName?: string; + /** + * 用户昵称 + */ + userNickName?: string; + /** + * 用户备注 - 必填,示例:你猜 + */ + userRemark?: string; +} + +/** + * 返回数据 + * + * TradeOrderDetailRespVO + */ +export interface TradeOrderDetailRespVO { + /** + * 购买的商品数量 + */ + count?: number; + /** + * 下单时间 - 必填 + */ + createTime?: string; + /** + * 财务状态 + */ + financeStatus?: string; + /** + * 到手价 + */ + handedPrice?: number; + /** + * 订单编号 - 必填,示例:1024 + */ + id?: number; + /** + * 订单类目 + */ + orderCategoryName?: string; + /** + * 订单流水号 - 必填,示例:1146347329394184195 + */ + orderNum?: string; + /** + * 订单状态 + */ + orderStatus?: number; + /** + * 订单来源 + */ + orderTerminal?: number; + /** + * 预约时间 + */ + orderTime?: string; + /** + * 应付金额(总) - 必填,示例:1000 + */ + payPrice?: number; + /** + * 支付方式 + */ + payType?: string; + /** + * 商品图片 + */ + picUrl?: string; + /** + * 单价 + */ + price?: number; + /** + * 服务地址 + */ + serveAddress?: string; + /** + * 商品规格 + */ + skuName?: string; + /** + * 商品名称 + */ + spuName?: string; + /** + * 配送信息 + */ + tradeDeliveryInfo?: TradeDeliveryInfo; + /** + * 附加费信息 + */ + tradeExtendCostInfo?: string; + /** + * 扩展服务信息 + */ + tradeExtendServeInfo?: string; + /** + * 基本信息 + */ + tradeOrderInfoBase?: TradeOrderBaseInfo; + /** + * 商品信息 + */ + tradeProductInfo?: string; + /** + * 单位 + */ + unit?: string; + /** + * 用户头像 + */ + userAvatar?: string; + /** + * 用户编号 - 必填,示例:2048 + */ + userId?: number; + /** + * 用户手机号 + */ + userMobile?: string; + /** + * 用户姓名 + */ + userName?: string; + /** + * 用户昵称 + */ + userNickName?: string; + /** + * 用户备注 - 必填,示例:你猜 + */ + userRemark?: string; +} + +/** + * 配送信息 + * + * TradeDeliveryInfo + */ +export interface TradeDeliveryInfo { + /** + * 快递详情 + */ + deliveryDetail?: string; + /** + * 承运方 + */ + logisticsName?: string; + /** + * 送货上门 + */ + logisticsNum?: string; + /** + * 送货方式 + */ + logisticsType?: string; + /** + * 收货地址 + */ + receiverDetailAddress?: string; + /** + * 收货手机 + */ + receiverMobile?: string; + /** + * 收货人 + */ + receiverName?: string; +} + +/** + * 基本信息 + * + * TradeOrderBaseInfo + */ +export interface TradeOrderBaseInfo { + /** + * 实收金额 + */ + actualPrice?: string; + /** + * 售后编号 - 必填,示例:450878 + */ + afterSaleCode?: string; + /** + * 售后类型 - 必填,示例:仅退款/退货退款/可扩展增加使用 + */ + afterSaleType?: string; + /** + * 申请人 - 必填,示例:用户/商家/平台+ID + */ + applicant?: string; + /** + * 审核人 - 必填,示例:姓名+ID + */ + auditor?: string; + /** + * 审核时间 - 必填,示例:2025-07-01 12:00:00 + */ + auditTime?: string; + /** + * 取消时间 + */ + cancelTime?: string; + /** + * 关闭时间 - 必填,示例:2025-07-01 12:00:00 + */ + closeTime?: string; + /** + * 创建时间 + */ + createTime?: string; + /** + * 优惠金额 + */ + discountPrice?: string; + /** + * 完成时间 + */ + finishTime?: string; + /** + * 订单id + */ + id?: string; + /** + * 订单编号 + */ + orderNo?: string; + /** + * 订单状态 + */ + orderStatus?: string; + /** + * 订单来源 + */ + orderTerminal?: string; + /** + * 订单类型 + */ + orderType?: string; + /** + * 支付方式 + */ + payChannel?: string; + /** + * 交易流水号 + */ + payOrderId?: string; + /** + * 订单金额 + */ + payPrice?: string; + /** + * 支付时间 + */ + payTime?: string; + /** + * 退款金额 - 必填 + */ + refundAmount?: number; + /** + * 退款方式 - 必填,示例:系统自动退款 + */ + refundMethod?: string; + /** + * 退款金额 + */ + refundPrice?: string; + /** + * 退款原因 - 必填,示例:不想要了 + */ + refundReason?: string; + /** + * 退款说明 - 必填,示例:这里是用户填写的退款描述 + */ + refundRemark?: string; + /** + * 退款状态 - 必填,示例:待审核/待退款/已退款/已拒绝 + */ + refundStatus?: string; + /** + * 退款至 - 必填,示例:原支付方式返还 + */ + refundTo?: string; + /** + * 退款类型 - 必填,示例:订单退款/差价退款/运费退款/可扩展增加 + */ + refundType?: string; + /** + * 用户ID 示例:666 + */ + userId?: number; + /** + * 用户昵称 示例:钱多多 + */ + userNickname?: string; +} + +// /** +// * CommonResultTradeOrderDetailRespVO +// */ +// export interface ApifoxModel { +// /** +// * 错误码 +// */ +// code?: number; +// /** +// * 返回数据 +// */ +// data?: TradeOrderDetailRespVO; +// /** +// * 错误提示,用户可阅读 +// */ +// msg?: string; +// } + +export const getTradeOrderPage = async (params: TradeReq) => { + return request>("/trade/order/page", { + method: "GET", + params, + }); +}; + +export const getTradeOrderDetail = async (id: number) => { + return request>("/trade/order/get-detail", { + method: "GET", + params: { id }, + }); +};