zhengnaiwen_citu 1 ano atrás
pai
commit
2784b3fe87
100 arquivos alterados com 5679 adições e 26 exclusões
  1. 27 26
      src/App.vue
  2. 8 0
      src/api/bpm/activity/index.ts
  3. 43 0
      src/api/bpm/category/index.ts
  4. 22 0
      src/api/bpm/definition/index.ts
  5. 56 0
      src/api/bpm/form/index.ts
  6. 27 0
      src/api/bpm/leave/index.ts
  7. 59 0
      src/api/bpm/model/index.ts
  8. 42 0
      src/api/bpm/processExpression/index.ts
  9. 68 0
      src/api/bpm/processInstance/index.ts
  10. 40 0
      src/api/bpm/processListener/index.ts
  11. 66 0
      src/api/bpm/task/index.ts
  12. 47 0
      src/api/bpm/userGroup/index.ts
  13. 98 0
      src/api/crm/business/index.ts
  14. 68 0
      src/api/crm/business/status/index.ts
  15. 78 0
      src/api/crm/clue/index.ts
  16. 113 0
      src/api/crm/contact/index.ts
  17. 16 0
      src/api/crm/contract/config/index.ts
  18. 114 0
      src/api/crm/contract/index.ts
  19. 132 0
      src/api/crm/customer/index.ts
  20. 49 0
      src/api/crm/customer/limitConfig/index.ts
  21. 19 0
      src/api/crm/customer/poolConfig/index.ts
  22. 43 0
      src/api/crm/followup/index.ts
  23. 11 0
      src/api/crm/operateLog/index.ts
  24. 72 0
      src/api/crm/permission/index.ts
  25. 33 0
      src/api/crm/product/category/index.ts
  26. 49 0
      src/api/crm/product/index.ts
  27. 73 0
      src/api/crm/receivable/index.ts
  28. 74 0
      src/api/crm/receivable/plan/index.ts
  29. 168 0
      src/api/crm/statistics/customer.ts
  30. 58 0
      src/api/crm/statistics/funnel.ts
  31. 33 0
      src/api/crm/statistics/performance.ts
  32. 60 0
      src/api/crm/statistics/portrait.ts
  33. 67 0
      src/api/crm/statistics/rank.ts
  34. 61 0
      src/api/erp/finance/account/index.ts
  35. 61 0
      src/api/erp/finance/payment/index.ts
  36. 61 0
      src/api/erp/finance/receipt/index.ts
  37. 49 0
      src/api/erp/product/category/index.ts
  38. 57 0
      src/api/erp/product/product/index.ts
  39. 46 0
      src/api/erp/product/unit/index.ts
  40. 64 0
      src/api/erp/purchase/in/index.ts
  41. 64 0
      src/api/erp/purchase/order/index.ts
  42. 62 0
      src/api/erp/purchase/return/index.ts
  43. 58 0
      src/api/erp/purchase/supplier/index.ts
  44. 58 0
      src/api/erp/sale/customer/index.ts
  45. 64 0
      src/api/erp/sale/order/index.ts
  46. 62 0
      src/api/erp/sale/out/index.ts
  47. 62 0
      src/api/erp/sale/return/index.ts
  48. 28 0
      src/api/erp/statistics/purchase/index.ts
  49. 28 0
      src/api/erp/statistics/sale/index.ts
  50. 61 0
      src/api/erp/stock/check/index.ts
  51. 62 0
      src/api/erp/stock/in/index.ts
  52. 61 0
      src/api/erp/stock/move/index.ts
  53. 62 0
      src/api/erp/stock/out/index.ts
  54. 32 0
      src/api/erp/stock/record/index.ts
  55. 41 0
      src/api/erp/stock/stock/index.ts
  56. 64 0
      src/api/erp/stock/warehouse/index.ts
  57. 34 0
      src/api/infra/apiAccessLog/index.ts
  58. 48 0
      src/api/infra/apiErrorLog/index.ts
  59. 122 0
      src/api/infra/codegen/index.ts
  60. 48 0
      src/api/infra/config/index.ts
  61. 35 0
      src/api/infra/dataSourceConfig/index.ts
  62. 40 0
      src/api/infra/demo/demo01/index.ts
  63. 37 0
      src/api/infra/demo/demo02/index.ts
  64. 91 0
      src/api/infra/demo/demo03/erp/index.ts
  65. 57 0
      src/api/infra/demo/demo03/inner/index.ts
  66. 57 0
      src/api/infra/demo/demo03/normal/index.ts
  67. 45 0
      src/api/infra/file/index.ts
  68. 61 0
      src/api/infra/fileConfig/index.ts
  69. 63 0
      src/api/infra/job/index.ts
  70. 33 0
      src/api/infra/jobLog/index.ts
  71. 8 0
      src/api/infra/redis/index.ts
  72. 176 0
      src/api/infra/redis/types.ts
  73. 37 0
      src/api/mall/market/banner/index.ts
  74. 61 0
      src/api/mall/product/brand.ts
  75. 56 0
      src/api/mall/product/category.ts
  76. 49 0
      src/api/mall/product/comment.ts
  77. 12 0
      src/api/mall/product/favorite.ts
  78. 93 0
      src/api/mall/product/property.ts
  79. 109 0
      src/api/mall/product/spu.ts
  80. 42 0
      src/api/mall/promotion/article/index.ts
  81. 39 0
      src/api/mall/promotion/articleCategory/index.ts
  82. 68 0
      src/api/mall/promotion/bargain/bargainActivity.ts
  83. 14 0
      src/api/mall/promotion/bargain/bargainHelp.ts
  84. 19 0
      src/api/mall/promotion/bargain/bargainRecord.ts
  85. 66 0
      src/api/mall/promotion/combination/combinationActivity.ts
  86. 28 0
      src/api/mall/promotion/combination/combinationRecord.ts
  87. 26 0
      src/api/mall/promotion/coupon/coupon.ts
  88. 90 0
      src/api/mall/promotion/coupon/couponTemplate.ts
  89. 60 0
      src/api/mall/promotion/discount/discountActivity.ts
  90. 45 0
      src/api/mall/promotion/diy/page.ts
  91. 58 0
      src/api/mall/promotion/diy/template.ts
  92. 48 0
      src/api/mall/promotion/reward/rewardActivity.ts
  93. 68 0
      src/api/mall/promotion/seckill/seckillActivity.ts
  94. 49 0
      src/api/mall/promotion/seckill/seckillConfig.ts
  95. 5 0
      src/api/mall/statistics/common.ts
  96. 123 0
      src/api/mall/statistics/member.ts
  97. 12 0
      src/api/mall/statistics/pay.ts
  98. 52 0
      src/api/mall/statistics/product.ts
  99. 119 0
      src/api/mall/statistics/trade.ts
  100. 75 0
      src/api/mall/trade/afterSale/index.ts

+ 27 - 26
src/App.vue

@@ -1,34 +1,35 @@
 <script lang="ts" setup>
-import { isDark } from '@/utils/is'
-import { useAppStore } from '@/store/modules/app'
-import { useDesign } from '@/hooks/web/useDesign'
-import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
-import routerSearch from '@/components/RouterSearch/index.vue'
-
-defineOptions({ name: 'APP' })
-
-const { getPrefixCls } = useDesign()
-const prefixCls = getPrefixCls('app')
-const appStore = useAppStore()
-const currentSize = computed(() => appStore.getCurrentSize)
-const greyMode = computed(() => appStore.getGreyMode)
-const { wsCache } = useCache()
-
-// 根据浏览器当前主题设置系统主题色
-const setDefaultTheme = () => {
-  let isDarkTheme = wsCache.get(CACHE_KEY.IS_DARK)
-  if (isDarkTheme === null) {
-    isDarkTheme = isDark()
-  }
-  appStore.setIsDark(isDarkTheme)
-}
-setDefaultTheme()
+// import { isDark } from '@/utils/is'
+// import { useAppStore } from '@/store/modules/app'
+// import { useDesign } from '@/hooks/web/useDesign'
+// import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
+// // import routerSearch from '@/components/RouterSearch/index.vue'
+
+// defineOptions({ name: 'APP' })
+
+// const { getPrefixCls } = useDesign()
+// const prefixCls = getPrefixCls('app')
+// const appStore = useAppStore()
+// const currentSize = computed(() => appStore.getCurrentSize)
+// const greyMode = computed(() => appStore.getGreyMode)
+// const { wsCache } = useCache()
+
+// // 根据浏览器当前主题设置系统主题色
+// const setDefaultTheme = () => {
+//   let isDarkTheme = wsCache.get(CACHE_KEY.IS_DARK)
+//   if (isDarkTheme === null) {
+//     isDarkTheme = isDark()
+//   }
+//   appStore.setIsDark(isDarkTheme)
+// }
+// setDefaultTheme()
 </script>
 <template>
-  <ConfigGlobal :size="currentSize">
+  <div></div>
+  <!-- <ConfigGlobal :size="currentSize">
     <RouterView :class="greyMode ? `${prefixCls}-grey-mode` : ''" />
     <routerSearch />
-  </ConfigGlobal>
+  </ConfigGlobal> -->
 </template>
 <style lang="scss">
 $prefix-cls: #{$namespace}-app;

+ 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
+  })
+}

+ 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'
+  })
+}

+ 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' })
+}

+ 168 - 0
src/api/crm/statistics/customer.ts

@@ -0,0 +1,168 @@
+import request from '@/config/axios'
+
+export interface CrmStatisticsCustomerSummaryByDateRespVO {
+  time: string
+  customerCreateCount: number
+  customerDealCount: number
+}
+
+export interface CrmStatisticsCustomerSummaryByUserRespVO {
+  ownerUserName: string
+  customerCreateCount: number
+  customerDealCount: number
+  contractPrice: number
+  receivablePrice: number
+}
+
+export interface CrmStatisticsFollowUpSummaryByDateRespVO {
+  time: string
+  followUpRecordCount: number
+  followUpCustomerCount: number
+}
+
+export interface CrmStatisticsFollowUpSummaryByUserRespVO {
+  ownerUserName: string
+  followupRecordCount: number
+  followupCustomerCount: number
+}
+
+export interface CrmStatisticsFollowUpSummaryByTypeRespVO {
+  followUpType: string
+  followUpRecordCount: number
+}
+
+export interface CrmStatisticsCustomerContractSummaryRespVO {
+  customerName: string
+  contractName: string
+  totalPrice: number
+  receivablePrice: number
+  customerType: string
+  customerSource: string
+  ownerUserName: string
+  creatorUserName: string
+  createTime: Date
+  orderDate: Date
+}
+
+export interface CrmStatisticsPoolSummaryByDateRespVO {
+  time: string
+  customerPutCount: number
+  customerTakeCount: number
+}
+
+export interface CrmStatisticsPoolSummaryByUserRespVO {
+  ownerUserName: string
+  customerPutCount: number
+  customerTakeCount: number
+}
+
+export interface CrmStatisticsCustomerDealCycleByDateRespVO {
+  time: string
+  customerDealCycle: number
+}
+
+export interface CrmStatisticsCustomerDealCycleByUserRespVO {
+  ownerUserName: string
+  customerDealCycle: number
+  customerDealCount: number
+}
+
+export interface CrmStatisticsCustomerDealCycleByAreaRespVO {
+  areaName: string
+  customerDealCycle: number
+  customerDealCount: number
+}
+
+export interface CrmStatisticsCustomerDealCycleByProductRespVO {
+  productName: string
+  customerDealCycle: number
+  customerDealCount: number
+}
+
+// 客户分析 API
+export const StatisticsCustomerApi = {
+  // 1.1 客户总量分析(按日期)
+  getCustomerSummaryByDate: (params: any) => {
+    return request.get({
+      url: '/crm/statistics-customer/get-customer-summary-by-date',
+      params
+    })
+  },
+  // 1.2 客户总量分析(按用户)
+  getCustomerSummaryByUser: (params: any) => {
+    return request.get({
+      url: '/crm/statistics-customer/get-customer-summary-by-user',
+      params
+    })
+  },
+  // 2.1 客户跟进次数分析(按日期)
+  getFollowUpSummaryByDate: (params: any) => {
+    return request.get({
+      url: '/crm/statistics-customer/get-follow-up-summary-by-date',
+      params
+    })
+  },
+  // 2.2 客户跟进次数分析(按用户)
+  getFollowUpSummaryByUser: (params: any) => {
+    return request.get({
+      url: '/crm/statistics-customer/get-follow-up-summary-by-user',
+      params
+    })
+  },
+  // 3.1 获取客户跟进方式统计数
+  getFollowUpSummaryByType: (params: any) => {
+    return request.get({
+      url: '/crm/statistics-customer/get-follow-up-summary-by-type',
+      params
+    })
+  },
+  // 4.1 合同摘要信息(客户转化率页面)
+  getContractSummary: (params: any) => {
+    return request.get({
+      url: '/crm/statistics-customer/get-contract-summary',
+      params
+    })
+  },
+  // 5.1 获取客户公海分析(按日期)
+  getPoolSummaryByDate: (param: any) => {
+    return request.get({
+      url: '/crm/statistics-customer/get-pool-summary-by-date',
+      params: param
+    })
+  },
+  // 5.2 获取客户公海分析(按用户)
+  getPoolSummaryByUser: (param: any) => {
+    return request.get({
+      url: '/crm/statistics-customer/get-pool-summary-by-user',
+      params: param
+    })
+  },
+  // 6.1 获取客户成交周期(按日期)
+  getCustomerDealCycleByDate: (params: any) => {
+    return request.get({
+      url: '/crm/statistics-customer/get-customer-deal-cycle-by-date',
+      params
+    })
+  },
+  // 6.2 获取客户成交周期(按用户)
+  getCustomerDealCycleByUser: (params: any) => {
+    return request.get({
+      url: '/crm/statistics-customer/get-customer-deal-cycle-by-user',
+      params
+    })
+  },
+  // 6.2 获取客户成交周期(按用户)
+  getCustomerDealCycleByArea: (params: any) => {
+    return request.get({
+      url: '/crm/statistics-customer/get-customer-deal-cycle-by-area',
+      params
+    })
+  },
+  // 6.2 获取客户成交周期(按用户)
+  getCustomerDealCycleByProduct: (params: any) => {
+    return request.get({
+      url: '/crm/statistics-customer/get-customer-deal-cycle-by-product',
+      params
+    })
+  }
+}

+ 58 - 0
src/api/crm/statistics/funnel.ts

@@ -0,0 +1,58 @@
+import request from '@/config/axios'
+
+export interface CrmStatisticFunnelRespVO {
+  customerCount: number // 客户数
+  businessCount: number // 商机数
+  businessWinCount: number // 赢单数
+}
+
+export interface CrmStatisticsBusinessSummaryByDateRespVO {
+  time: string // 时间
+  businessCreateCount: number // 商机数
+  totalPrice: number | string // 商机金额
+}
+
+export interface CrmStatisticsBusinessInversionRateSummaryByDateRespVO {
+  time: string // 时间
+  businessCount: number // 商机数量
+  businessWinCount: number // 赢单商机数
+}
+
+// 客户分析 API
+export const StatisticFunnelApi = {
+  // 1. 获取销售漏斗统计数据
+  getFunnelSummary: (params: any) => {
+    return request.get({
+      url: '/crm/statistics-funnel/get-funnel-summary',
+      params
+    })
+  },
+  // 2. 获取商机结束状态统计
+  getBusinessSummaryByEndStatus: (params: any) => {
+    return request.get({
+      url: '/crm/statistics-funnel/get-business-summary-by-end-status',
+      params
+    })
+  },
+  // 3. 获取新增商机分析(按日期)
+  getBusinessSummaryByDate: (params: any) => {
+    return request.get({
+      url: '/crm/statistics-funnel/get-business-summary-by-date',
+      params
+    })
+  },
+  // 4. 获取商机转化率分析(按日期)
+  getBusinessInversionRateSummaryByDate: (params: any) => {
+    return request.get({
+      url: '/crm/statistics-funnel/get-business-inversion-rate-summary-by-date',
+      params
+    })
+  },
+  // 5. 获取商机列表(按日期)
+  getBusinessPageByDate: (params: any) => {
+    return request.get({
+      url: '/crm/statistics-funnel/get-business-page-by-date',
+      params
+    })
+  }
+}

+ 33 - 0
src/api/crm/statistics/performance.ts

@@ -0,0 +1,33 @@
+import request from '@/config/axios'
+
+export interface StatisticsPerformanceRespVO {
+  time: string
+  currentMonthCount: number
+  lastMonthCount: number
+  lastYearCount: number
+}
+
+// 排行 API
+export const StatisticsPerformanceApi = {
+  // 员工获得合同金额统计
+  getContractPricePerformance: (params: any) => {
+    return request.get({
+      url: '/crm/statistics-performance/get-contract-price-performance',
+      params
+    })
+  },
+  // 员工获得回款统计
+  getReceivablePricePerformance: (params: any) => {
+    return request.get({
+      url: '/crm/statistics-performance/get-receivable-price-performance',
+      params
+    })
+  },
+  //员工获得签约合同数量统计
+  getContractCountPerformance: (params: any) => {
+    return request.get({
+      url: '/crm/statistics-performance/get-contract-count-performance',
+      params
+    })
+  }
+}

+ 60 - 0
src/api/crm/statistics/portrait.ts

@@ -0,0 +1,60 @@
+import request from '@/config/axios'
+
+export interface CrmStatisticCustomerBaseRespVO {
+  customerCount: number
+  dealCount: number
+  dealPortion: string | number
+}
+
+export interface CrmStatisticCustomerIndustryRespVO extends CrmStatisticCustomerBaseRespVO {
+  industryId: number
+  industryPortion: string | number
+}
+
+export interface CrmStatisticCustomerSourceRespVO extends CrmStatisticCustomerBaseRespVO {
+  source: number
+  sourcePortion: string | number
+}
+
+export interface CrmStatisticCustomerLevelRespVO extends CrmStatisticCustomerBaseRespVO {
+  level: number
+  levelPortion: string | number
+}
+
+export interface CrmStatisticCustomerAreaRespVO extends CrmStatisticCustomerBaseRespVO {
+  areaId: number
+  areaName: string
+  areaPortion: string | number
+}
+
+// 客户分析 API
+export const StatisticsPortraitApi = {
+  // 1. 获取客户行业统计数据
+  getCustomerIndustry: (params: any) => {
+    return request.get({
+      url: '/crm/statistics-portrait/get-customer-industry-summary',
+      params
+    })
+  },
+  // 2. 获取客户来源统计数据
+  getCustomerSource: (params: any) => {
+    return request.get({
+      url: '/crm/statistics-portrait/get-customer-source-summary',
+      params
+    })
+  },
+  // 3. 获取客户级别统计数据
+  getCustomerLevel: (params: any) => {
+    return request.get({
+      url: '/crm/statistics-portrait/get-customer-level-summary',
+      params
+    })
+  },
+  // 4. 获取客户地区统计数据
+  getCustomerArea: (params: any) => {
+    return request.get({
+      url: '/crm/statistics-portrait/get-customer-area-summary',
+      params
+    })
+  }
+}

+ 67 - 0
src/api/crm/statistics/rank.ts

@@ -0,0 +1,67 @@
+import request from '@/config/axios'
+
+export interface StatisticsRankRespVO {
+  count: number
+  nickname: string
+  deptName: string
+}
+
+// 排行 API
+export const StatisticsRankApi = {
+  // 获得合同排行榜
+  getContractPriceRank: (params: any) => {
+    return request.get({
+      url: '/crm/statistics-rank/get-contract-price-rank',
+      params
+    })
+  },
+  // 获得回款排行榜
+  getReceivablePriceRank: (params: any) => {
+    return request.get({
+      url: '/crm/statistics-rank/get-receivable-price-rank',
+      params
+    })
+  },
+  // 签约合同排行
+  getContractCountRank: (params: any) => {
+    return request.get({
+      url: '/crm/statistics-rank/get-contract-count-rank',
+      params
+    })
+  },
+  // 产品销量排行
+  getProductSalesRank: (params: any) => {
+    return request.get({
+      url: '/crm/statistics-rank/get-product-sales-rank',
+      params
+    })
+  },
+  // 新增客户数排行
+  getCustomerCountRank: (params: any) => {
+    return request.get({
+      url: '/crm/statistics-rank/get-customer-count-rank',
+      params
+    })
+  },
+  // 新增联系人数排行
+  getContactsCountRank: (params: any) => {
+    return request.get({
+      url: '/crm/statistics-rank/get-contacts-count-rank',
+      params
+    })
+  },
+  // 跟进次数排行
+  getFollowCountRank: (params: any) => {
+    return request.get({
+      url: '/crm/statistics-rank/get-follow-count-rank',
+      params
+    })
+  },
+  // 跟进客户数排行
+  getFollowCustomerCountRank: (params: any) => {
+    return request.get({
+      url: '/crm/statistics-rank/get-follow-customer-count-rank',
+      params
+    })
+  }
+}

+ 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 (params) => {
+    return await request.get({ url: `/erp/product-category/list`, params })
+  },
+
+  // 查询产品分类精简列表
+  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 })
+  }
+}

+ 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 (params) => {
+  return await request.get({ url: `/infra/demo02-category/list`, params })
+}
+
+// 查询示例分类详情
+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
+  })
+}

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

@@ -0,0 +1,45 @@
+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 })
+}

+ 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 })
+}

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

@@ -0,0 +1,33 @@
+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
+}
+
+// 任务日志列表
+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' })
+}

+ 176 - 0
src/api/infra/redis/types.ts

@@ -0,0 +1,176 @@
+export interface RedisMonitorInfoVO {
+  info: RedisInfoVO
+  dbSize: number
+  commandStats: RedisCommandStatsVO[]
+}
+
+export interface RedisInfoVO {
+  io_threaded_reads_processed: string
+  tracking_clients: string
+  uptime_in_seconds: string
+  cluster_connections: string
+  current_cow_size: string
+  maxmemory_human: string
+  aof_last_cow_size: string
+  master_replid2: string
+  mem_replication_backlog: string
+  aof_rewrite_scheduled: string
+  total_net_input_bytes: string
+  rss_overhead_ratio: string
+  hz: string
+  current_cow_size_age: string
+  redis_build_id: string
+  errorstat_BUSYGROUP: string
+  aof_last_bgrewrite_status: string
+  multiplexing_api: string
+  client_recent_max_output_buffer: string
+  allocator_resident: string
+  mem_fragmentation_bytes: string
+  aof_current_size: string
+  repl_backlog_first_byte_offset: string
+  tracking_total_prefixes: string
+  redis_mode: string
+  redis_git_dirty: string
+  aof_delayed_fsync: string
+  allocator_rss_bytes: string
+  repl_backlog_histlen: string
+  io_threads_active: string
+  rss_overhead_bytes: string
+  total_system_memory: string
+  loading: string
+  evicted_keys: string
+  maxclients: string
+  cluster_enabled: string
+  redis_version: string
+  repl_backlog_active: string
+  mem_aof_buffer: string
+  allocator_frag_bytes: string
+  io_threaded_writes_processed: string
+  instantaneous_ops_per_sec: string
+  used_memory_human: string
+  total_error_replies: string
+  role: string
+  maxmemory: string
+  used_memory_lua: string
+  rdb_current_bgsave_time_sec: string
+  used_memory_startup: string
+  used_cpu_sys_main_thread: string
+  lazyfree_pending_objects: string
+  aof_pending_bio_fsync: string
+  used_memory_dataset_perc: string
+  allocator_frag_ratio: string
+  arch_bits: string
+  used_cpu_user_main_thread: string
+  mem_clients_normal: string
+  expired_time_cap_reached_count: string
+  unexpected_error_replies: string
+  mem_fragmentation_ratio: string
+  aof_last_rewrite_time_sec: string
+  master_replid: string
+  aof_rewrite_in_progress: string
+  lru_clock: string
+  maxmemory_policy: string
+  run_id: string
+  latest_fork_usec: string
+  tracking_total_items: string
+  total_commands_processed: string
+  expired_keys: string
+  errorstat_ERR: string
+  used_memory: string
+  module_fork_in_progress: string
+  errorstat_WRONGPASS: string
+  aof_buffer_length: string
+  dump_payload_sanitizations: string
+  mem_clients_slaves: string
+  keyspace_misses: string
+  server_time_usec: string
+  executable: string
+  lazyfreed_objects: string
+  db0: string
+  used_memory_peak_human: string
+  keyspace_hits: string
+  rdb_last_cow_size: string
+  aof_pending_rewrite: string
+  used_memory_overhead: string
+  active_defrag_hits: string
+  tcp_port: string
+  uptime_in_days: string
+  used_memory_peak_perc: string
+  current_save_keys_processed: string
+  blocked_clients: string
+  total_reads_processed: string
+  expire_cycle_cpu_milliseconds: string
+  sync_partial_err: string
+  used_memory_scripts_human: string
+  aof_current_rewrite_time_sec: string
+  aof_enabled: string
+  process_supervised: string
+  master_repl_offset: string
+  used_memory_dataset: string
+  used_cpu_user: string
+  rdb_last_bgsave_status: string
+  tracking_total_keys: string
+  atomicvar_api: string
+  allocator_rss_ratio: string
+  client_recent_max_input_buffer: string
+  clients_in_timeout_table: string
+  aof_last_write_status: string
+  mem_allocator: string
+  used_memory_scripts: string
+  used_memory_peak: string
+  process_id: string
+  master_failover_state: string
+  errorstat_NOAUTH: string
+  used_cpu_sys: string
+  repl_backlog_size: string
+  connected_slaves: string
+  current_save_keys_total: string
+  gcc_version: string
+  total_system_memory_human: string
+  sync_full: string
+  connected_clients: string
+  module_fork_last_cow_size: string
+  total_writes_processed: string
+  allocator_active: string
+  total_net_output_bytes: string
+  pubsub_channels: string
+  current_fork_perc: string
+  active_defrag_key_hits: string
+  rdb_changes_since_last_save: string
+  instantaneous_input_kbps: string
+  used_memory_rss_human: string
+  configured_hz: string
+  expired_stale_perc: string
+  active_defrag_misses: string
+  used_cpu_sys_children: string
+  number_of_cached_scripts: string
+  sync_partial_ok: string
+  used_memory_lua_human: string
+  rdb_last_save_time: string
+  pubsub_patterns: string
+  slave_expires_tracked_keys: string
+  redis_git_sha1: string
+  used_memory_rss: string
+  rdb_last_bgsave_time_sec: string
+  os: string
+  mem_not_counted_for_evict: string
+  active_defrag_running: string
+  rejected_connections: string
+  aof_rewrite_buffer_length: string
+  total_forks: string
+  active_defrag_key_misses: string
+  allocator_allocated: string
+  aof_base_size: string
+  instantaneous_output_kbps: string
+  second_repl_offset: string
+  rdb_bgsave_in_progress: string
+  used_cpu_user_children: string
+  total_connections_received: string
+  migrate_cached_sockets: string
+}
+
+export interface RedisCommandStatsVO {
+  command: string
+  calls: number
+  usec: number
+}

+ 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 })
+}

+ 61 - 0
src/api/mall/product/brand.ts

@@ -0,0 +1,61 @@
+import request from '@/config/axios'
+
+/**
+ * 商品品牌
+ */
+export interface BrandVO {
+  /**
+   * 品牌编号
+   */
+  id?: number
+  /**
+   * 品牌名称
+   */
+  name: string
+  /**
+   * 品牌图片
+   */
+  picUrl: string
+  /**
+   * 品牌排序
+   */
+  sort?: number
+  /**
+   * 品牌描述
+   */
+  description?: string
+  /**
+   * 开启状态
+   */
+  status: number
+}
+
+// 创建商品品牌
+export const createBrand = (data: BrandVO) => {
+  return request.post({ url: '/product/brand/create', data })
+}
+
+// 更新商品品牌
+export const updateBrand = (data: BrandVO) => {
+  return request.put({ url: '/product/brand/update', data })
+}
+
+// 删除商品品牌
+export const deleteBrand = (id: number) => {
+  return request.delete({ url: `/product/brand/delete?id=${id}` })
+}
+
+// 获得商品品牌
+export const getBrand = (id: number) => {
+  return request.get({ url: `/product/brand/get?id=${id}` })
+}
+
+// 获得商品品牌列表
+export const getBrandParam = (params: PageParam) => {
+  return request.get({ url: '/product/brand/page', params })
+}
+
+// 获得商品品牌精简信息列表
+export const getSimpleBrandList = () => {
+  return request.get({ url: '/product/brand/list-all-simple' })
+}

+ 56 - 0
src/api/mall/product/category.ts

@@ -0,0 +1,56 @@
+import request from '@/config/axios'
+
+/**
+ * 产品分类
+ */
+export interface CategoryVO {
+  /**
+   * 分类编号
+   */
+  id?: number
+  /**
+   * 父分类编号
+   */
+  parentId?: number
+  /**
+   * 分类名称
+   */
+  name: string
+  /**
+   * 移动端分类图
+   */
+  picUrl: string
+  /**
+   * 分类排序
+   */
+  sort: number
+  /**
+   * 开启状态
+   */
+  status: number
+}
+
+// 创建商品分类
+export const createCategory = (data: CategoryVO) => {
+  return request.post({ url: '/product/category/create', data })
+}
+
+// 更新商品分类
+export const updateCategory = (data: CategoryVO) => {
+  return request.put({ url: '/product/category/update', data })
+}
+
+// 删除商品分类
+export const deleteCategory = (id: number) => {
+  return request.delete({ url: `/product/category/delete?id=${id}` })
+}
+
+// 获得商品分类
+export const getCategory = (id: number) => {
+  return request.get({ url: `/product/category/get?id=${id}` })
+}
+
+// 获得商品分类列表
+export const getCategoryList = (params: any) => {
+  return request.get({ url: '/product/category/list', params })
+}

+ 49 - 0
src/api/mall/product/comment.ts

@@ -0,0 +1,49 @@
+import request from '@/config/axios'
+
+export interface CommentVO {
+  id: number
+  userId: number
+  userNickname: string
+  userAvatar: string
+  anonymous: boolean
+  orderId: number
+  orderItemId: number
+  spuId: number
+  spuName: string
+  skuId: number
+  visible: boolean
+  scores: number
+  descriptionScores: number
+  benefitScores: number
+  content: string
+  picUrls: string
+  replyStatus: boolean
+  replyUserId: number
+  replyContent: string
+  replyTime: Date
+}
+
+// 查询商品评论列表
+export const getCommentPage = async (params) => {
+  return await request.get({ url: `/product/comment/page`, params })
+}
+
+// 查询商品评论详情
+export const getComment = async (id: number) => {
+  return await request.get({ url: `/product/comment/get?id=` + id })
+}
+
+// 添加自评
+export const createComment = async (data: CommentVO) => {
+  return await request.post({ url: `/product/comment/create`, data })
+}
+
+// 显示 / 隐藏评论
+export const updateCommentVisible = async (data: any) => {
+  return await request.put({ url: `/product/comment/update-visible`, data })
+}
+
+// 商家回复
+export const replyComment = async (data: any) => {
+  return await request.put({ url: `/product/comment/reply`, data })
+}

+ 12 - 0
src/api/mall/product/favorite.ts

@@ -0,0 +1,12 @@
+import request from '@/config/axios'
+
+export interface Favorite {
+  id?: number
+  userId?: string // 用户编号
+  spuId?: number | null // 商品 SPU 编号
+}
+
+// 获得 ProductFavorite 列表
+export const getFavoritePage = (params: PageParam) => {
+  return request.get({ url: '/product/favorite/page', params })
+}

+ 93 - 0
src/api/mall/product/property.ts

@@ -0,0 +1,93 @@
+import request from '@/config/axios'
+
+/**
+ * 商品属性
+ */
+export interface PropertyVO {
+  id?: number
+  /** 名称 */
+  name: string
+  /** 备注 */
+  remark?: string
+}
+
+/**
+ * 属性值
+ */
+export interface PropertyValueVO {
+  id?: number
+  /** 属性项的编号 */
+  propertyId?: number
+  /** 名称 */
+  name: string
+  /** 备注 */
+  remark?: string
+}
+
+/**
+ * 商品属性值的明细
+ */
+export interface PropertyValueDetailVO {
+  /** 属性项的编号 */
+  propertyId: number // 属性的编号
+  /** 属性的名称 */
+  propertyName: string
+  /** 属性值的编号 */
+  valueId: number
+  /** 属性值的名称 */
+  valueName: string
+}
+
+// ------------------------ 属性项 -------------------
+
+// 创建属性项
+export const createProperty = (data: PropertyVO) => {
+  return request.post({ url: '/product/property/create', data })
+}
+
+// 更新属性项
+export const updateProperty = (data: PropertyVO) => {
+  return request.put({ url: '/product/property/update', data })
+}
+
+// 删除属性项
+export const deleteProperty = (id: number) => {
+  return request.delete({ url: `/product/property/delete?id=${id}` })
+}
+
+// 获得属性项
+export const getProperty = (id: number): Promise<PropertyVO> => {
+  return request.get({ url: `/product/property/get?id=${id}` })
+}
+
+// 获得属性项分页
+export const getPropertyPage = (params: PageParam) => {
+  return request.get({ url: '/product/property/page', params })
+}
+
+// ------------------------ 属性值 -------------------
+
+// 获得属性值分页
+export const getPropertyValuePage = (params: PageParam & any) => {
+  return request.get({ url: '/product/property/value/page', params })
+}
+
+// 获得属性值
+export const getPropertyValue = (id: number): Promise<PropertyValueVO> => {
+  return request.get({ url: `/product/property/value/get?id=${id}` })
+}
+
+// 创建属性值
+export const createPropertyValue = (data: PropertyValueVO) => {
+  return request.post({ url: '/product/property/value/create', data })
+}
+
+// 更新属性值
+export const updatePropertyValue = (data: PropertyValueVO) => {
+  return request.put({ url: '/product/property/value/update', data })
+}
+
+// 删除属性值
+export const deletePropertyValue = (id: number) => {
+  return request.delete({ url: `/product/property/value/delete?id=${id}` })
+}

+ 109 - 0
src/api/mall/product/spu.ts

@@ -0,0 +1,109 @@
+import request from '@/config/axios'
+
+export interface Property {
+  propertyId?: number // 属性编号
+  propertyName?: string // 属性名称
+  valueId?: number // 属性值编号
+  valueName?: string // 属性值名称
+}
+
+export interface Sku {
+  id?: number // 商品 SKU 编号
+  name?: string // 商品 SKU 名称
+  spuId?: number // SPU 编号
+  properties?: Property[] // 属性数组
+  price?: number | string // 商品价格
+  marketPrice?: number | string // 市场价
+  costPrice?: number | string // 成本价
+  barCode?: string // 商品条码
+  picUrl?: string // 图片地址
+  stock?: number // 库存
+  weight?: number // 商品重量,单位:kg 千克
+  volume?: number // 商品体积,单位:m^3 平米
+  firstBrokeragePrice?: number | string // 一级分销的佣金
+  secondBrokeragePrice?: number | string // 二级分销的佣金
+  salesCount?: number // 商品销量
+}
+
+export interface GiveCouponTemplate {
+  id?: number
+  name?: string // 优惠券名称
+}
+
+export interface Spu {
+  id?: number
+  name?: string // 商品名称
+  categoryId?: number // 商品分类
+  keyword?: string // 关键字
+  unit?: number | undefined // 单位
+  picUrl?: string // 商品封面图
+  sliderPicUrls?: string[] // 商品轮播图
+  introduction?: string // 商品简介
+  deliveryTypes?: number[] // 配送方式
+  deliveryTemplateId?: number | undefined // 运费模版
+  brandId?: number // 商品品牌编号
+  specType?: boolean // 商品规格
+  subCommissionType?: boolean // 分销类型
+  skus?: Sku[] // sku数组
+  description?: string // 商品详情
+  sort?: number // 商品排序
+  giveIntegral?: number // 赠送积分
+  virtualSalesCount?: number // 虚拟销量
+  price?: number // 商品价格
+  salesCount?: number // 商品销量
+  marketPrice?: number // 市场价
+  costPrice?: number // 成本价
+  stock?: number // 商品库存
+  createTime?: Date // 商品创建时间
+  status?: number // 商品状态
+}
+
+// 获得 Spu 列表
+export const getSpuPage = (params: PageParam) => {
+  return request.get({ url: '/product/spu/page', params })
+}
+
+// 获得 Spu 列表 tabsCount
+export const getTabsCount = () => {
+  return request.get({ url: '/product/spu/get-count' })
+}
+
+// 创建商品 Spu
+export const createSpu = (data: Spu) => {
+  return request.post({ url: '/product/spu/create', data })
+}
+
+// 更新商品 Spu
+export const updateSpu = (data: Spu) => {
+  return request.put({ url: '/product/spu/update', data })
+}
+
+// 更新商品 Spu status
+export const updateStatus = (data: { id: number; status: number }) => {
+  return request.put({ url: '/product/spu/update-status', data })
+}
+
+// 获得商品 Spu
+export const getSpu = (id: number) => {
+  return request.get({ url: `/product/spu/get-detail?id=${id}` })
+}
+
+// 获得商品 Spu 详情列表
+export const getSpuDetailList = (ids: number[]) => {
+  return request.get({ url: `/product/spu/list?spuIds=${ids}` })
+}
+
+// 删除商品 Spu
+export const deleteSpu = (id: number) => {
+  return request.delete({ url: `/product/spu/delete?id=${id}` })
+}
+
+// 导出商品 Spu Excel
+export const exportSpu = async (params) => {
+  return await request.download({ url: '/product/spu/export', params })
+}
+
+// 获得商品 SPU 精简列表
+export const getSpuSimpleList = async () => {
+  return request.get({ url: '/product/spu/list-all-simple' })
+}

+ 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 })
+}

+ 68 - 0
src/api/mall/promotion/bargain/bargainActivity.ts

@@ -0,0 +1,68 @@
+import request from '@/config/axios'
+import { Sku, Spu } from '@/api/mall/product/spu'
+
+export interface BargainActivityVO {
+  id?: number
+  name?: string
+  startTime?: Date
+  endTime?: Date
+  status?: number
+  helpMaxCount?: number // 达到该人数,才能砍到低价
+  bargainCount?: number // 最大帮砍次数
+  totalLimitCount?: number // 最大购买次数
+  spuId: number
+  skuId: number
+  bargainFirstPrice: number // 砍价起始价格,单位分
+  bargainMinPrice: number // 砍价底价
+  stock: number // 活动库存
+  randomMinPrice?: number // 用户每次砍价的最小金额,单位:分
+  randomMaxPrice?: number // 用户每次砍价的最大金额,单位:分
+}
+
+// 砍价活动所需属性。选择的商品和属性的时候使用方便使用活动的通用封装
+export interface BargainProductVO {
+  spuId: number
+  skuId: number
+  bargainFirstPrice: number // 砍价起始价格,单位分
+  bargainMinPrice: number // 砍价底价
+  stock: number // 活动库存
+}
+
+// 扩展 Sku 配置
+export type SkuExtension = Sku & {
+  productConfig: BargainProductVO
+}
+
+export interface SpuExtension extends Spu {
+  skus: SkuExtension[] // 重写类型
+}
+
+// 查询砍价活动列表
+export const getBargainActivityPage = async (params: any) => {
+  return await request.get({ url: '/promotion/bargain-activity/page', params })
+}
+
+// 查询砍价活动详情
+export const getBargainActivity = async (id: number) => {
+  return await request.get({ url: '/promotion/bargain-activity/get?id=' + id })
+}
+
+// 新增砍价活动
+export const createBargainActivity = async (data: BargainActivityVO) => {
+  return await request.post({ url: '/promotion/bargain-activity/create', data })
+}
+
+// 修改砍价活动
+export const updateBargainActivity = async (data: BargainActivityVO) => {
+  return await request.put({ url: '/promotion/bargain-activity/update', data })
+}
+
+// 关闭砍价活动
+export const closeBargainActivity = async (id: number) => {
+  return await request.put({ url: '/promotion/bargain-activity/close?id=' + id })
+}
+
+// 删除砍价活动
+export const deleteBargainActivity = async (id: number) => {
+  return await request.delete({ url: '/promotion/bargain-activity/delete?id=' + id })
+}

+ 14 - 0
src/api/mall/promotion/bargain/bargainHelp.ts

@@ -0,0 +1,14 @@
+import request from '@/config/axios'
+
+export interface BargainHelpVO {
+  id: number
+  record: number
+  userId: number
+  reducePrice: number
+  endTime: Date
+}
+
+// 查询砍价记录列表
+export const getBargainHelpPage = async (params) => {
+  return await request.get({ url: `/promotion/bargain-help/page`, params })
+}

+ 19 - 0
src/api/mall/promotion/bargain/bargainRecord.ts

@@ -0,0 +1,19 @@
+import request from '@/config/axios'
+
+export interface BargainRecordVO {
+  id: number
+  activityId: number
+  userId: number
+  spuId: number
+  skuId: number
+  bargainFirstPrice: number
+  bargainPrice: number
+  status: number
+  orderId: number
+  endTime: Date
+}
+
+// 查询砍价记录列表
+export const getBargainRecordPage = async (params) => {
+  return await request.get({ url: `/promotion/bargain-record/page`, params })
+}

+ 66 - 0
src/api/mall/promotion/combination/combinationActivity.ts

@@ -0,0 +1,66 @@
+import request from '@/config/axios'
+import { Sku, Spu } from '@/api/mall/product/spu'
+
+export interface CombinationActivityVO {
+  id?: number
+  name?: string
+  spuId?: number
+  totalLimitCount?: number
+  singleLimitCount?: number
+  startTime?: Date
+  endTime?: Date
+  userSize?: number
+  totalCount?: number
+  successCount?: number
+  orderUserCount?: number
+  virtualGroup?: number
+  status?: number
+  limitDuration?: number
+  products: CombinationProductVO[]
+}
+
+// 拼团活动所需属性
+export interface CombinationProductVO {
+  spuId: number
+  skuId: number
+  combinationPrice: number // 拼团价格
+}
+
+// 扩展 Sku 配置
+export type SkuExtension = Sku & {
+  productConfig: CombinationProductVO
+}
+
+export interface SpuExtension extends Spu {
+  skus: SkuExtension[] // 重写类型
+}
+
+// 查询拼团活动列表
+export const getCombinationActivityPage = async (params) => {
+  return await request.get({ url: '/promotion/combination-activity/page', params })
+}
+
+// 查询拼团活动详情
+export const getCombinationActivity = async (id: number) => {
+  return await request.get({ url: '/promotion/combination-activity/get?id=' + id })
+}
+
+// 新增拼团活动
+export const createCombinationActivity = async (data: CombinationActivityVO) => {
+  return await request.post({ url: '/promotion/combination-activity/create', data })
+}
+
+// 修改拼团活动
+export const updateCombinationActivity = async (data: CombinationActivityVO) => {
+  return await request.put({ url: '/promotion/combination-activity/update', data })
+}
+
+// 关闭拼团活动
+export const closeCombinationActivity = async (id: number) => {
+  return await request.put({ url: '/promotion/combination-activity/close?id=' + id })
+}
+
+// 删除拼团活动
+export const deleteCombinationActivity = async (id: number) => {
+  return await request.delete({ url: '/promotion/combination-activity/delete?id=' + id })
+}

+ 28 - 0
src/api/mall/promotion/combination/combinationRecord.ts

@@ -0,0 +1,28 @@
+import request from '@/config/axios'
+
+export interface CombinationRecordVO {
+  id: number // 拼团记录编号
+  activityId: number // 拼团活动编号
+  nickname: string // 用户昵称
+  avatar: string // 用户头像
+  headId: number // 团长编号
+  expireTime: string // 过期时间
+  userSize: number // 可参团人数
+  userCount: number // 已参团人数
+  status: number // 拼团状态
+  spuName: string // 商品名字
+  picUrl: string // 商品图片
+  virtualGroup: boolean // 是否虚拟成团
+  startTime: string // 开始时间 (订单付款后开始的时间)
+  endTime: string // 结束时间(成团时间/失败时间)
+}
+
+// 查询拼团记录列表
+export const getCombinationRecordPage = async (params: any) => {
+  return await request.get({ url: '/promotion/combination-record/page', params })
+}
+
+// 获得拼团记录的概要信息
+export const getCombinationRecordSummary = async () => {
+  return await request.get({ url: '/promotion/combination-record/get-summary' })
+}

+ 26 - 0
src/api/mall/promotion/coupon/coupon.ts

@@ -0,0 +1,26 @@
+import request from '@/config/axios'
+
+// TODO @dhb52:vo 缺少
+
+// 删除优惠劵
+export const deleteCoupon = async (id: number) => {
+  return request.delete({
+    url: `/promotion/coupon/delete?id=${id}`
+  })
+}
+
+// 获得优惠劵分页
+export const getCouponPage = async (params: PageParam) => {
+  return request.get({
+    url: '/promotion/coupon/page',
+    params: params
+  })
+}
+
+// 发送优惠券
+export const sendCoupon = async (data: any) => {
+  return request.post({
+    url: '/promotion/coupon/send',
+    data: data
+  })
+}

+ 90 - 0
src/api/mall/promotion/coupon/couponTemplate.ts

@@ -0,0 +1,90 @@
+import request from '@/config/axios'
+
+export interface CouponTemplateVO {
+  id: number
+  name: string
+  status: number
+  totalCount: number
+  takeLimitCount: number
+  takeType: number
+  usePrice: number
+  productScope: number
+  productScopeValues: number[]
+  validityType: number
+  validStartTime: Date
+  validEndTime: Date
+  fixedStartTerm: number
+  fixedEndTerm: number
+  discountType: number
+  discountPercent: number
+  discountPrice: number
+  discountLimitPrice: number
+  takeCount: number
+  useCount: number
+}
+
+// 创建优惠劵模板
+export function createCouponTemplate(data: CouponTemplateVO) {
+  return request.post({
+    url: '/promotion/coupon-template/create',
+    data: data
+  })
+}
+
+// 更新优惠劵模板
+export function updateCouponTemplate(data: CouponTemplateVO) {
+  return request.put({
+    url: '/promotion/coupon-template/update',
+    data: data
+  })
+}
+
+// 更新优惠劵模板的状态
+export function updateCouponTemplateStatus(id: number, status: [0, 1]) {
+  const data = {
+    id,
+    status
+  }
+  return request.put({
+    url: '/promotion/coupon-template/update-status',
+    data: data
+  })
+}
+
+// 删除优惠劵模板
+export function deleteCouponTemplate(id: number) {
+  return request.delete({
+    url: '/promotion/coupon-template/delete?id=' + id
+  })
+}
+
+// 获得优惠劵模板
+export function getCouponTemplate(id: number) {
+  return request.get({
+    url: '/promotion/coupon-template/get?id=' + id
+  })
+}
+
+// 获得优惠劵模板分页
+export function getCouponTemplatePage(params: PageParam) {
+  return request.get({
+    url: '/promotion/coupon-template/page',
+    params: params
+  })
+}
+
+// 获得优惠劵模板分页
+export function getCouponTemplateList(ids: number[]) {
+  return request.get({
+    url: `/promotion/coupon-template/list?ids=${ids}`
+  })
+}
+
+// 导出优惠劵模板 Excel
+export function exportCouponTemplateExcel(params: PageParam) {
+  return request.get({
+    url: '/promotion/coupon-template/export-excel',
+    params: params,
+    responseType: 'blob'
+  })
+}

+ 60 - 0
src/api/mall/promotion/discount/discountActivity.ts

@@ -0,0 +1,60 @@
+import request from '@/config/axios'
+import { Sku, Spu } from '@/api/mall/product/spu'
+
+export interface DiscountActivityVO {
+  id?: number
+  spuId?: number
+  name?: string
+  status?: number
+  remark?: string
+  startTime?: Date
+  endTime?: Date
+  products?: DiscountProductVO[]
+}
+// 限时折扣相关 属性
+export interface DiscountProductVO {
+  spuId: number
+  skuId: number
+  discountType: number
+  discountPercent: number
+  discountPrice: number
+}
+
+// 扩展 Sku 配置
+export type SkuExtension = Sku & {
+  productConfig: DiscountProductVO
+}
+
+export interface SpuExtension extends Spu {
+  skus: SkuExtension[] // 重写类型
+}
+
+// 查询限时折扣活动列表
+export const getDiscountActivityPage = async (params) => {
+  return await request.get({ url: '/promotion/discount-activity/page', params })
+}
+
+// 查询限时折扣活动详情
+export const getDiscountActivity = async (id: number) => {
+  return await request.get({ url: '/promotion/discount-activity/get?id=' + id })
+}
+
+// 新增限时折扣活动
+export const createDiscountActivity = async (data: DiscountActivityVO) => {
+  return await request.post({ url: '/promotion/discount-activity/create', data })
+}
+
+// 修改限时折扣活动
+export const updateDiscountActivity = async (data: DiscountActivityVO) => {
+  return await request.put({ url: '/promotion/discount-activity/update', data })
+}
+
+// 关闭限时折扣活动
+export const closeDiscountActivity = async (id: number) => {
+  return await request.put({ url: '/promotion/discount-activity/close?id=' + id })
+}
+
+// 删除限时折扣活动
+export const deleteDiscountActivity = async (id: number) => {
+  return await request.delete({ url: '/promotion/discount-activity/delete?id=' + id })
+}

+ 45 - 0
src/api/mall/promotion/diy/page.ts

@@ -0,0 +1,45 @@
+import request from '@/config/axios'
+
+export interface DiyPageVO {
+  id?: number
+  templateId?: number
+  name: string
+  remark: string
+  previewPicUrls: string[]
+  property: string
+}
+
+// 查询装修页面列表
+export const getDiyPagePage = async (params: any) => {
+  return await request.get({ url: `/promotion/diy-page/page`, params })
+}
+
+// 查询装修页面详情
+export const getDiyPage = async (id: number) => {
+  return await request.get({ url: `/promotion/diy-page/get?id=` + id })
+}
+
+// 新增装修页面
+export const createDiyPage = async (data: DiyPageVO) => {
+  return await request.post({ url: `/promotion/diy-page/create`, data })
+}
+
+// 修改装修页面
+export const updateDiyPage = async (data: DiyPageVO) => {
+  return await request.put({ url: `/promotion/diy-page/update`, data })
+}
+
+// 删除装修页面
+export const deleteDiyPage = async (id: number) => {
+  return await request.delete({ url: `/promotion/diy-page/delete?id=` + id })
+}
+
+// 获得装修页面属性
+export const getDiyPageProperty = async (id: number) => {
+  return await request.get({ url: `/promotion/diy-page/get-property?id=` + id })
+}
+
+// 更新装修页面属性
+export const updateDiyPageProperty = async (data: DiyPageVO) => {
+  return await request.put({ url: `/promotion/diy-page/update-property`, data })
+}

+ 58 - 0
src/api/mall/promotion/diy/template.ts

@@ -0,0 +1,58 @@
+import request from '@/config/axios'
+import { DiyPageVO } from '@/api/mall/promotion/diy/page'
+
+export interface DiyTemplateVO {
+  id?: number
+  name: string
+  used: boolean
+  usedTime?: Date
+  remark: string
+  previewPicUrls: string[]
+  property: string
+}
+
+export interface DiyTemplatePropertyVO extends DiyTemplateVO {
+  pages: DiyPageVO[]
+}
+
+// 查询装修模板列表
+export const getDiyTemplatePage = async (params: any) => {
+  return await request.get({ url: `/promotion/diy-template/page`, params })
+}
+
+// 查询装修模板详情
+export const getDiyTemplate = async (id: number) => {
+  return await request.get({ url: `/promotion/diy-template/get?id=` + id })
+}
+
+// 新增装修模板
+export const createDiyTemplate = async (data: DiyTemplateVO) => {
+  return await request.post({ url: `/promotion/diy-template/create`, data })
+}
+
+// 修改装修模板
+export const updateDiyTemplate = async (data: DiyTemplateVO) => {
+  return await request.put({ url: `/promotion/diy-template/update`, data })
+}
+
+// 删除装修模板
+export const deleteDiyTemplate = async (id: number) => {
+  return await request.delete({ url: `/promotion/diy-template/delete?id=` + id })
+}
+
+// 使用装修模板
+export const useDiyTemplate = async (id: number) => {
+  return await request.put({ url: `/promotion/diy-template/use?id=` + id })
+}
+
+// 获得装修模板属性
+export const getDiyTemplateProperty = async (id: number) => {
+  return await request.get<DiyTemplatePropertyVO>({
+    url: `/promotion/diy-template/get-property?id=` + id
+  })
+}
+
+// 更新装修模板属性
+export const updateDiyTemplateProperty = async (data: DiyTemplateVO) => {
+  return await request.put({ url: `/promotion/diy-template/update-property`, data })
+}

+ 48 - 0
src/api/mall/promotion/reward/rewardActivity.ts

@@ -0,0 +1,48 @@
+import request from '@/config/axios'
+
+export interface DiscountActivityVO {
+  id?: number
+  name?: string
+  startTime?: Date
+  endTime?: Date
+  remark?: string
+  conditionType?: number
+  productScope?: number
+  productSpuIds?: number[]
+  rules?: DiscountProductVO[]
+}
+
+// 优惠规则
+export interface DiscountProductVO {
+  limit: number
+  discountPrice: number
+  freeDelivery: boolean
+  point: number
+  couponIds: number[]
+  couponCounts: number[]
+}
+
+// 新增满减送活动
+export const createRewardActivity = async (data: DiscountActivityVO) => {
+  return await request.post({ url: '/promotion/reward-activity/create', data })
+}
+
+// 更新满减送活动
+export const updateRewardActivity = async (data: DiscountActivityVO) => {
+  return await request.put({ url: '/promotion/reward-activity/update', data })
+}
+
+// 查询满减送活动列表
+export const getRewardActivityPage = async (params) => {
+  return await request.get({ url: '/promotion/reward-activity/page', params })
+}
+
+// 查询满减送活动详情
+export const getReward = async (id: number) => {
+  return await request.get({ url: '/promotion/reward-activity/get?id=' + id })
+}
+
+// 删除限时折扣活动
+export const deleteRewardActivity = async (id: number) => {
+  return await request.delete({ url: '/promotion/reward-activity/delete?id=' + id })
+}

+ 68 - 0
src/api/mall/promotion/seckill/seckillActivity.ts

@@ -0,0 +1,68 @@
+import request from '@/config/axios'
+import { Sku, Spu } from '@/api/mall/product/spu'
+
+export interface SeckillActivityVO {
+  id?: number
+  spuId?: number
+  name?: string
+  status?: number
+  remark?: string
+  startTime?: Date
+  endTime?: Date
+  sort?: number
+  configIds?: string
+  orderCount?: number
+  userCount?: number
+  totalPrice?: number
+  totalLimitCount?: number
+  singleLimitCount?: number
+  stock?: number
+  totalStock?: number
+  products?: SeckillProductVO[]
+}
+
+// 秒杀活动所需属性
+export interface SeckillProductVO {
+  skuId: number
+  seckillPrice: number
+  stock: number
+}
+
+// 扩展 Sku 配置
+export type SkuExtension = Sku & {
+  productConfig: SeckillProductVO
+}
+
+export interface SpuExtension extends Spu {
+  skus: SkuExtension[] // 重写类型
+}
+
+// 查询秒杀活动列表
+export const getSeckillActivityPage = async (params) => {
+  return await request.get({ url: '/promotion/seckill-activity/page', params })
+}
+
+// 查询秒杀活动详情
+export const getSeckillActivity = async (id: number) => {
+  return await request.get({ url: '/promotion/seckill-activity/get?id=' + id })
+}
+
+// 新增秒杀活动
+export const createSeckillActivity = async (data: SeckillActivityVO) => {
+  return await request.post({ url: '/promotion/seckill-activity/create', data })
+}
+
+// 修改秒杀活动
+export const updateSeckillActivity = async (data: SeckillActivityVO) => {
+  return await request.put({ url: '/promotion/seckill-activity/update', data })
+}
+
+// 关闭秒杀活动
+export const closeSeckillActivity = async (id: number) => {
+  return await request.put({ url: '/promotion/seckill-activity/close?id=' + id })
+}
+
+// 删除秒杀活动
+export const deleteSeckillActivity = async (id: number) => {
+  return await request.delete({ url: '/promotion/seckill-activity/delete?id=' + id })
+}

+ 49 - 0
src/api/mall/promotion/seckill/seckillConfig.ts

@@ -0,0 +1,49 @@
+import request from '@/config/axios'
+
+export interface SeckillConfigVO {
+  id: number
+  name: string
+  startTime: string
+  endTime: string
+  sliderPicUrls: string[]
+  status: number
+}
+
+// 查询秒杀时段配置列表
+export const getSeckillConfigPage = async (params) => {
+  return await request.get({ url: '/promotion/seckill-config/page', params })
+}
+
+// 查询秒杀时段配置详情
+export const getSeckillConfig = async (id: number) => {
+  return await request.get({ url: '/promotion/seckill-config/get?id=' + id })
+}
+
+// 获得所有开启状态的秒杀时段精简列表
+export const getSimpleSeckillConfigList = async () => {
+  return await request.get({ url: '/promotion/seckill-config/list-all-simple' })
+}
+
+// 新增秒杀时段配置
+export const createSeckillConfig = async (data: SeckillConfigVO) => {
+  return await request.post({ url: '/promotion/seckill-config/create', data })
+}
+
+// 修改秒杀时段配置
+export const updateSeckillConfig = async (data: SeckillConfigVO) => {
+  return await request.put({ url: '/promotion/seckill-config/update', data })
+}
+
+// 修改时段配置状态
+export const updateSeckillConfigStatus = (id: number, status: number) => {
+  const data = {
+    id,
+    status
+  }
+  return request.put({ url: '/promotion/seckill-config/update-status', data: data })
+}
+
+// 删除秒杀时段配置
+export const deleteSeckillConfig = async (id: number) => {
+  return await request.delete({ url: '/promotion/seckill-config/delete?id=' + id })
+}

+ 5 - 0
src/api/mall/statistics/common.ts

@@ -0,0 +1,5 @@
+/** 数据对照 Response VO */
+export interface DataComparisonRespVO<T> {
+  value: T
+  reference: T
+}

+ 123 - 0
src/api/mall/statistics/member.ts

@@ -0,0 +1,123 @@
+import request from '@/config/axios'
+import dayjs from 'dayjs'
+import { DataComparisonRespVO } from '@/api/mall/statistics/common'
+import { formatDate } from '@/utils/formatTime'
+
+/** 会员分析 Request VO */
+export interface MemberAnalyseReqVO {
+  times: dayjs.ConfigType[]
+}
+
+/** 会员分析 Response VO */
+export interface MemberAnalyseRespVO {
+  visitUserCount: number
+  orderUserCount: number
+  payUserCount: number
+  atv: number
+  comparison: DataComparisonRespVO<MemberAnalyseComparisonRespVO>
+}
+
+/** 会员分析对照数据 Response VO */
+export interface MemberAnalyseComparisonRespVO {
+  registerUserCount: number
+  visitUserCount: number
+  rechargeUserCount: number
+}
+
+/** 会员地区统计 Response VO */
+export interface MemberAreaStatisticsRespVO {
+  areaId: number
+  areaName: string
+  userCount: number
+  orderCreateUserCount: number
+  orderPayUserCount: number
+  orderPayPrice: number
+}
+
+/** 会员性别统计 Response VO */
+export interface MemberSexStatisticsRespVO {
+  sex: number
+  userCount: number
+}
+
+/** 会员统计 Response VO */
+export interface MemberSummaryRespVO {
+  userCount: number
+  rechargeUserCount: number
+  rechargePrice: number
+  expensePrice: number
+}
+
+/** 会员终端统计 Response VO */
+export interface MemberTerminalStatisticsRespVO {
+  terminal: number
+  userCount: number
+}
+
+/** 会员数量统计 Response VO */
+export interface MemberCountRespVO {
+  /** 用户访问量 */
+  visitUserCount: string
+  /** 注册用户数量 */
+  registerUserCount: number
+}
+
+/** 会员注册数量 Response VO */
+export interface MemberRegisterCountRespVO {
+  date: string
+  count: number
+}
+
+// 查询会员统计
+export const getMemberSummary = () => {
+  return request.get<MemberSummaryRespVO>({
+    url: '/statistics/member/summary'
+  })
+}
+
+// 查询会员分析数据
+export const getMemberAnalyse = (params: MemberAnalyseReqVO) => {
+  return request.get<MemberAnalyseRespVO>({
+    url: '/statistics/member/analyse',
+    params: { times: [formatDate(params.times[0]), formatDate(params.times[1])] }
+  })
+}
+
+// 按照省份,查询会员统计列表
+export const getMemberAreaStatisticsList = () => {
+  return request.get<MemberAreaStatisticsRespVO[]>({
+    url: '/statistics/member/area-statistics-list'
+  })
+}
+
+// 按照性别,查询会员统计列表
+export const getMemberSexStatisticsList = () => {
+  return request.get<MemberSexStatisticsRespVO[]>({
+    url: '/statistics/member/sex-statistics-list'
+  })
+}
+
+// 按照终端,查询会员统计列表
+export const getMemberTerminalStatisticsList = () => {
+  return request.get<MemberTerminalStatisticsRespVO[]>({
+    url: '/statistics/member/terminal-statistics-list'
+  })
+}
+
+// 获得用户数量量对照
+export const getUserCountComparison = () => {
+  return request.get<DataComparisonRespVO<MemberCountRespVO>>({
+    url: '/statistics/member/user-count-comparison'
+  })
+}
+
+// 获得会员注册数量列表
+export const getMemberRegisterCountList = (
+  beginTime: dayjs.ConfigType,
+  endTime: dayjs.ConfigType
+) => {
+  return request.get<MemberRegisterCountRespVO[]>({
+    url: '/statistics/member/register-count-list',
+    params: { times: [formatDate(beginTime), formatDate(endTime)] }
+  })
+}

+ 12 - 0
src/api/mall/statistics/pay.ts

@@ -0,0 +1,12 @@
+import request from '@/config/axios'
+
+/** 支付统计 */
+export interface PaySummaryRespVO {
+  /** 充值金额,单位分 */
+  rechargePrice: number
+}
+
+/** 获取钱包充值金额 */
+export const getWalletRechargePrice = async () => {
+  return await request.get<PaySummaryRespVO>({ url: `/statistics/pay/summary` })
+}

+ 52 - 0
src/api/mall/statistics/product.ts

@@ -0,0 +1,52 @@
+import request from '@/config/axios'
+import { DataComparisonRespVO } from '@/api/mall/statistics/common'
+
+export interface ProductStatisticsVO {
+  id: number
+  day: string
+  spuId: number
+  spuName: string
+  spuPicUrl: string
+  browseCount: number
+  browseUserCount: number
+  favoriteCount: number
+  cartCount: number
+  orderCount: number
+  orderPayCount: number
+  orderPayPrice: number
+  afterSaleCount: number
+  afterSaleRefundPrice: number
+  browseConvertPercent: number
+}
+
+// 商品统计 API
+export const ProductStatisticsApi = {
+  // 获得商品统计分析
+  getProductStatisticsAnalyse: (params: any) => {
+    return request.get<DataComparisonRespVO<ProductStatisticsVO>>({
+      url: '/statistics/product/analyse',
+      params
+    })
+  },
+  // 获得商品状况明细
+  getProductStatisticsList: (params: any) => {
+    return request.get<ProductStatisticsVO[]>({
+      url: '/statistics/product/list',
+      params
+    })
+  },
+  // 导出获得商品状况明细 Excel
+  exportProductStatisticsExcel: (params: any) => {
+    return request.download({
+      url: '/statistics/product/export-excel',
+      params
+    })
+  },
+  // 获得商品排行榜分页
+  getProductStatisticsRankPage: async (params: any) => {
+    return await request.get({
+      url: `/statistics/product/rank-page`,
+      params
+    })
+  }
+}

+ 119 - 0
src/api/mall/statistics/trade.ts

@@ -0,0 +1,119 @@
+import request from '@/config/axios'
+import dayjs from 'dayjs'
+import { formatDate } from '@/utils/formatTime'
+import { DataComparisonRespVO } from '@/api/mall/statistics/common'
+
+/** 交易统计 Response VO */
+export interface TradeSummaryRespVO {
+  yesterdayOrderCount: number
+  monthOrderCount: number
+  yesterdayPayPrice: number
+  monthPayPrice: number
+}
+
+/** 交易状况 Request VO */
+export interface TradeTrendReqVO {
+  times: [dayjs.ConfigType, dayjs.ConfigType]
+}
+
+/** 交易状况统计 Response VO */
+export interface TradeTrendSummaryRespVO {
+  time: string
+  turnoverPrice: number
+  orderPayPrice: number
+  rechargePrice: number
+  expensePrice: number
+  walletPayPrice: number
+  brokerageSettlementPrice: number
+  afterSaleRefundPrice: number
+}
+
+/** 交易订单数量 Response VO */
+export interface TradeOrderCountRespVO {
+  /** 待发货 */
+  undelivered?: number
+  /** 待核销 */
+  pickUp?: number
+  /** 退款中 */
+  afterSaleApply?: number
+  /** 提现待审核 */
+  auditingWithdraw?: number
+}
+
+/** 交易订单统计 Response VO */
+export interface TradeOrderSummaryRespVO {
+  /** 支付订单商品数 */
+  orderPayCount?: number
+  /** 总支付金额,单位:分 */
+  orderPayPrice?: number
+}
+
+/** 订单量趋势统计 Response VO */
+export interface TradeOrderTrendRespVO {
+  /** 日期 */
+  date: string
+  /** 订单数量 */
+  orderPayCount: number
+  /** 订单支付金额 */
+  orderPayPrice: number
+}
+
+// 查询交易统计
+export const getTradeStatisticsSummary = () => {
+  return request.get<DataComparisonRespVO<TradeSummaryRespVO>>({
+    url: '/statistics/trade/summary'
+  })
+}
+
+// 获得交易状况统计
+export const getTradeStatisticsAnalyse = (params: TradeTrendReqVO) => {
+  return request.get<DataComparisonRespVO<TradeTrendSummaryRespVO>>({
+    url: '/statistics/trade/analyse',
+    params: formatDateParam(params)
+  })
+}
+
+// 获得交易状况明细
+export const getTradeStatisticsList = (params: TradeTrendReqVO) => {
+  return request.get<TradeTrendSummaryRespVO[]>({
+    url: '/statistics/trade/list',
+    params: formatDateParam(params)
+  })
+}
+
+// 导出交易状况明细
+export const exportTradeStatisticsExcel = (params: TradeTrendReqVO) => {
+  return request.download({
+    url: '/statistics/trade/export-excel',
+    params: formatDateParam(params)
+  })
+}
+
+// 获得交易订单数量
+export const getOrderCount = async () => {
+  return await request.get<TradeOrderCountRespVO>({ url: `/statistics/trade/order-count` })
+}
+
+// 获得交易订单数量对照
+export const getOrderComparison = async () => {
+  return await request.get<DataComparisonRespVO<TradeOrderSummaryRespVO>>({
+    url: `/statistics/trade/order-comparison`
+  })
+}
+
+// 获得订单量趋势统计
+export const getOrderCountTrendComparison = (
+  type: number,
+  beginTime: dayjs.ConfigType,
+  endTime: dayjs.ConfigType
+) => {
+  return request.get<DataComparisonRespVO<TradeOrderTrendRespVO>[]>({
+    url: '/statistics/trade/order-count-trend',
+    params: { type, beginTime: formatDate(beginTime), endTime: formatDate(endTime) }
+  })
+}
+
+/** 时间参数需要格式化, 确保接口能识别 */
+const formatDateParam = (params: TradeTrendReqVO) => {
+  return { times: [formatDate(params.times[0]), formatDate(params.times[1])] } as TradeTrendReqVO
+}

+ 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}` })
+}

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff