ydmyzx 5 months ago
parent
commit
15524ad29e
100 changed files with 5687 additions and 0 deletions
  1. 100 0
      build/vite/index.ts
  2. 151 0
      index.html
  3. 65 0
      src/api/ai/chat/conversation/index.ts
  4. 83 0
      src/api/ai/chat/message/index.ts
  5. 103 0
      src/api/ai/image/index.ts
  6. 44 0
      src/api/ai/model/apiKey/index.ts
  7. 53 0
      src/api/ai/model/chatModel/index.ts
  8. 80 0
      src/api/ai/model/chatRole/index.ts
  9. 41 0
      src/api/ai/music/index.ts
  10. 65 0
      src/api/ai/writer/index.ts
  11. 8 0
      src/api/bpm/activity/index.ts
  12. 43 0
      src/api/bpm/category/index.ts
  13. 22 0
      src/api/bpm/definition/index.ts
  14. 91 0
      src/api/bpm/disbursement/index.ts
  15. 56 0
      src/api/bpm/form/index.ts
  16. 28 0
      src/api/bpm/fund/index.ts
  17. 27 0
      src/api/bpm/leave/index.ts
  18. 59 0
      src/api/bpm/model/index.ts
  19. 42 0
      src/api/bpm/processExpression/index.ts
  20. 68 0
      src/api/bpm/processInstance/index.ts
  21. 40 0
      src/api/bpm/processListener/index.ts
  22. 66 0
      src/api/bpm/task/index.ts
  23. 47 0
      src/api/bpm/userGroup/index.ts
  24. 98 0
      src/api/crm/business/index.ts
  25. 68 0
      src/api/crm/business/status/index.ts
  26. 78 0
      src/api/crm/clue/index.ts
  27. 113 0
      src/api/crm/contact/index.ts
  28. 16 0
      src/api/crm/contract/config/index.ts
  29. 114 0
      src/api/crm/contract/index.ts
  30. 132 0
      src/api/crm/customer/index.ts
  31. 49 0
      src/api/crm/customer/limitConfig/index.ts
  32. 19 0
      src/api/crm/customer/poolConfig/index.ts
  33. 43 0
      src/api/crm/followup/index.ts
  34. 11 0
      src/api/crm/operateLog/index.ts
  35. 72 0
      src/api/crm/permission/index.ts
  36. 33 0
      src/api/crm/product/category/index.ts
  37. 49 0
      src/api/crm/product/index.ts
  38. 73 0
      src/api/crm/receivable/index.ts
  39. 74 0
      src/api/crm/receivable/plan/index.ts
  40. 61 0
      src/api/erp/finance/account/index.ts
  41. 61 0
      src/api/erp/finance/payment/index.ts
  42. 61 0
      src/api/erp/finance/receipt/index.ts
  43. 49 0
      src/api/erp/product/category/index.ts
  44. 57 0
      src/api/erp/product/product/index.ts
  45. 46 0
      src/api/erp/product/unit/index.ts
  46. 64 0
      src/api/erp/purchase/in/index.ts
  47. 64 0
      src/api/erp/purchase/order/index.ts
  48. 62 0
      src/api/erp/purchase/return/index.ts
  49. 58 0
      src/api/erp/purchase/supplier/index.ts
  50. 58 0
      src/api/erp/sale/customer/index.ts
  51. 64 0
      src/api/erp/sale/order/index.ts
  52. 62 0
      src/api/erp/sale/out/index.ts
  53. 62 0
      src/api/erp/sale/return/index.ts
  54. 28 0
      src/api/erp/statistics/purchase/index.ts
  55. 28 0
      src/api/erp/statistics/sale/index.ts
  56. 61 0
      src/api/erp/stock/check/index.ts
  57. 62 0
      src/api/erp/stock/in/index.ts
  58. 61 0
      src/api/erp/stock/move/index.ts
  59. 62 0
      src/api/erp/stock/out/index.ts
  60. 32 0
      src/api/erp/stock/record/index.ts
  61. 41 0
      src/api/erp/stock/stock/index.ts
  62. 64 0
      src/api/erp/stock/warehouse/index.ts
  63. 53 0
      src/api/gislayer/gisform/index.ts
  64. 50 0
      src/api/gismodel/twinmodelicon/index.ts
  65. 47 0
      src/api/gismodel/twinmodels/index.ts
  66. 34 0
      src/api/infra/apiAccessLog/index.ts
  67. 48 0
      src/api/infra/apiErrorLog/index.ts
  68. 122 0
      src/api/infra/codegen/index.ts
  69. 48 0
      src/api/infra/config/index.ts
  70. 35 0
      src/api/infra/dataSourceConfig/index.ts
  71. 40 0
      src/api/infra/demo/demo01/index.ts
  72. 37 0
      src/api/infra/demo/demo02/index.ts
  73. 91 0
      src/api/infra/demo/demo03/erp/index.ts
  74. 57 0
      src/api/infra/demo/demo03/inner/index.ts
  75. 57 0
      src/api/infra/demo/demo03/normal/index.ts
  76. 50 0
      src/api/infra/file/index.ts
  77. 61 0
      src/api/infra/fileConfig/index.ts
  78. 63 0
      src/api/infra/job/index.ts
  79. 34 0
      src/api/infra/jobLog/index.ts
  80. 8 0
      src/api/infra/redis/index.ts
  81. 45 0
      src/api/layer/formvector/index.ts
  82. 47 0
      src/api/layer/formvectorattributes/index.ts
  83. 59 0
      src/api/layer/gisname/index.ts
  84. 78 0
      src/api/layer/visualizemessage/index.ts
  85. 81 0
      src/api/login/index.ts
  86. 41 0
      src/api/login/oauth2/index.ts
  87. 37 0
      src/api/mall/market/banner/index.ts
  88. 42 0
      src/api/mall/promotion/article/index.ts
  89. 39 0
      src/api/mall/promotion/articleCategory/index.ts
  90. 35 0
      src/api/mall/promotion/kefu/conversation/index.ts
  91. 36 0
      src/api/mall/promotion/kefu/message/index.ts
  92. 75 0
      src/api/mall/trade/afterSale/index.ts
  93. 11 0
      src/api/mall/trade/brokerage/record/index.ts
  94. 39 0
      src/api/mall/trade/brokerage/user/index.ts
  95. 39 0
      src/api/mall/trade/brokerage/withdraw/index.ts
  96. 23 0
      src/api/mall/trade/config/index.ts
  97. 45 0
      src/api/mall/trade/delivery/express/index.ts
  98. 54 0
      src/api/mall/trade/delivery/expressTemplate/index.ts
  99. 46 0
      src/api/mall/trade/delivery/pickUpStore/index.ts
  100. 188 0
      src/api/mall/trade/order/index.ts

+ 100 - 0
build/vite/index.ts

@@ -0,0 +1,100 @@
+import { resolve } from 'path'
+import Vue from '@vitejs/plugin-vue'
+import VueJsx from '@vitejs/plugin-vue-jsx'
+import progress from 'vite-plugin-progress'
+import EslintPlugin from 'vite-plugin-eslint'
+import PurgeIcons from 'vite-plugin-purge-icons'
+import { ViteEjsPlugin } from 'vite-plugin-ejs'
+// @ts-ignore
+import ElementPlus from 'unplugin-element-plus/vite'
+import AutoImport from 'unplugin-auto-import/vite'
+import Components from 'unplugin-vue-components/vite'
+import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
+import viteCompression from 'vite-plugin-compression'
+import topLevelAwait from 'vite-plugin-top-level-await'
+import VueI18nPlugin from '@intlify/unplugin-vue-i18n/vite'
+import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
+import UnoCSS from 'unocss/vite'
+
+export function createVitePlugins() {
+  const root = process.cwd()
+
+  // 路径查找
+  function pathResolve(dir: string) {
+    return resolve(root, '.', dir)
+  }
+
+  return [
+    Vue(),
+    VueJsx(),
+    UnoCSS(),
+    progress(),
+    PurgeIcons(),
+    ElementPlus({}),
+    AutoImport({
+      include: [
+        /\.[tj]sx?$/, // .ts, .tsx, .js, .jsx
+        /\.vue$/,
+        /\.vue\?vue/, // .vue
+        /\.md$/ // .md
+      ],
+      imports: [
+        'vue',
+        'vue-router',
+        // 可额外添加需要 autoImport 的组件
+        {
+          '@/hooks/web/useI18n': ['useI18n'],
+          '@/hooks/web/useMessage': ['useMessage'],
+          '@/hooks/web/useTable': ['useTable'],
+          '@/hooks/web/useCrudSchemas': ['useCrudSchemas'],
+          '@/utils/formRules': ['required'],
+          '@/utils/dict': ['DICT_TYPE']
+        }
+      ],
+      dts: 'src/types/auto-imports.d.ts',
+      resolvers: [ElementPlusResolver()],
+      eslintrc: {
+        enabled: false, // Default `false`
+        filepath: './.eslintrc-auto-import.json', // Default `./.eslintrc-auto-import.json`
+        globalsPropValue: true // Default `true`, (true | false | 'readonly' | 'readable' | 'writable' | 'writeable')
+      }
+    }),
+    Components({
+      // 生成自定义 `auto-components.d.ts` 全局声明
+      dts: 'src/types/auto-components.d.ts',
+      // 自定义组件的解析器
+      resolvers: [ElementPlusResolver()],
+      globs: ["src/components/**/**.{vue, md}", '!src/components/DiyEditor/components/mobile/**']
+    }),
+    EslintPlugin({
+      cache: false,
+      include: ['src/**/*.vue', 'src/**/*.ts', 'src/**/*.tsx'] // 检查的文件
+    }),
+    VueI18nPlugin({
+      runtimeOnly: true,
+      compositionOnly: true,
+      include: [resolve(__dirname, 'src/locales/**')]
+    }),
+    createSvgIconsPlugin({
+      iconDirs: [pathResolve('src/assets/svgs')],
+      symbolId: 'icon-[dir]-[name]',
+      svgoOptions: true
+    }),
+    viteCompression({
+      verbose: true, // 是否在控制台输出压缩结果
+      disable: false, // 是否禁用
+      threshold: 10240, // 体积大于 threshold 才会被压缩,单位 b
+      algorithm: 'gzip', // 压缩算法,可选 [ 'gzip' , 'brotliCompress' ,'deflate' , 'deflateRaw']
+      ext: '.gz', // 生成的压缩包后缀
+      deleteOriginFile: false //压缩后是否删除源文件
+    }),
+    ViteEjsPlugin(),
+    topLevelAwait({
+      // https://juejin.cn/post/7152191742513512485
+      // The export name of top-level await promise for each chunk module
+      promiseExportName: '__tla',
+      // The function to generate import names of top-level await promise in each chunk module
+      promiseImportName: (i) => `__tla_${i}`
+    })
+  ]
+}

+ 151 - 0
index.html

@@ -0,0 +1,151 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <link rel="icon" href="/favicon.ico" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <meta
+      name="keywords"
+      content="芋道管理系统 基于 vue3 + CompositionAPI + typescript + vite3 + element plus 的后台开源免费管理系统!"
+    />
+    <meta
+      name="description"
+      content="芋道管理系统 基于 vue3 + CompositionAPI + typescript + vite3 + element plus 的后台开源免费管理系统!"
+    />
+    <title>%VITE_APP_TITLE%</title>
+  </head>
+  <body>
+    <div id="app">
+      <style>
+        .app-loading {
+          display: flex;
+          width: 100%;
+          height: 100%;
+          justify-content: center;
+          align-items: center;
+          flex-direction: column;
+          background: #f0f2f5;
+        }
+
+        .app-loading .app-loading-wrap {
+          position: absolute;
+          top: 50%;
+          left: 50%;
+          display: flex;
+          -webkit-transform: translate3d(-50%, -50%, 0);
+          transform: translate3d(-50%, -50%, 0);
+          justify-content: center;
+          align-items: center;
+          flex-direction: column;
+        }
+
+        .app-loading .app-loading-title {
+          margin-bottom: 30px;
+          font-size: 20px;
+          font-weight: bold;
+          text-align: center;
+        }
+
+        .app-loading .app-loading-logo {
+          width: 100px;
+          margin: 0 auto 15px auto;
+        }
+
+        .app-loading .app-loading-item {
+          position: relative;
+          display: inline-block;
+          width: 60px;
+          height: 60px;
+          vertical-align: middle;
+          border-radius: 50%;
+        }
+
+        .app-loading .app-loading-outter {
+          position: absolute;
+          width: 100%;
+          height: 100%;
+          border: 4px solid #2d8cf0;
+          border-bottom: 0;
+          border-left-color: transparent;
+          border-radius: 50%;
+          animation: loader-outter 1s cubic-bezier(0.42, 0.61, 0.58, 0.41) infinite;
+        }
+
+        .app-loading .app-loading-inner {
+          position: absolute;
+          top: calc(50% - 20px);
+          left: calc(50% - 20px);
+          width: 40px;
+          height: 40px;
+          border: 4px solid #87bdff;
+          border-right: 0;
+          border-top-color: transparent;
+          border-radius: 50%;
+          animation: loader-inner 1s cubic-bezier(0.42, 0.61, 0.58, 0.41) infinite;
+        }
+
+        @-webkit-keyframes loader-outter {
+          0% {
+            -webkit-transform: rotate(0deg);
+            transform: rotate(0deg);
+          }
+
+          100% {
+            -webkit-transform: rotate(360deg);
+            transform: rotate(360deg);
+          }
+        }
+
+        @keyframes loader-outter {
+          0% {
+            -webkit-transform: rotate(0deg);
+            transform: rotate(0deg);
+          }
+
+          100% {
+            -webkit-transform: rotate(360deg);
+            transform: rotate(360deg);
+          }
+        }
+
+        @-webkit-keyframes loader-inner {
+          0% {
+            -webkit-transform: rotate(0deg);
+            transform: rotate(0deg);
+          }
+
+          100% {
+            -webkit-transform: rotate(-360deg);
+            transform: rotate(-360deg);
+          }
+        }
+
+        @keyframes loader-inner {
+          0% {
+            -webkit-transform: rotate(0deg);
+            transform: rotate(0deg);
+          }
+
+          100% {
+            -webkit-transform: rotate(-360deg);
+            transform: rotate(-360deg);
+          }
+        }
+      </style>
+      <div class="app-loading">
+        <div class="app-loading-wrap">
+          <div class="app-loading-title">
+            <img src="/logo.png" class="app-loading-logo" alt="Logo" />
+            <div class="app-loading-title">%VITE_APP_TITLE%</div>
+          </div>
+          <div class="app-loading-item">
+            <div class="app-loading-outter"></div>
+            <div class="app-loading-inner"></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <script type="module" src="/src/main.ts"></script>
+  </body>
+</html>

+ 65 - 0
src/api/ai/chat/conversation/index.ts

@@ -0,0 +1,65 @@
+import request from '@/config/axios'
+
+// AI 聊天对话 VO
+export interface ChatConversationVO {
+  id: number // ID 编号
+  userId: number // 用户编号
+  title: string // 对话标题
+  pinned: boolean // 是否置顶
+  roleId: number // 角色编号
+  modelId: number // 模型编号
+  model: string // 模型标志
+  temperature: number // 温度参数
+  maxTokens: number // 单条回复的最大 Token 数量
+  maxContexts: number // 上下文的最大 Message 数量
+  createTime?: Date // 创建时间
+  // 额外字段
+  systemMessage?: string // 角色设定
+  modelName?: string // 模型名字
+  roleAvatar?: string // 角色头像
+  modelMaxTokens?: string // 模型的单条回复的最大 Token 数量
+  modelMaxContexts?: string // 模型的上下文的最大 Message 数量
+}
+
+// AI 聊天对话 API
+export const ChatConversationApi = {
+  // 获得【我的】聊天对话
+  getChatConversationMy: async (id: number) => {
+    return await request.get({ url: `/ai/chat/conversation/get-my?id=${id}` })
+  },
+
+  // 新增【我的】聊天对话
+  createChatConversationMy: async (data?: ChatConversationVO) => {
+    return await request.post({ url: `/ai/chat/conversation/create-my`, data })
+  },
+
+  // 更新【我的】聊天对话
+  updateChatConversationMy: async (data: ChatConversationVO) => {
+    return await request.put({ url: `/ai/chat/conversation/update-my`, data })
+  },
+
+  // 删除【我的】聊天对话
+  deleteChatConversationMy: async (id: string) => {
+    return await request.delete({ url: `/ai/chat/conversation/delete-my?id=${id}` })
+  },
+
+  // 删除【我的】所有对话,置顶除外
+  deleteChatConversationMyByUnpinned: async () => {
+    return await request.delete({ url: `/ai/chat/conversation/delete-by-unpinned` })
+  },
+
+  // 获得【我的】聊天对话列表
+  getChatConversationMyList: async () => {
+    return await request.get({ url: `/ai/chat/conversation/my-list` })
+  },
+
+  // 获得对话分页
+  getChatConversationPage: async (params: any) => {
+    return await request.get({ url: `/ai/chat/conversation/page`, params })
+  },
+
+  // 管理员删除消息
+  deleteChatConversationByAdmin: async (id: number) => {
+    return await request.delete({ url: `/ai/chat/conversation/delete-by-admin?id=${id}` })
+  }
+}

+ 83 - 0
src/api/ai/chat/message/index.ts

@@ -0,0 +1,83 @@
+import request from '@/config/axios'
+import { fetchEventSource } from '@microsoft/fetch-event-source'
+import { getAccessToken } from '@/utils/auth'
+import { config } from '@/config/axios/config'
+
+// 聊天VO
+export interface ChatMessageVO {
+  id: number // 编号
+  conversationId: number // 对话编号
+  type: string // 消息类型
+  userId: string // 用户编号
+  roleId: string // 角色编号
+  model: number // 模型标志
+  modelId: number // 模型编号
+  content: string // 聊天内容
+  tokens: number // 消耗 Token 数量
+  createTime: Date // 创建时间
+  roleAvatar: string // 角色头像
+  userAvatar: string // 创建时间
+}
+
+// AI chat 聊天
+export const ChatMessageApi = {
+  // 消息列表
+  getChatMessageListByConversationId: async (conversationId: number | null) => {
+    return await request.get({
+      url: `/ai/chat/message/list-by-conversation-id?conversationId=${conversationId}`
+    })
+  },
+
+  // 发送 Stream 消息
+  // 为什么不用 axios 呢?因为它不支持 SSE 调用
+  sendChatMessageStream: async (
+    conversationId: number,
+    content: string,
+    ctrl,
+    enableContext: boolean,
+    onMessage,
+    onError,
+    onClose
+  ) => {
+    const token = getAccessToken()
+    return fetchEventSource(`${config.base_url}/ai/chat/message/send-stream`, {
+      method: 'post',
+      headers: {
+        'Content-Type': 'application/json',
+        Authorization: `Bearer ${token}`
+      },
+      openWhenHidden: true,
+      body: JSON.stringify({
+        conversationId,
+        content,
+        useContext: enableContext
+      }),
+      onmessage: onMessage,
+      onerror: onError,
+      onclose: onClose,
+      signal: ctrl.signal
+    })
+  },
+
+  // 删除消息
+  deleteChatMessage: async (id: string) => {
+    return await request.delete({ url: `/ai/chat/message/delete?id=${id}` })
+  },
+
+  // 删除指定对话的消息
+  deleteByConversationId: async (conversationId: number) => {
+    return await request.delete({
+      url: `/ai/chat/message/delete-by-conversation-id?conversationId=${conversationId}`
+    })
+  },
+
+  // 获得消息分页
+  getChatMessagePage: async (params: any) => {
+    return await request.get({ url: '/ai/chat/message/page', params })
+  },
+
+  // 管理员删除消息
+  deleteChatMessageByAdmin: async (id: number) => {
+    return await request.delete({ url: `/ai/chat/message/delete-by-admin?id=${id}` })
+  }
+}

+ 103 - 0
src/api/ai/image/index.ts

@@ -0,0 +1,103 @@
+import request from '@/config/axios'
+
+// AI 绘图 VO
+export interface ImageVO {
+  id: number // 编号
+  platform: string // 平台
+  model: string // 模型
+  prompt: string // 提示词
+  width: number // 图片宽度
+  height: number // 图片高度
+  status: number // 状态
+  publicStatus: boolean // 公开状态
+  picUrl: string // 任务地址
+  errorMessage: string // 错误信息
+  options: any // 配置 Map<string, string>
+  taskId: number // 任务编号
+  buttons: ImageMidjourneyButtonsVO[] // mj 操作按钮
+  createTime: Date // 创建时间
+  finishTime: Date // 完成时间
+}
+
+export interface ImageDrawReqVO {
+  platform: string // 平台
+  prompt: string // 提示词
+  model: string // 模型
+  style: string // 图像生成的风格
+  width: string // 图片宽度
+  height: string // 图片高度
+  options: object // 绘制参数,Map<String, String>
+}
+
+export interface ImageMidjourneyImagineReqVO {
+  prompt: string // 提示词
+  model: string // 模型 mj nijj
+  base64Array: string[] // size不能为空
+  width: string // 图片宽度
+  height: string // 图片高度
+  version: string // 版本
+}
+
+export interface ImageMidjourneyActionVO {
+  id: number // 图片编号
+  customId: string // MJ::JOB::upsample::1::85a4b4c1-8835-46c5-a15c-aea34fad1862 动作标识
+}
+
+export interface ImageMidjourneyButtonsVO {
+  customId: string // MJ::JOB::upsample::1::85a4b4c1-8835-46c5-a15c-aea34fad1862 动作标识
+  emoji: string // 图标 emoji
+  label: string // Make Variations 文本
+  style: number // 样式: 2(Primary)、3(Green)
+}
+
+// AI 图片 API
+export const ImageApi = {
+  // 获取【我的】绘图分页
+  getImagePageMy: async (params: PageParam) => {
+    return await request.get({ url: `/ai/image/my-page`, params })
+  },
+  // 获取【我的】绘图记录
+  getImageMy: async (id: number) => {
+    return await request.get({ url: `/ai/image/get-my?id=${id}` })
+  },
+  // 获取【我的】绘图记录列表
+  getImageListMyByIds: async (ids: number[]) => {
+    return await request.get({ url: `/ai/image/my-list-by-ids`, params: { ids: ids.join(',') } })
+  },
+  // 生成图片
+  drawImage: async (data: ImageDrawReqVO) => {
+    return await request.post({ url: `/ai/image/draw`, data })
+  },
+  // 删除【我的】绘画记录
+  deleteImageMy: async (id: number) => {
+    return await request.delete({ url: `/ai/image/delete-my?id=${id}` })
+  },
+
+  // ================ midjourney 专属 ================
+
+  // 【Midjourney】生成图片
+  midjourneyImagine: async (data: ImageMidjourneyImagineReqVO) => {
+    return await request.post({ url: `/ai/image/midjourney/imagine`, data })
+  },
+  // 【Midjourney】Action 操作(二次生成图片)
+  midjourneyAction: async (data: ImageMidjourneyActionVO) => {
+    return await request.post({ url: `/ai/image/midjourney/action`, data })
+  },
+
+  // ================ 绘图管理 ================
+
+  // 查询绘画分页
+  getImagePage: async (params: any) => {
+    return await request.get({ url: `/ai/image/page`, params })
+  },
+
+  // 更新绘画发布状态
+  updateImage: async (data: any) => {
+    return await request.put({ url: '/ai/image/update-public-status', data })
+  },
+
+  // 删除绘画
+  deleteImage: async (id: number) => {
+    return await request.delete({ url: `/ai/image/delete?id=` + id })
+  }
+}

+ 44 - 0
src/api/ai/model/apiKey/index.ts

@@ -0,0 +1,44 @@
+import request from '@/config/axios'
+
+// AI API 密钥 VO
+export interface ApiKeyVO {
+  id: number // 编号
+  name: string // 名称
+  apiKey: string // 密钥
+  platform: string // 平台
+  url: string // 自定义 API 地址
+  status: number // 状态
+}
+
+// AI API 密钥 API
+export const ApiKeyApi = {
+  // 查询 API 密钥分页
+  getApiKeyPage: async (params: any) => {
+    return await request.get({ url: `/ai/api-key/page`, params })
+  },
+
+  // 获得 API 密钥列表
+  getApiKeySimpleList: async () => {
+    return await request.get({ url: `/ai/api-key/simple-list` })
+  },
+
+  // 查询 API 密钥详情
+  getApiKey: async (id: number) => {
+    return await request.get({ url: `/ai/api-key/get?id=` + id })
+  },
+
+  // 新增 API 密钥
+  createApiKey: async (data: ApiKeyVO) => {
+    return await request.post({ url: `/ai/api-key/create`, data })
+  },
+
+  // 修改 API 密钥
+  updateApiKey: async (data: ApiKeyVO) => {
+    return await request.put({ url: `/ai/api-key/update`, data })
+  },
+
+  // 删除 API 密钥
+  deleteApiKey: async (id: number) => {
+    return await request.delete({ url: `/ai/api-key/delete?id=` + id })
+  }
+}

+ 53 - 0
src/api/ai/model/chatModel/index.ts

@@ -0,0 +1,53 @@
+import request from '@/config/axios'
+
+// AI 聊天模型 VO
+export interface ChatModelVO {
+  id: number // 编号
+  keyId: number // API 秘钥编号
+  name: string // 模型名字
+  model: string // 模型标识
+  platform: string // 模型平台
+  sort: number // 排序
+  status: number // 状态
+  temperature: number // 温度参数
+  maxTokens: number // 单条回复的最大 Token 数量
+  maxContexts: number // 上下文的最大 Message 数量
+}
+
+// AI 聊天模型 API
+export const ChatModelApi = {
+  // 查询聊天模型分页
+  getChatModelPage: async (params: any) => {
+    return await request.get({ url: `/ai/chat-model/page`, params })
+  },
+
+  // 获得聊天模型列表
+  getChatModelSimpleList: async (status?: number) => {
+    return await request.get({
+      url: `/ai/chat-model/simple-list`,
+      params: {
+        status
+      }
+    })
+  },
+
+  // 查询聊天模型详情
+  getChatModel: async (id: number) => {
+    return await request.get({ url: `/ai/chat-model/get?id=` + id })
+  },
+
+  // 新增聊天模型
+  createChatModel: async (data: ChatModelVO) => {
+    return await request.post({ url: `/ai/chat-model/create`, data })
+  },
+
+  // 修改聊天模型
+  updateChatModel: async (data: ChatModelVO) => {
+    return await request.put({ url: `/ai/chat-model/update`, data })
+  },
+
+  // 删除聊天模型
+  deleteChatModel: async (id: number) => {
+    return await request.delete({ url: `/ai/chat-model/delete?id=` + id })
+  }
+}

+ 80 - 0
src/api/ai/model/chatRole/index.ts

@@ -0,0 +1,80 @@
+import request from '@/config/axios'
+
+// AI 聊天角色 VO
+export interface ChatRoleVO {
+  id: number // 角色编号
+  modelId: number // 模型编号
+  name: string // 角色名称
+  avatar: string // 角色头像
+  category: string // 角色类别
+  sort: number // 角色排序
+  description: string // 角色描述
+  systemMessage: string // 角色设定
+  welcomeMessage: string // 角色设定
+  publicStatus: boolean // 是否公开
+  status: number // 状态
+}
+
+// AI 聊天角色 分页请求 vo
+export interface ChatRolePageReqVO {
+  name?: string // 角色名称
+  category?: string // 角色类别
+  publicStatus: boolean // 是否公开
+  pageNo: number // 是否公开
+  pageSize: number // 是否公开
+}
+
+// AI 聊天角色 API
+export const ChatRoleApi = {
+  // 查询聊天角色分页
+  getChatRolePage: async (params: any) => {
+    return await request.get({ url: `/ai/chat-role/page`, params })
+  },
+
+  // 查询聊天角色详情
+  getChatRole: async (id: number) => {
+    return await request.get({ url: `/ai/chat-role/get?id=` + id })
+  },
+
+  // 新增聊天角色
+  createChatRole: async (data: ChatRoleVO) => {
+    return await request.post({ url: `/ai/chat-role/create`, data })
+  },
+
+  // 修改聊天角色
+  updateChatRole: async (data: ChatRoleVO) => {
+    return await request.put({ url: `/ai/chat-role/update`, data })
+  },
+
+  // 删除聊天角色
+  deleteChatRole: async (id: number) => {
+    return await request.delete({ url: `/ai/chat-role/delete?id=` + id })
+  },
+
+  // ======= chat 聊天
+
+  // 获取 my role
+  getMyPage: async (params: ChatRolePageReqVO) => {
+    return await request.get({ url: `/ai/chat-role/my-page`, params})
+  },
+
+  // 获取角色分类
+  getCategoryList: async () => {
+    return await request.get({ url: `/ai/chat-role/category-list`})
+  },
+
+  // 创建角色
+  createMy: async (data: ChatRoleVO) => {
+    return await request.post({ url: `/ai/chat-role/create-my`, data})
+  },
+
+  // 更新角色
+  updateMy: async (data: ChatRoleVO) => {
+    return await request.put({ url: `/ai/chat-role/update-my`, data})
+  },
+
+  // 删除角色 my
+  deleteMy: async (id: number) => {
+    return await request.delete({ url: `/ai/chat-role/delete-my?id=` + id })
+  },
+}

+ 41 - 0
src/api/ai/music/index.ts

@@ -0,0 +1,41 @@
+import request from '@/config/axios'
+
+// AI 音乐 VO
+export interface MusicVO {
+  id: number // 编号
+  userId: number // 用户编号
+  title: string // 音乐名称
+  lyric: string // 歌词
+  imageUrl: string // 图片地址
+  audioUrl: string // 音频地址
+  videoUrl: string // 视频地址
+  status: number // 音乐状态
+  gptDescriptionPrompt: string // 描述词
+  prompt: string // 提示词
+  platform: string // 模型平台
+  model: string // 模型
+  generateMode: number // 生成模式
+  tags: string // 音乐风格标签
+  duration: number // 音乐时长
+  publicStatus: boolean // 是否发布
+  taskId: string // 任务id
+  errorMessage: string // 错误信息
+}
+
+// AI 音乐 API
+export const MusicApi = {
+  // 查询音乐分页
+  getMusicPage: async (params: any) => {
+    return await request.get({ url: `/ai/music/page`, params })
+  },
+
+  // 更新音乐
+  updateMusic: async (data: any) => {
+    return await request.put({ url: '/ai/music/update', data })
+  },
+
+  // 删除音乐
+  deleteMusic: async (id: number) => {
+    return await request.delete({ url: `/ai/music/delete?id=` + id })
+  }
+}

+ 65 - 0
src/api/ai/writer/index.ts

@@ -0,0 +1,65 @@
+import { fetchEventSource } from '@microsoft/fetch-event-source'
+import request from '@/config/axios'
+
+import { getAccessToken } from '@/utils/auth'
+import { config } from '@/config/axios/config'
+import { AiWriteTypeEnum } from '@/views/ai/utils/constants'
+
+export interface WriteVO {
+  type: AiWriteTypeEnum.WRITING | AiWriteTypeEnum.REPLY // 1:撰写 2:回复
+  prompt: string // 写作内容提示 1。撰写 2回复
+  originalContent: string // 原文
+  length: number // 长度
+  format: number // 格式
+  tone: number // 语气
+  language: number // 语言
+  userId?: number // 用户编号
+  platform?: string // 平台
+  model?: string // 模型
+  generatedContent?: string // 生成的内容
+  errorMessage: string // 错误信息
+  createTime?: Date // 创建时间
+}
+
+// TODO @hhero:搞成 WriteApi,类似 ConversationApi 一样。这样更有类的概念,后续引入某个 Api,然后调用它的方法就可以了。
+export const writeStream = ({
+  data,
+  onClose,
+  onMessage,
+  onError,
+  ctrl
+}: {
+  data: WriteVO
+  onMessage?: (res: any) => void
+  onError?: (...args: any[]) => void
+  onClose?: (...args: any[]) => void
+  ctrl: AbortController
+}) => {
+  const token = getAccessToken()
+  return fetchEventSource(`${config.base_url}/ai/write/generate-stream`, {
+    method: 'post',
+    headers: {
+      'Content-Type': 'application/json',
+      Authorization: `Bearer ${token}`
+    },
+    openWhenHidden: true,
+    body: JSON.stringify(data),
+    onmessage: onMessage,
+    onerror: onError,
+    onclose: onClose,
+    signal: ctrl.signal
+  })
+}
+
+// AI 写作 API
+export const WriteApi = {
+  // 查询AI 写作分页
+  getWritePage: async (params: any) => {
+    return await request.get({ url: `/ai/write/page`, params })
+  },
+
+  // 删除AI 写作
+  deleteWrite: async (id: number) => {
+    return await request.delete({ url: `/ai/write/delete?id=` + id })
+  }
+}

+ 8 - 0
src/api/bpm/activity/index.ts

@@ -0,0 +1,8 @@
+import request from '@/config/axios'
+
+export const getActivityList = async (params) => {
+  return await request.get({
+    url: '/bpm/activity/list',
+    params
+  })
+}

+ 43 - 0
src/api/bpm/category/index.ts

@@ -0,0 +1,43 @@
+import request from '@/config/axios'
+
+// BPM 流程分类 VO
+export interface CategoryVO {
+  id: number // 分类编号
+  name: string // 分类名
+  code: string // 分类标志
+  status: number // 分类状态
+  sort: number // 分类排序
+}
+
+// BPM 流程分类 API
+export const CategoryApi = {
+  // 查询流程分类分页
+  getCategoryPage: async (params: any) => {
+    return await request.get({ url: `/bpm/category/page`, params })
+  },
+
+  // 查询流程分类列表
+  getCategorySimpleList: async () => {
+    return await request.get({ url: `/bpm/category/simple-list` })
+  },
+
+  // 查询流程分类详情
+  getCategory: async (id: number) => {
+    return await request.get({ url: `/bpm/category/get?id=` + id })
+  },
+
+  // 新增流程分类
+  createCategory: async (data: CategoryVO) => {
+    return await request.post({ url: `/bpm/category/create`, data })
+  },
+
+  // 修改流程分类
+  updateCategory: async (data: CategoryVO) => {
+    return await request.put({ url: `/bpm/category/update`, data })
+  },
+
+  // 删除流程分类
+  deleteCategory: async (id: number) => {
+    return await request.delete({ url: `/bpm/category/delete?id=` + id })
+  }
+}

+ 22 - 0
src/api/bpm/definition/index.ts

@@ -0,0 +1,22 @@
+import request from '@/config/axios'
+
+export const getProcessDefinition = async (id: number, key: string) => {
+  return await request.get({
+    url: '/bpm/process-definition/get',
+    params: { id, key }
+  })
+}
+
+export const getProcessDefinitionPage = async (params) => {
+  return await request.get({
+    url: '/bpm/process-definition/page',
+    params
+  })
+}
+
+export const getProcessDefinitionList = async (params) => {
+  return await request.get({
+    url: '/bpm/process-definition/list',
+    params
+  })
+}

+ 91 - 0
src/api/bpm/disbursement/index.ts

@@ -0,0 +1,91 @@
+import request from '@/config/axios'
+
+// 资金拨付流程表	 VO
+export interface DisbursementVO {
+  id: number // 资金拨付表单主键
+  userId: number // 申请人的用户编号
+  reason: string // 申请原因
+  processInstanceId: string // 流程实例的编号
+  file: string // 文件
+  type: number // 申请类型
+  funding: number // 申请总金额
+  status: number // 审批结果
+  specialLoansFile: string // 专项借款申请材料
+  itemName: string // 项目名称
+  itemType: number // 项目类型
+  itemBelong: number // 项目归属(上级目录)
+  itemShp: string // 项目相关shp上传(保存url,可null)
+  itemImage: string // 项目相关佐证材料(图片,如施工图)
+  fundingApplicationFile: string // 资金申请材料
+  itemDisbursementStatus: number // 项目拨付结果(状态值)
+  initialShotPosition: string // 初始镜头位置
+  projectDetails: string // 项目详情
+  projectProgress: number // 项目进度
+  projectScope: string // 项目范围
+  projectBudget: number // 项目预算
+  projectLeader: string // 项目负责人
+  startDate: Date // 项目开始时间
+  estimatedEndDate: Date // 项目预计结束时间
+  actualEndDate: Date // 项目实际结束时间
+}
+
+// 资金拨付流程表	 API
+export const DisbursementApi = {
+  // 查询资金拨付流程表	分页
+  getDisbursementPage: async (params: any) => {
+    return await request.get({ url: `/bpm/disbursement/page`, params })
+  },
+
+  // 查询资金拨付流程表	详情
+  getDisbursement: async (id: number) => {
+    return await request.get({ url: `/bpm/disbursement/get?id=` + id })
+  },
+
+  // 新增资金拨付流程表	
+  createDisbursement: async (data: DisbursementVO) => {
+    return await request.post({ url: `/bpm/disbursement/create`, data })
+  },
+
+  // 修改资金拨付流程表	
+  updateDisbursement: async (data: DisbursementVO) => {
+    return await request.put({ url: `/bpm/disbursement/update`, data })
+  },
+
+  // 删除资金拨付流程表	
+  deleteDisbursement: async (id: number) => {
+    return await request.delete({ url: `/bpm/disbursement/delete?id=` + id })
+  },
+
+  // 导出资金拨付流程表	 Excel
+  exportDisbursement: async (params) => {
+    return await request.download({ url: `/bpm/disbursement/export-excel`, params })
+  },
+
+  setAuthority: async (data: any) => {
+    return await request.post({ url: `/bpm/disbursement/set-authority`, data })
+  },
+
+  getAuthorityRole: async (id: number) => {
+    return await request.get({ url: `/bpm/disbursement/get-authority-role?id=` + id })
+  },
+
+  getAuthorityUser: async (id: number) => {
+    return await request.get({ url: `/bpm/disbursement/get-authority-user?id=` + id })
+  },
+
+  getTeamMember: async (params: any) => {
+    return await request.get({ url: `/bpm/disbursement/get-member`, params })
+  },
+  addTeamMember: async (data: any) => {
+    return await request.post({ url: `/bpm/disbursement/add-member` , data })
+  },
+  deleteTeamMember: async (id: any, userId: any) => {
+    return await request.delete({ url: `/bpm/disbursement/delete-member?id=` + id + "&userId=" + userId  })
+  },
+  // 修改资金拨付流程表
+  updateTeamMember: async (data: any) => {
+    // console.log(data)
+    return await request.put({ url: `/bpm/disbursement/update-member`, data })
+  },
+
+}

+ 56 - 0
src/api/bpm/form/index.ts

@@ -0,0 +1,56 @@
+import request from '@/config/axios'
+
+export type FormVO = {
+  id: number
+  name: string
+  conf: string
+  fields: string[]
+  status: number
+  remark: string
+  createTime: string
+}
+
+// 创建工作流的表单定义
+export const createForm = async (data: FormVO) => {
+  return await request.post({
+    url: '/bpm/form/create',
+    data: data
+  })
+}
+
+// 更新工作流的表单定义
+export const updateForm = async (data: FormVO) => {
+  return await request.put({
+    url: '/bpm/form/update',
+    data: data
+  })
+}
+
+// 删除工作流的表单定义
+export const deleteForm = async (id: number) => {
+  return await request.delete({
+    url: '/bpm/form/delete?id=' + id
+  })
+}
+
+// 获得工作流的表单定义
+export const getForm = async (id: number) => {
+  return await request.get({
+    url: '/bpm/form/get?id=' + id
+  })
+}
+
+// 获得工作流的表单定义分页
+export const getFormPage = async (params) => {
+  return await request.get({
+    url: '/bpm/form/page',
+    params
+  })
+}
+
+// 获得动态表单的精简列表
+export const getFormSimpleList = async () => {
+  return await request.get({
+    url: '/bpm/form/simple-list'
+  })
+}

+ 28 - 0
src/api/bpm/fund/index.ts

@@ -0,0 +1,28 @@
+import request from '@/config/axios'
+
+export type FundVO = {
+  id: number
+  status: number
+  type: number
+  applyAmount:number
+  reason: string
+  processInstanceId: string
+  startTime: string
+  endTime: string
+  createTime: string
+}
+
+// 创建资金申请
+export const createFundApply = async (data: FundVO) => {
+  return await request.post({ url: '/bpm/fund/apply/apply-create', data: data })
+}
+
+// 获得资金申请
+export const getFundApply = async (id: number) => {
+  return await request.get({ url: '/bpm/fund/apply/get?id=' + id })
+}
+
+// 获得资金申请分页
+export const getFundApplyPage = async (params: PageParam) => {
+  return await request.get({ url: '/bpm/fund/apply/page', params })
+}

+ 27 - 0
src/api/bpm/leave/index.ts

@@ -0,0 +1,27 @@
+import request from '@/config/axios'
+
+export type LeaveVO = {
+  id: number
+  status: number
+  type: number
+  reason: string
+  processInstanceId: string
+  startTime: string
+  endTime: string
+  createTime: string
+}
+
+// 创建请假申请
+export const createLeave = async (data: LeaveVO) => {
+  return await request.post({ url: '/bpm/oa/leave/create', data: data })
+}
+
+// 获得请假申请
+export const getLeave = async (id: number) => {
+  return await request.get({ url: '/bpm/oa/leave/get?id=' + id })
+}
+
+// 获得请假申请分页
+export const getLeavePage = async (params: PageParam) => {
+  return await request.get({ url: '/bpm/oa/leave/page', params })
+}

+ 59 - 0
src/api/bpm/model/index.ts

@@ -0,0 +1,59 @@
+import request from '@/config/axios'
+
+export type ProcessDefinitionVO = {
+  id: string
+  version: number
+  deploymentTIme: string
+  suspensionState: number
+}
+
+export type ModelVO = {
+  id: number
+  formName: string
+  key: string
+  name: string
+  description: string
+  category: string
+  formType: number
+  formId: number
+  formCustomCreatePath: string
+  formCustomViewPath: string
+  processDefinition: ProcessDefinitionVO
+  status: number
+  remark: string
+  createTime: string
+  bpmnXml: string
+}
+
+export const getModelPage = async (params) => {
+  return await request.get({ url: '/bpm/model/page', params })
+}
+
+export const getModel = async (id: number) => {
+  return await request.get({ url: '/bpm/model/get?id=' + id })
+}
+
+export const updateModel = async (data: ModelVO) => {
+  return await request.put({ url: '/bpm/model/update', data: data })
+}
+
+// 任务状态修改
+export const updateModelState = async (id: number, state: number) => {
+  const data = {
+    id: id,
+    state: state
+  }
+  return await request.put({ url: '/bpm/model/update-state', data: data })
+}
+
+export const createModel = async (data: ModelVO) => {
+  return await request.post({ url: '/bpm/model/create', data: data })
+}
+
+export const deleteModel = async (id: number) => {
+  return await request.delete({ url: '/bpm/model/delete?id=' + id })
+}
+
+export const deployModel = async (id: number) => {
+  return await request.post({ url: '/bpm/model/deploy?id=' + id })
+}

+ 42 - 0
src/api/bpm/processExpression/index.ts

@@ -0,0 +1,42 @@
+import request from '@/config/axios'
+
+// BPM 流程表达式 VO
+export interface ProcessExpressionVO {
+  id: number // 编号
+  name: string // 表达式名字
+  status: number // 表达式状态
+  expression: string // 表达式
+}
+
+// BPM 流程表达式 API
+export const ProcessExpressionApi = {
+  // 查询BPM 流程表达式分页
+  getProcessExpressionPage: async (params: any) => {
+    return await request.get({ url: `/bpm/process-expression/page`, params })
+  },
+
+  // 查询BPM 流程表达式详情
+  getProcessExpression: async (id: number) => {
+    return await request.get({ url: `/bpm/process-expression/get?id=` + id })
+  },
+
+  // 新增BPM 流程表达式
+  createProcessExpression: async (data: ProcessExpressionVO) => {
+    return await request.post({ url: `/bpm/process-expression/create`, data })
+  },
+
+  // 修改BPM 流程表达式
+  updateProcessExpression: async (data: ProcessExpressionVO) => {
+    return await request.put({ url: `/bpm/process-expression/update`, data })
+  },
+
+  // 删除BPM 流程表达式
+  deleteProcessExpression: async (id: number) => {
+    return await request.delete({ url: `/bpm/process-expression/delete?id=` + id })
+  },
+
+  // 导出BPM 流程表达式 Excel
+  exportProcessExpression: async (params) => {
+    return await request.download({ url: `/bpm/process-expression/export-excel`, params })
+  }
+}

+ 68 - 0
src/api/bpm/processInstance/index.ts

@@ -0,0 +1,68 @@
+import request from '@/config/axios'
+
+export type Task = {
+  id: string
+  name: string
+}
+
+export type ProcessInstanceVO = {
+  id: number
+  name: string
+  processDefinitionId: string
+  category: string
+  result: number
+  tasks: Task[]
+  fields: string[]
+  status: number
+  remark: string
+  businessKey: string
+  createTime: string
+  endTime: string
+}
+
+export type ProcessInstanceCopyVO = {
+  type: number
+  taskName: string
+  taskKey: string
+  processInstanceName: string
+  processInstanceKey: string
+  startUserId: string
+  options: string[]
+  reason: string
+}
+
+export const getProcessInstanceMyPage = async (params: any) => {
+  return await request.get({ url: '/bpm/process-instance/my-page', params })
+}
+
+export const getProcessInstanceManagerPage = async (params: any) => {
+  return await request.get({ url: '/bpm/process-instance/manager-page', params })
+}
+
+export const createProcessInstance = async (data) => {
+  return await request.post({ url: '/bpm/process-instance/create', data: data })
+}
+
+export const cancelProcessInstanceByStartUser = async (id: number, reason: string) => {
+  const data = {
+    id: id,
+    reason: reason
+  }
+  return await request.delete({ url: '/bpm/process-instance/cancel-by-start-user', data: data })
+}
+
+export const cancelProcessInstanceByAdmin = async (id: number, reason: string) => {
+  const data = {
+    id: id,
+    reason: reason
+  }
+  return await request.delete({ url: '/bpm/process-instance/cancel-by-admin', data: data })
+}
+
+export const getProcessInstance = async (id: string) => {
+  return await request.get({ url: '/bpm/process-instance/get?id=' + id })
+}
+
+export const getProcessInstanceCopyPage = async (params: any) => {
+  return await request.get({ url: '/bpm/process-instance/copy/page', params })
+}

+ 40 - 0
src/api/bpm/processListener/index.ts

@@ -0,0 +1,40 @@
+import request from '@/config/axios'
+
+// BPM 流程监听器 VO
+export interface ProcessListenerVO {
+  id: number // 编号
+  name: string // 监听器名字
+  type: string // 监听器类型
+  status: number // 监听器状态
+  event: string // 监听事件
+  valueType: string // 监听器值类型
+  value: string // 监听器值
+}
+
+// BPM 流程监听器 API
+export const ProcessListenerApi = {
+  // 查询流程监听器分页
+  getProcessListenerPage: async (params: any) => {
+    return await request.get({ url: `/bpm/process-listener/page`, params })
+  },
+
+  // 查询流程监听器详情
+  getProcessListener: async (id: number) => {
+    return await request.get({ url: `/bpm/process-listener/get?id=` + id })
+  },
+
+  // 新增流程监听器
+  createProcessListener: async (data: ProcessListenerVO) => {
+    return await request.post({ url: `/bpm/process-listener/create`, data })
+  },
+
+  // 修改流程监听器
+  updateProcessListener: async (data: ProcessListenerVO) => {
+    return await request.put({ url: `/bpm/process-listener/update`, data })
+  },
+
+  // 删除流程监听器
+  deleteProcessListener: async (id: number) => {
+    return await request.delete({ url: `/bpm/process-listener/delete?id=` + id })
+  }
+}

+ 66 - 0
src/api/bpm/task/index.ts

@@ -0,0 +1,66 @@
+import request from '@/config/axios'
+
+export type TaskVO = {
+  id: number
+}
+
+export const getTaskTodoPage = async (params: any) => {
+  return await request.get({ url: '/bpm/task/todo-page', params })
+}
+
+export const getTaskDonePage = async (params: any) => {
+  return await request.get({ url: '/bpm/task/done-page', params })
+}
+
+export const getTaskManagerPage = async (params: any) => {
+  return await request.get({ url: '/bpm/task/manager-page', params })
+}
+
+export const approveTask = async (data: any) => {
+  return await request.put({ url: '/bpm/task/approve', data })
+}
+
+export const rejectTask = async (data: any) => {
+  return await request.put({ url: '/bpm/task/reject', data })
+}
+
+export const getTaskListByProcessInstanceId = async (processInstanceId: string) => {
+  return await request.get({
+    url: '/bpm/task/list-by-process-instance-id?processInstanceId=' + processInstanceId
+  })
+}
+
+// 获取所有可回退的节点
+export const getTaskListByReturn = async (id: string) => {
+  return await request.get({ url: '/bpm/task/list-by-return', params: { id } })
+}
+
+// 回退
+export const returnTask = async (data: any) => {
+  return await request.put({ url: '/bpm/task/return', data })
+}
+
+// 委派
+export const delegateTask = async (data: any) => {
+  return await request.put({ url: '/bpm/task/delegate', data })
+}
+
+// 转派
+export const transferTask = async (data: any) => {
+  return await request.put({ url: '/bpm/task/transfer', data })
+}
+
+// 加签
+export const signCreateTask = async (data: any) => {
+  return await request.put({ url: '/bpm/task/create-sign', data })
+}
+
+// 减签
+export const signDeleteTask = async (data: any) => {
+  return await request.delete({ url: '/bpm/task/delete-sign', data })
+}
+
+// 获取减签任务列表
+export const getChildrenTaskList = async (id: string) => {
+  return await request.get({ url: '/bpm/task/list-by-parent-task-id?parentTaskId=' + id })
+}

+ 47 - 0
src/api/bpm/userGroup/index.ts

@@ -0,0 +1,47 @@
+import request from '@/config/axios'
+
+export type UserGroupVO = {
+  id: number
+  name: string
+  description: string
+  userIds: number[]
+  status: number
+  remark: string
+  createTime: string
+}
+
+// 创建用户组
+export const createUserGroup = async (data: UserGroupVO) => {
+  return await request.post({
+    url: '/bpm/user-group/create',
+    data: data
+  })
+}
+
+// 更新用户组
+export const updateUserGroup = async (data: UserGroupVO) => {
+  return await request.put({
+    url: '/bpm/user-group/update',
+    data: data
+  })
+}
+
+// 删除用户组
+export const deleteUserGroup = async (id: number) => {
+  return await request.delete({ url: '/bpm/user-group/delete?id=' + id })
+}
+
+// 获得用户组
+export const getUserGroup = async (id: number) => {
+  return await request.get({ url: '/bpm/user-group/get?id=' + id })
+}
+
+// 获得用户组分页
+export const getUserGroupPage = async (params) => {
+  return await request.get({ url: '/bpm/user-group/page', params })
+}
+
+// 获取用户组精简信息列表
+export const getUserGroupSimpleList = async (): Promise<UserGroupVO[]> => {
+  return await request.get({ url: '/bpm/user-group/simple-list' })
+}

+ 98 - 0
src/api/crm/business/index.ts

@@ -0,0 +1,98 @@
+import request from '@/config/axios'
+import { TransferReqVO } from '@/api/crm/permission'
+
+export interface BusinessVO {
+  id: number
+  name: string
+  customerId: number
+  customerName?: string
+  followUpStatus: boolean
+  contactLastTime: Date
+  contactNextTime: Date
+  ownerUserId: number
+  ownerUserName?: string // 负责人的用户名称
+  ownerUserDept?: string // 负责人的部门名称
+  statusTypeId: number
+  statusTypeName?: string
+  statusId: number
+  statusName?: string
+  endStatus: number
+  endRemark: string
+  dealTime: Date
+  totalProductPrice: number
+  totalPrice: number
+  discountPercent: number
+  remark: string
+  creator: string // 创建人
+  creatorName?: string // 创建人名称
+  createTime: Date // 创建时间
+  updateTime: Date // 更新时间
+  products?: [
+    {
+      id: number
+      productId: number
+      productName: string
+      productNo: string
+      productUnit: number
+      productPrice: number
+      businessPrice: number
+      count: number
+      totalPrice: number
+    }
+  ]
+}
+
+// 查询 CRM 商机列表
+export const getBusinessPage = async (params) => {
+  return await request.get({ url: `/crm/business/page`, params })
+}
+
+// 查询 CRM 商机列表,基于指定客户
+export const getBusinessPageByCustomer = async (params) => {
+  return await request.get({ url: `/crm/business/page-by-customer`, params })
+}
+
+// 查询 CRM 商机详情
+export const getBusiness = async (id: number) => {
+  return await request.get({ url: `/crm/business/get?id=` + id })
+}
+
+// 获得 CRM 商机列表(精简)
+export const getSimpleBusinessList = async () => {
+  return await request.get({ url: `/crm/business/simple-all-list` })
+}
+
+// 新增 CRM 商机
+export const createBusiness = async (data: BusinessVO) => {
+  return await request.post({ url: `/crm/business/create`, data })
+}
+
+// 修改 CRM 商机
+export const updateBusiness = async (data: BusinessVO) => {
+  return await request.put({ url: `/crm/business/update`, data })
+}
+
+// 修改 CRM 商机状态
+export const updateBusinessStatus = async (data: BusinessVO) => {
+  return await request.put({ url: `/crm/business/update-status`, data })
+}
+
+// 删除 CRM 商机
+export const deleteBusiness = async (id: number) => {
+  return await request.delete({ url: `/crm/business/delete?id=` + id })
+}
+
+// 导出 CRM 商机 Excel
+export const exportBusiness = async (params) => {
+  return await request.download({ url: `/crm/business/export-excel`, params })
+}
+
+// 联系人关联商机列表
+export const getBusinessPageByContact = async (params) => {
+  return await request.get({ url: `/crm/business/page-by-contact`, params })
+}
+
+// 商机转移
+export const transferBusiness = async (data: TransferReqVO) => {
+  return await request.put({ url: '/crm/business/transfer', data })
+}

+ 68 - 0
src/api/crm/business/status/index.ts

@@ -0,0 +1,68 @@
+import request from '@/config/axios'
+
+export interface BusinessStatusTypeVO {
+  id: number
+  name: string
+  deptIds: number[]
+  statuses?: {
+    id: number
+    name: string
+    percent: number
+  }
+}
+
+export const DEFAULT_STATUSES = [
+  {
+    endStatus: 1,
+    key: '结束',
+    name: '赢单',
+    percent: 100
+  },
+  {
+    endStatus: 2,
+    key: '结束',
+    name: '输单',
+    percent: 0
+  },
+  {
+    endStatus: 3,
+    key: '结束',
+    name: '无效',
+    percent: 0
+  }
+]
+
+// 查询商机状态组列表
+export const getBusinessStatusPage = async (params: any) => {
+  return await request.get({ url: `/crm/business-status/page`, params })
+}
+
+// 新增商机状态组
+export const createBusinessStatus = async (data: BusinessStatusTypeVO) => {
+  return await request.post({ url: `/crm/business-status/create`, data })
+}
+
+// 修改商机状态组
+export const updateBusinessStatus = async (data: BusinessStatusTypeVO) => {
+  return await request.put({ url: `/crm/business-status/update`, data })
+}
+
+// 查询商机状态类型详情
+export const getBusinessStatus = async (id: number) => {
+  return await request.get({ url: `/crm/business-status/get?id=` + id })
+}
+
+// 删除商机状态
+export const deleteBusinessStatus = async (id: number) => {
+  return await request.delete({ url: `/crm/business-status/delete?id=` + id })
+}
+
+// 获得商机状态组列表
+export const getBusinessStatusTypeSimpleList = async () => {
+  return await request.get({ url: `/crm/business-status/type-simple-list` })
+}
+
+// 获得商机阶段列表
+export const getBusinessStatusSimpleList = async (typeId: number) => {
+  return await request.get({ url: `/crm/business-status/status-simple-list`, params: { typeId } })
+}

+ 78 - 0
src/api/crm/clue/index.ts

@@ -0,0 +1,78 @@
+import request from '@/config/axios'
+import { TransferReqVO } from '@/api/crm/permission'
+
+export interface ClueVO {
+  id: number // 编号
+  name: string // 线索名称
+  followUpStatus: boolean // 跟进状态
+  contactLastTime: Date // 最后跟进时间
+  contactLastContent: string // 最后跟进内容
+  contactNextTime: Date // 下次联系时间
+  ownerUserId: number // 负责人的用户编号
+  ownerUserName?: string // 负责人的用户名称
+  ownerUserDept?: string // 负责人的部门名称
+  transformStatus: boolean // 转化状态
+  customerId: number // 客户编号
+  customerName?: string // 客户名称
+  mobile: string // 手机号
+  telephone: string // 电话
+  qq: string // QQ
+  wechat: string // wechat
+  email: string // email
+  areaId: number // 所在地
+  areaName?: string // 所在地名称
+  detailAddress: string // 详细地址
+  industryId: number // 所属行业
+  level: number // 客户等级
+  source: number // 客户来源
+  remark: string // 备注
+  creator: string // 创建人
+  creatorName?: string // 创建人名称
+  createTime: Date // 创建时间
+  updateTime: Date // 更新时间
+}
+
+// 查询线索列表
+export const getCluePage = async (params: any) => {
+  return await request.get({ url: `/crm/clue/page`, params })
+}
+
+// 查询线索详情
+export const getClue = async (id: number) => {
+  return await request.get({ url: `/crm/clue/get?id=` + id })
+}
+
+// 新增线索
+export const createClue = async (data: ClueVO) => {
+  return await request.post({ url: `/crm/clue/create`, data })
+}
+
+// 修改线索
+export const updateClue = async (data: ClueVO) => {
+  return await request.put({ url: `/crm/clue/update`, data })
+}
+
+// 删除线索
+export const deleteClue = async (id: number) => {
+  return await request.delete({ url: `/crm/clue/delete?id=` + id })
+}
+
+// 导出线索 Excel
+export const exportClue = async (params) => {
+  return await request.download({ url: `/crm/clue/export-excel`, params })
+}
+
+// 线索转移
+export const transferClue = async (data: TransferReqVO) => {
+  return await request.put({ url: '/crm/clue/transfer', data })
+}
+
+// 线索转化为客户
+export const transformClue = async (id: number) => {
+  return await request.put({ url: '/crm/clue/transform', params: { id } })
+}
+
+// 获得分配给我的、待跟进的线索数量
+export const getFollowClueCount = async () => {
+  return await request.get({ url: '/crm/clue/follow-count' })
+}

+ 113 - 0
src/api/crm/contact/index.ts

@@ -0,0 +1,113 @@
+import request from '@/config/axios'
+import { TransferReqVO } from '@/api/crm/permission'
+
+export interface ContactVO {
+  id: number // 编号
+  name: string // 联系人名称
+  customerId: number // 客户编号
+  customerName?: string // 客户名称
+  contactLastTime: Date // 最后跟进时间
+  contactLastContent: string // 最后跟进内容
+  contactNextTime: Date // 下次联系时间
+  ownerUserId: number // 负责人的用户编号
+  ownerUserName?: string // 负责人的用户名称
+  ownerUserDept?: string // 负责人的部门名称
+  mobile: string // 手机号
+  telephone: string // 电话
+  qq: string // QQ
+  wechat: string // wechat
+  email: string // email
+  areaId: number // 所在地
+  areaName?: string // 所在地名称
+  detailAddress: string // 详细地址
+  sex: number // 性别
+  master: boolean // 是否主联系人
+  post: string // 职务
+  parentId: number // 上级联系人编号
+  parentName?: string // 上级联系人名称
+  remark: string // 备注
+  creator: string // 创建人
+  creatorName?: string // 创建人名称
+  createTime: Date // 创建时间
+  updateTime: Date // 更新时间
+}
+
+export interface ContactBusinessReqVO {
+  contactId: number
+  businessIds: number[]
+}
+
+export interface ContactBusiness2ReqVO {
+  businessId: number
+  contactIds: number[]
+}
+
+// 查询 CRM 联系人列表
+export const getContactPage = async (params) => {
+  return await request.get({ url: `/crm/contact/page`, params })
+}
+
+// 查询 CRM 联系人列表,基于指定客户
+export const getContactPageByCustomer = async (params: any) => {
+  return await request.get({ url: `/crm/contact/page-by-customer`, params })
+}
+
+// 查询 CRM 联系人列表,基于指定商机
+export const getContactPageByBusiness = async (params: any) => {
+  return await request.get({ url: `/crm/contact/page-by-business`, params })
+}
+
+// 查询 CRM 联系人详情
+export const getContact = async (id: number) => {
+  return await request.get({ url: `/crm/contact/get?id=` + id })
+}
+
+// 新增 CRM 联系人
+export const createContact = async (data: ContactVO) => {
+  return await request.post({ url: `/crm/contact/create`, data })
+}
+
+// 修改 CRM 联系人
+export const updateContact = async (data: ContactVO) => {
+  return await request.put({ url: `/crm/contact/update`, data })
+}
+
+// 删除 CRM 联系人
+export const deleteContact = async (id: number) => {
+  return await request.delete({ url: `/crm/contact/delete?id=` + id })
+}
+
+// 导出 CRM 联系人 Excel
+export const exportContact = async (params) => {
+  return await request.download({ url: `/crm/contact/export-excel`, params })
+}
+
+// 获得 CRM 联系人列表(精简)
+export const getSimpleContactList = async () => {
+  return await request.get({ url: `/crm/contact/simple-all-list` })
+}
+
+// 批量新增联系人商机关联
+export const createContactBusinessList = async (data: ContactBusinessReqVO) => {
+  return await request.post({ url: `/crm/contact/create-business-list`, data })
+}
+
+// 批量新增联系人商机关联
+export const createContactBusinessList2 = async (data: ContactBusiness2ReqVO) => {
+  return await request.post({ url: `/crm/contact/create-business-list2`, data })
+}
+
+// 解除联系人商机关联
+export const deleteContactBusinessList = async (data: ContactBusinessReqVO) => {
+  return await request.delete({ url: `/crm/contact/delete-business-list`, data })
+}
+
+// 解除联系人商机关联
+export const deleteContactBusinessList2 = async (data: ContactBusiness2ReqVO) => {
+  return await request.delete({ url: `/crm/contact/delete-business-list2`, data })
+}
+
+// 联系人转移
+export const transferContact = async (data: TransferReqVO) => {
+  return await request.put({ url: '/crm/contact/transfer', data })
+}

+ 16 - 0
src/api/crm/contract/config/index.ts

@@ -0,0 +1,16 @@
+import request from '@/config/axios'
+
+export interface ContractConfigVO {
+  notifyEnabled?: boolean
+  notifyDays?: number
+}
+
+// 获取合同配置
+export const getContractConfig = async () => {
+  return await request.get({ url: `/crm/contract-config/get` })
+}
+
+// 更新合同配置
+export const saveContractConfig = async (data: ContractConfigVO) => {
+  return await request.put({ url: `/crm/contract-config/save`, data })
+}

+ 114 - 0
src/api/crm/contract/index.ts

@@ -0,0 +1,114 @@
+import request from '@/config/axios'
+import { TransferReqVO } from '@/api/crm/permission'
+
+export interface ContractVO {
+  id: number
+  name: string
+  no: string
+  customerId: number
+  customerName?: string
+  businessId: number
+  businessName: string
+  contactLastTime: Date
+  ownerUserId: number
+  ownerUserName?: string
+  ownerUserDeptName?: string
+  processInstanceId: number
+  auditStatus: number
+  orderDate: Date
+  startTime: Date
+  endTime: Date
+  totalProductPrice: number
+  discountPercent: number
+  totalPrice: number
+  totalReceivablePrice: number
+  signContactId: number
+  signContactName?: string
+  signUserId: number
+  signUserName: string
+  remark: string
+  createTime?: Date
+  creator: string
+  creatorName: string
+  updateTime?: Date
+  products?: [
+    {
+      id: number
+      productId: number
+      productName: string
+      productNo: string
+      productUnit: number
+      productPrice: number
+      contractPrice: number
+      count: number
+      totalPrice: number
+    }
+  ]
+}
+
+// 查询 CRM 合同列表
+export const getContractPage = async (params) => {
+  return await request.get({ url: `/crm/contract/page`, params })
+}
+
+// 查询 CRM 联系人列表,基于指定客户
+export const getContractPageByCustomer = async (params: any) => {
+  return await request.get({ url: `/crm/contract/page-by-customer`, params })
+}
+
+// 查询 CRM 联系人列表,基于指定商机
+export const getContractPageByBusiness = async (params: any) => {
+  return await request.get({ url: `/crm/contract/page-by-business`, params })
+}
+
+// 查询 CRM 合同详情
+export const getContract = async (id: number) => {
+  return await request.get({ url: `/crm/contract/get?id=` + id })
+}
+
+// 查询 CRM 合同下拉列表
+export const getContractSimpleList = async (customerId: number) => {
+  return await request.get({
+    url: `/crm/contract/simple-list?customerId=${customerId}`
+  })
+}
+
+// 新增 CRM 合同
+export const createContract = async (data: ContractVO) => {
+  return await request.post({ url: `/crm/contract/create`, data })
+}
+
+// 修改 CRM 合同
+export const updateContract = async (data: ContractVO) => {
+  return await request.put({ url: `/crm/contract/update`, data })
+}
+
+// 删除 CRM 合同
+export const deleteContract = async (id: number) => {
+  return await request.delete({ url: `/crm/contract/delete?id=` + id })
+}
+
+// 导出 CRM 合同 Excel
+export const exportContract = async (params) => {
+  return await request.download({ url: `/crm/contract/export-excel`, params })
+}
+
+// 提交审核
+export const submitContract = async (id: number) => {
+  return await request.put({ url: `/crm/contract/submit?id=${id}` })
+}
+
+// 合同转移
+export const transferContract = async (data: TransferReqVO) => {
+  return await request.put({ url: '/crm/contract/transfer', data })
+}
+
+// 获得待审核合同数量
+export const getAuditContractCount = async () => {
+  return await request.get({ url: '/crm/contract/audit-count' })
+}
+
+// 获得即将到期(提醒)的合同数量
+export const getRemindContractCount = async () => {
+  return await request.get({ url: '/crm/contract/remind-count' })
+}

+ 132 - 0
src/api/crm/customer/index.ts

@@ -0,0 +1,132 @@
+import request from '@/config/axios'
+import { TransferReqVO } from '@/api/crm/permission'
+
+export interface CustomerVO {
+  id: number // 编号
+  name: string // 客户名称
+  followUpStatus: boolean // 跟进状态
+  contactLastTime: Date // 最后跟进时间
+  contactLastContent: string // 最后跟进内容
+  contactNextTime: Date // 下次联系时间
+  ownerUserId: number // 负责人的用户编号
+  ownerUserName?: string // 负责人的用户名称
+  ownerUserDept?: string // 负责人的部门名称
+  lockStatus?: boolean
+  dealStatus?: boolean
+  mobile: string // 手机号
+  telephone: string // 电话
+  qq: string // QQ
+  wechat: string // wechat
+  email: string // email
+  areaId: number // 所在地
+  areaName?: string // 所在地名称
+  detailAddress: string // 详细地址
+  industryId: number // 所属行业
+  level: number // 客户等级
+  source: number // 客户来源
+  remark: string // 备注
+  creator: string // 创建人
+  creatorName?: string // 创建人名称
+  createTime: Date // 创建时间
+  updateTime: Date // 更新时间
+}
+
+// 查询客户列表
+export const getCustomerPage = async (params) => {
+  return await request.get({ url: `/crm/customer/page`, params })
+}
+
+// 进入公海客户提醒的客户列表
+export const getPutPoolRemindCustomerPage = async (params) => {
+  return await request.get({ url: `/crm/customer/put-pool-remind-page`, params })
+}
+
+// 获得待进入公海客户数量
+export const getPutPoolRemindCustomerCount = async () => {
+  return await request.get({ url: `/crm/customer/put-pool-remind-count` })
+}
+
+// 获得今日需联系客户数量
+export const getTodayContactCustomerCount = async () => {
+  return await request.get({ url: `/crm/customer/today-contact-count` })
+}
+
+// 获得分配给我、待跟进的线索数量的客户数量
+export const getFollowCustomerCount = async () => {
+  return await request.get({ url: `/crm/customer/follow-count` })
+}
+
+// 查询客户详情
+export const getCustomer = async (id: number) => {
+  return await request.get({ url: `/crm/customer/get?id=` + id })
+}
+
+// 新增客户
+export const createCustomer = async (data: CustomerVO) => {
+  return await request.post({ url: `/crm/customer/create`, data })
+}
+
+// 修改客户
+export const updateCustomer = async (data: CustomerVO) => {
+  return await request.put({ url: `/crm/customer/update`, data })
+}
+
+// 更新客户的成交状态
+export const updateCustomerDealStatus = async (id: number, dealStatus: boolean) => {
+  return await request.put({ url: `/crm/customer/update-deal-status`, params: { id, dealStatus } })
+}
+
+// 删除客户
+export const deleteCustomer = async (id: number) => {
+  return await request.delete({ url: `/crm/customer/delete?id=` + id })
+}
+
+// 导出客户 Excel
+export const exportCustomer = async (params: any) => {
+  return await request.download({ url: `/crm/customer/export-excel`, params })
+}
+
+// 下载客户导入模板
+export const importCustomerTemplate = () => {
+  return request.download({ url: '/crm/customer/get-import-template' })
+}
+
+// 导入客户
+export const handleImport = async (formData) => {
+  return await request.upload({ url: `/crm/customer/import`, data: formData })
+}
+
+// 客户列表
+export const getCustomerSimpleList = async () => {
+  return await request.get({ url: `/crm/customer/simple-list` })
+}
+
+// ======================= 业务操作 =======================
+
+// 客户转移
+export const transferCustomer = async (data: TransferReqVO) => {
+  return await request.put({ url: '/crm/customer/transfer', data })
+}
+
+// 锁定/解锁客户
+export const lockCustomer = async (id: number, lockStatus: boolean) => {
+  return await request.put({ url: `/crm/customer/lock`, data: { id, lockStatus } })
+}
+
+// 领取公海客户
+export const receiveCustomer = async (ids: any[]) => {
+  return await request.put({ url: '/crm/customer/receive', params: { ids: ids.join(',') } })
+}
+
+// 分配公海给对应负责人
+export const distributeCustomer = async (ids: any[], ownerUserId: number) => {
+  return await request.put({
+    url: '/crm/customer/distribute',
+    data: { ids: ids, ownerUserId }
+  })
+}
+
+// 客户放入公海
+export const putCustomerPool = async (id: number) => {
+  return await request.put({ url: `/crm/customer/put-pool?id=${id}` })
+}

+ 49 - 0
src/api/crm/customer/limitConfig/index.ts

@@ -0,0 +1,49 @@
+import request from '@/config/axios'
+
+export interface CustomerLimitConfigVO {
+  id?: number
+  type?: number
+  userIds?: string
+  deptIds?: string
+  maxCount?: number
+  dealCountEnabled?: boolean
+}
+
+/**
+ * 客户限制配置类型
+ */
+export enum LimitConfType {
+  /**
+   * 拥有客户数限制
+   */
+  CUSTOMER_QUANTITY_LIMIT = 1,
+  /**
+   * 锁定客户数限制
+   */
+  CUSTOMER_LOCK_LIMIT = 2
+}
+
+// 查询客户限制配置列表
+export const getCustomerLimitConfigPage = async (params) => {
+  return await request.get({ url: `/crm/customer-limit-config/page`, params })
+}
+
+// 查询客户限制配置详情
+export const getCustomerLimitConfig = async (id: number) => {
+  return await request.get({ url: `/crm/customer-limit-config/get?id=` + id })
+}
+
+// 新增客户限制配置
+export const createCustomerLimitConfig = async (data: CustomerLimitConfigVO) => {
+  return await request.post({ url: `/crm/customer-limit-config/create`, data })
+}
+
+// 修改客户限制配置
+export const updateCustomerLimitConfig = async (data: CustomerLimitConfigVO) => {
+  return await request.put({ url: `/crm/customer-limit-config/update`, data })
+}
+
+// 删除客户限制配置
+export const deleteCustomerLimitConfig = async (id: number) => {
+  return await request.delete({ url: `/crm/customer-limit-config/delete?id=` + id })
+}

+ 19 - 0
src/api/crm/customer/poolConfig/index.ts

@@ -0,0 +1,19 @@
+import request from '@/config/axios'
+
+export interface CustomerPoolConfigVO {
+  enabled?: boolean
+  contactExpireDays?: number
+  dealExpireDays?: number
+  notifyEnabled?: boolean
+  notifyDays?: number
+}
+
+// 获取客户公海规则设置
+export const getCustomerPoolConfig = async () => {
+  return await request.get({ url: `/crm/customer-pool-config/get` })
+}
+
+// 更新客户公海规则设置
+export const saveCustomerPoolConfig = async (data: CustomerPoolConfigVO) => {
+  return await request.put({ url: `/crm/customer-pool-config/save`, data })
+}

+ 43 - 0
src/api/crm/followup/index.ts

@@ -0,0 +1,43 @@
+import request from '@/config/axios'
+
+// 跟进记录 VO
+export interface FollowUpRecordVO {
+  id: number // 编号
+  bizType: number // 数据类型
+  bizId: number // 数据编号
+  type: number // 跟进类型
+  content: string // 跟进内容
+  picUrls: string[] // 图片
+  fileUrls: string[] // 附件
+  nextTime: Date // 下次联系时间
+  businessIds: number[] // 关联的商机编号数组
+  businesses: {
+    id: number
+    name: string
+  }[] // 关联的商机数组
+  contactIds: number[] // 关联的联系人编号数组
+  contacts: {
+    id: number
+    name: string
+  }[] // 关联的联系人数组
+  creator: string
+  creatorName?: string
+}
+
+// 跟进记录 API
+export const FollowUpRecordApi = {
+  // 查询跟进记录分页
+  getFollowUpRecordPage: async (params: any) => {
+    return await request.get({ url: `/crm/follow-up-record/page`, params })
+  },
+
+  // 新增跟进记录
+  createFollowUpRecord: async (data: FollowUpRecordVO) => {
+    return await request.post({ url: `/crm/follow-up-record/create`, data })
+  },
+
+  // 删除跟进记录
+  deleteFollowUpRecord: async (id: number) => {
+    return await request.delete({ url: `/crm/follow-up-record/delete?id=` + id })
+  }
+}

+ 11 - 0
src/api/crm/operateLog/index.ts

@@ -0,0 +1,11 @@
+import request from '@/config/axios'
+
+export interface OperateLogVO extends PageParam {
+  bizType: number
+  bizId: number
+}
+
+// 获得操作日志
+export const getOperateLogPage = async (params: OperateLogVO) => {
+  return await request.get({ url: `/crm/operate-log/page`, params })
+}

+ 72 - 0
src/api/crm/permission/index.ts

@@ -0,0 +1,72 @@
+import request from '@/config/axios'
+
+export interface PermissionVO {
+  id?: number // 数据权限编号
+  userId: number // 用户编号
+  bizType: number // Crm 类型
+  bizId: number // Crm 类型数据编号
+  level: number // 权限级别
+  toBizTypes?: number[] // 同时添加至
+  deptName?: string // 部门名称
+  nickname?: string // 用户昵称
+  postNames?: string[] // 岗位名称数组
+  createTime?: Date
+  ids?: number[]
+}
+
+export interface TransferReqVO {
+  id: number // 模块编号
+  newOwnerUserId: number // 新负责人的用户编号
+  oldOwnerPermissionLevel?: number // 老负责人加入团队后的权限级别
+  toBizTypes?: number[] // 转移客户时,需要额外有【联系人】【商机】【合同】的 checkbox 选择
+}
+
+/**
+ * CRM 业务类型枚举
+ *
+ * @author HUIHUI
+ */
+export enum BizTypeEnum {
+  CRM_CLUE = 1, // 线索
+  CRM_CUSTOMER = 2, // 客户
+  CRM_CONTACT = 3, // 联系人
+  CRM_BUSINESS = 4, // 商机
+  CRM_CONTRACT = 5, // 合同
+  CRM_PRODUCT = 6, // 产品
+  CRM_RECEIVABLE = 7, // 回款
+  CRM_RECEIVABLE_PLAN = 8 // 回款计划
+}
+
+/**
+ * CRM 数据权限级别枚举
+ */
+export enum PermissionLevelEnum {
+  OWNER = 1, // 负责人
+  READ = 2, // 只读
+  WRITE = 3 // 读写
+}
+
+// 获得数据权限列表(查询团队成员列表)
+export const getPermissionList = async (params) => {
+  return await request.get({ url: `/crm/permission/list`, params })
+}
+
+// 创建数据权限(新增团队成员)
+export const createPermission = async (data: PermissionVO) => {
+  return await request.post({ url: `/crm/permission/create`, data })
+}
+
+// 编辑数据权限(修改团队成员权限级别)
+export const updatePermission = async (data) => {
+  return await request.put({ url: `/crm/permission/update`, data })
+}
+
+// 删除数据权限(删除团队成员)
+export const deletePermissionBatch = async (val: number[]) => {
+  return await request.delete({ url: '/crm/permission/delete?ids=' + val.join(',') })
+}
+
+// 删除自己的数据权限(退出团队)
+export const deleteSelfPermission = async (id: number) => {
+  return await request.delete({ url: '/crm/permission/delete-self?id=' + id })
+}

+ 33 - 0
src/api/crm/product/category/index.ts

@@ -0,0 +1,33 @@
+import request from '@/config/axios'
+
+// TODO @zange:挪到 product 下,建个 category 包,挪进去哈;
+export interface ProductCategoryVO {
+  id: number
+  name: string
+  parentId: number
+}
+
+// 查询产品分类详情
+export const getProductCategory = async (id: number) => {
+  return await request.get({ url: `/crm/product-category/get?id=` + id })
+}
+
+// 新增产品分类
+export const createProductCategory = async (data: ProductCategoryVO) => {
+  return await request.post({ url: `/crm/product-category/create`, data })
+}
+
+// 修改产品分类
+export const updateProductCategory = async (data: ProductCategoryVO) => {
+  return await request.put({ url: `/crm/product-category/update`, data })
+}
+
+// 删除产品分类
+export const deleteProductCategory = async (id: number) => {
+  return await request.delete({ url: `/crm/product-category/delete?id=` + id })
+}
+
+// 产品分类列表
+export const getProductCategoryList = async (params) => {
+  return await request.get({ url: `/crm/product-category/list`, params })
+}

+ 49 - 0
src/api/crm/product/index.ts

@@ -0,0 +1,49 @@
+import request from '@/config/axios'
+
+export interface ProductVO {
+  id: number
+  name: string
+  no: string
+  unit: number
+  price: number
+  status: number
+  categoryId: number
+  categoryName?: string
+  description: string
+  ownerUserId: number
+}
+
+// 查询产品列表
+export const getProductPage = async (params) => {
+  return await request.get({ url: `/crm/product/page`, params })
+}
+
+// 获得产品精简列表
+export const getProductSimpleList = async () => {
+  return await request.get({ url: `/crm/product/simple-list` })
+}
+
+// 查询产品详情
+export const getProduct = async (id: number) => {
+  return await request.get({ url: `/crm/product/get?id=` + id })
+}
+
+// 新增产品
+export const createProduct = async (data: ProductVO) => {
+  return await request.post({ url: `/crm/product/create`, data })
+}
+
+// 修改产品
+export const updateProduct = async (data: ProductVO) => {
+  return await request.put({ url: `/crm/product/update`, data })
+}
+
+// 删除产品
+export const deleteProduct = async (id: number) => {
+  return await request.delete({ url: `/crm/product/delete?id=` + id })
+}
+
+// 导出产品 Excel
+export const exportProduct = async (params) => {
+  return await request.download({ url: `/crm/product/export-excel`, params })
+}

+ 73 - 0
src/api/crm/receivable/index.ts

@@ -0,0 +1,73 @@
+import request from '@/config/axios'
+
+export interface ReceivableVO {
+  id: number
+  no: string
+  planId?: number
+  customerId?: number
+  customerName?: string
+  contractId?: number
+  contract?: {
+    id?: number
+    name?: string
+    no: string
+    totalPrice: number
+  }
+  auditStatus: number
+  processInstanceId: number
+  returnTime: Date
+  returnType: number
+  price: number
+  ownerUserId: number
+  ownerUserName?: string
+  remark: string
+  creator: string // 创建人
+  creatorName?: string // 创建人名称
+  createTime: Date // 创建时间
+  updateTime: Date // 更新时间
+}
+
+// 查询回款列表
+export const getReceivablePage = async (params) => {
+  return await request.get({ url: `/crm/receivable/page`, params })
+}
+
+// 查询回款列表
+export const getReceivablePageByCustomer = async (params) => {
+  return await request.get({ url: `/crm/receivable/page-by-customer`, params })
+}
+
+// 查询回款详情
+export const getReceivable = async (id: number) => {
+  return await request.get({ url: `/crm/receivable/get?id=` + id })
+}
+
+// 新增回款
+export const createReceivable = async (data: ReceivableVO) => {
+  return await request.post({ url: `/crm/receivable/create`, data })
+}
+
+// 修改回款
+export const updateReceivable = async (data: ReceivableVO) => {
+  return await request.put({ url: `/crm/receivable/update`, data })
+}
+
+// 删除回款
+export const deleteReceivable = async (id: number) => {
+  return await request.delete({ url: `/crm/receivable/delete?id=` + id })
+}
+
+// 导出回款 Excel
+export const exportReceivable = async (params) => {
+  return await request.download({ url: `/crm/receivable/export-excel`, params })
+}
+
+// 提交审核
+export const submitReceivable = async (id: number) => {
+  return await request.put({ url: `/crm/receivable/submit?id=${id}` })
+}
+
+// 获得待审核回款数量
+export const getAuditReceivableCount = async () => {
+  return await request.get({ url: '/crm/receivable/audit-count' })
+}

+ 74 - 0
src/api/crm/receivable/plan/index.ts

@@ -0,0 +1,74 @@
+import request from '@/config/axios'
+
+export interface ReceivablePlanVO {
+  id: number
+  period: number
+  receivableId: number
+  price: number
+  returnTime: Date
+  remindDays: number
+  returnType: number
+  remindTime: Date
+  customerId: number
+  customerName?: string
+  contractId?: number
+  contractNo?: string
+  ownerUserId: number
+  ownerUserName?: string
+  remark: string
+  creator: string // 创建人
+  creatorName?: string // 创建人名称
+  createTime: Date // 创建时间
+  updateTime: Date // 更新时间
+  receivable?: {
+    price: number
+    returnTime: Date
+  }
+}
+
+// 查询回款计划列表
+export const getReceivablePlanPage = async (params) => {
+  return await request.get({ url: `/crm/receivable-plan/page`, params })
+}
+
+// 查询回款计划列表
+export const getReceivablePlanPageByCustomer = async (params) => {
+  return await request.get({ url: `/crm/receivable-plan/page-by-customer`, params })
+}
+
+// 查询回款计划详情
+export const getReceivablePlan = async (id: number) => {
+  return await request.get({ url: `/crm/receivable-plan/get?id=` + id })
+}
+
+// 查询回款计划下拉数据
+export const getReceivablePlanSimpleList = async (customerId: number, contractId: number) => {
+  return await request.get({
+    url: `/crm/receivable-plan/simple-list?customerId=${customerId}&contractId=${contractId}`
+  })
+}
+
+// 新增回款计划
+export const createReceivablePlan = async (data: ReceivablePlanVO) => {
+  return await request.post({ url: `/crm/receivable-plan/create`, data })
+}
+
+// 修改回款计划
+export const updateReceivablePlan = async (data: ReceivablePlanVO) => {
+  return await request.put({ url: `/crm/receivable-plan/update`, data })
+}
+
+// 删除回款计划
+export const deleteReceivablePlan = async (id: number) => {
+  return await request.delete({ url: `/crm/receivable-plan/delete?id=` + id })
+}
+
+// 导出回款计划 Excel
+export const exportReceivablePlan = async (params) => {
+  return await request.download({ url: `/crm/receivable-plan/export-excel`, params })
+}
+
+// 获得待回款提醒数量
+export const getReceivablePlanRemindCount = async () => {
+  return await request.get({ url: '/crm/receivable-plan/remind-count' })
+}

+ 61 - 0
src/api/erp/finance/account/index.ts

@@ -0,0 +1,61 @@
+import request from '@/config/axios'
+
+// ERP 结算账户 VO
+export interface AccountVO {
+  id: number // 结算账户编号
+  no: string // 账户编码
+  remark: string // 备注
+  status: number // 开启状态
+  sort: number // 排序
+  defaultStatus: boolean // 是否默认
+  name: string // 账户名称
+}
+
+// ERP 结算账户 API
+export const AccountApi = {
+  // 查询结算账户分页
+  getAccountPage: async (params: any) => {
+    return await request.get({ url: `/erp/account/page`, params })
+  },
+
+  // 查询结算账户精简列表
+  getAccountSimpleList: async () => {
+    return await request.get({ url: `/erp/account/simple-list` })
+  },
+
+  // 查询结算账户详情
+  getAccount: async (id: number) => {
+    return await request.get({ url: `/erp/account/get?id=` + id })
+  },
+
+  // 新增结算账户
+  createAccount: async (data: AccountVO) => {
+    return await request.post({ url: `/erp/account/create`, data })
+  },
+
+  // 修改结算账户
+  updateAccount: async (data: AccountVO) => {
+    return await request.put({ url: `/erp/account/update`, data })
+  },
+
+  // 修改结算账户默认状态
+  updateAccountDefaultStatus: async (id: number, defaultStatus: boolean) => {
+    return await request.put({
+      url: `/erp/account/update-default-status`,
+      params: {
+        id,
+        defaultStatus
+      }
+    })
+  },
+
+  // 删除结算账户
+  deleteAccount: async (id: number) => {
+    return await request.delete({ url: `/erp/account/delete?id=` + id })
+  },
+
+  // 导出结算账户 Excel
+  exportAccount: async (params: any) => {
+    return await request.download({ url: `/erp/account/export-excel`, params })
+  }
+}

+ 61 - 0
src/api/erp/finance/payment/index.ts

@@ -0,0 +1,61 @@
+import request from '@/config/axios'
+
+// ERP 付款单 VO
+export interface FinancePaymentVO {
+  id: number // 付款单编号
+  no: string // 付款单号
+  supplierId: number // 供应商编号
+  paymentTime: Date // 付款时间
+  totalPrice: number // 合计金额,单位:元
+  status: number // 状态
+  remark: string // 备注
+}
+
+// ERP 付款单 API
+export const FinancePaymentApi = {
+  // 查询付款单分页
+  getFinancePaymentPage: async (params: any) => {
+    return await request.get({ url: `/erp/finance-payment/page`, params })
+  },
+
+  // 查询付款单详情
+  getFinancePayment: async (id: number) => {
+    return await request.get({ url: `/erp/finance-payment/get?id=` + id })
+  },
+
+  // 新增付款单
+  createFinancePayment: async (data: FinancePaymentVO) => {
+    return await request.post({ url: `/erp/finance-payment/create`, data })
+  },
+
+  // 修改付款单
+  updateFinancePayment: async (data: FinancePaymentVO) => {
+    return await request.put({ url: `/erp/finance-payment/update`, data })
+  },
+
+  // 更新付款单的状态
+  updateFinancePaymentStatus: async (id: number, status: number) => {
+    return await request.put({
+      url: `/erp/finance-payment/update-status`,
+      params: {
+        id,
+        status
+      }
+    })
+  },
+
+  // 删除付款单
+  deleteFinancePayment: async (ids: number[]) => {
+    return await request.delete({
+      url: `/erp/finance-payment/delete`,
+      params: {
+        ids: ids.join(',')
+      }
+    })
+  },
+
+  // 导出付款单 Excel
+  exportFinancePayment: async (params: any) => {
+    return await request.download({ url: `/erp/finance-payment/export-excel`, params })
+  }
+}

+ 61 - 0
src/api/erp/finance/receipt/index.ts

@@ -0,0 +1,61 @@
+import request from '@/config/axios'
+
+// ERP 收款单 VO
+export interface FinanceReceiptVO {
+  id: number // 收款单编号
+  no: string // 收款单号
+  customerId: number // 客户编号
+  receiptTime: Date // 收款时间
+  totalPrice: number // 合计金额,单位:元
+  status: number // 状态
+  remark: string // 备注
+}
+
+// ERP 收款单 API
+export const FinanceReceiptApi = {
+  // 查询收款单分页
+  getFinanceReceiptPage: async (params: any) => {
+    return await request.get({ url: `/erp/finance-receipt/page`, params })
+  },
+
+  // 查询收款单详情
+  getFinanceReceipt: async (id: number) => {
+    return await request.get({ url: `/erp/finance-receipt/get?id=` + id })
+  },
+
+  // 新增收款单
+  createFinanceReceipt: async (data: FinanceReceiptVO) => {
+    return await request.post({ url: `/erp/finance-receipt/create`, data })
+  },
+
+  // 修改收款单
+  updateFinanceReceipt: async (data: FinanceReceiptVO) => {
+    return await request.put({ url: `/erp/finance-receipt/update`, data })
+  },
+
+  // 更新收款单的状态
+  updateFinanceReceiptStatus: async (id: number, status: number) => {
+    return await request.put({
+      url: `/erp/finance-receipt/update-status`,
+      params: {
+        id,
+        status
+      }
+    })
+  },
+
+  // 删除收款单
+  deleteFinanceReceipt: async (ids: number[]) => {
+    return await request.delete({
+      url: `/erp/finance-receipt/delete`,
+      params: {
+        ids: ids.join(',')
+      }
+    })
+  },
+
+  // 导出收款单 Excel
+  exportFinanceReceipt: async (params: any) => {
+    return await request.download({ url: `/erp/finance-receipt/export-excel`, params })
+  }
+}

+ 49 - 0
src/api/erp/product/category/index.ts

@@ -0,0 +1,49 @@
+import request from '@/config/axios'
+
+// ERP 产品分类 VO
+export interface ProductCategoryVO {
+  id: number // 分类编号
+  parentId: number // 父分类编号
+  name: string // 分类名称
+  code: string // 分类编码
+  sort: number // 分类排序
+  status: number // 开启状态
+}
+
+// ERP 产品分类 API
+export const ProductCategoryApi = {
+  // 查询产品分类列表
+  getProductCategoryList: async () => {
+    return await request.get({ url: `/erp/product-category/list` })
+  },
+
+  // 查询产品分类精简列表
+  getProductCategorySimpleList: async () => {
+    return await request.get({ url: `/erp/product-category/simple-list` })
+  },
+
+  // 查询产品分类详情
+  getProductCategory: async (id: number) => {
+    return await request.get({ url: `/erp/product-category/get?id=` + id })
+  },
+
+  // 新增产品分类
+  createProductCategory: async (data: ProductCategoryVO) => {
+    return await request.post({ url: `/erp/product-category/create`, data })
+  },
+
+  // 修改产品分类
+  updateProductCategory: async (data: ProductCategoryVO) => {
+    return await request.put({ url: `/erp/product-category/update`, data })
+  },
+
+  // 删除产品分类
+  deleteProductCategory: async (id: number) => {
+    return await request.delete({ url: `/erp/product-category/delete?id=` + id })
+  },
+
+  // 导出产品分类 Excel
+  exportProductCategory: async (params) => {
+    return await request.download({ url: `/erp/product-category/export-excel`, params })
+  }
+}

+ 57 - 0
src/api/erp/product/product/index.ts

@@ -0,0 +1,57 @@
+import request from '@/config/axios'
+
+// ERP 产品 VO
+export interface ProductVO {
+  id: number // 产品编号
+  name: string // 产品名称
+  barCode: string // 产品条码
+  categoryId: number // 产品类型编号
+  unitId: number // 单位编号
+  unitName?: string // 单位名字
+  status: number // 产品状态
+  standard: string // 产品规格
+  remark: string // 产品备注
+  expiryDay: number // 保质期天数
+  weight: number // 重量(kg)
+  purchasePrice: number // 采购价格,单位:元
+  salePrice: number // 销售价格,单位:元
+  minPrice: number // 最低价格,单位:元
+}
+
+// ERP 产品 API
+export const ProductApi = {
+  // 查询产品分页
+  getProductPage: async (params: any) => {
+    return await request.get({ url: `/erp/product/page`, params })
+  },
+
+  // 查询产品精简列表
+  getProductSimpleList: async () => {
+    return await request.get({ url: `/erp/product/simple-list` })
+  },
+
+  // 查询产品详情
+  getProduct: async (id: number) => {
+    return await request.get({ url: `/erp/product/get?id=` + id })
+  },
+
+  // 新增产品
+  createProduct: async (data: ProductVO) => {
+    return await request.post({ url: `/erp/product/create`, data })
+  },
+
+  // 修改产品
+  updateProduct: async (data: ProductVO) => {
+    return await request.put({ url: `/erp/product/update`, data })
+  },
+
+  // 删除产品
+  deleteProduct: async (id: number) => {
+    return await request.delete({ url: `/erp/product/delete?id=` + id })
+  },
+
+  // 导出产品 Excel
+  exportProduct: async (params) => {
+    return await request.download({ url: `/erp/product/export-excel`, params })
+  }
+}

+ 46 - 0
src/api/erp/product/unit/index.ts

@@ -0,0 +1,46 @@
+import request from '@/config/axios'
+
+// ERP 产品单位 VO
+export interface ProductUnitVO {
+  id: number // 单位编号
+  name: string // 单位名字
+  status: number // 单位状态
+}
+
+// ERP 产品单位 API
+export const ProductUnitApi = {
+  // 查询产品单位分页
+  getProductUnitPage: async (params: any) => {
+    return await request.get({ url: `/erp/product-unit/page`, params })
+  },
+
+  // 查询产品单位精简列表
+  getProductUnitSimpleList: async () => {
+    return await request.get({ url: `/erp/product-unit/simple-list` })
+  },
+
+  // 查询产品单位详情
+  getProductUnit: async (id: number) => {
+    return await request.get({ url: `/erp/product-unit/get?id=` + id })
+  },
+
+  // 新增产品单位
+  createProductUnit: async (data: ProductUnitVO) => {
+    return await request.post({ url: `/erp/product-unit/create`, data })
+  },
+
+  // 修改产品单位
+  updateProductUnit: async (data: ProductUnitVO) => {
+    return await request.put({ url: `/erp/product-unit/update`, data })
+  },
+
+  // 删除产品单位
+  deleteProductUnit: async (id: number) => {
+    return await request.delete({ url: `/erp/product-unit/delete?id=` + id })
+  },
+
+  // 导出产品单位 Excel
+  exportProductUnit: async (params) => {
+    return await request.download({ url: `/erp/product-unit/export-excel`, params })
+  }
+}

+ 64 - 0
src/api/erp/purchase/in/index.ts

@@ -0,0 +1,64 @@
+import request from '@/config/axios'
+
+// ERP 采购入库 VO
+export interface PurchaseInVO {
+  id: number // 入库工单编号
+  no: string // 采购入库号
+  customerId: number // 客户编号
+  inTime: Date // 入库时间
+  totalCount: number // 合计数量
+  totalPrice: number // 合计金额,单位:元
+  status: number // 状态
+  remark: string // 备注
+  outCount: number // 采购出库数量
+  returnCount: number // 采购退货数量
+}
+
+// ERP 采购入库 API
+export const PurchaseInApi = {
+  // 查询采购入库分页
+  getPurchaseInPage: async (params: any) => {
+    return await request.get({ url: `/erp/purchase-in/page`, params })
+  },
+
+  // 查询采购入库详情
+  getPurchaseIn: async (id: number) => {
+    return await request.get({ url: `/erp/purchase-in/get?id=` + id })
+  },
+
+  // 新增采购入库
+  createPurchaseIn: async (data: PurchaseInVO) => {
+    return await request.post({ url: `/erp/purchase-in/create`, data })
+  },
+
+  // 修改采购入库
+  updatePurchaseIn: async (data: PurchaseInVO) => {
+    return await request.put({ url: `/erp/purchase-in/update`, data })
+  },
+
+  // 更新采购入库的状态
+  updatePurchaseInStatus: async (id: number, status: number) => {
+    return await request.put({
+      url: `/erp/purchase-in/update-status`,
+      params: {
+        id,
+        status
+      }
+    })
+  },
+
+  // 删除采购入库
+  deletePurchaseIn: async (ids: number[]) => {
+    return await request.delete({
+      url: `/erp/purchase-in/delete`,
+      params: {
+        ids: ids.join(',')
+      }
+    })
+  },
+
+  // 导出采购入库 Excel
+  exportPurchaseIn: async (params: any) => {
+    return await request.download({ url: `/erp/purchase-in/export-excel`, params })
+  }
+}

+ 64 - 0
src/api/erp/purchase/order/index.ts

@@ -0,0 +1,64 @@
+import request from '@/config/axios'
+
+// ERP 采购订单 VO
+export interface PurchaseOrderVO {
+  id: number // 订单工单编号
+  no: string // 采购订单号
+  customerId: number // 客户编号
+  orderTime: Date // 订单时间
+  totalCount: number // 合计数量
+  totalPrice: number // 合计金额,单位:元
+  status: number // 状态
+  remark: string // 备注
+  outCount: number // 采购出库数量
+  returnCount: number // 采购退货数量
+}
+
+// ERP 采购订单 API
+export const PurchaseOrderApi = {
+  // 查询采购订单分页
+  getPurchaseOrderPage: async (params: any) => {
+    return await request.get({ url: `/erp/purchase-order/page`, params })
+  },
+
+  // 查询采购订单详情
+  getPurchaseOrder: async (id: number) => {
+    return await request.get({ url: `/erp/purchase-order/get?id=` + id })
+  },
+
+  // 新增采购订单
+  createPurchaseOrder: async (data: PurchaseOrderVO) => {
+    return await request.post({ url: `/erp/purchase-order/create`, data })
+  },
+
+  // 修改采购订单
+  updatePurchaseOrder: async (data: PurchaseOrderVO) => {
+    return await request.put({ url: `/erp/purchase-order/update`, data })
+  },
+
+  // 更新采购订单的状态
+  updatePurchaseOrderStatus: async (id: number, status: number) => {
+    return await request.put({
+      url: `/erp/purchase-order/update-status`,
+      params: {
+        id,
+        status
+      }
+    })
+  },
+
+  // 删除采购订单
+  deletePurchaseOrder: async (ids: number[]) => {
+    return await request.delete({
+      url: `/erp/purchase-order/delete`,
+      params: {
+        ids: ids.join(',')
+      }
+    })
+  },
+
+  // 导出采购订单 Excel
+  exportPurchaseOrder: async (params: any) => {
+    return await request.download({ url: `/erp/purchase-order/export-excel`, params })
+  }
+}

+ 62 - 0
src/api/erp/purchase/return/index.ts

@@ -0,0 +1,62 @@
+import request from '@/config/axios'
+
+// ERP 采购退货 VO
+export interface PurchaseReturnVO {
+  id: number // 采购退货编号
+  no: string // 采购退货号
+  customerId: number // 客户编号
+  returnTime: Date // 退货时间
+  totalCount: number // 合计数量
+  totalPrice: number // 合计金额,单位:元
+  status: number // 状态
+  remark: string // 备注
+}
+
+// ERP 采购退货 API
+export const PurchaseReturnApi = {
+  // 查询采购退货分页
+  getPurchaseReturnPage: async (params: any) => {
+    return await request.get({ url: `/erp/purchase-return/page`, params })
+  },
+
+  // 查询采购退货详情
+  getPurchaseReturn: async (id: number) => {
+    return await request.get({ url: `/erp/purchase-return/get?id=` + id })
+  },
+
+  // 新增采购退货
+  createPurchaseReturn: async (data: PurchaseReturnVO) => {
+    return await request.post({ url: `/erp/purchase-return/create`, data })
+  },
+
+  // 修改采购退货
+  updatePurchaseReturn: async (data: PurchaseReturnVO) => {
+    return await request.put({ url: `/erp/purchase-return/update`, data })
+  },
+
+  // 更新采购退货的状态
+  updatePurchaseReturnStatus: async (id: number, status: number) => {
+    return await request.put({
+      url: `/erp/purchase-return/update-status`,
+      params: {
+        id,
+        status
+      }
+    })
+  },
+
+  // 删除采购退货
+  deletePurchaseReturn: async (ids: number[]) => {
+    return await request.delete({
+      url: `/erp/purchase-return/delete`,
+      params: {
+        ids: ids.join(',')
+      }
+    })
+  },
+
+  // 导出采购退货 Excel
+  exportPurchaseReturn: async (params: any) => {
+    return await request.download({ url: `/erp/purchase-return/export-excel`, params })
+  }
+}

+ 58 - 0
src/api/erp/purchase/supplier/index.ts

@@ -0,0 +1,58 @@
+import request from '@/config/axios'
+
+// ERP 供应商 VO
+export interface SupplierVO {
+  id: number // 供应商编号
+  name: string // 供应商名称
+  contact: string // 联系人
+  mobile: string // 手机号码
+  telephone: string // 联系电话
+  email: string // 电子邮箱
+  fax: string // 传真
+  remark: string // 备注
+  status: number // 开启状态
+  sort: number // 排序
+  taxNo: string // 纳税人识别号
+  taxPercent: number // 税率
+  bankName: string // 开户行
+  bankAccount: string // 开户账号
+  bankAddress: string // 开户地址
+}
+
+// ERP 供应商 API
+export const SupplierApi = {
+  // 查询供应商分页
+  getSupplierPage: async (params: any) => {
+    return await request.get({ url: `/erp/supplier/page`, params })
+  },
+
+  // 获得供应商精简列表
+  getSupplierSimpleList: async () => {
+    return await request.get({ url: `/erp/supplier/simple-list` })
+  },
+
+  // 查询供应商详情
+  getSupplier: async (id: number) => {
+    return await request.get({ url: `/erp/supplier/get?id=` + id })
+  },
+
+  // 新增供应商
+  createSupplier: async (data: SupplierVO) => {
+    return await request.post({ url: `/erp/supplier/create`, data })
+  },
+
+  // 修改供应商
+  updateSupplier: async (data: SupplierVO) => {
+    return await request.put({ url: `/erp/supplier/update`, data })
+  },
+
+  // 删除供应商
+  deleteSupplier: async (id: number) => {
+    return await request.delete({ url: `/erp/supplier/delete?id=` + id })
+  },
+
+  // 导出供应商 Excel
+  exportSupplier: async (params) => {
+    return await request.download({ url: `/erp/supplier/export-excel`, params })
+  }
+}

+ 58 - 0
src/api/erp/sale/customer/index.ts

@@ -0,0 +1,58 @@
+import request from '@/config/axios'
+
+// ERP 客户 VO
+export interface CustomerVO {
+  id: number // 客户编号
+  name: string // 客户名称
+  contact: string // 联系人
+  mobile: string // 手机号码
+  telephone: string // 联系电话
+  email: string // 电子邮箱
+  fax: string // 传真
+  remark: string // 备注
+  status: number // 开启状态
+  sort: number // 排序
+  taxNo: string // 纳税人识别号
+  taxPercent: number // 税率
+  bankName: string // 开户行
+  bankAccount: string // 开户账号
+  bankAddress: string // 开户地址
+}
+
+// ERP 客户 API
+export const CustomerApi = {
+  // 查询客户分页
+  getCustomerPage: async (params: any) => {
+    return await request.get({ url: `/erp/customer/page`, params })
+  },
+
+  // 查询客户精简列表
+  getCustomerSimpleList: async () => {
+    return await request.get({ url: `/erp/customer/simple-list` })
+  },
+
+  // 查询客户详情
+  getCustomer: async (id: number) => {
+    return await request.get({ url: `/erp/customer/get?id=` + id })
+  },
+
+  // 新增客户
+  createCustomer: async (data: CustomerVO) => {
+    return await request.post({ url: `/erp/customer/create`, data })
+  },
+
+  // 修改客户
+  updateCustomer: async (data: CustomerVO) => {
+    return await request.put({ url: `/erp/customer/update`, data })
+  },
+
+  // 删除客户
+  deleteCustomer: async (id: number) => {
+    return await request.delete({ url: `/erp/customer/delete?id=` + id })
+  },
+
+  // 导出客户 Excel
+  exportCustomer: async (params) => {
+    return await request.download({ url: `/erp/customer/export-excel`, params })
+  }
+}

+ 64 - 0
src/api/erp/sale/order/index.ts

@@ -0,0 +1,64 @@
+import request from '@/config/axios'
+
+// ERP 销售订单 VO
+export interface SaleOrderVO {
+  id: number // 订单工单编号
+  no: string // 销售订单号
+  customerId: number // 客户编号
+  orderTime: Date // 订单时间
+  totalCount: number // 合计数量
+  totalPrice: number // 合计金额,单位:元
+  status: number // 状态
+  remark: string // 备注
+  outCount: number // 销售出库数量
+  returnCount: number // 销售退货数量
+}
+
+// ERP 销售订单 API
+export const SaleOrderApi = {
+  // 查询销售订单分页
+  getSaleOrderPage: async (params: any) => {
+    return await request.get({ url: `/erp/sale-order/page`, params })
+  },
+
+  // 查询销售订单详情
+  getSaleOrder: async (id: number) => {
+    return await request.get({ url: `/erp/sale-order/get?id=` + id })
+  },
+
+  // 新增销售订单
+  createSaleOrder: async (data: SaleOrderVO) => {
+    return await request.post({ url: `/erp/sale-order/create`, data })
+  },
+
+  // 修改销售订单
+  updateSaleOrder: async (data: SaleOrderVO) => {
+    return await request.put({ url: `/erp/sale-order/update`, data })
+  },
+
+  // 更新销售订单的状态
+  updateSaleOrderStatus: async (id: number, status: number) => {
+    return await request.put({
+      url: `/erp/sale-order/update-status`,
+      params: {
+        id,
+        status
+      }
+    })
+  },
+
+  // 删除销售订单
+  deleteSaleOrder: async (ids: number[]) => {
+    return await request.delete({
+      url: `/erp/sale-order/delete`,
+      params: {
+        ids: ids.join(',')
+      }
+    })
+  },
+
+  // 导出销售订单 Excel
+  exportSaleOrder: async (params: any) => {
+    return await request.download({ url: `/erp/sale-order/export-excel`, params })
+  }
+}

+ 62 - 0
src/api/erp/sale/out/index.ts

@@ -0,0 +1,62 @@
+import request from '@/config/axios'
+
+// ERP 销售出库 VO
+export interface SaleOutVO {
+  id: number // 销售出库编号
+  no: string // 销售出库号
+  customerId: number // 客户编号
+  outTime: Date // 出库时间
+  totalCount: number // 合计数量
+  totalPrice: number // 合计金额,单位:元
+  status: number // 状态
+  remark: string // 备注
+}
+
+// ERP 销售出库 API
+export const SaleOutApi = {
+  // 查询销售出库分页
+  getSaleOutPage: async (params: any) => {
+    return await request.get({ url: `/erp/sale-out/page`, params })
+  },
+
+  // 查询销售出库详情
+  getSaleOut: async (id: number) => {
+    return await request.get({ url: `/erp/sale-out/get?id=` + id })
+  },
+
+  // 新增销售出库
+  createSaleOut: async (data: SaleOutVO) => {
+    return await request.post({ url: `/erp/sale-out/create`, data })
+  },
+
+  // 修改销售出库
+  updateSaleOut: async (data: SaleOutVO) => {
+    return await request.put({ url: `/erp/sale-out/update`, data })
+  },
+
+  // 更新销售出库的状态
+  updateSaleOutStatus: async (id: number, status: number) => {
+    return await request.put({
+      url: `/erp/sale-out/update-status`,
+      params: {
+        id,
+        status
+      }
+    })
+  },
+
+  // 删除销售出库
+  deleteSaleOut: async (ids: number[]) => {
+    return await request.delete({
+      url: `/erp/sale-out/delete`,
+      params: {
+        ids: ids.join(',')
+      }
+    })
+  },
+
+  // 导出销售出库 Excel
+  exportSaleOut: async (params: any) => {
+    return await request.download({ url: `/erp/sale-out/export-excel`, params })
+  }
+}

+ 62 - 0
src/api/erp/sale/return/index.ts

@@ -0,0 +1,62 @@
+import request from '@/config/axios'
+
+// ERP 销售退货 VO
+export interface SaleReturnVO {
+  id: number // 销售退货编号
+  no: string // 销售退货号
+  customerId: number // 客户编号
+  returnTime: Date // 退货时间
+  totalCount: number // 合计数量
+  totalPrice: number // 合计金额,单位:元
+  status: number // 状态
+  remark: string // 备注
+}
+
+// ERP 销售退货 API
+export const SaleReturnApi = {
+  // 查询销售退货分页
+  getSaleReturnPage: async (params: any) => {
+    return await request.get({ url: `/erp/sale-return/page`, params })
+  },
+
+  // 查询销售退货详情
+  getSaleReturn: async (id: number) => {
+    return await request.get({ url: `/erp/sale-return/get?id=` + id })
+  },
+
+  // 新增销售退货
+  createSaleReturn: async (data: SaleReturnVO) => {
+    return await request.post({ url: `/erp/sale-return/create`, data })
+  },
+
+  // 修改销售退货
+  updateSaleReturn: async (data: SaleReturnVO) => {
+    return await request.put({ url: `/erp/sale-return/update`, data })
+  },
+
+  // 更新销售退货的状态
+  updateSaleReturnStatus: async (id: number, status: number) => {
+    return await request.put({
+      url: `/erp/sale-return/update-status`,
+      params: {
+        id,
+        status
+      }
+    })
+  },
+
+  // 删除销售退货
+  deleteSaleReturn: async (ids: number[]) => {
+    return await request.delete({
+      url: `/erp/sale-return/delete`,
+      params: {
+        ids: ids.join(',')
+      }
+    })
+  },
+
+  // 导出销售退货 Excel
+  exportSaleReturn: async (params: any) => {
+    return await request.download({ url: `/erp/sale-return/export-excel`, params })
+  }
+}

+ 28 - 0
src/api/erp/statistics/purchase/index.ts

@@ -0,0 +1,28 @@
+import request from '@/config/axios'
+
+// ERP 采购全局统计 VO
+export interface ErpPurchaseSummaryRespVO {
+  todayPrice: number // 今日采购金额
+  yesterdayPrice: number // 昨日采购金额
+  monthPrice: number // 本月采购金额
+  yearPrice: number // 今年采购金额
+}
+
+// ERP 采购时间段统计 VO
+export interface ErpPurchaseTimeSummaryRespVO {
+  time: string // 时间
+  price: number // 采购金额
+}
+
+// ERP 采购统计 API
+export const PurchaseStatisticsApi = {
+  // 获得采购统计
+  getPurchaseSummary: async (): Promise<ErpPurchaseSummaryRespVO> => {
+    return await request.get({ url: `/erp/purchase-statistics/summary` })
+  },
+
+  // 获得采购时间段统计
+  getPurchaseTimeSummary: async (): Promise<ErpPurchaseTimeSummaryRespVO[]> => {
+    return await request.get({ url: `/erp/purchase-statistics/time-summary` })
+  }
+}

+ 28 - 0
src/api/erp/statistics/sale/index.ts

@@ -0,0 +1,28 @@
+import request from '@/config/axios'
+
+// ERP 销售全局统计 VO
+export interface ErpSaleSummaryRespVO {
+  todayPrice: number // 今日销售金额
+  yesterdayPrice: number // 昨日销售金额
+  monthPrice: number // 本月销售金额
+  yearPrice: number // 今年销售金额
+}
+
+// ERP 销售时间段统计 VO
+export interface ErpSaleTimeSummaryRespVO {
+  time: string // 时间
+  price: number // 销售金额
+}
+
+// ERP 销售统计 API
+export const SaleStatisticsApi = {
+  // 获得销售统计
+  getSaleSummary: async (): Promise<ErpSaleSummaryRespVO> => {
+    return await request.get({ url: `/erp/sale-statistics/summary` })
+  },
+
+  // 获得销售时间段统计
+  getSaleTimeSummary: async (): Promise<ErpSaleTimeSummaryRespVO[]> => {
+    return await request.get({ url: `/erp/sale-statistics/time-summary` })
+  }
+}

+ 61 - 0
src/api/erp/stock/check/index.ts

@@ -0,0 +1,61 @@
+import request from '@/config/axios'
+
+// ERP 库存盘点单 VO
+export interface StockCheckVO {
+  id: number // 出库编号
+  no: string // 出库单号
+  outTime: Date // 出库时间
+  totalCount: number // 合计数量
+  totalPrice: number // 合计金额,单位:元
+  status: number // 状态
+  remark: string // 备注
+}
+
+// ERP 库存盘点单 API
+export const StockCheckApi = {
+  // 查询库存盘点单分页
+  getStockCheckPage: async (params: any) => {
+    return await request.get({ url: `/erp/stock-check/page`, params })
+  },
+
+  // 查询库存盘点单详情
+  getStockCheck: async (id: number) => {
+    return await request.get({ url: `/erp/stock-check/get?id=` + id })
+  },
+
+  // 新增库存盘点单
+  createStockCheck: async (data: StockCheckVO) => {
+    return await request.post({ url: `/erp/stock-check/create`, data })
+  },
+
+  // 修改库存盘点单
+  updateStockCheck: async (data: StockCheckVO) => {
+    return await request.put({ url: `/erp/stock-check/update`, data })
+  },
+
+  // 更新库存盘点单的状态
+  updateStockCheckStatus: async (id: number, status: number) => {
+    return await request.put({
+      url: `/erp/stock-check/update-status`,
+      params: {
+        id,
+        status
+      }
+    })
+  },
+
+  // 删除库存盘点单
+  deleteStockCheck: async (ids: number[]) => {
+    return await request.delete({
+      url: `/erp/stock-check/delete`,
+      params: {
+        ids: ids.join(',')
+      }
+    })
+  },
+
+  // 导出库存盘点单 Excel
+  exportStockCheck: async (params) => {
+    return await request.download({ url: `/erp/stock-check/export-excel`, params })
+  }
+}

+ 62 - 0
src/api/erp/stock/in/index.ts

@@ -0,0 +1,62 @@
+import request from '@/config/axios'
+
+// ERP 其它入库单 VO
+export interface StockInVO {
+  id: number // 入库编号
+  no: string // 入库单号
+  supplierId: number // 供应商编号
+  inTime: Date // 入库时间
+  totalCount: number // 合计数量
+  totalPrice: number // 合计金额,单位:元
+  status: number // 状态
+  remark: string // 备注
+}
+
+// ERP 其它入库单 API
+export const StockInApi = {
+  // 查询其它入库单分页
+  getStockInPage: async (params: any) => {
+    return await request.get({ url: `/erp/stock-in/page`, params })
+  },
+
+  // 查询其它入库单详情
+  getStockIn: async (id: number) => {
+    return await request.get({ url: `/erp/stock-in/get?id=` + id })
+  },
+
+  // 新增其它入库单
+  createStockIn: async (data: StockInVO) => {
+    return await request.post({ url: `/erp/stock-in/create`, data })
+  },
+
+  // 修改其它入库单
+  updateStockIn: async (data: StockInVO) => {
+    return await request.put({ url: `/erp/stock-in/update`, data })
+  },
+
+  // 更新其它入库单的状态
+  updateStockInStatus: async (id: number, status: number) => {
+    return await request.put({
+      url: `/erp/stock-in/update-status`,
+      params: {
+        id,
+        status
+      }
+    })
+  },
+
+  // 删除其它入库单
+  deleteStockIn: async (ids: number[]) => {
+    return await request.delete({
+      url: `/erp/stock-in/delete`,
+      params: {
+        ids: ids.join(',')
+      }
+    })
+  },
+
+  // 导出其它入库单 Excel
+  exportStockIn: async (params) => {
+    return await request.download({ url: `/erp/stock-in/export-excel`, params })
+  }
+}

+ 61 - 0
src/api/erp/stock/move/index.ts

@@ -0,0 +1,61 @@
+import request from '@/config/axios'
+
+// ERP 库存调度单 VO
+export interface StockMoveVO {
+  id: number // 出库编号
+  no: string // 出库单号
+  outTime: Date // 出库时间
+  totalCount: number // 合计数量
+  totalPrice: number // 合计金额,单位:元
+  status: number // 状态
+  remark: string // 备注
+}
+
+// ERP 库存调度单 API
+export const StockMoveApi = {
+  // 查询库存调度单分页
+  getStockMovePage: async (params: any) => {
+    return await request.get({ url: `/erp/stock-move/page`, params })
+  },
+
+  // 查询库存调度单详情
+  getStockMove: async (id: number) => {
+    return await request.get({ url: `/erp/stock-move/get?id=` + id })
+  },
+
+  // 新增库存调度单
+  createStockMove: async (data: StockMoveVO) => {
+    return await request.post({ url: `/erp/stock-move/create`, data })
+  },
+
+  // 修改库存调度单
+  updateStockMove: async (data: StockMoveVO) => {
+    return await request.put({ url: `/erp/stock-move/update`, data })
+  },
+
+  // 更新库存调度单的状态
+  updateStockMoveStatus: async (id: number, status: number) => {
+    return await request.put({
+      url: `/erp/stock-move/update-status`,
+      params: {
+        id,
+        status
+      }
+    })
+  },
+
+  // 删除库存调度单
+  deleteStockMove: async (ids: number[]) => {
+    return await request.delete({
+      url: `/erp/stock-move/delete`,
+      params: {
+        ids: ids.join(',')
+      }
+    })
+  },
+
+  // 导出库存调度单 Excel
+  exportStockMove: async (params) => {
+    return await request.download({ url: `/erp/stock-move/export-excel`, params })
+  }
+}

+ 62 - 0
src/api/erp/stock/out/index.ts

@@ -0,0 +1,62 @@
+import request from '@/config/axios'
+
+// ERP 其它出库单 VO
+export interface StockOutVO {
+  id: number // 出库编号
+  no: string // 出库单号
+  customerId: number // 客户编号
+  outTime: Date // 出库时间
+  totalCount: number // 合计数量
+  totalPrice: number // 合计金额,单位:元
+  status: number // 状态
+  remark: string // 备注
+}
+
+// ERP 其它出库单 API
+export const StockOutApi = {
+  // 查询其它出库单分页
+  getStockOutPage: async (params: any) => {
+    return await request.get({ url: `/erp/stock-out/page`, params })
+  },
+
+  // 查询其它出库单详情
+  getStockOut: async (id: number) => {
+    return await request.get({ url: `/erp/stock-out/get?id=` + id })
+  },
+
+  // 新增其它出库单
+  createStockOut: async (data: StockOutVO) => {
+    return await request.post({ url: `/erp/stock-out/create`, data })
+  },
+
+  // 修改其它出库单
+  updateStockOut: async (data: StockOutVO) => {
+    return await request.put({ url: `/erp/stock-out/update`, data })
+  },
+
+  // 更新其它出库单的状态
+  updateStockOutStatus: async (id: number, status: number) => {
+    return await request.put({
+      url: `/erp/stock-out/update-status`,
+      params: {
+        id,
+        status
+      }
+    })
+  },
+
+  // 删除其它出库单
+  deleteStockOut: async (ids: number[]) => {
+    return await request.delete({
+      url: `/erp/stock-out/delete`,
+      params: {
+        ids: ids.join(',')
+      }
+    })
+  },
+
+  // 导出其它出库单 Excel
+  exportStockOut: async (params) => {
+    return await request.download({ url: `/erp/stock-out/export-excel`, params })
+  }
+}

+ 32 - 0
src/api/erp/stock/record/index.ts

@@ -0,0 +1,32 @@
+import request from '@/config/axios'
+
+// ERP 产品库存明细 VO
+export interface StockRecordVO {
+  id: number // 编号
+  productId: number // 产品编号
+  warehouseId: number // 仓库编号
+  count: number // 出入库数量
+  totalCount: number // 总库存量
+  bizType: number // 业务类型
+  bizId: number // 业务编号
+  bizItemId: number // 业务项编号
+  bizNo: string // 业务单号
+}
+
+// ERP 产品库存明细 API
+export const StockRecordApi = {
+  // 查询产品库存明细分页
+  getStockRecordPage: async (params: any) => {
+    return await request.get({ url: `/erp/stock-record/page`, params })
+  },
+
+  // 查询产品库存明细详情
+  getStockRecord: async (id: number) => {
+    return await request.get({ url: `/erp/stock-record/get?id=` + id })
+  },
+
+  // 导出产品库存明细 Excel
+  exportStockRecord: async (params) => {
+    return await request.download({ url: `/erp/stock-record/export-excel`, params })
+  }
+}

+ 41 - 0
src/api/erp/stock/stock/index.ts

@@ -0,0 +1,41 @@
+import request from '@/config/axios'
+
+// ERP 产品库存 VO
+export interface StockVO {
+  // 编号
+  id: number
+  // 产品编号
+  productId: number
+  // 仓库编号
+  warehouseId: number
+  // 库存数量
+  count: number
+}
+
+// ERP 产品库存 API
+export const StockApi = {
+  // 查询产品库存分页
+  getStockPage: async (params: any) => {
+    return await request.get({ url: `/erp/stock/page`, params })
+  },
+
+  // 查询产品库存详情
+  getStock: async (id: number) => {
+    return await request.get({ url: `/erp/stock/get?id=` + id })
+  },
+
+  // 查询产品库存详情
+  getStock2: async (productId: number, warehouseId: number) => {
+    return await request.get({ url: `/erp/stock/get`, params: { productId, warehouseId } })
+  },
+
+  // 获得产品库存数量
+  getStockCount: async (productId: number) => {
+    return await request.get({ url: `/erp/stock/get-count`, params: { productId } })
+  },
+
+  // 导出产品库存 Excel
+  exportStock: async (params) => {
+    return await request.download({ url: `/erp/stock/export-excel`, params })
+  }
+}

+ 64 - 0
src/api/erp/stock/warehouse/index.ts

@@ -0,0 +1,64 @@
+import request from '@/config/axios'
+
+// ERP 仓库 VO
+export interface WarehouseVO {
+  id: number // 仓库编号
+  name: string // 仓库名称
+  address: string // 仓库地址
+  sort: number // 排序
+  remark: string // 备注
+  principal: string // 负责人
+  warehousePrice: number // 仓储费,单位:元
+  truckagePrice: number // 搬运费,单位:元
+  status: number // 开启状态
+  defaultStatus: boolean // 是否默认
+}
+
+// ERP 仓库 API
+export const WarehouseApi = {
+  // 查询仓库分页
+  getWarehousePage: async (params: any) => {
+    return await request.get({ url: `/erp/warehouse/page`, params })
+  },
+
+  // 查询仓库精简列表
+  getWarehouseSimpleList: async () => {
+    return await request.get({ url: `/erp/warehouse/simple-list` })
+  },
+
+  // 查询仓库详情
+  getWarehouse: async (id: number) => {
+    return await request.get({ url: `/erp/warehouse/get?id=` + id })
+  },
+
+  // 新增仓库
+  createWarehouse: async (data: WarehouseVO) => {
+    return await request.post({ url: `/erp/warehouse/create`, data })
+  },
+
+  // 修改仓库
+  updateWarehouse: async (data: WarehouseVO) => {
+    return await request.put({ url: `/erp/warehouse/update`, data })
+  },
+
+  // 修改仓库默认状态
+  updateWarehouseDefaultStatus: async (id: number, defaultStatus: boolean) => {
+    return await request.put({
+      url: `/erp/warehouse/update-default-status`,
+      params: {
+        id,
+        defaultStatus
+      }
+    })
+  },
+
+  // 删除仓库
+  deleteWarehouse: async (id: number) => {
+    return await request.delete({ url: `/erp/warehouse/delete?id=` + id })
+  },
+
+  // 导出仓库 Excel
+  exportWarehouse: async (params) => {
+    return await request.download({ url: `/erp/warehouse/export-excel`, params })
+  }
+}

+ 53 - 0
src/api/gislayer/gisform/index.ts

@@ -0,0 +1,53 @@
+import request from '@/config/axios'
+
+// 图层表单 VO
+export interface GisFormVO {
+  id: number // 编号
+  type: number // 图层数据类型
+  name: string // 地理实体名
+  parentId: number // 父级编号
+  seq: number // 排序
+  fileFormat: string // 文件格式
+  urlAddress: string // url地址
+  fileAddress: string // 文件地址
+  key: string // API key
+  rgb: number // 图层颜色
+  acquisitionDate: Date // 数据获取日期
+  description: string // 数据描述或摘要
+  shpId: number // 图层关联
+  file: string // 文件上传
+  shpName: string // shp表名
+}
+
+// 图层表单 API
+export const GisFormApi = {
+  // 查询图层表单列表
+  getGisFormList: async (params) => {
+    return await request.get({ url: `/layer/gis-form/list`, params })
+  },
+
+  // 查询图层表单详情
+  getGisForm: async (id: number) => {
+    return await request.get({ url: `/layer/gis-form/get?id=` + id })
+  },
+
+  // 新增图层表单
+  createGisForm: async (data: GisFormVO) => {
+    return await request.post({ url: `/layer/gis-form/create`, data })
+  },
+
+  // 修改图层表单
+  updateGisForm: async (data: GisFormVO) => {
+    return await request.put({ url: `/layer/gis-form/update`, data })
+  },
+
+  // 删除图层表单
+  deleteGisForm: async (id: number) => {
+    return await request.delete({ url: `/layer/gis-form/delete?id=` + id })
+  },
+
+  // 导出图层表单 Excel
+  exportGisForm: async (params) => {
+    return await request.download({ url: `/layer/gis-form/export-excel`, params })
+  },
+}

+ 50 - 0
src/api/gismodel/twinmodelicon/index.ts

@@ -0,0 +1,50 @@
+import request from '@/config/axios'
+
+// 图标管理 VO
+export interface TwinModelsVO {
+  id: number // 编号
+  modelName: string // 图标名称
+
+  modelPath: string // 图标路径
+
+  imagePath: string // 图标图片路径
+  thumbnailPath: string // 缩略图路径
+  description: string // 图标描述
+  modelType: number // 图标类型
+  status: number // 图标状态
+
+  tenantId: number // 是否为公共图标
+}
+
+// 图标管理 API
+export const TwinModelIconApi = {
+  // 查询图标管理分页
+  getTwinModelsPage: async (params: any) => {
+    return await request.get({ url: `/gismodel/twin-models/pageIcon`, params })
+  },
+
+  // 查询图标管理详情
+  getTwinModels: async (id: number) => {
+    return await request.get({ url: `/gismodel/twin-models/getIcon?id=` + id })
+  },
+
+  // 新增图标管理
+  createTwinModels: async (data: TwinModelsVO) => {
+    return await request.post({ url: `/gismodel/twin-models/createIcon`, data })
+  },
+
+  // 修改图标管理
+  updateTwinModels: async (data: TwinModelsVO) => {
+    return await request.put({ url: `/gismodel/twin-models/update`, data })
+  },
+
+  // 删除图标管理
+  deleteTwinModels: async (id: number) => {
+    return await request.delete({ url: `/gismodel/twin-models/delete?id=` + id })
+  },
+
+  // 导出图标管理 Excel
+  exportTwinModels: async (params) => {
+    return await request.download({ url: `/gismodel/twin-models/export-iconExcel`, params })
+  },
+}

+ 47 - 0
src/api/gismodel/twinmodels/index.ts

@@ -0,0 +1,47 @@
+import request from '@/config/axios'
+
+// 模型管理 VO
+export interface TwinModelsVO {
+  id: number // 编号
+  modelName: string // 模型名称
+  modelPath: string // 模型路径
+  imagePath: string // 模型图片路径
+  thumbnailPath: string // 缩略图路径
+  description: string // 模型描述
+  modelType: number // 模型类型
+  status: number // 模型状态
+  tenantId: number // 是否为公共模型
+}
+
+// 模型管理 API
+export const TwinModelsApi = {
+  // 查询模型管理分页
+  getTwinModelsPage: async (params: any) => {
+    return await request.get({ url: `/gismodel/twin-models/pageModel`, params })
+  },
+
+  // 查询模型管理详情
+  getTwinModels: async (id: number) => {
+    return await request.get({ url: `/gismodel/twin-models/getModels?id=` + id })
+  },
+
+  // 新增模型管理
+  createTwinModels: async (data: TwinModelsVO) => {
+    return await request.post({ url: `/gismodel/twin-models/create`, data })
+  },
+
+  // 修改模型管理
+  updateTwinModels: async (data: TwinModelsVO) => {
+    return await request.put({ url: `/gismodel/twin-models/update`, data })
+  },
+
+  // 删除模型管理
+  deleteTwinModels: async (id: number) => {
+    return await request.delete({ url: `/gismodel/twin-models/delete?id=` + id })
+  },
+
+  // 导出模型管理 Excel
+  exportTwinModels: async (params) => {
+    return await request.download({ url: `/gismodel/twin-models/export-modelExcel`, params })
+  },
+}

+ 34 - 0
src/api/infra/apiAccessLog/index.ts

@@ -0,0 +1,34 @@
+import request from '@/config/axios'
+
+export interface ApiAccessLogVO {
+  id: number
+  traceId: string
+  userId: number
+  userType: number
+  applicationName: string
+  requestMethod: string
+  requestParams: string
+  responseBody: string
+  requestUrl: string
+  userIp: string
+  userAgent: string
+  operateModule: string
+  operateName: string
+  operateType: number
+  beginTime: Date
+  endTime: Date
+  duration: number
+  resultCode: number
+  resultMsg: string
+  createTime: Date
+}
+
+// 查询列表API 访问日志
+export const getApiAccessLogPage = (params: PageParam) => {
+  return request.get({ url: '/infra/api-access-log/page', params })
+}
+
+// 导出API 访问日志
+export const exportApiAccessLog = (params) => {
+  return request.download({ url: '/infra/api-access-log/export-excel', params })
+}

+ 48 - 0
src/api/infra/apiErrorLog/index.ts

@@ -0,0 +1,48 @@
+import request from '@/config/axios'
+
+export interface ApiErrorLogVO {
+  id: number
+  traceId: string
+  userId: number
+  userType: number
+  applicationName: string
+  requestMethod: string
+  requestParams: string
+  requestUrl: string
+  userIp: string
+  userAgent: string
+  exceptionTime: Date
+  exceptionName: string
+  exceptionMessage: string
+  exceptionRootCauseMessage: string
+  exceptionStackTrace: string
+  exceptionClassName: string
+  exceptionFileName: string
+  exceptionMethodName: string
+  exceptionLineNumber: number
+  processUserId: number
+  processStatus: number
+  processTime: Date
+  resultCode: number
+  createTime: Date
+}
+
+// 查询列表API 访问日志
+export const getApiErrorLogPage = (params: PageParam) => {
+  return request.get({ url: '/infra/api-error-log/page', params })
+}
+
+// 更新 API 错误日志的处理状态
+export const updateApiErrorLogPage = (id: number, processStatus: number) => {
+  return request.put({
+    url: '/infra/api-error-log/update-status?id=' + id + '&processStatus=' + processStatus
+  })
+}
+
+// 导出API 访问日志
+export const exportApiErrorLog = (params) => {
+  return request.download({
+    url: '/infra/api-error-log/export-excel',
+    params
+  })
+}

+ 122 - 0
src/api/infra/codegen/index.ts

@@ -0,0 +1,122 @@
+import request from '@/config/axios'
+
+export type CodegenTableVO = {
+  id: number
+  tableId: number
+  isParentMenuIdValid: boolean
+  dataSourceConfigId: number
+  scene: number
+  tableName: string
+  tableComment: string
+  remark: string
+  moduleName: string
+  businessName: string
+  className: string
+  classComment: string
+  author: string
+  createTime: Date
+  updateTime: Date
+  templateType: number
+  parentMenuId: number
+}
+
+export type CodegenColumnVO = {
+  id: number
+  tableId: number
+  columnName: string
+  dataType: string
+  columnComment: string
+  nullable: number
+  primaryKey: number
+  ordinalPosition: number
+  javaType: string
+  javaField: string
+  dictType: string
+  example: string
+  createOperation: number
+  updateOperation: number
+  listOperation: number
+  listOperationCondition: string
+  listOperationResult: number
+  htmlType: string
+}
+
+export type DatabaseTableVO = {
+  name: string
+  comment: string
+}
+
+export type CodegenDetailVO = {
+  table: CodegenTableVO
+  columns: CodegenColumnVO[]
+}
+
+export type CodegenPreviewVO = {
+  filePath: string
+  code: string
+}
+
+export type CodegenUpdateReqVO = {
+  table: CodegenTableVO | any
+  columns: CodegenColumnVO[]
+}
+
+export type CodegenCreateListReqVO = {
+  dataSourceConfigId: number
+  tableNames: string[]
+}
+
+// 查询列表代码生成表定义
+export const getCodegenTableList = (dataSourceConfigId: number) => {
+  return request.get({ url: '/infra/codegen/table/list?dataSourceConfigId=' + dataSourceConfigId })
+}
+
+// 查询列表代码生成表定义
+export const getCodegenTablePage = (params: PageParam) => {
+  return request.get({ url: '/infra/codegen/table/page', params })
+}
+
+// 查询详情代码生成表定义
+export const getCodegenTable = (id: number) => {
+  return request.get({ url: '/infra/codegen/detail?tableId=' + id })
+}
+
+// 新增代码生成表定义
+export const createCodegenTable = (data: CodegenCreateListReqVO) => {
+  return request.post({ url: '/infra/codegen/create', data })
+}
+
+// 修改代码生成表定义
+export const updateCodegenTable = (data: CodegenUpdateReqVO) => {
+  return request.put({ url: '/infra/codegen/update', data })
+}
+
+// 基于数据库的表结构,同步数据库的表和字段定义
+export const syncCodegenFromDB = (id: number) => {
+  return request.put({ url: '/infra/codegen/sync-from-db?tableId=' + id })
+}
+
+// 预览生成代码
+export const previewCodegen = (id: number) => {
+  return request.get({ url: '/infra/codegen/preview?tableId=' + id })
+}
+
+// 下载生成代码
+export const downloadCodegen = (id: number) => {
+  return request.download({ url: '/infra/codegen/download?tableId=' + id })
+}
+
+// 获得表定义
+export const getSchemaTableList = (params) => {
+  return request.get({ url: '/infra/codegen/db/table/list', params })
+}
+
+// 基于数据库的表结构,创建代码生成器的表定义
+export const createCodegenList = (data) => {
+  return request.post({ url: '/infra/codegen/create-list', data })
+}
+
+// 删除代码生成表定义
+export const deleteCodegenTable = (id: number) => {
+  return request.delete({ url: '/infra/codegen/delete?tableId=' + id })
+}

+ 48 - 0
src/api/infra/config/index.ts

@@ -0,0 +1,48 @@
+import request from '@/config/axios'
+
+export interface ConfigVO {
+  id: number | undefined
+  category: string
+  name: string
+  key: string
+  value: string
+  type: number
+  visible: boolean
+  remark: string
+  createTime: Date
+}
+
+// 查询参数列表
+export const getConfigPage = (params: PageParam) => {
+  return request.get({ url: '/infra/config/page', params })
+}
+
+// 查询参数详情
+export const getConfig = (id: number) => {
+  return request.get({ url: '/infra/config/get?id=' + id })
+}
+
+// 根据参数键名查询参数值
+export const getConfigKey = (configKey: string) => {
+  return request.get({ url: '/infra/config/get-value-by-key?key=' + configKey })
+}
+
+// 新增参数
+export const createConfig = (data: ConfigVO) => {
+  return request.post({ url: '/infra/config/create', data })
+}
+
+// 修改参数
+export const updateConfig = (data: ConfigVO) => {
+  return request.put({ url: '/infra/config/update', data })
+}
+
+// 删除参数
+export const deleteConfig = (id: number) => {
+  return request.delete({ url: '/infra/config/delete?id=' + id })
+}
+
+// 导出参数
+export const exportConfig = (params) => {
+  return request.download({ url: '/infra/config/export', params })
+}

+ 35 - 0
src/api/infra/dataSourceConfig/index.ts

@@ -0,0 +1,35 @@
+import request from '@/config/axios'
+
+export interface DataSourceConfigVO {
+  id: number | undefined
+  name: string
+  url: string
+  username: string
+  password: string
+  createTime?: Date
+}
+
+// 新增数据源配置
+export const createDataSourceConfig = (data: DataSourceConfigVO) => {
+  return request.post({ url: '/infra/data-source-config/create', data })
+}
+
+// 修改数据源配置
+export const updateDataSourceConfig = (data: DataSourceConfigVO) => {
+  return request.put({ url: '/infra/data-source-config/update', data })
+}
+
+// 删除数据源配置
+export const deleteDataSourceConfig = (id: number) => {
+  return request.delete({ url: '/infra/data-source-config/delete?id=' + id })
+}
+
+// 查询数据源配置详情
+export const getDataSourceConfig = (id: number) => {
+  return request.get({ url: '/infra/data-source-config/get?id=' + id })
+}
+
+// 查询数据源配置列表
+export const getDataSourceConfigList = () => {
+  return request.get({ url: '/infra/data-source-config/list' })
+}

+ 40 - 0
src/api/infra/demo/demo01/index.ts

@@ -0,0 +1,40 @@
+import request from '@/config/axios'
+
+export interface Demo01ContactVO {
+  id: number
+  name: string
+  sex: number
+  birthday: Date
+  description: string
+  avatar: string
+}
+
+// 查询示例联系人分页
+export const getDemo01ContactPage = async (params) => {
+  return await request.get({ url: `/infra/demo01-contact/page`, params })
+}
+
+// 查询示例联系人详情
+export const getDemo01Contact = async (id: number) => {
+  return await request.get({ url: `/infra/demo01-contact/get?id=` + id })
+}
+
+// 新增示例联系人
+export const createDemo01Contact = async (data: Demo01ContactVO) => {
+  return await request.post({ url: `/infra/demo01-contact/create`, data })
+}
+
+// 修改示例联系人
+export const updateDemo01Contact = async (data: Demo01ContactVO) => {
+  return await request.put({ url: `/infra/demo01-contact/update`, data })
+}
+
+// 删除示例联系人
+export const deleteDemo01Contact = async (id: number) => {
+  return await request.delete({ url: `/infra/demo01-contact/delete?id=` + id })
+}
+
+// 导出示例联系人 Excel
+export const exportDemo01Contact = async (params) => {
+  return await request.download({ url: `/infra/demo01-contact/export-excel`, params })
+}

+ 37 - 0
src/api/infra/demo/demo02/index.ts

@@ -0,0 +1,37 @@
+import request from '@/config/axios'
+
+export interface Demo02CategoryVO {
+  id: number
+  name: string
+  parentId: number
+}
+
+// 查询示例分类列表
+export const getDemo02CategoryList = async () => {
+  return await request.get({ url: `/infra/demo02-category/list` })
+}
+
+// 查询示例分类详情
+export const getDemo02Category = async (id: number) => {
+  return await request.get({ url: `/infra/demo02-category/get?id=` + id })
+}
+
+// 新增示例分类
+export const createDemo02Category = async (data: Demo02CategoryVO) => {
+  return await request.post({ url: `/infra/demo02-category/create`, data })
+}
+
+// 修改示例分类
+export const updateDemo02Category = async (data: Demo02CategoryVO) => {
+  return await request.put({ url: `/infra/demo02-category/update`, data })
+}
+
+// 删除示例分类
+export const deleteDemo02Category = async (id: number) => {
+  return await request.delete({ url: `/infra/demo02-category/delete?id=` + id })
+}
+
+// 导出示例分类 Excel
+export const exportDemo02Category = async (params) => {
+  return await request.download({ url: `/infra/demo02-category/export-excel`, params })
+}

+ 91 - 0
src/api/infra/demo/demo03/erp/index.ts

@@ -0,0 +1,91 @@
+import request from '@/config/axios'
+
+export interface Demo03StudentVO {
+  id: number
+  name: string
+  sex: number
+  birthday: Date
+  description: string
+}
+
+// 查询学生分页
+export const getDemo03StudentPage = async (params) => {
+  return await request.get({ url: `/infra/demo03-student/page`, params })
+}
+
+// 查询学生详情
+export const getDemo03Student = async (id: number) => {
+  return await request.get({ url: `/infra/demo03-student/get?id=` + id })
+}
+
+// 新增学生
+export const createDemo03Student = async (data: Demo03StudentVO) => {
+  return await request.post({ url: `/infra/demo03-student/create`, data })
+}
+
+// 修改学生
+export const updateDemo03Student = async (data: Demo03StudentVO) => {
+  return await request.put({ url: `/infra/demo03-student/update`, data })
+}
+
+// 删除学生
+export const deleteDemo03Student = async (id: number) => {
+  return await request.delete({ url: `/infra/demo03-student/delete?id=` + id })
+}
+
+// 导出学生 Excel
+export const exportDemo03Student = async (params) => {
+  return await request.download({ url: `/infra/demo03-student/export-excel`, params })
+}
+
+// ==================== 子表(学生课程) ====================
+
+// 获得学生课程分页
+export const getDemo03CoursePage = async (params) => {
+  return await request.get({ url: `/infra/demo03-student/demo03-course/page`, params })
+}
+// 新增学生课程
+export const createDemo03Course = async (data) => {
+  return await request.post({ url: `/infra/demo03-student/demo03-course/create`, data })
+}
+
+// 修改学生课程
+export const updateDemo03Course = async (data) => {
+  return await request.put({ url: `/infra/demo03-student/demo03-course/update`, data })
+}
+
+// 删除学生课程
+export const deleteDemo03Course = async (id: number) => {
+  return await request.delete({ url: `/infra/demo03-student/demo03-course/delete?id=` + id })
+}
+
+// 获得学生课程
+export const getDemo03Course = async (id: number) => {
+  return await request.get({ url: `/infra/demo03-student/demo03-course/get?id=` + id })
+}
+
+// ==================== 子表(学生班级) ====================
+
+// 获得学生班级分页
+export const getDemo03GradePage = async (params) => {
+  return await request.get({ url: `/infra/demo03-student/demo03-grade/page`, params })
+}
+// 新增学生班级
+export const createDemo03Grade = async (data) => {
+  return await request.post({ url: `/infra/demo03-student/demo03-grade/create`, data })
+}
+
+// 修改学生班级
+export const updateDemo03Grade = async (data) => {
+  return await request.put({ url: `/infra/demo03-student/demo03-grade/update`, data })
+}
+
+// 删除学生班级
+export const deleteDemo03Grade = async (id: number) => {
+  return await request.delete({ url: `/infra/demo03-student/demo03-grade/delete?id=` + id })
+}
+
+// 获得学生班级
+export const getDemo03Grade = async (id: number) => {
+  return await request.get({ url: `/infra/demo03-student/demo03-grade/get?id=` + id })
+}

+ 57 - 0
src/api/infra/demo/demo03/inner/index.ts

@@ -0,0 +1,57 @@
+import request from '@/config/axios'
+
+export interface Demo03StudentVO {
+  id: number
+  name: string
+  sex: number
+  birthday: Date
+  description: string
+}
+
+// 查询学生分页
+export const getDemo03StudentPage = async (params) => {
+  return await request.get({ url: `/infra/demo03-student/page`, params })
+}
+
+// 查询学生详情
+export const getDemo03Student = async (id: number) => {
+  return await request.get({ url: `/infra/demo03-student/get?id=` + id })
+}
+
+// 新增学生
+export const createDemo03Student = async (data: Demo03StudentVO) => {
+  return await request.post({ url: `/infra/demo03-student/create`, data })
+}
+
+// 修改学生
+export const updateDemo03Student = async (data: Demo03StudentVO) => {
+  return await request.put({ url: `/infra/demo03-student/update`, data })
+}
+
+// 删除学生
+export const deleteDemo03Student = async (id: number) => {
+  return await request.delete({ url: `/infra/demo03-student/delete?id=` + id })
+}
+
+// 导出学生 Excel
+export const exportDemo03Student = async (params) => {
+  return await request.download({ url: `/infra/demo03-student/export-excel`, params })
+}
+
+// ==================== 子表(学生课程) ====================
+
+// 获得学生课程列表
+export const getDemo03CourseListByStudentId = async (studentId) => {
+  return await request.get({
+    url: `/infra/demo03-student/demo03-course/list-by-student-id?studentId=` + studentId
+  })
+}
+
+// ==================== 子表(学生班级) ====================
+
+// 获得学生班级
+export const getDemo03GradeByStudentId = async (studentId) => {
+  return await request.get({
+    url: `/infra/demo03-student/demo03-grade/get-by-student-id?studentId=` + studentId
+  })
+}

+ 57 - 0
src/api/infra/demo/demo03/normal/index.ts

@@ -0,0 +1,57 @@
+import request from '@/config/axios'
+
+export interface Demo03StudentVO {
+  id: number
+  name: string
+  sex: number
+  birthday: Date
+  description: string
+}
+
+// 查询学生分页
+export const getDemo03StudentPage = async (params) => {
+  return await request.get({ url: `/infra/demo03-student/page`, params })
+}
+
+// 查询学生详情
+export const getDemo03Student = async (id: number) => {
+  return await request.get({ url: `/infra/demo03-student/get?id=` + id })
+}
+
+// 新增学生
+export const createDemo03Student = async (data: Demo03StudentVO) => {
+  return await request.post({ url: `/infra/demo03-student/create`, data })
+}
+
+// 修改学生
+export const updateDemo03Student = async (data: Demo03StudentVO) => {
+  return await request.put({ url: `/infra/demo03-student/update`, data })
+}
+
+// 删除学生
+export const deleteDemo03Student = async (id: number) => {
+  return await request.delete({ url: `/infra/demo03-student/delete?id=` + id })
+}
+
+// 导出学生 Excel
+export const exportDemo03Student = async (params) => {
+  return await request.download({ url: `/infra/demo03-student/export-excel`, params })
+}
+
+// ==================== 子表(学生课程) ====================
+
+// 获得学生课程列表
+export const getDemo03CourseListByStudentId = async (studentId) => {
+  return await request.get({
+    url: `/infra/demo03-student/demo03-course/list-by-student-id?studentId=` + studentId
+  })
+}
+
+// ==================== 子表(学生班级) ====================
+
+// 获得学生班级
+export const getDemo03GradeByStudentId = async (studentId) => {
+  return await request.get({
+    url: `/infra/demo03-student/demo03-grade/get-by-student-id?studentId=` + studentId
+  })
+}

+ 50 - 0
src/api/infra/file/index.ts

@@ -0,0 +1,50 @@
+import request from '@/config/axios'
+
+export interface FilePageReqVO extends PageParam {
+  path?: string
+  type?: string
+  createTime?: Date[]
+}
+
+// 文件预签名地址 Response VO
+export interface FilePresignedUrlRespVO {
+  // 文件配置编号
+  configId: number
+  // 文件上传 URL
+  uploadUrl: string
+  // 文件 URL
+  url: string
+}
+
+// 查询文件列表
+export const getFilePage = (params: FilePageReqVO) => {
+  return request.get({ url: '/infra/file/page', params })
+}
+
+// 删除文件
+export const deleteFile = (id: number) => {
+  return request.delete({ url: '/infra/file/delete?id=' + id })
+}
+
+// 获取文件预签名地址
+export const getFilePresignedUrl = (path: string) => {
+  return request.get<FilePresignedUrlRespVO>({
+    url: '/infra/file/presigned-url',
+    params: { path }
+  })
+}
+
+// 创建文件
+export const createFile = (data: any) => {
+  return request.post({ url: '/infra/file/create', data })
+}
+
+// 上传文件
+export const updateFile = (data: any) => {
+  return request.upload({ url: '/infra/file/upload', data })
+}
+
+//上传缩略图
+export const uploadThumbnail = (data: any) => {
+  return request.upload({ url: '/infra/file/uploadThumbnail', data })
+}

+ 61 - 0
src/api/infra/fileConfig/index.ts

@@ -0,0 +1,61 @@
+import request from '@/config/axios'
+
+export interface FileClientConfig {
+  basePath: string
+  host?: string
+  port?: number
+  username?: string
+  password?: string
+  mode?: string
+  endpoint?: string
+  bucket?: string
+  accessKey?: string
+  accessSecret?: string
+  domain: string
+}
+
+export interface FileConfigVO {
+  id: number
+  name: string
+  storage?: number
+  master: boolean
+  visible: boolean
+  config: FileClientConfig
+  remark: string
+  createTime: Date
+}
+
+// 查询文件配置列表
+export const getFileConfigPage = (params: PageParam) => {
+  return request.get({ url: '/infra/file-config/page', params })
+}
+
+// 查询文件配置详情
+export const getFileConfig = (id: number) => {
+  return request.get({ url: '/infra/file-config/get?id=' + id })
+}
+
+// 更新文件配置为主配置
+export const updateFileConfigMaster = (id: number) => {
+  return request.put({ url: '/infra/file-config/update-master?id=' + id })
+}
+
+// 新增文件配置
+export const createFileConfig = (data: FileConfigVO) => {
+  return request.post({ url: '/infra/file-config/create', data })
+}
+
+// 修改文件配置
+export const updateFileConfig = (data: FileConfigVO) => {
+  return request.put({ url: '/infra/file-config/update', data })
+}
+
+// 删除文件配置
+export const deleteFileConfig = (id: number) => {
+  return request.delete({ url: '/infra/file-config/delete?id=' + id })
+}
+
+// 测试文件配置
+export const testFileConfig = (id: number) => {
+  return request.get({ url: '/infra/file-config/test?id=' + id })
+}

+ 63 - 0
src/api/infra/job/index.ts

@@ -0,0 +1,63 @@
+import request from '@/config/axios'
+
+export interface JobVO {
+  id: number
+  name: string
+  status: number
+  handlerName: string
+  handlerParam: string
+  cronExpression: string
+  retryCount: number
+  retryInterval: number
+  monitorTimeout: number
+  createTime: Date
+}
+
+// 任务列表
+export const getJobPage = (params: PageParam) => {
+  return request.get({ url: '/infra/job/page', params })
+}
+
+// 任务详情
+export const getJob = (id: number) => {
+  return request.get({ url: '/infra/job/get?id=' + id })
+}
+
+// 新增任务
+export const createJob = (data: JobVO) => {
+  return request.post({ url: '/infra/job/create', data })
+}
+
+// 修改定时任务调度
+export const updateJob = (data: JobVO) => {
+  return request.put({ url: '/infra/job/update', data })
+}
+
+// 删除定时任务调度
+export const deleteJob = (id: number) => {
+  return request.delete({ url: '/infra/job/delete?id=' + id })
+}
+
+// 导出定时任务调度
+export const exportJob = (params) => {
+  return request.download({ url: '/infra/job/export-excel', params })
+}
+
+// 任务状态修改
+export const updateJobStatus = (id: number, status: number) => {
+  const params = {
+    id,
+    status
+  }
+  return request.put({ url: '/infra/job/update-status', params })
+}
+
+// 定时任务立即执行一次
+export const runJob = (id: number) => {
+  return request.put({ url: '/infra/job/trigger?id=' + id })
+}
+
+// 获得定时任务的下 n 次执行时间
+export const getJobNextTimes = (id: number) => {
+  return request.get({ url: '/infra/job/get_next_times?id=' + id })
+}

+ 34 - 0
src/api/infra/jobLog/index.ts

@@ -0,0 +1,34 @@
+import request from '@/config/axios'
+
+export interface JobLogVO {
+  id: number
+  jobId: number
+  handlerName: string
+  handlerParam: string
+  cronExpression: string
+  executeIndex: string
+  beginTime: Date
+  endTime: Date
+  duration: string
+  status: number
+  createTime: string
+  result: string
+}
+
+// 任务日志列表
+export const getJobLogPage = (params: PageParam) => {
+  return request.get({ url: '/infra/job-log/page', params })
+}
+
+// 任务日志详情
+export const getJobLog = (id: number) => {
+  return request.get({ url: '/infra/job-log/get?id=' + id })
+}
+
+// 导出定时任务日志
+export const exportJobLog = (params) => {
+  return request.download({
+    url: '/infra/job-log/export-excel',
+    params
+  })
+}

+ 8 - 0
src/api/infra/redis/index.ts

@@ -0,0 +1,8 @@
+import request from '@/config/axios'
+
+/**
+ * 获取redis 监控信息
+ */
+export const getCache = () => {
+  return request.get({ url: '/infra/redis/get-monitor-info' })
+}

+ 45 - 0
src/api/layer/formvector/index.ts

@@ -0,0 +1,45 @@
+import request from '@/config/axios'
+
+// 矢量图层表单 VO
+export interface FormVectorVO {
+  id: number // 编号
+  layername: number // 图层名
+  parentId: number // 父级编号
+  seq: number // 排序
+  rgb: number // 图层颜色
+  geom: object // 几何形状数据
+  description: string // 数据描述或摘要
+}
+
+// 矢量图层表单 API
+export const FormVectorApi = {
+  // 查询矢量图层表单分页
+  getFormVectorPage: async (params: any) => {
+    return await request.get({ url: `/layer/form-vector/page`, params })
+  },
+
+  // 查询矢量图层表单详情
+  getFormVector: async (id: number) => {
+    return await request.get({ url: `/layer/form-vector/get?id=` + id })
+  },
+
+  // 新增矢量图层表单
+  createFormVector: async (data: FormVectorVO) => {
+    return await request.post({ url: `/layer/form-vector/create`, data })
+  },
+
+  // 修改矢量图层表单
+  updateFormVector: async (data: FormVectorVO) => {
+    return await request.put({ url: `/layer/form-vector/update`, data })
+  },
+
+  // 删除矢量图层表单
+  deleteFormVector: async (id: number) => {
+    return await request.delete({ url: `/layer/form-vector/delete?id=` + id })
+  },
+
+  // 导出矢量图层表单 Excel
+  exportFormVector: async (params) => {
+    return await request.download({ url: `/layer/form-vector/export-excel`, params })
+  },
+}

+ 47 - 0
src/api/layer/formvectorattributes/index.ts

@@ -0,0 +1,47 @@
+import request from '@/config/axios'
+
+// 矢量图层表单属性 VO
+export interface FormVectorAttributesVO {
+  id: number // 编号
+  parentId: number // 父级编号
+  rgb: number // 图层颜色
+  attributes: string // 属性数据
+  description: string // 数据描述或摘要
+  fileFormat: number // 文件格式
+  urlAddress: string // url地址
+  fileAddress: string // 文件地址
+  layername: number // 图层名
+}
+
+// 矢量图层表单属性 API
+export const FormVectorAttributesApi = {
+  // 查询矢量图层表单属性分页
+  getFormVectorAttributesPage: async (params: any) => {
+    return await request.get({ url: `/layer/form-vector-attributes/page`, params })
+  },
+
+  // 查询矢量图层表单属性详情
+  getFormVectorAttributes: async (id: number) => {
+    return await request.get({ url: `/layer/form-vector-attributes/get?id=` + id })
+  },
+
+  // 新增矢量图层表单属性
+  createFormVectorAttributes: async (data: FormVectorAttributesVO) => {
+    return await request.post({ url: `/layer/form-vector-attributes/create`, data })
+  },
+
+  // 修改矢量图层表单属性
+  updateFormVectorAttributes: async (data: FormVectorAttributesVO) => {
+    return await request.put({ url: `/layer/form-vector-attributes/update`, data })
+  },
+
+  // 删除矢量图层表单属性
+  deleteFormVectorAttributes: async (id: number) => {
+    return await request.delete({ url: `/layer/form-vector-attributes/delete?id=` + id })
+  },
+
+  // 导出矢量图层表单属性 Excel
+  exportFormVectorAttributes: async (params) => {
+    return await request.download({ url: `/layer/form-vector-attributes/export-excel`, params })
+  },
+}

+ 59 - 0
src/api/layer/gisname/index.ts

@@ -0,0 +1,59 @@
+import request from '@/config/axios'
+import { pa } from 'element-plus/es/locale'
+
+// shp名 VO
+export interface GisNameVO {
+  shpName: string // 图层名
+  description: string // 描述
+  id: number // 序号
+  shpType: number // shp类型数据标识,0表示用户上传,1表示系统配置
+  showitem: string // 需要显示为文本的字段
+  symbolizeModel: string // 符号化模型
+  textDisplay: string // 文本显示
+}
+
+// shp名 API
+export const GisNameApi = {
+  // 查询shp名分页
+  getGisNamePage: async (params: any) => {
+    return await request.get({ url: `/layer/gis-name/page`, params })
+  },
+
+  // 查询shp名详情
+  getGisName: async (id: number) => {
+    return await request.get({ url: `/layer/gis-name/get?id=` + id })
+  },
+
+  // 新增shp名
+  createGisName: async (data: GisNameVO) => {
+    return await request.post({ url: `/layer/gis-name/create`, data })
+  },
+
+  // 修改shp名
+  updateGisName: async (data: GisNameVO) => {
+    return await request.put({ url: `/layer/gis-name/update`, data })
+  },
+
+  // 删除shp名
+  deleteGisName: async (id: number) => {
+    return await request.delete({ url: `/layer/gis-name/delete?id=` + id })
+  },
+
+  // 导出shp名 Excel
+  exportGisName: async (params) => {
+    return await request.download({ url: `/layer/gis-name/export-excel`, params })
+  },
+
+  // getSimpleGisNameList: async () => {
+  //   return await request.get({ url: '/layer/gis-name/simple-list' })
+  // }
+}
+
+// // 查询图层(精简)列表
+  export const getSimpleGisNameList = async (): Promise<GisNameVO[]>  => {
+  return await request.get({ url: '/layer/gis-name/simple-list' })
+}
+
+export const getgisAttr = async (shpName): Promise<GisNameVO[]>  => {
+  return await request.get({ url: '/layer/ltygis/getgisAttr?tableName='+shpName ,ltyNotent:true})
+}

+ 78 - 0
src/api/layer/visualizemessage/index.ts

@@ -0,0 +1,78 @@
+import request from '@/config/axios'
+
+// 项目信息表 VO
+export interface VisualizeMessageVO {
+  id: number // 编号
+  parentId: number // 父ID
+  associateLayerName: string // 关联图层名
+  associateLayerId: number // 关联图层ID
+  placeName: string // 地名
+  sort: number // 排序
+  itemName: string // 项目名称
+  itemId: number // 项目编号
+  implementedBy: string // 执行单位
+  itemDescribe: string // 项目描述
+  itemFile: string // 项目相关附件
+  itemUserName: string // 项目负责人
+  itemBudget: number // 项目总预算
+  allocatedFunds: number // 已经分配资金
+  itemGetFunds: number // 项目获得资金
+  itemStartTime: Date // 项目开始时间
+  itemEstimateEndTime: Date // 项目预估结束时间
+  itemActualEndTime: Date // 项目实际结束时间
+  status: number // 项目状态
+  itemInfluenceRange: string // 项目影响范围
+  itemRiskDescription: string // 项目风险描述
+  planForUse: string // 规划用途
+  placeId: number // 地块编号
+  placeType: number // 地块类型
+  propertyOwnerNameOrUnitName: string // 产权人或单位名
+  phone: string // 联系方式
+  titleDeedNumber: number // 产权证编号
+  address: string // 详细地址
+  layerColor: string // 图层颜色
+  propertyValuation: string // 产权估值
+  propertyRightsIntroduction: string // 产权简介
+  useType: number // 使用权类型
+  useStartTime: Date // 使用权开始时间
+  useEndTime: Date // 使用权结束时间
+  titleProceedingsRecords: string // 产权法律诉讼记录
+  propertyTransactionsInfo: string // 产权交易信息
+  mortgageSituation: string // 抵押情况
+  propertyOwnerImage: string // 产权人照片上传
+  realImage: string // 实景照片上传
+  imageDescription: string // 图片信息描述
+}
+
+// 项目信息表 API
+export const VisualizeMessageApi = {
+  // 查询项目信息表分页
+  getVisualizeMessagePage: async (params: any) => {
+    return await request.get({ url: `/layer/visualize-message/page`, params })
+  },
+
+  // 查询项目信息表详情
+  getVisualizeMessage: async (id: number) => {
+    return await request.get({ url: `/layer/visualize-message/get?id=` + id })
+  },
+
+  // 新增项目信息表
+  createVisualizeMessage: async (data: VisualizeMessageVO) => {
+    return await request.post({ url: `/layer/visualize-message/create`, data })
+  },
+
+  // 修改项目信息表
+  updateVisualizeMessage: async (data: VisualizeMessageVO) => {
+    return await request.put({ url: `/layer/visualize-message/update`, data })
+  },
+
+  // 删除项目信息表
+  deleteVisualizeMessage: async (id: number) => {
+    return await request.delete({ url: `/layer/visualize-message/delete?id=` + id })
+  },
+
+  // 导出项目信息表 Excel
+  exportVisualizeMessage: async (params) => {
+    return await request.download({ url: `/layer/visualize-message/export-excel`, params })
+  },
+}

+ 81 - 0
src/api/login/index.ts

@@ -0,0 +1,81 @@
+import request from '@/config/axios'
+import { getRefreshToken } from '@/utils/auth'
+import type { UserLoginVO } from './types'
+
+export interface SmsCodeVO {
+  mobile: string
+  scene: number
+}
+
+export interface SmsLoginVO {
+  mobile: string
+  code: string
+}
+
+// 登录
+export const login = (data: UserLoginVO) => {
+  return request.post({ url: '/system/auth/login', data })
+}
+
+// 刷新访问令牌
+export const refreshToken = () => {
+  return request.post({ url: '/system/auth/refresh-token?refreshToken=' + getRefreshToken() })
+}
+
+// 使用租户名,获得租户编号
+export const getTenantIdByName = (name: string) => {
+  return request.get({ url: '/system/tenant/get-id-by-name?name=' + name })
+}
+
+// 使用租户域名,获得租户信息
+export const getTenantByWebsite = (website: string) => {
+  return request.get({ url: '/system/tenant/get-by-website?website=' + website })
+}
+
+// 登出
+export const loginOut = () => {
+  return request.post({ url: '/system/auth/logout' })
+}
+
+// 获取用户权限信息
+export const getInfo = () => {
+  return request.get({ url: '/system/auth/get-permission-info' })
+}
+
+//获取登录验证码
+export const sendSmsCode = (data: SmsCodeVO) => {
+  return request.post({ url: '/system/auth/send-sms-code', data })
+}
+
+// 短信验证码登录
+export const smsLogin = (data: SmsLoginVO) => {
+  return request.post({ url: '/system/auth/sms-login', data })
+}
+
+// 社交快捷登录,使用 code 授权码
+export function socialLogin(type: string, code: string, state: string) {
+  return request.post({
+    url: '/system/auth/social-login',
+    data: {
+      type,
+      code,
+      state
+    }
+  })
+}
+
+// 社交授权的跳转
+export const socialAuthRedirect = (type: number, redirectUri: string) => {
+  return request.get({
+    url: '/system/auth/social-auth-redirect?type=' + type + '&redirectUri=' + redirectUri
+  })
+}
+// 获取验证图片以及 token
+export const getCode = (data) => {
+  return request.postOriginal({ url: 'system/captcha/get', data })
+}
+
+// 滑动或者点选验证
+export const reqCheck = (data) => {
+  return request.postOriginal({ url: 'system/captcha/check', data })
+}

+ 41 - 0
src/api/login/oauth2/index.ts

@@ -0,0 +1,41 @@
+import request from '@/config/axios'
+
+// 获得授权信息
+export const getAuthorize = (clientId: string) => {
+  return request.get({ url: '/system/oauth2/authorize?clientId=' + clientId })
+}
+
+// 发起授权
+export const authorize = (
+  responseType: string,
+  clientId: string,
+  redirectUri: string,
+  state: string,
+  autoApprove: boolean,
+  checkedScopes: string[],
+  uncheckedScopes: string[]
+) => {
+  // 构建 scopes
+  const scopes = {}
+  for (const scope of checkedScopes) {
+    scopes[scope] = true
+  }
+  for (const scope of uncheckedScopes) {
+    scopes[scope] = false
+  }
+  // 发起请求
+  return request.post({
+    url: '/system/oauth2/authorize',
+    headers: {
+      'Content-type': 'application/x-www-form-urlencoded'
+    },
+    params: {
+      response_type: responseType,
+      client_id: clientId,
+      redirect_uri: redirectUri,
+      state: state,
+      auto_approve: autoApprove,
+      scope: JSON.stringify(scopes)
+    }
+  })
+}

+ 37 - 0
src/api/mall/market/banner/index.ts

@@ -0,0 +1,37 @@
+import request from '@/config/axios'
+
+export interface BannerVO {
+  id: number
+  title: string
+  picUrl: string
+  status: number
+  url: string
+  position: number
+  sort: number
+  memo: string
+}
+
+// 查询Banner管理列表
+export const getBannerPage = async (params) => {
+  return await request.get({ url: `/promotion/banner/page`, params })
+}
+
+// 查询Banner管理详情
+export const getBanner = async (id: number) => {
+  return await request.get({ url: `/promotion/banner/get?id=` + id })
+}
+
+// 新增Banner管理
+export const createBanner = async (data: BannerVO) => {
+  return await request.post({ url: `/promotion/banner/create`, data })
+}
+
+// 修改Banner管理
+export const updateBanner = async (data: BannerVO) => {
+  return await request.put({ url: `/promotion/banner/update`, data })
+}
+
+// 删除Banner管理
+export const deleteBanner = async (id: number) => {
+  return await request.delete({ url: `/promotion/banner/delete?id=` + id })
+}

+ 42 - 0
src/api/mall/promotion/article/index.ts

@@ -0,0 +1,42 @@
+import request from '@/config/axios'
+
+export interface ArticleVO {
+  id: number
+  categoryId: number
+  title: string
+  author: string
+  picUrl: string
+  introduction: string
+  browseCount: string
+  sort: number
+  status: number
+  spuId: number
+  recommendHot: boolean
+  recommendBanner: boolean
+  content: string
+}
+
+// 查询文章管理列表
+export const getArticlePage = async (params: any) => {
+  return await request.get({ url: `/promotion/article/page`, params })
+}
+
+// 查询文章管理详情
+export const getArticle = async (id: number) => {
+  return await request.get({ url: `/promotion/article/get?id=` + id })
+}
+
+// 新增文章管理
+export const createArticle = async (data: ArticleVO) => {
+  return await request.post({ url: `/promotion/article/create`, data })
+}
+
+// 修改文章管理
+export const updateArticle = async (data: ArticleVO) => {
+  return await request.put({ url: `/promotion/article/update`, data })
+}
+
+// 删除文章管理
+export const deleteArticle = async (id: number) => {
+  return await request.delete({ url: `/promotion/article/delete?id=` + id })
+}

+ 39 - 0
src/api/mall/promotion/articleCategory/index.ts

@@ -0,0 +1,39 @@
+import request from '@/config/axios'
+
+export interface ArticleCategoryVO {
+  id: number
+  name: string
+  picUrl: string
+  status: number
+  sort: number
+}
+
+// 查询文章分类列表
+export const getArticleCategoryPage = async (params) => {
+  return await request.get({ url: `/promotion/article-category/page`, params })
+}
+
+// 查询文章分类精简信息列表
+export const getSimpleArticleCategoryList = async () => {
+  return await request.get({ url: `/promotion/article-category/list-all-simple` })
+}
+
+// 查询文章分类详情
+export const getArticleCategory = async (id: number) => {
+  return await request.get({ url: `/promotion/article-category/get?id=` + id })
+}
+
+// 新增文章分类
+export const createArticleCategory = async (data: ArticleCategoryVO) => {
+  return await request.post({ url: `/promotion/article-category/create`, data })
+}
+
+// 修改文章分类
+export const updateArticleCategory = async (data: ArticleCategoryVO) => {
+  return await request.put({ url: `/promotion/article-category/update`, data })
+}
+
+// 删除文章分类
+export const deleteArticleCategory = async (id: number) => {
+  return await request.delete({ url: `/promotion/article-category/delete?id=` + id })
+}

+ 35 - 0
src/api/mall/promotion/kefu/conversation/index.ts

@@ -0,0 +1,35 @@
+import request from '@/config/axios'
+
+export interface KeFuConversationRespVO {
+  id: number // 编号
+  userId: number // 会话所属用户
+  userAvatar: string // 会话所属用户头像
+  userNickname: string // 会话所属用户昵称
+  lastMessageTime: Date // 最后聊天时间
+  lastMessageContent: string // 最后聊天内容
+  lastMessageContentType: number // 最后发送的消息类型
+  adminPinned: boolean // 管理端置顶
+  userDeleted: boolean // 用户是否可见
+  adminDeleted: boolean // 管理员是否可见
+  adminUnreadMessageCount: number // 管理员未读消息数
+  createTime?: string // 创建时间
+}
+
+// 客服会话 API
+export const KeFuConversationApi = {
+  // 获得客服会话列表
+  getConversationList: async () => {
+    return await request.get({ url: '/promotion/kefu-conversation/list' })
+  },
+  // 客服会话置顶
+  updateConversationPinned: async (data: any) => {
+    return await request.put({
+      url: '/promotion/kefu-conversation/update-conversation-pinned',
+      data
+    })
+  },
+  // 删除客服会话
+  deleteConversation: async (id: number) => {
+    return await request.get({ url: '/promotion/kefu-conversation/delete?id' + id })
+  }
+}

+ 36 - 0
src/api/mall/promotion/kefu/message/index.ts

@@ -0,0 +1,36 @@
+import request from '@/config/axios'
+
+export interface KeFuMessageRespVO {
+  id: number // 编号
+  conversationId: number // 会话编号
+  senderId: number // 发送人编号
+  senderAvatar: string // 发送人头像
+  senderType: number // 发送人类型
+  receiverId: number // 接收人编号
+  receiverType: number // 接收人类型
+  contentType: number // 消息类型
+  content: string // 消息
+  readStatus: boolean // 是否已读
+  createTime: Date // 创建时间
+}
+
+// 客服会话 API
+export const KeFuMessageApi = {
+  // 发送客服消息
+  sendKeFuMessage: async (data: any) => {
+    return await request.post({
+      url: '/promotion/kefu-message/send',
+      data
+    })
+  },
+  // 更新客服消息已读状态
+  updateKeFuMessageReadStatus: async (conversationId: number) => {
+    return await request.put({
+      url: '/promotion/kefu-message/update-read-status?conversationId=' + conversationId
+    })
+  },
+  // 获得消息分页数据
+  getKeFuMessagePage: async (params: any) => {
+    return await request.get({ url: '/promotion/kefu-message/page', params })
+  }
+}

+ 75 - 0
src/api/mall/trade/afterSale/index.ts

@@ -0,0 +1,75 @@
+import request from '@/config/axios'
+
+export interface TradeAfterSaleVO {
+  id?: number | null // 售后编号,主键自增
+  no?: string // 售后单号
+  status?: number | null // 退款状态
+  way?: number | null // 售后方式
+  type?: number | null // 售后类型
+  userId?: number | null // 用户编号
+  applyReason?: string // 申请原因
+  applyDescription?: string // 补充描述
+  applyPicUrls?: string[] // 补充凭证图片
+  orderId?: number | null // 交易订单编号
+  orderNo?: string // 订单流水号
+  orderItemId?: number | null // 交易订单项编号
+  spuId?: number | null // 商品 SPU 编号
+  spuName?: string // 商品 SPU 名称
+  skuId?: number | null // 商品 SKU 编号
+  properties?: ProductPropertiesVO[] // 属性数组
+  picUrl?: string // 商品图片
+  count?: number | null // 退货商品数量
+  auditTime?: Date // 审批时间
+  auditUserId?: number | null // 审批人
+  auditReason?: string // 审批备注
+  refundPrice?: number | null // 退款金额,单位:分。
+  payRefundId?: number | null // 支付退款编号
+  refundTime?: Date // 退款时间
+  logisticsId?: number | null // 退货物流公司编号
+  logisticsNo?: string // 退货物流单号
+  deliveryTime?: Date // 退货时间
+  receiveTime?: Date // 收货时间
+  receiveReason?: string // 收货备注
+}
+
+export interface ProductPropertiesVO {
+  propertyId?: number | null // 属性的编号
+  propertyName?: string // 属性的名称
+  valueId?: number | null //属性值的编号
+  valueName?: string // 属性值的名称
+}
+
+// 获得交易售后分页
+export const getAfterSalePage = async (params) => {
+  return await request.get({ url: `/trade/after-sale/page`, params })
+}
+
+// 获得交易售后详情
+export const getAfterSale = async (id: any) => {
+  return await request.get({ url: `/trade/after-sale/get-detail?id=${id}` })
+}
+
+// 同意售后
+export const agree = async (id: any) => {
+  return await request.put({ url: `/trade/after-sale/agree?id=${id}` })
+}
+
+// 拒绝售后
+export const disagree = async (data: any) => {
+  return await request.put({ url: `/trade/after-sale/disagree`, data })
+}
+
+// 确认收货
+export const receive = async (id: any) => {
+  return await request.put({ url: `/trade/after-sale/receive?id=${id}` })
+}
+
+// 拒绝收货
+export const refuse = async (id: any) => {
+  return await request.put({ url: `/trade/after-sale/refuse?id=${id}` })
+}
+
+// 确认退款
+export const refund = async (id: any) => {
+  return await request.put({ url: `/trade/after-sale/refund?id=${id}` })
+}

+ 11 - 0
src/api/mall/trade/brokerage/record/index.ts

@@ -0,0 +1,11 @@
+import request from '@/config/axios'
+
+// 查询佣金记录列表
+export const getBrokerageRecordPage = async (params: any) => {
+  return await request.get({ url: `/trade/brokerage-record/page`, params })
+}
+
+// 查询佣金记录详情
+export const getBrokerageRecord = async (id: number) => {
+  return await request.get({ url: `/trade/brokerage-record/get?id=` + id })
+}

+ 39 - 0
src/api/mall/trade/brokerage/user/index.ts

@@ -0,0 +1,39 @@
+import request from '@/config/axios'
+
+export interface BrokerageUserVO {
+  id: number
+  bindUserId: number
+  bindUserTime: Date
+  brokerageEnabled: boolean
+  brokerageTime: Date
+  price: number
+  frozenPrice: number
+
+  nickname: string
+  avatar: string
+}
+
+// 查询分销用户列表
+export const getBrokerageUserPage = async (params: any) => {
+  return await request.get({ url: `/trade/brokerage-user/page`, params })
+}
+
+// 查询分销用户详情
+export const getBrokerageUser = async (id: number) => {
+  return await request.get({ url: `/trade/brokerage-user/get?id=` + id })
+}
+
+// 修改推广员
+export const updateBindUser = async (data: any) => {
+  return await request.put({ url: `/trade/brokerage-user/update-bind-user`, data })
+}
+
+// 清除推广员
+export const clearBindUser = async (data: any) => {
+  return await request.put({ url: `/trade/brokerage-user/clear-bind-user`, data })
+}
+
+// 修改推广资格
+export const updateBrokerageEnabled = async (data: any) => {
+  return await request.put({ url: `/trade/brokerage-user/update-brokerage-enable`, data })
+}

+ 39 - 0
src/api/mall/trade/brokerage/withdraw/index.ts

@@ -0,0 +1,39 @@
+import request from '@/config/axios'
+
+export interface BrokerageWithdrawVO {
+  id: number
+  userId: number
+  price: number
+  feePrice: number
+  totalPrice: number
+  type: number
+  name: string
+  accountNo: string
+  bankName: string
+  bankAddress: string
+  accountQrCodeUrl: string
+  status: number
+  auditReason: string
+  auditTime: Date
+  remark: string
+}
+
+// 查询佣金提现列表
+export const getBrokerageWithdrawPage = async (params: any) => {
+  return await request.get({ url: `/trade/brokerage-withdraw/page`, params })
+}
+
+// 查询佣金提现详情
+export const getBrokerageWithdraw = async (id: number) => {
+  return await request.get({ url: `/trade/brokerage-withdraw/get?id=` + id })
+}
+
+// 佣金提现 - 通过申请
+export const approveBrokerageWithdraw = async (id: number) => {
+  return await request.put({ url: `/trade/brokerage-withdraw/approve?id=` + id })
+}
+
+// 审核佣金提现 - 驳回申请
+export const rejectBrokerageWithdraw = async (data: BrokerageWithdrawVO) => {
+  return await request.put({ url: `/trade/brokerage-withdraw/reject`, data })
+}

+ 23 - 0
src/api/mall/trade/config/index.ts

@@ -0,0 +1,23 @@
+import request from '@/config/axios'
+
+export interface ConfigVO {
+  brokerageEnabled: boolean
+  brokerageEnabledCondition: number
+  brokerageBindMode: number
+  brokeragePosterUrls: string
+  brokerageFirstPercent: number
+  brokerageSecondPercent: number
+  brokerageWithdrawMinPrice: number
+  brokerageFrozenDays: number
+  brokerageWithdrawTypes: string
+}
+
+// 查询交易中心配置详情
+export const getTradeConfig = async () => {
+  return await request.get({ url: `/trade/config/get` })
+}
+
+// 保存交易中心配置
+export const saveTradeConfig = async (data: ConfigVO) => {
+  return await request.put({ url: `/trade/config/save`, data })
+}

+ 45 - 0
src/api/mall/trade/delivery/express/index.ts

@@ -0,0 +1,45 @@
+import request from '@/config/axios'
+
+export interface DeliveryExpressVO {
+  id: number
+  code: string
+  name: string
+  logo: string
+  sort: number
+  status: number
+}
+
+// 查询快递公司列表
+export const getDeliveryExpressPage = async (params: PageParam) => {
+  return await request.get({ url: '/trade/delivery/express/page', params })
+}
+
+// 查询快递公司详情
+export const getDeliveryExpress = async (id: number) => {
+  return await request.get({ url: '/trade/delivery/express/get?id=' + id })
+}
+
+// 获得快递公司精简信息列表
+export const getSimpleDeliveryExpressList = () => {
+  return request.get({ url: '/trade/delivery/express/list-all-simple' })
+}
+
+// 新增快递公司
+export const createDeliveryExpress = async (data: DeliveryExpressVO) => {
+  return await request.post({ url: '/trade/delivery/express/create', data })
+}
+
+// 修改快递公司
+export const updateDeliveryExpress = async (data: DeliveryExpressVO) => {
+  return await request.put({ url: '/trade/delivery/express/update', data })
+}
+
+// 删除快递公司
+export const deleteDeliveryExpress = async (id: number) => {
+  return await request.delete({ url: '/trade/delivery/express/delete?id=' + id })
+}
+
+// 导出快递公司 Excel
+export const exportDeliveryExpressApi = async (params) => {
+  return await request.download({ url: '/trade/delivery/express/export-excel', params })
+}

+ 54 - 0
src/api/mall/trade/delivery/expressTemplate/index.ts

@@ -0,0 +1,54 @@
+import request from '@/config/axios'
+
+export interface DeliveryExpressTemplateVO {
+  id: number
+  name: string
+  chargeMode: number
+  sort: number
+  templateCharge: ExpressTemplateChargeVO[]
+  templateFree: ExpressTemplateFreeVO[]
+}
+
+export declare type ExpressTemplateChargeVO = {
+  areaIds: number[]
+  startCount: number
+  startPrice: number
+  extraCount: number
+  extraPrice: number
+}
+
+export declare type ExpressTemplateFreeVO = {
+  areaIds: number[]
+  freeCount: number
+  freePrice: number
+}
+
+// 查询快递运费模板列表
+export const getDeliveryExpressTemplatePage = async (params: PageParam) => {
+  return await request.get({ url: '/trade/delivery/express-template/page', params })
+}
+
+// 查询快递运费模板详情
+export const getDeliveryExpressTemplate = async (id: number) => {
+  return await request.get({ url: '/trade/delivery/express-template/get?id=' + id })
+}
+
+// 查询快递运费模板详情
+export const getSimpleTemplateList = async () => {
+  return await request.get({ url: '/trade/delivery/express-template/list-all-simple' })
+}
+
+// 新增快递运费模板
+export const createDeliveryExpressTemplate = async (data: DeliveryExpressTemplateVO) => {
+  return await request.post({ url: '/trade/delivery/express-template/create', data })
+}
+
+// 修改快递运费模板
+export const updateDeliveryExpressTemplate = async (data: DeliveryExpressTemplateVO) => {
+  return await request.put({ url: '/trade/delivery/express-template/update', data })
+}
+
+// 删除快递运费模板
+export const deleteDeliveryExpressTemplate = async (id: number) => {
+  return await request.delete({ url: '/trade/delivery/express-template/delete?id=' + id })
+}

+ 46 - 0
src/api/mall/trade/delivery/pickUpStore/index.ts

@@ -0,0 +1,46 @@
+import request from '@/config/axios'
+
+export interface DeliveryPickUpStoreVO {
+  id: number
+  name: string
+  introduction: string
+  phone: string
+  areaId: number
+  detailAddress: string
+  logo: string
+  openingTime: string
+  closingTime: string
+  latitude: number
+  longitude: number
+  status: number
+}
+
+// 查询自提门店列表
+export const getDeliveryPickUpStorePage = async (params) => {
+  return await request.get({ url: '/trade/delivery/pick-up-store/page', params })
+}
+
+// 查询自提门店详情
+export const getDeliveryPickUpStore = async (id: number) => {
+  return await request.get({ url: '/trade/delivery/pick-up-store/get?id=' + id })
+}
+
+// 查询自提门店精简列表
+export const getListAllSimple = async (): Promise<DeliveryPickUpStoreVO[]> => {
+  return await request.get({ url: '/trade/delivery/pick-up-store/list-all-simple' })
+}
+
+// 新增自提门店
+export const createDeliveryPickUpStore = async (data: DeliveryPickUpStoreVO) => {
+  return await request.post({ url: '/trade/delivery/pick-up-store/create', data })
+}
+
+// 修改自提门店
+export const updateDeliveryPickUpStore = async (data: DeliveryPickUpStoreVO) => {
+  return await request.put({ url: '/trade/delivery/pick-up-store/update', data })
+}
+
+// 删除自提门店
+export const deleteDeliveryPickUpStore = async (id: number) => {
+  return await request.delete({ url: '/trade/delivery/pick-up-store/delete?id=' + id })
+}

+ 188 - 0
src/api/mall/trade/order/index.ts

@@ -0,0 +1,188 @@
+import request from '@/config/axios'
+
+export interface OrderVO {
+  // ========== 订单基本信息 ==========
+  id?: number | null // 订单编号
+  no?: string // 订单流水号
+  createTime?: Date | null // 下单时间
+  type?: number | null // 订单类型
+  terminal?: number | null // 订单来源
+  userId?: number | null // 用户编号
+  userIp?: string // 用户 IP
+  userRemark?: string // 用户备注
+  status?: number | null // 订单状态
+  productCount?: number | null // 购买的商品数量
+  finishTime?: Date | null // 订单完成时间
+  cancelTime?: Date | null // 订单取消时间
+  cancelType?: number | null // 取消类型
+  remark?: string // 商家备注
+
+  // ========== 价格 + 支付基本信息 ==========
+  payOrderId?: number | null // 支付订单编号
+  payStatus?: boolean // 是否已支付
+  payTime?: Date | null // 付款时间
+  payChannelCode?: string // 支付渠道
+  totalPrice?: number | null // 商品原价(总)
+  discountPrice?: number | null // 订单优惠(总)
+  deliveryPrice?: number | null // 运费金额
+  adjustPrice?: number | null // 订单调价(总)
+  payPrice?: number | null // 应付金额(总)
+  // ========== 收件 + 物流基本信息 ==========
+  deliveryType?: number | null // 发货方式
+  pickUpStoreId?: number // 自提门店编号
+  pickUpVerifyCode?: string // 自提核销码
+  deliveryTemplateId?: number | null // 配送模板编号
+  logisticsId?: number | null // 发货物流公司编号
+  logisticsNo?: string // 发货物流单号
+  deliveryTime?: Date | null // 发货时间
+  receiveTime?: Date | null // 收货时间
+  receiverName?: string // 收件人名称
+  receiverMobile?: string // 收件人手机
+  receiverPostCode?: number | null // 收件人邮编
+  receiverAreaId?: number | null // 收件人地区编号
+  receiverAreaName?: string //收件人地区名字
+  receiverDetailAddress?: string // 收件人详细地址
+
+  // ========== 售后基本信息 ==========
+  afterSaleStatus?: number | null // 售后状态
+  refundPrice?: number | null // 退款金额
+
+  // ========== 营销基本信息 ==========
+  couponId?: number | null // 优惠劵编号
+  couponPrice?: number | null // 优惠劵减免金额
+  pointPrice?: number | null // 积分抵扣的金额
+  vipPrice?: number | null // VIP 减免金额
+
+  items?: OrderItemRespVO[] // 订单项列表
+  // 下单用户信息
+  user?: {
+    id?: number | null
+    nickname?: string
+    avatar?: string
+  }
+  // 推广用户信息
+  brokerageUser?: {
+    id?: number | null
+    nickname?: string
+    avatar?: string
+  }
+  // 订单操作日志
+  logs?: OrderLogRespVO[]
+}
+
+export interface OrderLogRespVO {
+  content?: string
+  createTime?: Date
+  userType?: number
+}
+
+export interface OrderItemRespVO {
+  // ========== 订单项基本信息 ==========
+  id?: number | null // 编号
+  userId?: number | null // 用户编号
+  orderId?: number | null // 订单编号
+  // ========== 商品基本信息 ==========
+  spuId?: number | null // 商品 SPU 编号
+  spuName?: string //商品 SPU 名称
+  skuId?: number | null // 商品 SKU 编号
+  picUrl?: string //商品图片
+  count?: number | null //购买数量
+  // ========== 价格 + 支付基本信息 ==========
+  originalPrice?: number | null //商品原价(总)
+  originalUnitPrice?: number | null //商品原价(单)
+  discountPrice?: number | null //商品优惠(总)
+  payPrice?: number | null //商品实付金额(总)
+  orderPartPrice?: number | null //子订单分摊金额(总)
+  orderDividePrice?: number | null //分摊后子订单实付金额(总)
+  // ========== 营销基本信息 ==========
+  // TODO 芋艿:在捉摸一下
+  // ========== 售后基本信息 ==========
+  afterSaleStatus?: number | null // 售后状态
+  properties?: ProductPropertiesVO[] //属性数组
+}
+
+export interface ProductPropertiesVO {
+  propertyId?: number | null // 属性的编号
+  propertyName?: string // 属性的名称
+  valueId?: number | null //属性值的编号
+  valueName?: string // 属性值的名称
+}
+
+/** 交易订单统计 */
+export interface TradeOrderSummaryRespVO {
+  /** 订单数量 */
+  orderCount?: number
+  /** 订单金额 */
+  orderPayPrice?: string
+  /** 退款单数 */
+  afterSaleCount?: number
+  /** 退款金额 */
+  afterSalePrice?: string
+}
+
+// 查询交易订单列表
+export const getOrderPage = async (params: any) => {
+  return await request.get({ url: `/trade/order/page`, params })
+}
+
+// 查询交易订单统计
+export const getOrderSummary = async (params: any) => {
+  return await request.get<TradeOrderSummaryRespVO>({ url: `/trade/order/summary`, params })
+}
+
+// 查询交易订单详情
+export const getOrder = async (id: number | null) => {
+  return await request.get({ url: `/trade/order/get-detail?id=` + id })
+}
+
+// 查询交易订单物流详情
+export const getExpressTrackList = async (id: number | null) => {
+  return await request.get({ url: `/trade/order/get-express-track-list?id=` + id })
+}
+
+export interface DeliveryVO {
+  id?: number // 订单编号
+  logisticsId: number | null // 物流公司编号
+  logisticsNo: string // 物流编号
+}
+
+// 订单发货
+export const deliveryOrder = async (data: DeliveryVO) => {
+  return await request.put({ url: `/trade/order/delivery`, data })
+}
+
+// 订单备注
+export const updateOrderRemark = async (data: any) => {
+  return await request.put({ url: `/trade/order/update-remark`, data })
+}
+
+// 订单调价
+export const updateOrderPrice = async (data: any) => {
+  return await request.put({ url: `/trade/order/update-price`, data })
+}
+
+// 修改订单地址
+export const updateOrderAddress = async (data: any) => {
+  return await request.put({ url: `/trade/order/update-address`, data })
+}
+
+// 订单核销
+export const pickUpOrder = async (id: number) => {
+  return await request.put({ url: `/trade/order/pick-up-by-id?id=${id}` })
+}
+
+// 订单核销
+export const pickUpOrderByVerifyCode = async (pickUpVerifyCode: string) => {
+  return await request.put({
+    url: `/trade/order/pick-up-by-verify-code`,
+    params: { pickUpVerifyCode }
+  })
+}
+
+// 查询核销码对应的订单
+export const getOrderByPickUpVerifyCode = async (pickUpVerifyCode: string) => {
+  return await request.get<OrderVO>({
+    url: `/trade/order/get-by-pick-up-verify-code`,
+    params: { pickUpVerifyCode }
+  })
+}

Some files were not shown because too many files changed in this diff