周洋 il y a 2 semaines
commit
30c814161b
100 fichiers modifiés avec 5263 ajouts et 0 suppressions
  1. 22 0
      .editorconfig
  2. 28 0
      .env.development
  3. 27 0
      .env.production
  4. 10 0
      .eslintignore
  5. 199 0
      .eslintrc.js
  6. 30 0
      .gitignore
  7. 14 0
      Dockerfile
  8. 36 0
      README.en.md
  9. 37 0
      README.md
  10. 17 0
      babel.config.js
  11. 12 0
      bin/build.bat
  12. 12 0
      bin/package.bat
  13. 12 0
      bin/run-web.bat
  14. 35 0
      build/index.js
  15. 118 0
      nginx.conf
  16. 112 0
      package.json
  17. 633 0
      public/chat-aggregate.html
  18. 21 0
      public/html/ie.html
  19. 209 0
      public/index.html
  20. 2 0
      public/robots.txt
  21. 12 0
      public/service.html
  22. 19 0
      src/App.vue
  23. 53 0
      src/api/ad/AdDyAccount.js
  24. 60 0
      src/api/ad/AdIqiyiAccount.js
  25. 53 0
      src/api/ad/AdUploadLog.js
  26. 60 0
      src/api/ad/AdYouKuaccount.js
  27. 9 0
      src/api/ad/adAccount.js
  28. 60 0
      src/api/ad/adDomain.js
  29. 61 0
      src/api/ad/adSite.js
  30. 60 0
      src/api/ad/htmlTemplate.js
  31. 9 0
      src/api/admin/ad.js
  32. 83 0
      src/api/admin/aiChatQuality.js
  33. 84 0
      src/api/admin/aiModel.js
  34. 29 0
      src/api/admin/aiProvider.js
  35. 62 0
      src/api/admin/article.js
  36. 103 0
      src/api/admin/callRecord.js
  37. 27 0
      src/api/admin/commissionRecord.js
  38. 27 0
      src/api/admin/consumeRecord.js
  39. 10 0
      src/api/admin/consumeReport.js
  40. 39 0
      src/api/admin/course.js
  41. 9 0
      src/api/admin/crm.js
  42. 18 0
      src/api/admin/dailyStatistics.js
  43. 46 0
      src/api/admin/dbConfig.js
  44. 18 0
      src/api/admin/ipadServer.js
  45. 39 0
      src/api/admin/live.js
  46. 10 0
      src/api/admin/liveVideo.js
  47. 92 0
      src/api/admin/lobster.js
  48. 29 0
      src/api/admin/moduleUsage.js
  49. 56 0
      src/api/admin/product.js
  50. 36 0
      src/api/admin/proxy.js
  51. 15 0
      src/api/admin/proxyOperLog.js
  52. 39 0
      src/api/admin/qwExternalContact.js
  53. 27 0
      src/api/admin/rechargeRecord.js
  54. 34 0
      src/api/admin/serviceCost.js
  55. 13 0
      src/api/admin/sop.js
  56. 61 0
      src/api/admin/statistics.js
  57. 9 0
      src/api/admin/storeOrder.js
  58. 108 0
      src/api/admin/sysCompany.js
  59. 45 0
      src/api/admin/sysUser.js
  60. 44 0
      src/api/admin/trafficPricing.js
  61. 10 0
      src/api/admin/videoResource.js
  62. 10 0
      src/api/admin/voiceNumber.js
  63. 20 0
      src/api/admin/voiceOrder.js
  64. 18 0
      src/api/admin/voicePackage.js
  65. 52 0
      src/api/admin/withdrawalManage.js
  66. 62 0
      src/api/adv/advertiser.js
  67. 70 0
      src/api/adv/callbackAccount.js
  68. 29 0
      src/api/adv/channel.js
  69. 18 0
      src/api/adv/configuration.js
  70. 10 0
      src/api/adv/conversionLog.js
  71. 63 0
      src/api/adv/domain.js
  72. 73 0
      src/api/adv/landingPageTemplate.js
  73. 19 0
      src/api/adv/project.js
  74. 54 0
      src/api/adv/promotionAccount.js
  75. 60 0
      src/api/adv/site.js
  76. 34 0
      src/api/adv/siteStatistics.js
  77. 36 0
      src/api/adv/trackingLink.js
  78. 62 0
      src/api/aiDpctorChat/aiDoctorChat.js
  79. 53 0
      src/api/aiDpctorChat/role.js
  80. 53 0
      src/api/aiSipCall/aiSipCallBizGroup.js
  81. 62 0
      src/api/aiSipCall/aiSipCallGateway.js
  82. 53 0
      src/api/aiSipCall/aiSipCallLlmAgentAccount.js
  83. 88 0
      src/api/aiSipCall/aiSipCallOutboundCdr.js
  84. 61 0
      src/api/aiSipCall/aiSipCallPhone.js
  85. 86 0
      src/api/aiSipCall/aiSipCallTask.js
  86. 77 0
      src/api/aiSipCall/aiSipCallUser.js
  87. 53 0
      src/api/aiSipCall/aiSipCallVoiceTtsAliyun.js
  88. 53 0
      src/api/aiob/AiobBaiduCallApi.js
  89. 53 0
      src/api/aiob/AiobBaiduEncryption.js
  90. 60 0
      src/api/aiob/AiobBaiduTask.js
  91. 101 0
      src/api/baidu/BdAccount.js
  92. 38 0
      src/api/baidu/statistics.js
  93. 61 0
      src/api/bill/billLog.js
  94. 31 0
      src/api/billing/wallet.js
  95. 53 0
      src/api/callRecord/callRecord.js
  96. 53 0
      src/api/chat/chatDataset.js
  97. 53 0
      src/api/chat/chatDatasetFile.js
  98. 53 0
      src/api/chat/chatKeyword.js
  99. 53 0
      src/api/chat/chatMsg.js
  100. 61 0
      src/api/chat/chatMsgLogs.js

+ 22 - 0
.editorconfig

@@ -0,0 +1,22 @@
+# 告诉EditorConfig插件,这是根文件,不用继续往上查找
+root = true
+
+# 匹配全部文件
+[*]
+# 设置字符集
+charset = utf-8
+# 缩进风格,可选space、tab
+indent_style = space
+# 缩进的空格数
+indent_size = 2
+# 结尾换行符,可选lf、cr、crlf
+end_of_line = lf
+# 在文件结尾插入新行
+insert_final_newline = true
+# 删除一行中的前后空格
+trim_trailing_whitespace = true
+
+# 匹配md结尾的文件
+[*.md]
+insert_final_newline = false
+trim_trailing_whitespace = false

+ 28 - 0
.env.development

@@ -0,0 +1,28 @@
+#该文本用于打包测试平台
+# 页面标题
+VUE_APP_TITLE =总后台管理系统
+
+# 首页菜单标题
+VUE_APP_TITLE_INDEX =总后台
+# 公司名称
+VUE_APP_COMPANY_NAME =云联融智科技有限公司
+# ICP备案号
+VUE_APP_ICP_RECORD =
+# ICP网站访问地址
+VUE_APP_ICP_URL =https://beian.miit.gov.cn
+# 网站LOG
+VUE_APP_LOG_URL =@/assets/logo/ylrz.png
+
+# 开发环境配置
+ENV = 'production'
+
+# FS管理系统/开发环境
+VUE_APP_BASE_API = '/prod-api'
+
+# 路由懒加载
+VUE_CLI_BABEL_TRANSPILE_MODULES = true
+
+# 患者信息
+VUE_APP_PATIENT_INFO = '客户信息'
+# 添加病人
+VUE_APP_ADD_PATIENT = '添加信息'

+ 27 - 0
.env.production

@@ -0,0 +1,27 @@
+#该文本用于打包测试平台
+# 页面标题
+VUE_APP_TITLE =云联融智SAAS管理系统
+# 首页菜单标题
+VUE_APP_TITLE_INDEX =云联融智SAAS
+# 公司名称
+VUE_APP_COMPANY_NAME =云联融智科技有限公司
+# ICP备案号
+VUE_APP_ICP_RECORD =
+# ICP网站访问地址
+VUE_APP_ICP_URL =https://beian.miit.gov.cn
+# 网站LOG
+VUE_APP_LOG_URL =@/assets/logo/ylrz.png
+
+# 开发环境配置
+ENV = 'production'
+
+# FS管理系统/开发环境
+VUE_APP_BASE_API = '/prod-api'
+
+# 路由懒加载
+VUE_CLI_BABEL_TRANSPILE_MODULES = true
+
+# 患者信息
+VUE_APP_PATIENT_INFO = '客户信息'
+# 添加病人
+VUE_APP_ADD_PATIENT = '添加信息'

+ 10 - 0
.eslintignore

@@ -0,0 +1,10 @@
+# 忽略build目录下类型为js的文件的语法检查
+build/*.js
+# 忽略src/assets目录下文件的语法检查
+src/assets
+# 忽略public目录下文件的语法检查
+public
+# 忽略当前目录下为js的文件的语法检查
+*.js
+# 忽略当前目录下为vue的文件的语法检查
+*.vue

+ 199 - 0
.eslintrc.js

@@ -0,0 +1,199 @@
+// ESlint 检查配置
+module.exports = {
+  root: true,
+  parserOptions: {
+    parser: 'babel-eslint',
+    sourceType: 'module'
+  },
+  env: {
+    browser: true,
+    node: true,
+    es6: true,
+  },
+  extends: ['plugin:vue/recommended', 'eslint:recommended'],
+
+  // add your custom rules here
+  //it is base on https://github.com/vuejs/eslint-config-vue
+  rules: {
+    "vue/max-attributes-per-line": [2, {
+      "singleline": 10,
+      "multiline": {
+        "max": 1,
+        "allowFirstLine": false
+      }
+    }],
+    "vue/singleline-html-element-content-newline": "off",
+    "vue/multiline-html-element-content-newline":"off",
+    "vue/name-property-casing": ["error", "PascalCase"],
+    "vue/no-v-html": "off",
+    'accessor-pairs': 2,
+    'arrow-spacing': [2, {
+      'before': true,
+      'after': true
+    }],
+    'block-spacing': [2, 'always'],
+    'brace-style': [2, '1tbs', {
+      'allowSingleLine': true
+    }],
+    'camelcase': [0, {
+      'properties': 'always'
+    }],
+    'comma-dangle': [2, 'never'],
+    'comma-spacing': [2, {
+      'before': false,
+      'after': true
+    }],
+    'comma-style': [2, 'last'],
+    'constructor-super': 2,
+    'curly': [2, 'multi-line'],
+    'dot-location': [2, 'property'],
+    'eol-last': 2,
+    'eqeqeq': ["error", "always", {"null": "ignore"}],
+    'generator-star-spacing': [2, {
+      'before': true,
+      'after': true
+    }],
+    'handle-callback-err': [2, '^(err|error)$'],
+    'indent': [2, 2, {
+      'SwitchCase': 1
+    }],
+    'jsx-quotes': [2, 'prefer-single'],
+    'key-spacing': [2, {
+      'beforeColon': false,
+      'afterColon': true
+    }],
+    'keyword-spacing': [2, {
+      'before': true,
+      'after': true
+    }],
+    'new-cap': [2, {
+      'newIsCap': true,
+      'capIsNew': false
+    }],
+    'new-parens': 2,
+    'no-array-constructor': 2,
+    'no-caller': 2,
+    'no-console': 'off',
+    'no-class-assign': 2,
+    'no-cond-assign': 2,
+    'no-const-assign': 2,
+    'no-control-regex': 0,
+    'no-delete-var': 2,
+    'no-dupe-args': 2,
+    'no-dupe-class-members': 2,
+    'no-dupe-keys': 2,
+    'no-duplicate-case': 2,
+    'no-empty-character-class': 2,
+    'no-empty-pattern': 2,
+    'no-eval': 2,
+    'no-ex-assign': 2,
+    'no-extend-native': 2,
+    'no-extra-bind': 2,
+    'no-extra-boolean-cast': 2,
+    'no-extra-parens': [2, 'functions'],
+    'no-fallthrough': 2,
+    'no-floating-decimal': 2,
+    'no-func-assign': 2,
+    'no-implied-eval': 2,
+    'no-inner-declarations': [2, 'functions'],
+    'no-invalid-regexp': 2,
+    'no-irregular-whitespace': 2,
+    'no-iterator': 2,
+    'no-label-var': 2,
+    'no-labels': [2, {
+      'allowLoop': false,
+      'allowSwitch': false
+    }],
+    'no-lone-blocks': 2,
+    'no-mixed-spaces-and-tabs': 2,
+    'no-multi-spaces': 2,
+    'no-multi-str': 2,
+    'no-multiple-empty-lines': [2, {
+      'max': 1
+    }],
+    'no-native-reassign': 2,
+    'no-negated-in-lhs': 2,
+    'no-new-object': 2,
+    'no-new-require': 2,
+    'no-new-symbol': 2,
+    'no-new-wrappers': 2,
+    'no-obj-calls': 2,
+    'no-octal': 2,
+    'no-octal-escape': 2,
+    'no-path-concat': 2,
+    'no-proto': 2,
+    'no-redeclare': 2,
+    'no-regex-spaces': 2,
+    'no-return-assign': [2, 'except-parens'],
+    'no-self-assign': 2,
+    'no-self-compare': 2,
+    'no-sequences': 2,
+    'no-shadow-restricted-names': 2,
+    'no-spaced-func': 2,
+    'no-sparse-arrays': 2,
+    'no-this-before-super': 2,
+    'no-throw-literal': 2,
+    'no-trailing-spaces': 2,
+    'no-undef': 2,
+    'no-undef-init': 2,
+    'no-unexpected-multiline': 2,
+    'no-unmodified-loop-condition': 2,
+    'no-unneeded-ternary': [2, {
+      'defaultAssignment': false
+    }],
+    'no-unreachable': 2,
+    'no-unsafe-finally': 2,
+    'no-unused-vars': [2, {
+      'vars': 'all',
+      'args': 'none'
+    }],
+    'no-useless-call': 2,
+    'no-useless-computed-key': 2,
+    'no-useless-constructor': 2,
+    'no-useless-escape': 0,
+    'no-whitespace-before-property': 2,
+    'no-with': 2,
+    'one-var': [2, {
+      'initialized': 'never'
+    }],
+    'operator-linebreak': [2, 'after', {
+      'overrides': {
+        '?': 'before',
+        ':': 'before'
+      }
+    }],
+    'padded-blocks': [2, 'never'],
+    'quotes': [2, 'single', {
+      'avoidEscape': true,
+      'allowTemplateLiterals': true
+    }],
+    'semi': [2, 'never'],
+    'semi-spacing': [2, {
+      'before': false,
+      'after': true
+    }],
+    'space-before-blocks': [2, 'always'],
+    'space-before-function-paren': [2, 'never'],
+    'space-in-parens': [2, 'never'],
+    'space-infix-ops': 2,
+    'space-unary-ops': [2, {
+      'words': true,
+      'nonwords': false
+    }],
+    'spaced-comment': [2, 'always', {
+      'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ',']
+    }],
+    'template-curly-spacing': [2, 'never'],
+    'use-isnan': 2,
+    'valid-typeof': 2,
+    'wrap-iife': [2, 'any'],
+    'yield-star-spacing': [2, 'both'],
+    'yoda': [2, 'never'],
+    'prefer-const': 2,
+    'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
+    'object-curly-spacing': [2, 'always', {
+      objectsInObjects: false
+    }],
+    'array-bracket-spacing': [2, 'never']
+  }
+}

+ 30 - 0
.gitignore

@@ -0,0 +1,30 @@
+.DS_Store
+node_modules
+/dist
+
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.log
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+package-lock.json
+yarn.lock
+
+# AGENTS.md - 项目指导文档,不上传到远程仓库
+AGENTS.md

+ 14 - 0
Dockerfile

@@ -0,0 +1,14 @@
+#基于官方 NGINX 镜像部署(精简镜像)
+FROM swr.cn-east-2.myhuaweicloud.com/library/nginx:alpine
+
+# 复制本地打包好的 dist 目录到 NGINX 静态资源目录
+COPY ./dist /usr/share/nginx/html
+
+# 替换 NGINX 默认配置(用我们自定义的 nginx.conf)
+COPY ./nginx.conf /etc/nginx/nginx.conf
+
+# 暴露容器端口(与 nginx.conf 中 listen 一致)
+#EXPOSE 80
+
+# 启动 NGINX(前台运行,避免容器启动后退出)
+CMD ["nginx", "-g", "daemon off;"]

+ 36 - 0
README.en.md

@@ -0,0 +1,36 @@
+# his_adminui
+
+#### Description
+adminui
+
+#### Software Architecture
+Software architecture description
+
+#### Installation
+
+1.  xxxx
+2.  xxxx
+3.  xxxx
+
+#### Instructions
+
+1.  xxxx
+2.  xxxx
+3.  xxxx
+
+#### Contribution
+
+1.  Fork the repository
+2.  Create Feat_xxx branch
+3.  Commit your code
+4.  Create Pull Request
+
+
+#### Gitee Feature
+
+1.  You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
+2.  Gitee blog [blog.gitee.com](https://blog.gitee.com)
+3.  Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
+4.  The most valuable open source project [GVP](https://gitee.com/gvp)
+5.  The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
+6.  The most popular members  [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

+ 37 - 0
README.md

@@ -0,0 +1,37 @@
+# his_adminui
+
+#### 介绍
+adminui
+
+#### 软件架构
+软件架构说明
+
+
+#### 安装教程
+
+1.  xxxx
+2.  xxxx
+3.  xxxx
+
+#### 使用说明
+
+1.  xxxx
+2.  xxxx
+3.  xxxx
+
+#### 参与贡献
+
+1.  Fork 本仓库
+2.  新建 Feat_xxx 分支
+3.  提交代码
+4.  新建 Pull Request
+
+
+#### 特技
+
+1.  使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
+2.  Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
+3.  你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
+4.  [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
+5.  Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
+6.  Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

+ 17 - 0
babel.config.js

@@ -0,0 +1,17 @@
+module.exports = {
+  presets: [
+    // https://github.com/vuejs/vue-cli/tree/master/packages/@vue/babel-preset-app
+    '@vue/cli-plugin-babel/preset'
+  ],
+  'env': {
+    'development': {
+      // babel-plugin-dynamic-import-node plugin only does one thing by converting all import() to require().
+      // This plugin can significantly increase the speed of hot updates, when you have a large number of pages.
+      'plugins': ['dynamic-import-node']
+    }
+  },
+  plugins: [
+    '@babel/plugin-proposal-nullish-coalescing-operator',
+    '@babel/plugin-proposal-optional-chaining'
+  ]
+}

+ 12 - 0
bin/build.bat

@@ -0,0 +1,12 @@
+@echo off
+echo.
+echo [信息] 打包Web工程,生成dist文件。
+echo.
+
+%~d0
+cd %~dp0
+
+cd ..
+npm run build:prod
+
+pause

+ 12 - 0
bin/package.bat

@@ -0,0 +1,12 @@
+@echo off
+echo.
+echo [信息] 安装Web工程,生成node_modules文件。
+echo.
+
+%~d0
+cd %~dp0
+
+cd ..
+npm install --registry=https://registry.npm.taobao.org
+
+pause

+ 12 - 0
bin/run-web.bat

@@ -0,0 +1,12 @@
+@echo off
+echo.
+echo [信息] 使用 Vue CLI 命令运行 Web 工程。
+echo.
+
+%~d0
+cd %~dp0
+
+cd ..
+npm run dev
+
+pause

+ 35 - 0
build/index.js

@@ -0,0 +1,35 @@
+const { run } = require('runjs')
+const chalk = require('chalk')
+const config = require('../vue.config.js')
+const rawArgv = process.argv.slice(2)
+const args = rawArgv.join(' ')
+
+if (process.env.npm_config_preview || rawArgv.includes('--preview')) {
+  const report = rawArgv.includes('--report')
+
+  run(`vue-cli-service build ${args}`)
+
+  const port = 9526
+  const publicPath = config.publicPath
+
+  var connect = require('connect')
+  var serveStatic = require('serve-static')
+  const app = connect()
+
+  app.use(
+    publicPath,
+    serveStatic('./dist', {
+      index: ['index.html', '/']
+    })
+  )
+
+  app.listen(port, function () {
+    console.log(chalk.green(`> Preview at  http://localhost:${port}${publicPath}`))
+    if (report) {
+      console.log(chalk.green(`> Report at  http://localhost:${port}${publicPath}report.html`))
+    }
+
+  })
+} else {
+  run(`vue-cli-service build ${args}`)
+}

+ 118 - 0
nginx.conf

@@ -0,0 +1,118 @@
+# nginx.conf
+worker_processes  5;
+
+events {
+    worker_connections  1024;
+}
+
+http {
+    include       mime.types;
+    default_type  application/octet-stream;
+    client_max_body_size 200m;
+    sendfile        on;
+    keepalive_timeout  65;
+
+    server {
+        listen       80;  # 容器内端口
+        server_name  localhost;
+
+        # 前端静态资源目录(对应容器内的 /usr/share/nginx/html)
+        root   /usr/share/nginx/html;
+        index  index.html;
+
+        # 关键:处理 VUE Router history 模式(避免刷新 404)
+        location / {
+            try_files $uri $uri/ /index.html;  # 所有路由指向 index.html
+        }
+
+        # 反向代理 - fs-company(8006) 租户服务端API
+        # 以下路径前缀只有fs-company有Controller,需代理到8006
+        location /prod-api/adv/ {
+            proxy_pass http://192.168.58.159:8006/adv/;
+            proxy_set_header Host $host;
+            proxy_set_header X-Real-IP $remote_addr;
+            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+            proxy_set_header X-Forwarded-Proto $scheme;
+        }
+        location /prod-api/aicall/ {
+            proxy_pass http://192.168.58.159:8006/aicall/;
+            proxy_set_header Host $host;
+            proxy_set_header X-Real-IP $remote_addr;
+            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+            proxy_set_header X-Forwarded-Proto $scheme;
+        }
+        location /prod-api/common/ {
+            proxy_pass http://192.168.58.159:8006/common/;
+            proxy_set_header Host $host;
+            proxy_set_header X-Real-IP $remote_addr;
+            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+            proxy_set_header X-Forwarded-Proto $scheme;
+        }
+        location /prod-api/company/ {
+            proxy_pass http://192.168.58.159:8006/company/;
+            proxy_set_header Host $host;
+            proxy_set_header X-Real-IP $remote_addr;
+            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+            proxy_set_header X-Forwarded-Proto $scheme;
+        }
+        location /prod-api/companyWorkflow/ {
+            proxy_pass http://192.168.58.159:8006/companyWorkflow/;
+            proxy_set_header Host $host;
+            proxy_set_header X-Real-IP $remote_addr;
+            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+            proxy_set_header X-Forwarded-Proto $scheme;
+        }
+        location /prod-api/qwAssignRule/ {
+            proxy_pass http://192.168.58.159:8006/qwAssignRule/;
+            proxy_set_header Host $host;
+            proxy_set_header X-Real-IP $remote_addr;
+            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+            proxy_set_header X-Forwarded-Proto $scheme;
+        }
+        location /prod-api/qwCustomerLink/ {
+            proxy_pass http://192.168.58.159:8006/qwCustomerLink/;
+            proxy_set_header Host $host;
+            proxy_set_header X-Real-IP $remote_addr;
+            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+            proxy_set_header X-Forwarded-Proto $scheme;
+        }
+        location /prod-api/qwGroupActual/ {
+            proxy_pass http://192.168.58.159:8006/qwGroupActual/;
+            proxy_set_header Host $host;
+            proxy_set_header X-Real-IP $remote_addr;
+            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+            proxy_set_header X-Forwarded-Proto $scheme;
+        }
+        location /prod-api/qwGroupLiveCode/ {
+            proxy_pass http://192.168.58.159:8006/qwGroupLiveCode/;
+            proxy_set_header Host $host;
+            proxy_set_header X-Real-IP $remote_addr;
+            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+            proxy_set_header X-Forwarded-Proto $scheme;
+        }
+        location /prod-api/shop/ {
+            proxy_pass http://192.168.58.159:8006/shop/;
+            proxy_set_header Host $host;
+            proxy_set_header X-Real-IP $remote_addr;
+            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+            proxy_set_header X-Forwarded-Proto $scheme;
+        }
+        location /prod-api/workflow/ {
+            proxy_pass http://192.168.58.159:8006/workflow/;
+            proxy_set_header Host $host;
+            proxy_set_header X-Real-IP $remote_addr;
+            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+            proxy_set_header X-Forwarded-Proto $scheme;
+        }
+
+        # 关键:反向代理 API(默认代理到 fs-admin 平台管理端)
+        location /prod-api/ {
+            proxy_pass http://192.168.58.159:7772/;  # fs-admin 后端 API 地址(末尾加 / 避免路径拼接问题)
+            proxy_set_header Host $host;
+            proxy_set_header X-Real-IP $remote_addr;
+            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+            proxy_set_header X-Forwarded-Proto $scheme;  # 传递 HTTPS 协议
+        }
+
+     }
+}

+ 112 - 0
package.json

@@ -0,0 +1,112 @@
+{
+  "name": "FS",
+  "version": "1.1.0",
+  "description": "FS管理系统",
+  "author": "YZX",
+  "license": "MIT",
+  "scripts": {
+    "dev": "vue-cli-service serve",
+    "build:prod": "vue-cli-service build",
+    "build:stage": "vue-cli-service build --mode staging",
+    "preview": "node build/index.js --preview",
+    "lint": "eslint --ext .js,.vue src"
+  },
+  "husky": {
+    "hooks": {
+      "pre-commit": "lint-staged"
+    }
+  },
+  "lint-staged": {
+    "src/**/*.{js,vue}": [
+      "eslint --fix",
+      "git add"
+    ]
+  },
+  "keywords": [
+    "vue",
+    "admin",
+    "dashboard",
+    "element-ui",
+    "boilerplate",
+    "admin-template",
+    "management-system"
+  ],
+  "dependencies": {
+    "@amap/amap-jsapi-loader": "^1.0.1",
+    "@huaweicloud/huaweicloud-sdk-core": "^3.1.105",
+    "@huaweicloud/huaweicloud-sdk-vod": "^3.1.105",
+    "@riophae/vue-treeselect": "0.4.0",
+    "axios": "0.21.0",
+    "chart.js": "^2.9.4",
+    "clipboard": "2.0.6",
+    "core-js": "3.8.1",
+    "cos-js-sdk-v5": "^1.8.3",
+    "dayjs": "^1.11.13",
+    "echarts": "^4.9.0",
+    "element-ui": "2.15.5",
+    "esdk-obs-browserjs": "^3.24.3",
+    "file-saver": "2.0.4",
+    "fuse.js": "6.4.3",
+    "highlight.js": "9.18.5",
+    "hls.js": "^1.6.14",
+    "image-conversion": "^2.1.1",
+    "js-beautify": "1.13.0",
+    "js-cookie": "2.2.1",
+    "js-yaml": "^4.1.1",
+    "jsencrypt": "3.0.0-rc.1",
+    "monaco-editor": "^0.55.1",
+    "nprogress": "0.2.0",
+    "qrcode": "^1.5.4",
+    "qrcodejs2": "0.0.2",
+    "quill": "1.3.7",
+    "screenfull": "5.0.2",
+    "sortablejs": "1.10.2",
+    "tt-uploader": "^1.5.5",
+    "vod-js-sdk-v6": "^1.7.0",
+    "vue": "2.6.12",
+    "vue-baidu-map": "^0.21.22",
+    "vue-count-to": "1.0.13",
+    "vue-cropper": "0.5.5",
+    "vue-full-calendar": "^2.8.1-0",
+    "vue-jsonp": "^2.0.0",
+    "vue-meta": "^2.4.0",
+    "vue-mobile-calendar": "^3.3.0",
+    "vue-monaco": "^1.2.2",
+    "vue-router": "3.4.9",
+    "vuedraggable": "^2.24.3",
+    "vuex": "3.6.0",
+    "wangeditor": "^4.7.5",
+    "xlsx": "^0.18.5"
+  },
+  "devDependencies": {
+    "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6",
+    "@babel/plugin-proposal-optional-chaining": "^7.21.0",
+    "@vue/cli-plugin-babel": "4.4.6",
+    "@vue/cli-plugin-eslint": "4.4.6",
+    "@vue/cli-service": "4.4.6",
+    "babel-eslint": "10.1.0",
+    "chalk": "4.1.0",
+    "connect": "3.6.6",
+    "eslint": "7.15.0",
+    "eslint-plugin-vue": "7.2.0",
+    "lint-staged": "10.5.3",
+    "runjs": "4.4.2",
+    "sass": "^1.77.0",
+    "sass-loader": "8.0.2",
+    "script-ext-html-webpack-plugin": "2.1.5",
+    "stylus": "^0.64.0",
+    "stylus-loader": "^3.0.2",
+    "svg-sprite-loader": "5.1.1",
+    "vue-template-compiler": "2.6.12",
+    "webpack": "^4.46.0",
+    "webpack-dev-server": "^3.11.3"
+  },
+  "engines": {
+    "node": ">=8.9",
+    "npm": ">= 3.0.0"
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions"
+  ]
+}

+ 633 - 0
public/chat-aggregate.html

@@ -0,0 +1,633 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<title>龙虾引擎 - 聚合聊天</title>
+<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
+<style>
+*{margin:0;padding:0;box-sizing:border-box}
+body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;background:#0a0a1a;color:#e0e0e0;height:100vh;overflow:hidden}
+.main{display:flex;height:100vh}
+
+/* 左侧账户列表 */
+.account-panel{width:80px;background:#0d0d1f;border-right:1px solid #1a1a3e;display:flex;flex-direction:column;padding:12px 0}
+.account-item{width:56px;height:56px;border-radius:50%;margin:0 auto 8px;cursor:pointer;position:relative;border:2px solid transparent;transition:.2s;display:flex;align-items:center;justify-content:center;font-size:24px}
+.account-item:hover{border-color:#e94560;transform:scale(1.05)}
+.account-item.active{border-color:#e94560;background:#e9456022}
+.account-item .badge{position:absolute;top:-2px;right:-2px;background:#e94560;color:#fff;border-radius:10px;padding:1px 5px;font-size:10px}
+.account-item.disabled{opacity:.4;cursor:not-allowed}
+
+/* 会话列表 */
+.session-panel{width:280px;background:#1a1a2e;border-right:1px solid #2a2a4a;display:flex;flex-direction:column}
+.session-header{padding:12px 16px;border-bottom:1px solid #2a2a4a}
+.session-header h3{font-size:14px;color:#e94560}
+.session-header .search{margin-top:8px}
+.session-header input{width:100%;padding:6px 10px;background:#0a0a1a;border:1px solid #2a2a4a;border-radius:4px;color:#e0e0e0;font-size:12px}
+.session-list{flex:1;overflow-y:auto;padding:8px}
+.session-item{display:flex;padding:10px;cursor:pointer;border-radius:6px;margin-bottom:4px;transition:.2s}
+.session-item:hover{background:#2a2a4a}
+.session-item.active{background:#0f3460}
+.session-avatar{width:40px;height:40px;border-radius:50%;background:linear-gradient(135deg,#e94560,#f59e0b);display:flex;align-items:center;justify-content:center;font-size:16px;flex-shrink:0}
+.session-info{flex:1;min-width:0;margin-left:10px}
+.session-info .name{font-size:13px;color:#e0e0e0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
+.session-info .msg{font-size:12px;color:#888;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-top:2px}
+.session-time{font-size:11px;color:#666;text-align:right}
+.session-item.unread .name{font-weight:600;color:#fff}
+.session-item.unread .badge{background:#e94560;color:#fff;border-radius:10px;padding:1px 5px;font-size:10px}
+
+/* 聊天区域 */
+.chat-panel{flex:1;display:flex;flex-direction:column;background:#0a0a1a}
+.chat-header{padding:12px 20px;background:#1a1a2e;border-bottom:1px solid #2a2a4a;display:flex;align-items:center;justify-content:space-between}
+.chat-title .name{font-size:15px;color:#e0e0e0}
+.chat-title .type{font-size:11px;color:#888;margin-left:8px}
+.chat-actions{display:flex;gap:8px}
+.chat-actions button{padding:6px 12px;background:#0f3460;border:none;border-radius:4px;color:#e0e0e0;font-size:12px;cursor:pointer}
+.chat-actions button:hover{background:#1a4a80}
+
+/* 消息列表 */
+.message-list{flex:1;overflow-y:auto;padding:16px;display:flex;flex-direction:column}
+.message-item{display:flex;margin-bottom:12px;max-width:80%}
+.message-item.sent{align-self:flex-end}
+.message-item.sent .msg-bubble{background:#e94560;color:#fff;border-radius:12px 12px 0 12px}
+.message-item.received{align-self:flex-start}
+.message-item.received .msg-bubble{background:#1a1a2e;color:#e0e0e0;border-radius:12px 12px 12px 0;border:1px solid #2a2a4a}
+.msg-avatar{width:32px;height:32px;border-radius:50%;background:linear-gradient(135deg,#3b82f6,#22c55e);display:flex;align-items:center;justify-content:center;font-size:12px;flex-shrink:0}
+.message-item.sent .msg-avatar{order:2;margin-left:8px}
+.message-item.received .msg-avatar{order:1;margin-right:8px}
+.msg-content{display:flex;flex-direction:column}
+.message-item.sent .msg-content{order:1}
+.message-item.received .msg-content{order:2}
+.msg-bubble{padding:10px 14px;max-width:max-content}
+.msg-text{font-size:13px;line-height:1.5}
+.msg-time{font-size:10px;color:#666;margin-top:4px;text-align:right}
+.message-item.sent .msg-time{color:#fff8}
+
+/* 输入区域 */
+.chat-input{padding:12px 20px;background:#1a1a2e;border-top:1px solid #2a2a4a}
+.input-row{display:flex;gap:10px}
+.input-row textarea{flex:1;padding:10px 14px;background:#0a0a1a;border:1px solid #2a2a4a;border-radius:8px;color:#e0e0e0;font-size:13px;resize:none;min-height:44px;max-height:120px;font-family:inherit}
+.input-row textarea:focus{outline:none;border-color:#e94560}
+.input-row button{padding:10px 24px;background:#e94560;color:#fff;border:none;border-radius:8px;cursor:pointer;font-size:13px;font-weight:500;flex-shrink:0}
+.input-row button:hover{background:#d63850}
+.input-row button:disabled{opacity:.5;cursor:not-allowed}
+
+/* 客户信息面板 */
+.customer-panel{width:280px;background:#1a1a2e;border-left:1px solid #2a2a4a;display:flex;flex-direction:column}
+.customer-header{padding:16px;border-bottom:1px solid #2a2a4a;text-align:center}
+.customer-avatar{width:64px;height:64px;border-radius:50%;background:linear-gradient(135deg,#e94560,#f59e0b);display:flex;align-items:center;justify-content:center;font-size:24px;margin:0 auto}
+.customer-name{font-size:15px;color:#e0e0e0;margin-top:8px}
+.customer-id{font-size:11px;color:#666}
+.customer-tabs{display:flex;border-bottom:1px solid #2a2a4a}
+.customer-tabs .tab{flex:1;padding:8px;text-align:center;font-size:12px;color:#888;cursor:pointer;border-bottom:2px solid transparent}
+.customer-tabs .tab.active{border-color:#e94560;color:#e94560}
+.customer-detail{flex:1;overflow-y:auto;padding:12px}
+.detail-section{margin-bottom:16px}
+.detail-section h4{font-size:12px;color:#888;margin-bottom:8px}
+.detail-row{display:flex;justify-content:space-between;padding:4px 0;font-size:12px}
+.detail-row .label{color:#888}
+.detail-row .value{color:#e0e0e0}
+.tag-list{display:flex;flex-wrap:gap;gap:4px}
+.tag{display:inline-block;padding:3px 8px;background:#0f3460;color:#ccc;border-radius:4px;font-size:11px}
+.record-item{padding:8px;border-bottom:1px solid #1a1a3e}
+.record-item .time{font-size:11px;color:#666}
+.record-item .desc{font-size:12px;color:#e0e0e0;margin-top:2px}
+
+/* 渠道图标 */
+.channel-qw{background:linear-gradient(135deg,#1890ff,#096dd9)}
+.channel-wx{background:linear-gradient(135deg,#07c160,#10b981)}
+.channel-im{background:linear-gradient(135deg,#6366f1,#8b5cf6)}
+.channel-whatsapp{background:linear-gradient(135deg,#25d366,#10b981)}
+.channel-other{background:linear-gradient(135deg,#6b7280,#9ca3af)}
+
+/* 滚动条 */
+::-webkit-scrollbar{width:6px}
+::-webkit-scrollbar-track{background:#0a0a1a}
+::-webkit-scrollbar-thumb{background:#2a2a4a;border-radius:3px}
+::-webkit-scrollbar-thumb:hover{background:#3a3a5a}
+</style>
+</head>
+<body>
+<div id="app" class="main">
+  <!-- 左侧账户列表 -->
+  <div class="account-panel">
+    <div v-for="acc in accounts" :key="acc.id" 
+         :class="['account-item', acc.active ? 'active' : '', acc.connected ? '' : 'disabled']"
+         @click="selectAccount(acc)" :title="acc.name">
+      <span>{{acc.icon}}</span>
+      <span v-if="acc.unread>0" class="badge">{{acc.unread}}</span>
+    </div>
+  </div>
+
+  <!-- 会话列表 -->
+  <div class="session-panel">
+    <div class="session-header">
+      <h3>🗨️ 聊天列表</h3>
+      <div class="search">
+        <input v-model="searchKey" placeholder="搜索联系人..." @keyup="filterSessions">
+      </div>
+    </div>
+    <div class="session-list">
+      <div v-for="sess in filteredSessions" :key="sess.sessionId" 
+           :class="['session-item', sess.sessionId === currentSession?.sessionId ? 'active' : '', sess.unread > 0 ? 'unread' : '']"
+           @click="selectSession(sess)">
+        <div class="session-avatar">{{sess.avatar||'?'}}</div>
+        <div class="session-info">
+          <div class="name">{{sess.name}}</div>
+          <div class="msg">{{sess.lastMsg||'暂无消息'}}</div>
+        </div>
+        <div style="text-align:right;margin-left:8px">
+          <div class="session-time">{{sess.lastTime||''}}</div>
+          <span v-if="sess.unread>0" class="badge">{{sess.unread}}</span>
+        </div>
+      </div>
+      <div v-if="filteredSessions.length===0" style="text-align:center;padding:40px;color:#666;font-size:13px">
+        暂无会话记录
+      </div>
+    </div>
+  </div>
+
+  <!-- 聊天区域 -->
+  <div class="chat-panel">
+    <div v-if="currentSession" class="chat-header">
+      <div class="chat-title">
+        <span class="name">{{currentSession.name}}</span>
+        <span class="type">{{channelName(currentSession.channelType)}}</span>
+      </div>
+      <div class="chat-actions">
+        <button @click="toggleControlMode">{{currentSession.controlMode === 'ai' ? '🤖 AI接管中' : '👤 人工接管'}}</button>
+        <button @click="showCustomerInfo=true">👤 客户信息</button>
+      </div>
+    </div>
+    <div v-else class="chat-header">
+      <div class="chat-title">
+        <span class="name">请选择一个会话</span>
+      </div>
+    </div>
+
+    <div class="message-list" ref="messageList">
+      <div v-for="(msg, idx) in messages" :key="idx" :class="['message-item', msg.sendType === 1 ? 'received' : 'sent']">
+        <div class="msg-avatar">{{msg.sendType === 1 ? '👤' : '🤖'}}</div>
+        <div class="msg-content">
+          <div class="msg-bubble">
+            <div class="msg-text">{{msg.content}}</div>
+          </div>
+          <div class="msg-time">{{msg.time}}</div>
+        </div>
+      </div>
+      <div v-if="messages.length===0" style="text-align:center;padding:60px;color:#666">
+        <div style="font-size:48px;margin-bottom:12px">💬</div>
+        <p>开始与客户聊天</p>
+      </div>
+    </div>
+
+    <div class="chat-input">
+      <div class="input-row">
+        <textarea v-model="inputMsg" placeholder="输入消息..." @keyup.enter="sendMessage"></textarea>
+        <button @click="sendMessage" :disabled="!inputMsg.trim()">发送</button>
+      </div>
+    </div>
+  </div>
+
+  <!-- 客户信息面板 -->
+  <div class="customer-panel" v-if="showCustomerInfo">
+    <div class="customer-header">
+      <div class="customer-avatar">{{currentSession?.avatar||'?'}}</div>
+      <div class="customer-name">{{currentSession?.name||'-'}}</div>
+      <div class="customer-id">{{currentSession?.channelSourceId||'-'}}</div>
+    </div>
+    <div class="customer-tabs">
+      <div :class="['tab', customerTab==='basic'?'active':'']" @click="customerTab='basic'">基本信息</div>
+      <div :class="['tab', customerTab==='tags'?'active':'']" @click="customerTab='tags'">标签</div>
+      <div :class="['tab', customerTab==='records'?'active':'']" @click="customerTab='records'">访问记录</div>
+    </div>
+    <div class="customer-detail">
+      <div v-if="customerTab==='basic'" class="detail-section">
+        <h4>📋 基本信息</h4>
+        <div class="detail-row"><span class="label">渠道</span><span class="value">{{channelName(currentSession?.channelType)}}</span></div>
+        <div class="detail-row"><span class="label">来源ID</span><span class="value">{{currentSession?.channelSourceId||'-'}}</span></div>
+        <div class="detail-row"><span class="label">联系人ID</span><span class="value">{{currentSession?.contactId||'-'}}</span></div>
+        <div class="detail-row"><span class="label">会话ID</span><span class="value">{{currentSession?.sessionId||'-'}}</span></div>
+        <div class="detail-row"><span class="label">创建时间</span><span class="value">{{currentSession?.createTime||'-'}}</span></div>
+      </div>
+      <div v-if="customerTab==='tags'" class="detail-section">
+        <h4>🏷️ 客户标签</h4>
+        <div class="tag-list">
+          <span v-for="tag in customerTags" :key="tag" class="tag">{{tag}}</span>
+        </div>
+        <div v-if="customerTags.length===0" style="color:#666;font-size:12px">暂无标签</div>
+      </div>
+      <div v-if="customerTab==='records'" class="detail-section">
+        <h4>📊 访问记录</h4>
+        <div v-for="record in visitRecords" :key="record.time" class="record-item">
+          <div class="time">{{record.time}}</div>
+          <div class="desc">{{record.desc}}</div>
+        </div>
+        <div v-if="visitRecords.length===0" style="color:#666;font-size:12px">暂无访问记录</div>
+      </div>
+    </div>
+  </div>
+</div>
+
+<script>
+const {createApp, ref, computed, watch, nextTick, onMounted} = Vue;
+    createApp({
+        setup(){
+            const searchKey = ref('');
+            const inputMsg = ref('');
+            const showCustomerInfo = ref(true);
+            const customerTab = ref('basic');
+            const messageList = ref(null);
+            const loading = ref(false);
+            
+            // ====== API配置 ======
+            // 从URL参数获取配置(iframe嵌入时由父窗口传递)
+            const getUrlParam = (name) => {
+                const params = new URLSearchParams(window.location.search);
+                return params.get(name) || '';
+            };
+            
+            // 获取API基路径:URL参数 > 父窗口webpack环境变量 > 默认值
+            const getBaseApi = () => {
+                const fromUrl = getUrlParam('baseApi');
+                if (fromUrl) return fromUrl;
+                try {
+                    if (window.parent && window.parent.process && window.parent.process.env) {
+                        return window.parent.process.env.VUE_APP_BASE_API || '/dev-api';
+                    }
+                } catch(e) {}
+                return '/dev-api';
+            };
+            const BASE_API = getBaseApi();
+            
+            // 获取前端类型:URL参数 > 默认值
+            const getFrontendType = () => {
+                return getUrlParam('frontendType') || 'company';
+            };
+            const FRONTEND_TYPE = getFrontendType();
+            
+            // 从Cookie获取Token
+            const getToken = () => {
+                const match = document.cookie.match(/(?:^|;\s*)Web-Token=([^;]*)/);
+                return match ? match[1] : null;
+            };
+            
+            // 获取租户编码:URL参数 > localStorage
+            const getTenantCode = () => {
+                const fromUrl = getUrlParam('tenantCode');
+                if (fromUrl) return fromUrl;
+                try {
+                    return localStorage.getItem('tenantCode') || '';
+                } catch(e) { return ''; }
+            };
+            
+            // 认证请求工具
+            const request = async (url, options = {}) => {
+                const token = getToken();
+                const tenantCode = getTenantCode();
+                const headers = {
+                    'Content-Type': 'application/json',
+                    'X-Frontend-Type': FRONTEND_TYPE,
+                };
+                if (token) {
+                    headers['Authorization'] = 'Bearer ' + token;
+                }
+                if (tenantCode) {
+                    headers['tenant-code'] = tenantCode;
+                }
+                // 合并自定义headers
+                if (options.headers) {
+                    Object.assign(headers, options.headers);
+                }
+                
+                const fullUrl = url.startsWith('http') ? url : (BASE_API + url);
+                const response = await fetch(fullUrl, {
+                    ...options,
+                    headers,
+                    credentials: 'include',
+                });
+                if (!response.ok) {
+                    const text = await response.text().catch(() => '');
+                    throw new Error(`HTTP ${response.status}: ${text || response.statusText}`);
+                }
+                const data = await response.json();
+                if (data.code === 401) {
+                    // Token过期,显示提示而非强制刷新父窗口(避免死循环)
+                    console.warn('[ChatAggregate] 登录已过期');
+                    throw new Error('登录已过期');
+                }
+                return data;
+            };
+
+            // 账户列表
+            const accounts = ref([]);
+
+            // 会话列表
+            const sessions = ref([]);
+
+            // 当前会话
+            const currentSession = ref(null);
+
+            // 消息列表
+            const messages = ref([]);
+
+            // 客户标签
+            const customerTags = ref([]);
+
+            // 访问记录
+            const visitRecords = ref([]);
+
+            // 当前登录用户的企微账户
+            const currentAccount = ref(null);
+
+            // 过滤后的会话
+            const filteredSessions = computed(()=>{
+                if(!searchKey.value) return sessions.value;
+                const key = searchKey.value.toLowerCase();
+                return sessions.value.filter(s=>{
+                    const name = s.nickName || s.name || '';
+                    return name.toLowerCase().includes(key);
+                });
+            });
+
+            // 加载账户列表
+            const loadAccounts = async () => {
+                try {
+                    // 先获取当前登录用户绑定的企微账户
+                    const res = await request('/qw/user/getMyQwUserList');
+                    if (res.code === 200 || res.code === 0) {
+                        const qwAccounts = (res.data || []).map((acc, idx) => ({
+                            id: acc.id || `qw_${idx}`,
+                            name: acc.qwUserName || '企微账户',
+                            icon: '💼',
+                            active: idx === 0,
+                            connected: true,
+                            unread: 0,
+                            type: 'QW',
+                            corpId: acc.corpId,
+                            qwUserId: acc.qwUserId
+                        }));
+                        
+                        // 添加个微账户占位(后续扩展)
+                        const wxAccounts = []; // 暂时为空,后续实现个微账户绑定
+                        
+                        accounts.value = [...qwAccounts, ...wxAccounts];
+                        
+                        if (accounts.value.length > 0) {
+                            currentAccount.value = accounts.value[0];
+                        }
+                    }
+                } catch (error) {
+                    console.error('加载账户失败:', error);
+                    // 降级显示模拟账户
+                    accounts.value = [
+                        {id:'qw', name:'企业微信', icon:'💼', active:true, connected:true, unread:0, type:'QW'},
+                        {id:'wx', name:'个人微信', icon:'💬', active:false, connected:false, unread:0, type:'WX'},
+                    ];
+                    currentAccount.value = accounts.value[0];
+                }
+            };
+
+            // 加载会话列表
+            const loadSessions = async () => {
+                try {
+                    // 先尝试加载chat会话
+                    const chatRes = await request('/chat/chatSession/list?pageNum=1&pageSize=100');
+                    if (chatRes.code === 200 || chatRes.rows) {
+                        const chatSessions = (chatRes.rows || []).map(s => ({
+                            sessionId: s.sessionId,
+                            name: s.nickName || s.userName || '客户',
+                            avatar: (s.nickName || s.userName || '客').charAt(0),
+                            channelType: 'CHAT',
+                            channelSourceId: s.userId,
+                            contactId: s.userId,
+                            lastMsg: '',
+                            lastTime: s.createTime || '',
+                            unread: 0,
+                            createTime: s.createTime,
+                            status: s.status
+                        }));
+                        
+                        // 再尝试加载企微外部联系人作为会话
+                        const qwRes = await request('/qw/externalContact/list?pageNum=1&pageSize=100');
+                        if (qwRes.code === 200 || qwRes.rows) {
+                            const qwSessions = (qwRes.rows || []).map(c => ({
+                                sessionId: `qw_${c.id}`,
+                                name: c.name || c.remark || '企微客户',
+                                avatar: (c.name || c.remark || '客').charAt(0),
+                                channelType: 'QW',
+                                channelSourceId: c.externalUserId,
+                                contactId: c.id,
+                                lastMsg: '',
+                                lastTime: c.createTime || '',
+                                unread: 0,
+                                createTime: c.createTime,
+                                tagIds: c.tagIds,
+                                customerId: c.customerId,
+                                remarkMobiles: c.remarkMobiles
+                            }));
+                            sessions.value = [...qwSessions, ...chatSessions];
+                        } else {
+                            sessions.value = chatSessions;
+                        }
+                    }
+                } catch (error) {
+                    console.error('加载会话失败:', error);
+                    sessions.value = [];
+                }
+                
+                if (sessions.value.length > 0 && !currentSession.value) {
+                    selectSession(sessions.value[0]);
+                }
+            };
+
+            // 选择账户
+            const selectAccount = (acc)=>{
+                if(!acc.connected) return;
+                accounts.value.forEach(a=>a.active = false);
+                acc.active = true;
+                currentAccount.value = acc;
+                loadSessions();
+            };
+
+            // 选择会话
+            const selectSession = async (sess)=>{
+                currentSession.value = sess;
+                // 清除未读
+                sess.unread = 0;
+                // 加载消息
+                await loadMessages(sess);
+                // 加载客户标签和信息
+                await loadCustomerInfo(sess);
+            };
+
+            // 加载消息
+            const loadMessages = async (session) => {
+                messages.value = [];
+                try {
+                    if (session.channelType === 'CHAT') {
+                        // 加载chat会话消息
+                        const chatDetailRes = await request(`/chat/chatSession/${session.sessionId}`);
+                        if (chatDetailRes.code === 200 || chatDetailRes.data) {
+                            const msgRes = await request(`/chat/chatMsg/list?sessionId=${session.sessionId}&pageNum=1&pageSize=100`);
+                            if (msgRes.rows) {
+                                messages.value = msgRes.rows.map(m => ({
+                                    content: m.content,
+                                    sendType: m.sendType,
+                                    time: m.createTime || new Date().toLocaleTimeString('zh-CN',{hour:'2-digit',minute:'2-digit'})
+                                }));
+                            }
+                        }
+                    } else if (session.channelType === 'QW') {
+                        // TODO: 加载企微聊天记录
+                        messages.value = [];
+                    }
+                } catch (error) {
+                    console.error('加载消息失败:', error);
+                    messages.value = [];
+                }
+                
+                nextTick(()=>{
+                    if(messageList.value){
+                        messageList.value.scrollTop = messageList.value.scrollHeight;
+                    }
+                });
+            };
+
+            // 加载客户信息
+            const loadCustomerInfo = async (session) => {
+                customerTags.value = [];
+                visitRecords.value = [];
+                
+                try {
+                    if (session.tagIds && session.tagIds !== '[]') {
+                        // 解析标签ID并加载标签名称
+                        const tagIds = JSON.parse(session.tagIds);
+                        if (tagIds.length > 0) {
+                            const tagRes = await request(`/qw/tag/list?tagIds=${tagIds.join(',')}`);
+                            if (tagRes.rows) {
+                                customerTags.value = tagRes.rows.map(t => t.tagName || t.name);
+                            }
+                        }
+                    }
+                    
+                    // 加载CRM客户信息
+                    if (session.customerId) {
+                        const crmRes = await request(`/crm/customer/${session.customerId}`);
+                        if (crmRes.data) {
+                            // 补充客户基本信息
+                            if (crmRes.data.phone) {
+                                visitRecords.value.push({
+                                    time: new Date().toLocaleDateString('zh-CN'),
+                                    desc: `手机号: ${crmRes.data.phone}`
+                                });
+                            }
+                            if (crmRes.data.email) {
+                                visitRecords.value.push({
+                                    time: new Date().toLocaleDateString('zh-CN'),
+                                    desc: `邮箱: ${crmRes.data.email}`
+                                });
+                            }
+                        }
+                    }
+                    
+                    // 加载fastGpt聊天摘要
+                    try {
+                        const chatRes = await request('/fastGpt/fastGptChatSession/list?pageNum=1&pageSize=10');
+                        if (chatRes.rows) {
+                            const relatedChat = chatRes.rows.find(c => 
+                                c.externalUserId === session.channelSourceId || 
+                                c.userId === session.contactId
+                            );
+                            if (relatedChat) {
+                                visitRecords.value.push({
+                                    time: relatedChat.createTime || new Date().toLocaleDateString('zh-CN'),
+                                    desc: `最近聊天: ${relatedChat.lastMsg || '暂无消息'}`
+                                });
+                            }
+                        }
+                    } catch (err) {
+                        console.error('加载聊天摘要失败:', err);
+                    }
+                } catch (error) {
+                    console.error('加载客户信息失败:', error);
+                }
+            };
+
+            // 发送消息
+            const sendMessage = async ()=>{
+                if(!inputMsg.value.trim() || !currentSession.value) return;
+                
+                const msg = {
+                    content: inputMsg.value, 
+                    sendType: 2, 
+                    time: new Date().toLocaleTimeString('zh-CN',{hour:'2-digit',minute:'2-digit'})
+                };
+                messages.value.push(msg);
+                const contentToSend = inputMsg.value;
+                inputMsg.value = '';
+                
+                nextTick(()=>{
+                    if(messageList.value){
+                        messageList.value.scrollTop = messageList.value.scrollHeight;
+                    }
+                });
+                
+                // 调用发送消息接口
+                try {
+                    if (currentSession.value.channelType === 'QW') {
+                        // 企微发送消息
+                        await request('/qw/msg/send', {
+                            method: 'POST',
+                            body: JSON.stringify({
+                                externalUserId: currentSession.value.channelSourceId,
+                                content: contentToSend,
+                                qwUserId: currentAccount.value?.qwUserId
+                            })
+                        });
+                    } else if (currentSession.value.channelType === 'CHAT') {
+                        // Chat会话发送消息
+                        await request('/chat/chatMsg', {
+                            method: 'POST',
+                            body: JSON.stringify({
+                                sessionId: currentSession.value.sessionId,
+                                content: contentToSend,
+                                sendType: 2
+                            })
+                        });
+                    }
+                } catch (error) {
+                    console.error('发送消息失败:', error);
+                }
+            };
+
+            // 切换控制模式
+            const toggleControlMode = ()=>{
+                if(currentSession.value){
+                    currentSession.value.controlMode = currentSession.value.controlMode === 'ai' ? 'human' : 'ai';
+                }
+            };
+
+            // 渠道名称
+            const channelName = (type)=>{
+                const names = {QW:'企业微信', WX:'个人微信', IM:'系统IM', WHATSAPP:'WhatsApp', OTHER:'其他渠道', CHAT:'在线咨询'};
+                return names[type] || type;
+            };
+
+            // 初始化
+            onMounted(async () => {
+                await loadAccounts();
+                await loadSessions();
+            });
+
+            return {
+                searchKey, inputMsg, showCustomerInfo, customerTab, messageList, loading,
+                accounts, sessions, currentSession, messages, customerTags, visitRecords,
+                filteredSessions,
+                selectAccount, selectSession, sendMessage, toggleControlMode, channelName
+            };
+        }
+    }).mount('#app');
+</script>
+</body>
+</html>

Fichier diff supprimé car celui-ci est trop grand
+ 21 - 0
public/html/ie.html


+ 209 - 0
public/index.html

@@ -0,0 +1,209 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="renderer" content="webkit">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
+    <!-- <link rel="icon" href="<%= BASE_URL %>favicon.ico"> -->
+    <!-- <title><%= webpackConfig.name %></title> -->
+    <!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
+    <!-- <script charset="utf-8" src="https://map.qq.com/api/gljs?v=1.exp&key=UZQBZ-SYQL3-LYF3K-Y7FAL-N3656-2DBJ4"></script> -->
+	  <style>
+    html,
+    body,
+    #app {
+      height: 100%;
+      margin: 0px;
+      padding: 0px;
+    }
+    .chromeframe {
+      margin: 0.2em 0;
+      background: #ccc;
+      color: #000;
+      padding: 0.2em 0;
+    }
+
+    #loader-wrapper {
+      position: fixed;
+      top: 0;
+      left: 0;
+      width: 100%;
+      height: 100%;
+      z-index: 999999;
+    }
+
+    #loader {
+      display: block;
+      position: relative;
+      left: 50%;
+      top: 50%;
+      width: 150px;
+      height: 150px;
+      margin: -75px 0 0 -75px;
+      border-radius: 50%;
+      border: 3px solid transparent;
+      border-top-color: #FFF;
+      -webkit-animation: spin 2s linear infinite;
+      -ms-animation: spin 2s linear infinite;
+      -moz-animation: spin 2s linear infinite;
+      -o-animation: spin 2s linear infinite;
+      animation: spin 2s linear infinite;
+      z-index: 1001;
+    }
+
+    #loader:before {
+      content: "";
+      position: absolute;
+      top: 5px;
+      left: 5px;
+      right: 5px;
+      bottom: 5px;
+      border-radius: 50%;
+      border: 3px solid transparent;
+      border-top-color: #FFF;
+      -webkit-animation: spin 3s linear infinite;
+      -moz-animation: spin 3s linear infinite;
+      -o-animation: spin 3s linear infinite;
+      -ms-animation: spin 3s linear infinite;
+      animation: spin 3s linear infinite;
+    }
+
+    #loader:after {
+      content: "";
+      position: absolute;
+      top: 15px;
+      left: 15px;
+      right: 15px;
+      bottom: 15px;
+      border-radius: 50%;
+      border: 3px solid transparent;
+      border-top-color: #FFF;
+      -moz-animation: spin 1.5s linear infinite;
+      -o-animation: spin 1.5s linear infinite;
+      -ms-animation: spin 1.5s linear infinite;
+      -webkit-animation: spin 1.5s linear infinite;
+      animation: spin 1.5s linear infinite;
+    }
+
+
+    @-webkit-keyframes spin {
+      0% {
+        -webkit-transform: rotate(0deg);
+        -ms-transform: rotate(0deg);
+        transform: rotate(0deg);
+      }
+      100% {
+        -webkit-transform: rotate(360deg);
+        -ms-transform: rotate(360deg);
+        transform: rotate(360deg);
+      }
+    }
+
+    @keyframes spin {
+      0% {
+        -webkit-transform: rotate(0deg);
+        -ms-transform: rotate(0deg);
+        transform: rotate(0deg);
+      }
+      100% {
+        -webkit-transform: rotate(360deg);
+        -ms-transform: rotate(360deg);
+        transform: rotate(360deg);
+      }
+    }
+
+
+    #loader-wrapper .loader-section {
+      position: fixed;
+      top: 0;
+      width: 51%;
+      height: 100%;
+      background: #7171C6;
+      z-index: 1000;
+      -webkit-transform: translateX(0);
+      -ms-transform: translateX(0);
+      transform: translateX(0);
+    }
+
+    #loader-wrapper .loader-section.section-left {
+      left: 0;
+    }
+
+    #loader-wrapper .loader-section.section-right {
+      right: 0;
+    }
+
+
+    .loaded #loader-wrapper .loader-section.section-left {
+      -webkit-transform: translateX(-100%);
+      -ms-transform: translateX(-100%);
+      transform: translateX(-100%);
+      -webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
+      transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
+    }
+
+    .loaded #loader-wrapper .loader-section.section-right {
+      -webkit-transform: translateX(100%);
+      -ms-transform: translateX(100%);
+      transform: translateX(100%);
+      -webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
+      transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
+    }
+
+    .loaded #loader {
+      opacity: 0;
+      -webkit-transition: all 0.3s ease-out;
+      transition: all 0.3s ease-out;
+    }
+
+    .loaded #loader-wrapper {
+      visibility: hidden;
+      -webkit-transform: translateY(-100%);
+      -ms-transform: translateY(-100%);
+      transform: translateY(-100%);
+      -webkit-transition: all 0.3s 1s ease-out;
+      transition: all 0.3s 1s ease-out;
+    }
+
+    .no-js #loader-wrapper {
+      display: none;
+    }
+
+    .no-js h1 {
+      color: #222222;
+    }
+
+    #loader-wrapper .load_title {
+      font-family: 'Open Sans';
+      color: #FFF;
+      font-size: 19px;
+      width: 100%;
+      text-align: center;
+      z-index: 9999999999999;
+      position: absolute;
+      top: 60%;
+      opacity: 1;
+      line-height: 30px;
+    }
+
+    #loader-wrapper .load_title span {
+      font-weight: normal;
+      font-style: italic;
+      font-size: 13px;
+      color: #FFF;
+      opacity: 0.5;
+    }
+  </style>
+  </head>
+  <body>
+    <div id="app">
+	    <div id="loader-wrapper">
+		    <div id="loader"></div>
+		    <div class="loader-section section-left"></div>
+		    <div class="loader-section section-right"></div>
+		    <div class="load_title">正在加载系统资源,请耐心等待</div>
+        </div>
+	</div>
+  </body>
+</html>

+ 2 - 0
public/robots.txt

@@ -0,0 +1,2 @@
+User-agent: *
+Disallow: /

+ 12 - 0
public/service.html

@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<meta charset="utf-8">
+		<title>技术支持</title>
+	</head>
+	<body>
+		<h4>芳华未来技术支持</h4>
+		<p>联系电话:17749925835</p>
+		<p>联系邮箱:17749925835@163.com</p>
+	</body>
+</html>

+ 19 - 0
src/App.vue

@@ -0,0 +1,19 @@
+<template>
+  <div id="app">
+    <router-view />
+  </div>
+</template>
+
+<script>
+export default  {
+  name:  'App',
+    metaInfo() {
+        return {
+            title: this.$store.state.settings.dynamicTitle && this.$store.state.settings.title,
+            titleTemplate: title => {
+                return title ? `${title} - ${process.env.VUE_APP_TITLE}` : process.env.VUE_APP_TITLE
+            }
+        }
+    }
+}
+</script>

+ 53 - 0
src/api/ad/AdDyAccount.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询抖音账户列表
+export function listAdDyAccount(query) {
+  return request({
+    url: '/ad/AdDyAccount/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询抖音账户详细
+export function getAdDyAccount(id) {
+  return request({
+    url: '/ad/AdDyAccount/' + id,
+    method: 'get'
+  })
+}
+
+// 新增抖音账户
+export function addAdDyAccount(data) {
+  return request({
+    url: '/ad/AdDyAccount',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改抖音账户
+export function updateAdDyAccount(data) {
+  return request({
+    url: '/ad/AdDyAccount',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除抖音账户
+export function delAdDyAccount(id) {
+  return request({
+    url: '/ad/AdDyAccount/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出抖音账户
+export function exportAdDyAccount(query) {
+  return request({
+    url: '/ad/AdDyAccount/export',
+    method: 'get',
+    params: query
+  })
+}

+ 60 - 0
src/api/ad/AdIqiyiAccount.js

@@ -0,0 +1,60 @@
+import request from '@/utils/request'
+
+// 查询爱奇艺广告账号列表
+export function listAdIqiyiAccount(query) {
+  return request({
+    url: '/ad/AdIqiyiAccount/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询爱奇艺广告账号详细
+export function getAdIqiyiAccount(id) {
+  return request({
+    url: '/ad/AdIqiyiAccount/' + id,
+    method: 'get'
+  })
+}
+
+// 查询优酷广告账号详细
+export function listAll() {
+  return request({
+    url: '/ad/AdIqiyiAccount/listAll',
+    method: 'get'
+  })
+}
+// 新增爱奇艺广告账号
+export function addAdIqiyiAccount(data) {
+  return request({
+    url: '/ad/AdIqiyiAccount',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改爱奇艺广告账号
+export function updateAdIqiyiAccount(data) {
+  return request({
+    url: '/ad/AdIqiyiAccount',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除爱奇艺广告账号
+export function delAdIqiyiAccount(id) {
+  return request({
+    url: '/ad/AdIqiyiAccount/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出爱奇艺广告账号
+export function exportAdIqiyiAccount(query) {
+  return request({
+    url: '/ad/AdIqiyiAccount/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/ad/AdUploadLog.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询百度回传日志列表
+export function listAdUploadLog(query) {
+  return request({
+    url: '/ad/AdUploadLog/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询百度回传日志详细
+export function getAdUploadLog(id) {
+  return request({
+    url: '/ad/AdUploadLog/' + id,
+    method: 'get'
+  })
+}
+
+// 新增百度回传日志
+export function addAdUploadLog(data) {
+  return request({
+    url: '/ad/AdUploadLog',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改百度回传日志
+export function updateAdUploadLog(data) {
+  return request({
+    url: '/ad/AdUploadLog',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除百度回传日志
+export function delAdUploadLog(id) {
+  return request({
+    url: '/ad/AdUploadLog/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出百度回传日志
+export function exportAdUploadLog(query) {
+  return request({
+    url: '/ad/AdUploadLog/export',
+    method: 'get',
+    params: query
+  })
+}

+ 60 - 0
src/api/ad/AdYouKuaccount.js

@@ -0,0 +1,60 @@
+import request from '@/utils/request'
+
+// 查询优酷广告账号列表
+export function listAdYouKuAccount(query) {
+  return request({
+    url: '/ad/AdYouKuAccount/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询优酷广告账号详细
+export function getAdYouKuAccount(id) {
+  return request({
+    url: '/ad/AdYouKuAccount/' + id,
+    method: 'get'
+  })
+}
+// 查询优酷广告账号详细
+export function listAll() {
+  return request({
+    url: '/ad/AdYouKuAccount/listAll',
+    method: 'get'
+  })
+}
+
+// 新增优酷广告账号
+export function addAdYouKuAccount(data) {
+  return request({
+    url: '/ad/AdYouKuAccount',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改优酷广告账号
+export function updateAdYouKuAccount(data) {
+  return request({
+    url: '/ad/AdYouKuAccount',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除优酷广告账号
+export function delAdYouKuAccount(id) {
+  return request({
+    url: '/ad/AdYouKuAccount/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出优酷广告账号
+export function exportAdYouKuAccount(query) {
+  return request({
+    url: '/ad/AdYouKuAccount/export',
+    method: 'get',
+    params: query
+  })
+}

+ 9 - 0
src/api/ad/adAccount.js

@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+
+// 查询推广账户列表
+export function listAll() {
+  return request({
+    url: '/ad/adAccount/listAll',
+    method: 'get',
+  })
+}

+ 60 - 0
src/api/ad/adDomain.js

@@ -0,0 +1,60 @@
+import request from '@/utils/request'
+
+// 查询广告域名列表
+export function listAdDomain(query) {
+  return request({
+    url: '/ad/adDomain/list',
+    method: 'get',
+    params: query
+  })
+}
+// 查询广告域名列表
+export function listAll() {
+  return request({
+    url: '/ad/adDomain/listAll',
+    method: 'get',
+  })
+}
+
+// 查询广告域名详细
+export function getAdDomain(id) {
+  return request({
+    url: '/ad/adDomain/' + id,
+    method: 'get'
+  })
+}
+
+// 新增广告域名
+export function addAdDomain(data) {
+  return request({
+    url: '/ad/adDomain',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改广告域名
+export function updateAdDomain(data) {
+  return request({
+    url: '/ad/adDomain',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除广告域名
+export function delAdDomain(id) {
+  return request({
+    url: '/ad/adDomain/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出广告域名
+export function exportAdDomain(query) {
+  return request({
+    url: '/ad/adDomain/export',
+    method: 'get',
+    params: query
+  })
+}

+ 61 - 0
src/api/ad/adSite.js

@@ -0,0 +1,61 @@
+import request from '@/utils/request'
+
+// 查询站点管理列表
+export function listAdSite(query) {
+  return request({
+    url: '/ad/adSite/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询站点管理详细
+export function getAdSite(id) {
+  return request({
+    url: '/ad/adSite/' + id,
+    method: 'get'
+  })
+}
+
+// 新增站点管理
+export function addAdSite(data) {
+  return request({
+    url: '/ad/adSite',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改站点管理
+export function updateAdSite(data) {
+  return request({
+    url: '/ad/adSite',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除站点管理
+export function delAdSite(id) {
+  return request({
+    url: '/ad/adSite/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出站点管理
+export function exportAdSite(query) {
+  return request({
+    url: '/ad/adSite/export',
+    method: 'get',
+    params: query
+  })
+}
+// 导出站点管理
+export function listAll(query) {
+  return request({
+    url: '/ad/adSite/listAll',
+    method: 'get',
+    params: query
+  })
+}

+ 60 - 0
src/api/ad/htmlTemplate.js

@@ -0,0 +1,60 @@
+import request from '@/utils/request'
+
+// 查询广告信息流链接列表
+export function listHtml(query) {
+  return request({
+    url: '/ad/html/template/list',
+    method: 'get',
+    params: query
+  })
+}
+// 查询广告信息流链接列表
+export function listAll() {
+  return request({
+    url: '/ad/html/template/listAll',
+    method: 'get',
+  })
+}
+
+// 查询广告信息流链接详细
+export function getHtml(id) {
+  return request({
+    url: '/ad/html/template/' + id,
+    method: 'get'
+  })
+}
+
+// 新增广告信息流链接
+export function addHtml(data) {
+  return request({
+    url: '/ad/html/template',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改广告信息流链接
+export function updateHtml(data) {
+  return request({
+    url: '/ad/html/template',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除广告信息流链接
+export function delHtml(id) {
+  return request({
+    url: '/ad/html/template/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出广告信息流链接
+export function exportHtml(query) {
+  return request({
+    url: '/ad/html/template/export',
+    method: 'get',
+    params: query
+  })
+}

+ 9 - 0
src/api/admin/ad.js

@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+
+export function listAdAccount(query) {
+  return request({ url: '/admin/ad/list', method: 'get', params: query })
+}
+
+export function exportAdAccount(query) {
+  return request({ url: '/admin/ad/export', method: 'get', params: query })
+}

+ 83 - 0
src/api/admin/aiChatQuality.js

@@ -0,0 +1,83 @@
+import request from '@/utils/request'
+
+// 导出AI对话会话
+export function exportChatSessions(query) {
+  return request({ url: '/admin/aiChatQuality/export', method: 'get', params: query })
+}
+
+// 查询AI聊天会话列表
+export function listChatSessions(query) {
+  return request({
+    url: '/admin/aiChatQuality/sessions',
+    method: 'get',
+    params: query
+  })
+}
+
+// 根据租户ID查询会话列表
+export function listByCompany(companyId) {
+  return request({
+    url: '/admin/aiChatQuality/sessions',
+    method: 'get',
+    params: { companyId }
+  })
+}
+
+// 获取会话详情
+export function getSessionDetail(sessionId) {
+  return request({
+    url: '/admin/aiChatQuality/session/' + sessionId,
+    method: 'get'
+  })
+}
+
+// 获取会话消息列表
+export function getSessionMessages(sessionId) {
+  return request({
+    url: '/admin/aiChatQuality/messages/' + sessionId,
+    method: 'get'
+  })
+}
+
+// 添加质检记录
+export function addQualityRecord(data) {
+  return request({
+    url: '/admin/aiChatQuality/record',
+    method: 'post',
+    data: data
+  })
+}
+
+// 查询质检记录列表
+export function listQualityRecords(query) {
+  return request({
+    url: '/admin/aiChatQuality/records',
+    method: 'get',
+    params: query
+  })
+}
+
+// 获取质检记录详情
+export function getQualityRecord(id) {
+  return request({
+    url: '/admin/aiChatQuality/record/' + id,
+    method: 'get'
+  })
+}
+
+// 修改质检记录
+export function updateQualityRecord(data) {
+  return request({
+    url: '/admin/aiChatQuality/record',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除质检记录
+export function deleteQualityRecord(id) {
+  return request({
+    url: '/admin/aiChatQuality/record/' + id,
+    method: 'delete'
+  })
+}

+ 84 - 0
src/api/admin/aiModel.js

@@ -0,0 +1,84 @@
+import request from '@/utils/request'
+
+const BASE = '/admin/aiModel'
+const SCENE_BASE = '/admin/aiScene'
+
+// ─── 模型管理 ───
+
+export function listAiModel() {
+  return request({ url: BASE + '/list', method: 'get' })
+}
+
+export function getAiModel(id) {
+  return request({ url: BASE + '/' + id, method: 'get' })
+}
+
+export function addAiModel(data) {
+  return request({ url: BASE, method: 'post', data })
+}
+
+export function updateAiModel(id, data) {
+  return request({ url: BASE + '/' + id, method: 'put', data })
+}
+
+export function deleteAiModel(id) {
+  return request({ url: BASE + '/' + id, method: 'delete' })
+}
+
+export function batchSortAiModel(sortList) {
+  return request({ url: BASE + '/batchSort', method: 'put', data: sortList })
+}
+
+export function testAiModel(id) {
+  return request({ url: BASE + '/test/' + id, method: 'post' })
+}
+
+export function refreshAiModel() {
+  return request({ url: BASE + '/refresh', method: 'post' })
+}
+
+// ─── 场景管理 ───
+
+export function listAiScene() {
+  return request({ url: SCENE_BASE + '/list', method: 'get' })
+}
+
+export function getAiScene(sceneCode) {
+  return request({ url: SCENE_BASE + '/' + sceneCode, method: 'get' })
+}
+
+export function updateAiScene(sceneCode, data) {
+  return request({ url: SCENE_BASE + '/' + sceneCode, method: 'put', data })
+}
+
+export function updateSceneThreshold(sceneCode, qualityThreshold) {
+  return request({ url: SCENE_BASE + '/' + sceneCode + '/threshold', method: 'put', data: { qualityThreshold } })
+}
+
+export function getSceneModels(sceneCode) {
+  return request({ url: SCENE_BASE + '/' + sceneCode + '/models', method: 'get' })
+}
+
+export function getSceneEnabledModels(sceneCode) {
+  return request({ url: SCENE_BASE + '/' + sceneCode + '/enabledModels', method: 'get' })
+}
+
+export function addSceneModel(sceneCode, data) {
+  return request({ url: SCENE_BASE + '/' + sceneCode + '/models', method: 'post', data })
+}
+
+export function deleteSceneModel(sceneCode, id) {
+  return request({ url: SCENE_BASE + '/' + sceneCode + '/models/' + id, method: 'delete' })
+}
+
+export function clearSceneModels(sceneCode) {
+  return request({ url: SCENE_BASE + '/' + sceneCode + '/models', method: 'delete' })
+}
+
+export function updateSceneModel(sceneCode, id, data) {
+  return request({ url: SCENE_BASE + '/' + sceneCode + '/models/' + id, method: 'put', data })
+}
+
+export function refreshAiScene() {
+  return request({ url: SCENE_BASE + '/refresh', method: 'post' })
+}

+ 29 - 0
src/api/admin/aiProvider.js

@@ -0,0 +1,29 @@
+import request from '@/utils/request'
+
+export function listAiProvider() {
+  return request({ url: '/knowledge/ai-provider/list', method: 'get' })
+}
+
+export function getAiProvider(id) {
+  return request({ url: '/knowledge/ai-provider/' + id, method: 'get' })
+}
+
+export function addAiProvider(data) {
+  return request({ url: '/knowledge/ai-provider', method: 'post', data })
+}
+
+export function updateAiProvider(id, data) {
+  return request({ url: '/knowledge/ai-provider/' + id, method: 'put', data })
+}
+
+export function deleteAiProvider(id) {
+  return request({ url: '/knowledge/ai-provider/' + id, method: 'delete' })
+}
+
+export function setDefaultAiProvider(id) {
+  return request({ url: '/knowledge/ai-provider/' + id + '/set-default', method: 'post' })
+}
+
+export function testAiProvider(data) {
+  return request({ url: '/knowledge/ai-provider/test', method: 'post', data })
+}

+ 62 - 0
src/api/admin/article.js

@@ -0,0 +1,62 @@
+import request from '@/utils/request'
+
+// 查询所有租户文章列表
+export function listAllArticles(query) {
+  return request({
+    url: '/admin/article/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询待审计文章列表
+export function listPendingArticles() {
+  return request({
+    url: '/admin/article/pending',
+    method: 'get'
+  })
+}
+
+// 根据租户ID查询文章列表
+export function listByCompany(companyId) {
+  return request({
+    url: '/admin/article/byCompany/' + companyId,
+    method: 'get'
+  })
+}
+
+// 获取文章详情
+export function getArticleInfo(articleId) {
+  return request({
+    url: '/admin/article/' + articleId,
+    method: 'get'
+  })
+}
+
+// 审计文章
+export function auditArticle(articleId, status, auditRemark) {
+  return request({
+    url: '/admin/article/audit/' + articleId,
+    method: 'put',
+    params: { status, auditRemark }
+  })
+}
+
+// 删除文章
+export function deleteArticle(articleId) {
+  return request({
+    url: '/admin/article/' + articleId,
+    method: 'delete'
+  })
+}
+
+// 导出文章
+export function exportAllArticles(query) {
+  return request({ url: '/admin/article/export', method: 'get', params: query })
+}
+export function getArticleStatistics() {
+  return request({
+    url: '/admin/article/statistics',
+    method: 'get'
+  })
+}

+ 103 - 0
src/api/admin/callRecord.js

@@ -0,0 +1,103 @@
+import request from '@/utils/request'
+
+// 查询所有租户外呼通话记录列表
+export function listAllCallRecords(query) {
+  return request({
+    url: '/admin/callRecord/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 根据租户ID查询外呼记录
+export function listByCompany(companyId) {
+  return request({
+    url: '/admin/callRecord/byCompany/' + companyId,
+    method: 'get'
+  })
+}
+
+// 获取外呼记录详情
+export function getCallRecordInfo(logId) {
+  return request({
+    url: '/admin/callRecord/' + logId,
+    method: 'get'
+  })
+}
+
+// 获取通话录音
+export function getCallAudio(logId) {
+  return request({
+    url: '/admin/callRecord/audio/' + logId,
+    method: 'get'
+  })
+}
+
+// 查询质检记录列表
+export function listQualityRecords(query) {
+  return request({
+    url: '/admin/callRecord/quality/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 获取质检记录详情
+export function getQualityRecord(id) {
+  return request({
+    url: '/admin/callRecord/quality/' + id,
+    method: 'get'
+  })
+}
+
+// 新增质检记录
+export function addQualityRecord(data) {
+  return request({
+    url: '/admin/callRecord/quality',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改质检记录
+export function updateQualityRecord(data) {
+  return request({
+    url: '/admin/callRecord/quality',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除质检记录
+export function deleteQualityRecord(id) {
+  return request({
+    url: '/admin/callRecord/quality/' + id,
+    method: 'delete'
+  })
+}
+
+// 报备质检
+export function reportQuality(logIds) {
+  return request({
+    url: '/admin/callRecord/report',
+    method: 'post',
+    data: logIds
+  })
+}
+
+// 获取通话统计信息
+export function getCallStatistics() {
+  return request({
+    url: '/admin/callRecord/statistics',
+    method: 'get'
+  })
+}
+
+// 导出通话记录
+export function exportCallRecord(query) {
+  return request({
+    url: '/admin/callRecord/export',
+    method: 'get',
+    params: query
+  })
+}

+ 27 - 0
src/api/admin/commissionRecord.js

@@ -0,0 +1,27 @@
+import request from '@/utils/request'
+
+// 查询代理返佣记录列表
+export function listCommissionRecords(query) {
+  return request({
+    url: '/admin/commission-record/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 获取返佣记录详情
+export function getCommissionRecord(id) {
+  return request({
+    url: '/admin/commission-record/' + id,
+    method: 'get'
+  })
+}
+
+// 导出返佣记录
+export function exportCommissionRecord(query) {
+  return request({
+    url: '/admin/commission-record/export',
+    method: 'get',
+    params: query
+  })
+}

+ 27 - 0
src/api/admin/consumeRecord.js

@@ -0,0 +1,27 @@
+import request from '@/utils/request'
+
+// 查询租户消费扣款记录列表
+export function listConsumeRecords(query) {
+  return request({
+    url: '/admin/consume-record/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 获取消费记录详情
+export function getConsumeRecord(id) {
+  return request({
+    url: '/admin/consume-record/' + id,
+    method: 'get'
+  })
+}
+
+// 导出消费记录
+export function exportConsumeRecord(query) {
+  return request({
+    url: '/admin/consume-record/export',
+    method: 'get',
+    params: query
+  })
+}

+ 10 - 0
src/api/admin/consumeReport.js

@@ -0,0 +1,10 @@
+import request from '@/utils/request'
+
+// 获取模块消费统计报告(按租户+模块交叉汇总)
+export function getConsumptionReport(params) {
+  return request({
+    url: '/admin/module-consumption/report',
+    method: 'get',
+    params
+  })
+}

+ 39 - 0
src/api/admin/course.js

@@ -0,0 +1,39 @@
+import request from '@/utils/request'
+
+// 查询所有租户课程列表
+export function listAllCourses(query) {
+  return request({
+    url: '/admin/course/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 根据租户ID查询课程列表
+export function listByCompany(companyId) {
+  return request({
+    url: '/admin/course/byCompany/' + companyId,
+    method: 'get'
+  })
+}
+
+// 获取课程详情
+export function getCourseInfo(courseId) {
+  return request({
+    url: '/admin/course/' + courseId,
+    method: 'get'
+  })
+}
+
+// 导出课程
+export function exportAllCourses(query) {
+  return request({ url: '/admin/course/export', method: 'get', params: query })
+}
+
+// 获取课程统计信息
+export function getCourseStatistics() {
+  return request({
+    url: '/admin/course/statistics',
+    method: 'get'
+  })
+}

+ 9 - 0
src/api/admin/crm.js

@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+
+export function listCrmCustomer(query) {
+  return request({ url: '/admin/crm/list', method: 'get', params: query })
+}
+
+export function exportCrmCustomer(query) {
+  return request({ url: '/admin/crm/export', method: 'get', params: query })
+}

+ 18 - 0
src/api/admin/dailyStatistics.js

@@ -0,0 +1,18 @@
+import request from '@/utils/request'
+
+// ======== 每日统计 ========
+
+// 代理下租户每日消费明细
+export function getDailyAgentTenants(params) {
+  return request({ url: '/admin/statistics/daily/agentTenants', method: 'get', params })
+}
+
+// 各服务类型每日利润
+export function getDailyServiceTypeProfit(params) {
+  return request({ url: '/admin/statistics/daily/serviceTypeProfit', method: 'get', params })
+}
+
+// 所有代理每日汇总
+export function getDailyAgentSummary(params) {
+  return request({ url: '/admin/statistics/daily/agentSummary', method: 'get', params })
+}

+ 46 - 0
src/api/admin/dbConfig.js

@@ -0,0 +1,46 @@
+import request from '@/utils/request'
+
+export function listDbConfig(query) {
+  return request({
+    url: '/admin/dbConfig/list',
+    method: 'get',
+    params: query
+  })
+}
+
+export function getDbConfig(id) {
+  return request({
+    url: '/admin/dbConfig/' + id,
+    method: 'get'
+  })
+}
+
+export function addDbConfig(data) {
+  return request({
+    url: '/admin/dbConfig',
+    method: 'post',
+    data: data
+  })
+}
+
+export function updateDbConfig(data) {
+  return request({
+    url: '/admin/dbConfig',
+    method: 'put',
+    data: data
+  })
+}
+
+export function delDbConfig(ids) {
+  return request({
+    url: '/admin/dbConfig/' + ids,
+    method: 'delete'
+  })
+}
+
+export function getAvailableDbConfig() {
+  return request({
+    url: '/admin/dbConfig/available',
+    method: 'get'
+  })
+}

+ 18 - 0
src/api/admin/ipadServer.js

@@ -0,0 +1,18 @@
+import request from '@/utils/request'
+
+// 查询iPad服务器列表(含租户使用统计)
+export function listIpadServers(query) {
+  return request({
+    url: '/admin/ipad-server-list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 获取iPad租户使用统计
+export function getIpadStats() {
+  return request({
+    url: '/admin/ipad-stats',
+    method: 'get'
+  })
+}

+ 39 - 0
src/api/admin/live.js

@@ -0,0 +1,39 @@
+import request from '@/utils/request'
+
+// 查询所有租户直播列表
+export function listAllLives(query) {
+  return request({
+    url: '/admin/live/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 根据租户ID查询直播列表
+export function listByCompany(companyId) {
+  return request({
+    url: '/admin/live/byCompany/' + companyId,
+    method: 'get'
+  })
+}
+
+// 获取直播详情
+export function getLiveInfo(liveId) {
+  return request({
+    url: '/admin/live/' + liveId,
+    method: 'get'
+  })
+}
+
+// 导出直播
+export function exportAllLives(query) {
+  return request({ url: '/admin/live/export', method: 'get', params: query })
+}
+
+// 获取直播统计信息
+export function getLiveStatistics() {
+  return request({
+    url: '/admin/live/statistics',
+    method: 'get'
+  })
+}

+ 10 - 0
src/api/admin/liveVideo.js

@@ -0,0 +1,10 @@
+import request from '@/utils/request'
+
+// 查询所有租户直播视频列表
+export function listAllLiveVideos(query) {
+  return request({
+    url: '/admin/liveVideo/list',
+    method: 'get',
+    params: query
+  })
+}

+ 92 - 0
src/api/admin/lobster.js

@@ -0,0 +1,92 @@
+import request from '@/utils/request'
+
+// ======== 全局工作流实例监控 ========
+
+// 查看所有租户的工作流实例列表
+export function listAllInstances(params) {
+  return request({ url: '/workflow/lobster/instance/list', method: 'get', params })
+}
+
+// 查看指定实例详情(跨租户)
+export function getInstanceDetail(instanceId) {
+  return request({ url: `/workflow/lobster/instance/${instanceId}`, method: 'get' })
+}
+
+// 查看指定实例的节点执行日志
+export function getInstanceNodeLogs(instanceId) {
+  return request({ url: `/workflow/lobster/instance/node-logs/${instanceId}`, method: 'get' })
+}
+
+// 强制终止指定实例(管理级操作)
+export function forceTerminateInstance(instanceId, reason) {
+  return request({ url: `/workflow/lobster/instance/terminate/${instanceId}`, method: 'post', params: { reason } })
+}
+
+// 全局工作流运行统计
+export function getInstanceStats() {
+  return request({ url: '/workflow/lobster/instance/stats', method: 'get' })
+}
+
+// ======== 全局死信队列管理 ========
+
+export function listAllDeadLetters(params) {
+  return request({ url: '/workflow/lobster/dead-letter/list', method: 'get', params })
+}
+
+export function retryAllDeadLetters() {
+  return request({ url: '/workflow/lobster/dead-letter/retry-all', method: 'post' })
+}
+
+export function getDeadLetterStats() {
+  return request({ url: '/workflow/lobster/dead-letter/stats', method: 'get' })
+}
+
+// ======== 全局节点审核 ========
+
+export function listAllEventAudits(params) {
+  return request({ url: '/workflow/lobster/event-audit/list', method: 'get', params })
+}
+
+export function approveEventAudit(id) {
+  return request({ url: `/workflow/lobster/event-audit/approve/${id}`, method: 'post' })
+}
+
+export function rejectEventAudit(id, data) {
+  return request({ url: `/workflow/lobster/event-audit/reject/${id}`, method: 'post', data })
+}
+
+export function getEventAuditDetail(id) {
+  return request({ url: `/workflow/lobster/event-audit/${id}`, method: 'get' })
+}
+
+// ======== 全局优化建议 ========
+
+export function listAllOptimization(params) {
+  return request({ url: '/workflow/lobster/optimization/list', method: 'get', params })
+}
+
+export function batchAuditOptimization(data) {
+  return request({ url: '/workflow/lobster/optimization/batch-audit', method: 'post', data })
+}
+
+export function getOptimizationStats() {
+  return request({ url: '/workflow/lobster/optimization/stats', method: 'get' })
+}
+
+// ======== 全局Token计费统计 ========
+
+export function listAllBillingRecords(params) {
+  return request({ url: '/workflow/lobster/billing/records', method: 'get', params })
+}
+
+export function getBillingStats() {
+  return request({ url: '/workflow/lobster/billing/stats', method: 'get' })
+}
+
+export function getTokenCoefficient() {
+  return request({ url: '/workflow/lobster/billing/token-coefficient', method: 'get' })
+}
+
+export function updateTokenCoefficient(data) {
+  return request({ url: '/workflow/lobster/billing/token-coefficient', method: 'put', data })
+}

+ 29 - 0
src/api/admin/moduleUsage.js

@@ -0,0 +1,29 @@
+import request from '@/utils/request'
+
+export function listModuleUsage(query) {
+  return request({ url: '/admin/module-usage/list', method: 'get', params: query })
+}
+
+export function listModuleUsageSummary(query) {
+  return request({ url: '/admin/module-usage/summary', method: 'get', params: query })
+}
+
+export function getProxyDetail(proxyId, statDate) {
+  return request({ url: `/admin/module-usage/proxy/${proxyId}`, method: 'get', params: { statDate } })
+}
+
+export function getTenantDetail(tenantId) {
+  return request({ url: `/admin/module-usage/tenant/${tenantId}`, method: 'get' })
+}
+
+export function refreshStatistics() {
+  return request({ url: '/admin/module-usage/refresh', method: 'post' })
+}
+
+export function refreshTenantStatistics(tenantId) {
+  return request({ url: `/admin/module-usage/refresh/${tenantId}`, method: 'post' })
+}
+
+export function exportModuleUsage(query) {
+  return request({ url: '/admin/module-usage/export', method: 'get', params: query })
+}

+ 56 - 0
src/api/admin/product.js

@@ -0,0 +1,56 @@
+import request from '@/utils/request'
+
+// 查询所有租户商品列表
+export function listAllProducts(query) {
+  return request({
+    url: '/admin/product/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询待审核商品列表
+export function listPendingProducts() {
+  return request({
+    url: '/admin/product/pending',
+    method: 'get'
+  })
+}
+
+// 根据租户ID查询商品列表
+export function listByCompany(companyId) {
+  return request({
+    url: '/admin/product/byCompany/' + companyId,
+    method: 'get'
+  })
+}
+
+// 获取商品详情
+export function getProductInfo(productId) {
+  return request({
+    url: '/admin/product/' + productId,
+    method: 'get'
+  })
+}
+
+// 审核商品
+export function auditProduct(productId, status, auditRemark) {
+  return request({
+    url: '/admin/product/audit/' + productId,
+    method: 'put',
+    params: { status, auditRemark }
+  })
+}
+
+// 导出商品
+export function exportAllProducts(query) {
+  return request({ url: '/admin/product/export', method: 'get', params: query })
+}
+
+// 获取商品统计信息
+export function getProductStatistics() {
+  return request({
+    url: '/admin/product/statistics',
+    method: 'get'
+  })
+}

+ 36 - 0
src/api/admin/proxy.js

@@ -0,0 +1,36 @@
+import request from '@/utils/request'
+
+// ======== 代理 CRUD ========
+
+export function listProxy(query) {
+  return request({ url: '/admin/proxy/list', method: 'get', params: query })
+}
+
+export function getProxy(proxyId) {
+  return request({ url: `/admin/proxy/${proxyId}`, method: 'get' })
+}
+
+export function addProxy(data) {
+  return request({ url: '/admin/proxy', method: 'post', data })
+}
+
+export function updateProxy(data) {
+  return request({ url: '/admin/proxy', method: 'put', data })
+}
+
+export function delProxy(proxyIds) {
+  return request({ url: `/admin/proxy/${proxyIds}`, method: 'delete' })
+}
+
+export function changeProxyStatus(proxyId, status) {
+  return request({ url: `/admin/proxy/changeStatus/${proxyId}`, method: 'put', params: { status } })
+}
+
+export function allEnabledProxies() {
+  return request({ url: '/admin/proxy/allEnabled', method: 'get' })
+}
+
+// 重置代理密码
+export function resetProxyPwd(proxyId, password) {
+  return request({ url: `/admin/proxy/resetPwd/${proxyId}`, method: 'put', data: { password } })
+}

+ 15 - 0
src/api/admin/proxyOperLog.js

@@ -0,0 +1,15 @@
+import request from '@/utils/request'
+
+// 查询代理操作日志列表
+export function listProxyOperLog(params) {
+  return request({
+    url: '/admin/proxyOperLog/list',
+    method: 'get',
+    params: params
+  })
+}
+
+// 导出代理操作日志
+export function exportProxyOperLog(query) {
+  return request({ url: '/admin/proxyOperLog/export', method: 'get', params: query })
+}

+ 39 - 0
src/api/admin/qwExternalContact.js

@@ -0,0 +1,39 @@
+import request from '@/utils/request'
+
+// 查询所有租户企微用户列表
+export function listAllExternalContact(query) {
+  return request({
+    url: '/admin/qwContact/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询指定租户企微用户列表
+export function listByCompany(companyId) {
+  return request({
+    url: '/admin/qwContact/byCompany/' + companyId,
+    method: 'get'
+  })
+}
+
+// 获取企微用户详情
+export function getExternalContact(id) {
+  return request({
+    url: '/admin/qwContact/' + id,
+    method: 'get'
+  })
+}
+
+// 导出企微外部联系人
+export function exportAllExternalContact(query) {
+  return request({ url: '/admin/qwContact/export', method: 'get', params: query })
+}
+
+// 获取统计信息
+export function getStatistics() {
+  return request({
+    url: '/admin/qwContact/statistics',
+    method: 'get'
+  })
+}

+ 27 - 0
src/api/admin/rechargeRecord.js

@@ -0,0 +1,27 @@
+import request from '@/utils/request'
+
+// 查询租户充值记录列表
+export function listRechargeRecords(query) {
+  return request({
+    url: '/admin/recharge-record/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 获取充値记录详情
+export function getRechargeRecord(id) {
+  return request({
+    url: '/admin/recharge-record/' + id,
+    method: 'get'
+  })
+}
+
+// 导出充値记录
+export function exportRechargeRecord(query) {
+  return request({
+    url: '/admin/recharge-record/export',
+    method: 'get',
+    params: query
+  })
+}

+ 34 - 0
src/api/admin/serviceCost.js

@@ -0,0 +1,34 @@
+import request from '@/utils/request'
+
+// ======== 服务成本配置 ========
+
+export function listServiceCost() {
+  return request({ url: '/admin/serviceCost/list', method: 'get' })
+}
+
+export function getServiceCostByType(serviceType) {
+  return request({ url: `/admin/serviceCost/${serviceType}`, method: 'get' })
+}
+
+export function updateServiceCost(data) {
+  return request({ url: '/admin/serviceCost', method: 'put', data })
+}
+
+export function getEnabledServiceTypes() {
+  return request({ url: '/admin/serviceCost/enabled', method: 'get' })
+}
+
+// ======== 代理定价 ========
+
+export function listServicePrice(query) {
+  return request({ url: '/admin/servicePrice/list', method: 'get', params: query })
+}
+
+export function batchSaveServicePrice(data) {
+  return request({ url: '/admin/servicePrice/batch', method: 'post', data })
+}
+
+// 代理定价批量保存(代理端接口)
+export function batchSaveProxyServicePrice(data) {
+  return request({ url: '/proxy/servicePrice/batch', method: 'put', data })
+}

+ 13 - 0
src/api/admin/sop.js

@@ -0,0 +1,13 @@
+import request from '@/utils/request'
+
+export function listSop(query) {
+  return request({ url: '/admin/sop/list', method: 'get', params: query })
+}
+
+export function listSopTemp(query) {
+  return request({ url: '/admin/sop/temp/list', method: 'get', params: query })
+}
+
+export function exportSop(query) {
+  return request({ url: '/admin/sop/export', method: 'get', params: query })
+}

+ 61 - 0
src/api/admin/statistics.js

@@ -0,0 +1,61 @@
+import request from '@/utils/request'
+
+// 平台总览
+export function getOverview() {
+  return request({ url: '/admin/statistics/overview', method: 'get' })
+}
+
+// 代理分佣统计
+export function getProxyProfitStatistics(params) {
+  return request({ url: '/admin/statistics/proxyProfit', method: 'get', params })
+}
+
+// 代理分佣详情
+export function getProxyProfitDetail(proxyId, params) {
+  return request({ url: `/admin/statistics/proxyProfit/${proxyId}`, method: 'get', params })
+}
+
+// 租户消费统计
+export function getTenantConsumeStatistics(params) {
+  return request({ url: '/admin/statistics/tenantConsume', method: 'get', params })
+}
+
+// 租户消费详情
+export function getTenantDetail(tenantId, params) {
+  return request({ url: `/admin/statistics/tenantDetail/${tenantId}`, method: 'get', params })
+}
+
+// 消费类型统计
+export function getConsumeTypeStatistics(params) {
+  return request({ url: '/admin/statistics/consumeType', method: 'get', params })
+}
+
+// 平台成本汇总
+export function getCostSummary(params) {
+  return request({ url: '/admin/statistics/costSummary', method: 'get', params })
+}
+
+// 平台趋势
+export function getPlatformTrend(params) {
+  return request({ url: '/admin/statistics/trend', method: 'get', params })
+}
+
+// 小时统计
+export function getHourlyStatistics(statDate, dimension) {
+  return request({ url: '/admin/statistics/hourly', method: 'get', params: { statDate, dimension } })
+}
+
+// 服务成本配置
+export function getCostConfigList() {
+  return request({ url: '/admin/statistics/costConfig', method: 'get' })
+}
+
+// 原始消费记录
+export function getConsumeRecords(params) {
+  return request({ url: '/admin/statistics/consumeRecords', method: 'get', params })
+}
+
+// 手动执行统计
+export function executeStatistics(type) {
+  return request({ url: '/admin/statistics/execute', method: 'post', params: { type } })
+}

+ 9 - 0
src/api/admin/storeOrder.js

@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+
+export function listStoreOrder(query) {
+  return request({ url: '/admin/storeOrder/list', method: 'get', params: query })
+}
+
+export function exportStoreOrder(query) {
+  return request({ url: '/admin/storeOrder/export', method: 'get', params: query })
+}

+ 108 - 0
src/api/admin/sysCompany.js

@@ -0,0 +1,108 @@
+import request from '@/utils/request'
+
+// 查询所有租户列表
+export function listAllCompanies(query) {
+  return request({
+    url: '/admin/company/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 获取租户详情
+export function getCompanyInfo(companyId) {
+  return request({
+    url: '/admin/company/' + companyId,
+    method: 'get'
+  })
+}
+
+// 禁用租户(TenantInfo: status=0 禁用)
+export function disableCompany(companyId) {
+  return request({
+    url: '/admin/company/status/' + companyId,
+    method: 'put',
+    params: { status: 0 }
+  })
+}
+
+// 启用租户(TenantInfo: status=1 启用)
+export function enableCompany(companyId) {
+  return request({
+    url: '/admin/company/status/' + companyId,
+    method: 'put',
+    params: { status: 1 }
+  })
+}
+
+// 获取租户统计信息
+export function getStatistics() {
+  return request({
+    url: '/admin/company/statistics',
+    method: 'get'
+  })
+}
+
+// 新增租户
+export function addCompany(data) {
+  return request({
+    url: '/admin/company',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新租户信息
+export function updateTenant(data) {
+  return request({
+    url: '/admin/company',
+    method: 'put',
+    data: data
+  })
+}
+
+// 租户充値/扣款
+export function rechargeCompany(companyId, data) {
+  return request({
+    url: '/admin/company/' + companyId + '/recharge',
+    method: 'post',
+    data: data
+  })
+}
+
+// 导出租户列表
+export function exportCompany(query) {
+  return request({
+    url: '/admin/company/export',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}
+
+// 获取租户菜单树(管理端/销售端)
+export function getTenantMenuTree(companyId, flag) {
+  return request({
+    url: '/admin/company/' + companyId + '/menu',
+    method: 'post',
+    data: { flag: flag }
+  })
+}
+
+// 编辑租户菜单(勾选/取消)
+export function editTenantMenu(companyId, data) {
+  return request({
+    url: '/admin/company/' + companyId + '/menu/edit',
+    method: 'post',
+    data: data
+  })
+}
+
+// 重置租户管理员密码
+export function resetTenantPwd(companyId, password) {
+  return request({
+    url: '/admin/company/' + companyId + '/resetPwd',
+    method: 'put',
+    data: { password }
+  })
+}

+ 45 - 0
src/api/admin/sysUser.js

@@ -0,0 +1,45 @@
+import request from '@/utils/request'
+
+// 查询管理员列表(sys_user 中 company_id IS NULL)
+export function listAdminUsers(query) {
+  return request({
+    url: '/admin/companyUser/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 获取管理员详情
+export function getAdminUserInfo(userId) {
+  return request({
+    url: '/admin/companyUser/' + userId,
+    method: 'get'
+  })
+}
+
+// 禁用管理员账户(status=1 停用)
+export function disableAdminUser(userId) {
+  return request({
+    url: '/admin/companyUser/status/' + userId,
+    method: 'put',
+    params: { status: '1' }
+  })
+}
+
+// 启用管理员账户(status=0 正常)
+export function enableAdminUser(userId) {
+  return request({
+    url: '/admin/companyUser/status/' + userId,
+    method: 'put',
+    params: { status: '0' }
+  })
+}
+
+// 导出管理员列表
+export function exportAdminUser(query) {
+  return request({
+    url: '/admin/companyUser/export',
+    method: 'get',
+    params: query
+  })
+}

+ 44 - 0
src/api/admin/trafficPricing.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询租户流量定价列表
+export function listTrafficPricing(query) {
+  return request({
+    url: '/admin/traffic-pricing/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询流量定价详情
+export function getTrafficPricing(id) {
+  return request({
+    url: '/admin/traffic-pricing/' + id,
+    method: 'get'
+  })
+}
+
+// 新增流量定价
+export function addTrafficPricing(data) {
+  return request({
+    url: '/admin/traffic-pricing',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新流量定价
+export function updateTrafficPricing(data) {
+  return request({
+    url: '/admin/traffic-pricing',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除流量定价
+export function delTrafficPricing(id) {
+  return request({
+    url: '/admin/traffic-pricing/' + id,
+    method: 'delete'
+  })
+}

+ 10 - 0
src/api/admin/videoResource.js

@@ -0,0 +1,10 @@
+import request from '@/utils/request'
+
+// 查询所有租户视频资源列表
+export function listAllVideoResources(query) {
+  return request({
+    url: '/admin/videoResource/list',
+    method: 'get',
+    params: query
+  })
+}

+ 10 - 0
src/api/admin/voiceNumber.js

@@ -0,0 +1,10 @@
+import request from '@/utils/request'
+
+// 查询CID主叫号码列表(admin专用,走 /admin/ 前缀,路由到 fs-admin 8004)
+export function listCidNumber(query) {
+  return request({
+    url: '/admin/voice-number/list',
+    method: 'get',
+    params: query
+  })
+}

+ 20 - 0
src/api/admin/voiceOrder.js

@@ -0,0 +1,20 @@
+import request from '@/utils/request'
+
+// 查询通话套餐订单列表(admin专用,走 /admin/ 前缀,路由到 fs-admin 8004)
+export function listVoiceOrder(query) {
+  return request({
+    url: '/admin/voice-order/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出通话套餐订单
+export function exportVoiceOrder(query) {
+  return request({
+    url: '/admin/voice-order/export',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}

+ 18 - 0
src/api/admin/voicePackage.js

@@ -0,0 +1,18 @@
+import request from '@/utils/request'
+
+// 查询通话套餐列表(admin专用,走 /admin/ 前缀,路由到 fs-admin 8004)
+export function listVoicePackage(query) {
+  return request({
+    url: '/admin/voice-package/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询通话套餐详情
+export function getVoicePackage(id) {
+  return request({
+    url: '/admin/voice-package/' + id,
+    method: 'get'
+  })
+}

+ 52 - 0
src/api/admin/withdrawalManage.js

@@ -0,0 +1,52 @@
+import request from '@/utils/request'
+
+// 查询提现申请列表
+export function listWithdrawals(query) {
+  return request({
+    url: '/admin/withdrawal/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 获取提现申请详情
+export function getWithdrawal(id) {
+  return request({
+    url: '/admin/withdrawal/' + id,
+    method: 'get'
+  })
+}
+
+// 审核通过
+export function approveWithdrawal(id) {
+  return request({
+    url: '/admin/withdrawal/' + id + '/approve',
+    method: 'put'
+  })
+}
+
+// 审核拒绝
+export function rejectWithdrawal(id, reason) {
+  return request({
+    url: '/admin/withdrawal/' + id + '/reject',
+    method: 'put',
+    params: { reason }
+  })
+}
+
+// 确认打款
+export function confirmPaid(id) {
+  return request({
+    url: '/admin/withdrawal/' + id + '/paid',
+    method: 'put'
+  })
+}
+
+// 导出提现申请
+export function exportWithdrawal(query) {
+  return request({
+    url: '/admin/withdrawal/export',
+    method: 'get',
+    params: query
+  })
+}

+ 62 - 0
src/api/adv/advertiser.js

@@ -0,0 +1,62 @@
+import request from '@/utils/request'
+
+// 分页查询广告商列表
+export function pageAdvertiser(query) {
+  return request({
+    url: '/adv/advertiser/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 根据ID查询广告商详情
+export function getAdvertiser(id) {
+  return request({
+    url: '/adv/advertiser/' + id,
+    method: 'get'
+  })
+}
+
+// 创建广告商
+export function addAdvertiser(data) {
+  return request({
+    url: '/adv/advertiser',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新广告商
+export function updateAdvertiser(id, data) {
+  return request({
+    url: '/adv/advertiser/' + id,
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除广告商
+export function delAdvertiser(id) {
+  return request({
+    url: '/adv/advertiser/' + id,
+    method: 'delete'
+  })
+}
+
+// 批量删除广告商
+export function batchDelAdvertiser(ids) {
+  return request({
+    url: '/adv/advertiser/batch',
+    method: 'delete',
+    data: ids
+  })
+}
+
+// 启用/停用广告商
+export function enableAdvertiser(id) {
+  return request({
+    url: '/adv/advertiser/enable/' + id,
+    method: 'post'
+  })
+}
+

+ 70 - 0
src/api/adv/callbackAccount.js

@@ -0,0 +1,70 @@
+import request from '@/utils/request'
+
+// 分页查询回传账号列表
+export function pageCallbackAccount(query) {
+  return request({
+    url: '/adv/callback-account/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 根据ID查询回传账号详情
+export function getCallbackAccount(id) {
+  return request({
+    url: '/adv/callback-account/' + id,
+    method: 'get'
+  })
+}
+
+// 创建回传账号
+export function addCallbackAccount(data) {
+  return request({
+    url: '/adv/callback-account',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新回传账号
+export function updateCallbackAccount(id, data) {
+  return request({
+    url: '/adv/callback-account/' + id,
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除回传账号
+export function delCallbackAccount(id) {
+  return request({
+    url: '/adv/callback-account/' + id,
+    method: 'delete'
+  })
+}
+
+// 批量删除回传账号
+export function batchDelCallbackAccount(ids) {
+  return request({
+    url: '/adv/callback-account/batch',
+    method: 'delete',
+    data: ids
+  })
+}
+
+// 查询事件类型
+export function queryEventType(advertiserId) {
+  return request({
+    url: '/adv/callback-account/queryEventType/' + advertiserId,
+    method: 'post'
+  })
+}
+
+// 保存转换事件
+export function saveEventType(id, data) {
+  return request({
+    url: '/adv/callback-account/saveEventType/' + id,
+    method: 'post',
+    data: data
+  })
+}

+ 29 - 0
src/api/adv/channel.js

@@ -0,0 +1,29 @@
+import request from '@/utils/request'
+
+// 查询分组列表
+export function pageProject(data) {
+  return request({
+    url: '/adv/channel/page',
+    method: 'get',
+    params: data
+  })
+}
+
+
+// 新增或更新渠道
+export function addOrUpdateChannel(data) {
+  return request({
+    url: '/adv/channel/addOrUpdate',
+    method: 'post',
+    data: data
+  })
+}
+
+// 批量复制渠道
+export function saveBatchChannel(data) {
+  return request({
+    url: '/adv/channel/saveBatch',
+    method: 'post',
+    data: data
+  })
+}

+ 18 - 0
src/api/adv/configuration.js

@@ -0,0 +1,18 @@
+import request from '@/utils/request'
+
+// 查询配置详情
+export function getConfigDetail() {
+    return request({
+        url: '/adv/config/detail',
+        method: 'get'
+    })
+}
+
+// 新增或修改配置
+export function addOrUpdateConfig(data) {
+    return request({
+        url: '/adv/config/addOrUpdate',
+        method: 'post',
+        data: data
+    })
+}

+ 10 - 0
src/api/adv/conversionLog.js

@@ -0,0 +1,10 @@
+import request from '@/utils/request'
+
+// 分页查询回传事件列表
+export function pageConversionLog(query) {
+  return request({
+    url: '/adv/conversion-log/page',
+    method: 'get',
+    params: query
+  })
+}

+ 63 - 0
src/api/adv/domain.js

@@ -0,0 +1,63 @@
+import request from '@/utils/request'
+
+// 分页查询域名列表
+export function pageDomain(query) {
+  return request({
+    url: '/adv/domains/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 根据ID查询域名详情
+export function getDomain(id) {
+  return request({
+    url: '/adv/domains/' + id,
+    method: 'get'
+  })
+}
+
+// 新增域名
+export function addDomain(data) {
+  return request({
+    url: '/adv/domains',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新域名
+export function updateDomain(id, data) {
+  return request({
+    url: '/adv/domains/' + id,
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除域名
+export function delDomain(id) {
+  return request({
+    url: '/adv/domains/' + id,
+    method: 'delete'
+  })
+}
+
+// 批量删除域名
+export function batchDelDomain(ids) {
+  return request({
+    url: '/adv/domains/batch',
+    method: 'delete',
+    data: ids
+  })
+}
+
+// 启用/禁用域名
+export function updateDomainStatus(id, status) {
+  return request({
+    url: '/adv/domains/' + id + '/status',
+    method: 'put',
+    params: { status }
+  })
+}
+

+ 73 - 0
src/api/adv/landingPageTemplate.js

@@ -0,0 +1,73 @@
+import request from '@/utils/request'
+
+// 分页查询模板列表
+export function pageTemplate(query) {
+  return request({
+    url: '/adv/landing-page-templates/page',
+    method: 'get',
+    params: query
+  })
+}
+
+
+
+// 根据ID查询模板详情
+export function getTemplate(id) {
+  return request({
+    url: '/adv/landing-page-templates/' + id,
+    method: 'get'
+  })
+}
+
+// 新增模板
+export function addTemplate(data) {
+  return request({
+    url: '/adv/landing-page-templates',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新模板
+export function updateTemplate(id, data) {
+  return request({
+    url: '/adv/landing-page-templates/' + id,
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除模板
+export function delTemplate(id) {
+  return request({
+    url: '/adv/landing-page-templates/' + id,
+    method: 'delete'
+  })
+}
+
+// 批量删除模板
+export function batchDelTemplate(ids) {
+  return request({
+    url: '/adv/landing-page-templates/batch',
+    method: 'delete',
+    data: ids
+  })
+}
+
+// 启用/禁用模板
+export function updateTemplateStatus(id, status) {
+  return request({
+    url: '/adv/landing-page-templates/enable/' + id,
+    method: 'post',
+    params: { status }
+  })
+}
+
+// 复制模板
+export function copyTemplate(id) {
+  return request({
+    url: '/adv/landing-page-templates/' + id + '/copy',
+    method: 'post'
+  })
+}
+

+ 19 - 0
src/api/adv/project.js

@@ -0,0 +1,19 @@
+import request from '@/utils/request'
+
+// 查询项目列表
+export function pageProject(data) {
+  return request({
+    url: '/adv/project/page',
+    method: 'get',
+    params: data
+  })
+}
+
+// 新增项目
+export function addProject(data) {
+  return request({
+    url: '/adv/project/add',
+    method: 'post',
+    data: data
+  })
+}

+ 54 - 0
src/api/adv/promotionAccount.js

@@ -0,0 +1,54 @@
+import request from '@/utils/request'
+
+// 分页查询推广账号列表
+export function pagePromotionAccount(query) {
+  return request({
+    url: '/adv/promotion-account/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 根据ID查询推广账号详情
+export function getPromotionAccount(id) {
+  return request({
+    url: '/adv/promotion-account/' + id,
+    method: 'get'
+  })
+}
+
+// 创建推广账号
+export function addPromotionAccount(data) {
+  return request({
+    url: '/adv/promotion-account',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新推广账号
+export function updatePromotionAccount(id, data) {
+  return request({
+    url: '/adv/promotion-account/' + id,
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除推广账号
+export function delPromotionAccount(id) {
+  return request({
+    url: '/adv/promotion-account/' + id,
+    method: 'delete'
+  })
+}
+
+// 批量删除推广账号
+export function batchDelPromotionAccount(ids) {
+  return request({
+    url: '/adv/promotion-account/batch',
+    method: 'delete',
+    data: ids
+  })
+}
+

+ 60 - 0
src/api/adv/site.js

@@ -0,0 +1,60 @@
+import request from '@/utils/request'
+
+// 查询站点列表
+export function listSite() {
+  return request({
+    url: '/adv/site/list',
+    method: 'get'
+  })
+}
+
+// 查询站点详情
+export function getSite(id) {
+  return request({
+    url: '/adv/site/' + id,
+    method: 'get'
+  })
+}
+
+// 创建站点
+export function addSite(data) {
+  return request({
+    url: '/adv/site',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新站点
+export function updateSite(id, data) {
+  return request({
+    url: '/adv/site/' + id,
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除站点
+export function delSite(id) {
+  return request({
+    url: '/adv/site/' + id,
+    method: 'delete'
+  })
+}
+
+// 查询站点统计数据
+export function getSiteStatistics(id) {
+  return request({
+    url: '/adv/site/' + id + '/statistics',
+    method: 'get'
+  })
+}
+
+// 启用/停用站点
+export function enableSite(id) {
+  return request({
+    url: '/adv/site/enable/' + id,
+    method: 'post'
+  })
+}
+

+ 34 - 0
src/api/adv/siteStatistics.js

@@ -0,0 +1,34 @@
+import request from '@/utils/request'
+
+// 查询站点统计列表
+export function pageSiteStatistics(query) {
+  return request({
+    url: '/adv/site-statistics/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询站点统计详情
+export function getSiteStatistics(id) {
+  return request({
+    url: '/adv/site-statistics/' + id,
+    method: 'get'
+  })
+}
+
+// 根据站点ID查询统计
+export function getSiteStatisticsBySiteId(siteId) {
+  return request({
+    url: '/adv/site-statistics/site/' + siteId,
+    method: 'get'
+  })
+}
+
+// 刷新站点统计数据
+export function refreshSiteStatistics(siteId) {
+  return request({
+    url: '/adv/site-statistics/refresh/' + siteId,
+    method: 'post'
+  })
+}

+ 36 - 0
src/api/adv/trackingLink.js

@@ -0,0 +1,36 @@
+import request from '@/utils/request'
+
+// 分页查询监测链接列表
+export function pageTrackingLink(query) {
+  return request({
+    url: '/adv/tracking-link/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询所有监测链接列表(不分页)
+export function listTrackingLink(query) {
+  return request({
+    url: '/adv/tracking-link/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 根据ID查询监测链接详情
+export function getTrackingLink(id) {
+  return request({
+    url: '/adv/tracking-link/' + id,
+    method: 'get'
+  })
+}
+
+// 根据广告商ID查询监测链接列表
+export function getTrackingLinkByAdvertiser(advertiserId) {
+  return request({
+    url: '/adv/tracking-link/advertiser/' + advertiserId,
+    method: 'get'
+  })
+}
+

+ 62 - 0
src/api/aiDpctorChat/aiDoctorChat.js

@@ -0,0 +1,62 @@
+import request from '@/utils/request'
+
+// 查询对话关系列表
+export function listSession(query) {
+  return request({
+    url: '/doctorChat/session/list',
+    method: 'get',
+    params: query
+  })
+}
+
+
+export function listMsg(query) {
+  return request({
+    url: '/doctorChat/msg/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询对话关系详细
+export function getChatSession(sessionId) {
+  return request({
+    url: '/doctorChat/session/' + sessionId,
+    method: 'get'
+  })
+}
+
+// 新增对话关系
+export function addSession(data) {
+  return request({
+    url: '/doctorChat/session',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改对话关系
+export function updateSession(data) {
+  return request({
+    url: '/doctorChat/session',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除对话关系
+export function delSession(sessionId) {
+  return request({
+    url: '/doctorChat/session/' + sessionId,
+    method: 'delete'
+  })
+}
+
+// 导出对话关系
+export function exportSession(query) {
+  return request({
+    url: '/doctorChat/session/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/aiDpctorChat/role.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询应用列表
+export function listRole(query) {
+  return request({
+    url: '/fastGpt/fastGptRole/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询应用详细
+export function getRole(roleId) {
+  return request({
+    url: '/fastGpt/fastGptRole/' + roleId,
+    method: 'get'
+  })
+}
+
+// 新增应用
+export function addRole(data) {
+  return request({
+    url: '/fastGpt/fastGptRole',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改应用
+export function updateRole(data) {
+  return request({
+    url: '/fastGpt/fastGptRole/',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除应用
+export function delRole(roleId) {
+  return request({
+    url: '/fastGpt/fastGptRole/' + roleId,
+    method: 'delete'
+  })
+}
+
+// 导出应用
+export function exportRole(query) {
+  return request({
+    url: '/fastGpt/fastGptRoles/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/aiSipCall/aiSipCallBizGroup.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询aiSIP外呼技能组列表
+export function listAiSipCallBizGroup(query) {
+  return request({
+    url: '/company/aiSipCall/bizGroup/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询aiSIP外呼技能组详细
+export function getAiSipCallBizGroup(groupId) {
+  return request({
+    url: '/company/aiSipCall/bizGroup/' + groupId,
+    method: 'get'
+  })
+}
+
+// 新增aiSIP外呼技能组
+export function addAiSipCallBizGroup(data) {
+  return request({
+    url: '/company/aiSipCall/bizGroup',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改aiSIP外呼技能组
+export function updateAiSipCallBizGroup(data) {
+  return request({
+    url: '/company/aiSipCall/bizGroup',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除aiSIP外呼技能组
+export function delAiSipCallBizGroup(groupId) {
+  return request({
+    url: '/company/aiSipCall/bizGroup/' + groupId,
+    method: 'delete'
+  })
+}
+
+// 导出aiSIP外呼技能组
+export function exportAiSipCallBizGroup(query) {
+  return request({
+    url: '/company/aiSipCall/bizGroup/export',
+    method: 'get',
+    params: query
+  })
+}

+ 62 - 0
src/api/aiSipCall/aiSipCallGateway.js

@@ -0,0 +1,62 @@
+import request from '@/utils/request'
+
+// 查询aiSIP外呼网关列表
+export function listAiSipCallGateway(query) {
+    return request({
+        url: '/company/aiSipCall/gateway/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询aiSIP外呼网关列表
+export function remoteList(data) {
+    return request({
+        url: '/company/aiSipCall/gateway/remoteList',
+        method: 'post',
+        data: data
+    })
+}
+
+// 查询aiSIP外呼网关详细
+export function getAiSipCallGateway(id) {
+    return request({
+        url: '/company/aiSipCall/gateway/' + id,
+        method: 'get'
+    })
+}
+
+// 新增aiSIP外呼网关
+export function addAiSipCallGateway(data) {
+    return request({
+        url: '/company/aiSipCall/gateway',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改aiSIP外呼网关
+export function updateAiSipCallGateway(data) {
+    return request({
+        url: '/company/aiSipCall/gateway',
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除aiSIP外呼网关
+export function delAiSipCallGateway(id) {
+    return request({
+        url: '/company/aiSipCall/gateway/' + id,
+        method: 'delete'
+    })
+}
+
+// 导出aiSIP外呼网关
+export function exportAiSipCallGateway(query) {
+    return request({
+        url: '/company/aiSipCall/gateway/export',
+        method: 'get',
+        params: query
+    })
+}

+ 53 - 0
src/api/aiSipCall/aiSipCallLlmAgentAccount.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询aiSIP外呼大模型列表
+export function listAiSipCallLlmAgentAccount(query) {
+  return request({
+    url: '/company/aiSipCall/llmAgentAccount/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询aiSIP外呼大模型详细
+export function getAiSipCallLlmAgentAccount(id) {
+  return request({
+    url: '/company/aiSipCall/llmAgentAccount/' + id,
+    method: 'get'
+  })
+}
+
+// 新增aiSIP外呼大模型
+export function addAiSipCallLlmAgentAccount(data) {
+  return request({
+    url: '/company/aiSipCall/llmAgentAccount',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改aiSIP外呼大模型
+export function updateAiSipCallLlmAgentAccount(data) {
+  return request({
+    url: '/company/aiSipCall/llmAgentAccount',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除aiSIP外呼大模型
+export function delAiSipCalllLlmAgentAccount(id) {
+  return request({
+    url: '/company/aiSipCall/llmAgentAccount/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出aiSIP外呼大模型
+export function exportAiSipCallLlmAgentAccount(query) {
+  return request({
+    url: '/company/aiSipCall/llmAgentAccount/export',
+    method: 'get',
+    params: query
+  })
+}

+ 88 - 0
src/api/aiSipCall/aiSipCallOutboundCdr.js

@@ -0,0 +1,88 @@
+import request from '@/utils/request'
+
+// 查询aiSIP手动外呼通话记录列表
+export function listOutboundCdr(query) {
+  return request({
+    url: '/company/aiSipCall/outboundCdr/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询aiSIP手动外呼通话记录详细
+export function getOutboundCdr(id) {
+  return request({
+    url: '/company/aiSipCall/outboundCdr/' + id,
+    method: 'get'
+  })
+}
+
+// 新增aiSIP手动外呼通话记录
+export function addOutboundCdr(data) {
+  return request({
+    url: '/company/aiSipCall/outboundCdr',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改aiSIP手动外呼通话记录
+export function updateOutboundCdr(data) {
+  return request({
+    url: '/company/aiSipCall/outboundCdr',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除aiSIP手动外呼通话记录
+export function delOutboundCdr(id) {
+  return request({
+    url: '/company/aiSipCall/outboundCdr/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出aiSIP手动外呼通话记录
+export function exportOutboundCdr(query) {
+  return request({
+    url: '/company/aiSipCall/outboundCdr/export',
+    method: 'get',
+    params: query
+  })
+}
+// 取手动外呼客户沟通信息
+export function getCustCommunicationInfo(phoneNum,callType,uuid) {
+  return request({
+    url: '/company/aiSipCall/outboundCdr/getCustCommunicationInfo?phoneNum=' +  phoneNum + "&callType=" + callType + "&uuid=" + uuid,
+    method: 'get'
+  })
+}
+
+// 新增保存手动外呼沟通记录
+export function addCustcallrecord(data) {
+  return request({
+    url: '/company/aiSipCall/outboundCdr/add/custcallrecord',
+    method: 'post',
+    data: data
+  })
+}
+// 手动同步人工外呼通话记录
+export function manualPull() {
+  return request({
+    url: '/company/aiSipCall/outboundCdr/manualPull',
+    method: 'get'
+  })
+}
+
+/**
+ * 根据 uuid 同步通话记录
+ */
+export function syncByUuid(data) {
+    return request({
+        url: '/company/aiSipCall/outboundCdr/syncByUuid',
+        method: 'post',
+        data: data
+    })
+}
+

+ 61 - 0
src/api/aiSipCall/aiSipCallPhone.js

@@ -0,0 +1,61 @@
+import request from '@/utils/request'
+
+// 查询aiSIP外呼通话记录列表
+export function listAiSipCallPhone(query) {
+  return request({
+    url: '/company/aiSipCall/phone/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询aiSIP外呼通话记录详细
+export function getAiSipCallPhone(id) {
+  return request({
+    url: '/company/aiSipCall/phone/' + id,
+    method: 'get'
+  })
+}
+
+// 新增aiSIP外呼通话记录
+export function addAiSipCallPhone(data) {
+  return request({
+    url: '/company/aiSipCall/phone',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改aiSIP外呼通话记录
+export function updateAiSipCallPhone(data) {
+  return request({
+    url: '/company/aiSipCall/phone',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除aiSIP外呼通话记录
+export function delAiSipCallPhone(id) {
+  return request({
+    url: '/company/aiSipCall/phone/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出aiSIP外呼通话记录
+export function exportAiSipCallPhone(query) {
+  return request({
+    url: '/company/aiSipCall/phone/export',
+    method: 'get',
+    params: query
+  })
+}
+// 同步aiSIP外呼通话记录
+export function manualPull() {
+  return request({
+    url: '/company/aiSipCall/phone/manualPull',
+    method: 'get'
+  })
+}
+

+ 86 - 0
src/api/aiSipCall/aiSipCallTask.js

@@ -0,0 +1,86 @@
+import request from '@/utils/request'
+
+// 查询aiSIP外呼任务列表
+export function listAiSipCallTask(query) {
+  return request({
+    url: '/company/aiSipCall/task/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询aiSIP外呼任务详细
+export function getAiSipCallTask(batchId) {
+  return request({
+    url: '/company/aiSipCall/task/' + batchId,
+    method: 'get'
+  })
+}
+
+// 新增aiSIP外呼任务
+export function addAiSipCallTask(data) {
+  return request({
+    url: '/company/aiSipCall/task',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改aiSIP外呼任务
+export function updateAiSipCallTask(data) {
+  return request({
+    url: '/company/aiSipCall/task',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除aiSIP外呼任务
+export function delAiSipCallTask(batchId) {
+  return request({
+    url: '/company/aiSipCall/task/' + batchId,
+    method: 'delete'
+  })
+}
+
+// 导出aiSIP外呼任务
+export function exportAiSipCallTask(query) {
+  return request({
+    url: '/company/aiSipCall/task/export',
+    method: 'get',
+    params: query
+  })
+}
+// 启动aiSIP外呼任务
+export function startTask(batchId) {
+  return request({
+    url: '/company/aiSipCall/task/startTask/' + batchId,
+    method: 'post'
+  })
+}
+// 暂停aiSIP外呼任务
+export function stopTask(batchId) {
+  return request({
+    url: '/company/aiSipCall/task/stopTask/' + batchId,
+    method: 'post'
+  })
+}
+// 公共导入数据
+export function commonImportExcel(data) {
+  return request({
+    url: '/company/aiSipCall/task/common/importExcel',
+    method: 'post',
+    data: data,
+    headers: {
+      'Content-Type': undefined
+    }
+  })
+}
+// 下载aiSIP外呼模板
+export function downloadTemplateByType(type) {
+  return request({
+    url: '/company/aiSipCall/task/download/template/' + type,
+    method: 'get',
+    responseType: 'blob'
+  })
+}

+ 77 - 0
src/api/aiSipCall/aiSipCallUser.js

@@ -0,0 +1,77 @@
+import request from '@/utils/request'
+
+// 查询sip用户信息列表
+export function listAiSipCallUser(query) {
+  return request({
+    url: '/company/aiSipCall/aiSipCallUser/list',
+    method: 'get',
+    params: query
+  })
+}
+// 查询sip用户信息列表
+export function myCallUser(query) {
+  return request({
+    url: '/company/aiSipCall/aiSipCallUser/myCallUser',
+    method: 'get',
+    params: query
+  })
+}
+// 查询sip用户信息详细
+export function getAiSipCallUser(userId) {
+  return request({
+    url: '/company/aiSipCall/aiSipCallUser/' + userId,
+    method: 'get'
+  })
+}
+
+// 新增sip用户信息
+export function addAiSipCallUser(data) {
+  return request({
+    url: '/company/aiSipCall/aiSipCallUser',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改sip用户信息
+export function updateAiSipCallUser(data) {
+  return request({
+    url: '/company/aiSipCall/aiSipCallUser',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除sip用户信息
+export function delAiSipCallUser(userId) {
+  return request({
+    url: '/company/aiSipCall/aiSipCallUser/' + userId,
+    method: 'delete'
+  })
+}
+
+// 导出sip用户信息
+export function exportAiSipCallUser(query) {
+  return request({
+    url: '/company/aiSipCall/aiSipCallUser/export',
+    method: 'get',
+    params: query
+  })
+}
+// 获取未绑定的分机列表
+export function getUnBindExtnum(query) {
+  return request({
+    url: '/company/aiSipCall/aiSipCallUser/getUnBindExtnum',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询aiSIP工具条基础配置参数
+export function getToolbarBasicParam(data) {
+    return request({
+        url: '/company/aiSipCall/aiSipCallUser/getToolbarBasicParam',
+        method: 'post',
+        data: data
+    })
+}

+ 53 - 0
src/api/aiSipCall/aiSipCallVoiceTtsAliyun.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询aiSIP外呼阿里云音色列表
+export function listAiSipCallVoiceTtsAliyun(query) {
+  return request({
+    url: '/company/aiSipCall/voiceTtsAliyun/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询aiSIP外呼阿里云音色详细
+export function getAiSipCallVoiceTtsAliyun(id) {
+  return request({
+    url: '/company/aiSipCall/voiceTtsAliyun/' + id,
+    method: 'get'
+  })
+}
+
+// 新增aiSIP外呼阿里云音色
+export function addAiSipCallVoiceTtsAliyun(data) {
+  return request({
+    url: '/company/aiSipCall/voiceTtsAliyun',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改aiSIP外呼阿里云音色
+export function updateAiSipCallVoiceTtsAliyun(data) {
+  return request({
+    url: '/company/aiSipCall/voiceTtsAliyun',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除aiSIP外呼阿里云音色
+export function delAiSipCallVoiceTtsAliyun(id) {
+  return request({
+    url: '/company/aiSipCall/voiceTtsAliyun/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出aiSIP外呼阿里云音色
+export function exportAiSipCallVoiceTtsAliyun(query) {
+  return request({
+    url: '/company/aiSipCall/voiceTtsAliyun/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/aiob/AiobBaiduCallApi.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询百度外呼接口配置列表
+export function listAiobBaiduCallApi(query) {
+  return request({
+    url: '/aiob/AiobBaiduCallApi/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询百度外呼接口配置详细
+export function getAiobBaiduCallApi(id) {
+  return request({
+    url: '/aiob/AiobBaiduCallApi/' + id,
+    method: 'get'
+  })
+}
+
+// 新增百度外呼接口配置
+export function addAiobBaiduCallApi(data) {
+  return request({
+    url: '/aiob/AiobBaiduCallApi',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改百度外呼接口配置
+export function updateAiobBaiduCallApi(data) {
+  return request({
+    url: '/aiob/AiobBaiduCallApi',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除百度外呼接口配置
+export function delAiobBaiduCallApi(id) {
+  return request({
+    url: '/aiob/AiobBaiduCallApi/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出百度外呼接口配置
+export function exportAiobBaiduCallApi(query) {
+  return request({
+    url: '/aiob/AiobBaiduCallApi/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/aiob/AiobBaiduEncryption.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询百度AI外呼加密列表
+export function listAiobBaiduEncryption(query) {
+  return request({
+    url: '/aiob/AiobBaiduEncryption/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询百度AI外呼加密详细
+export function getAiobBaiduEncryption(id) {
+  return request({
+    url: '/aiob/AiobBaiduEncryption/' + id,
+    method: 'get'
+  })
+}
+
+// 新增百度AI外呼加密
+export function addAiobBaiduEncryption(data) {
+  return request({
+    url: '/aiob/AiobBaiduEncryption',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改百度AI外呼加密
+export function updateAiobBaiduEncryption(data) {
+  return request({
+    url: '/aiob/AiobBaiduEncryption',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除百度AI外呼加密
+export function delAiobBaiduEncryption(id) {
+  return request({
+    url: '/aiob/AiobBaiduEncryption/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出百度AI外呼加密
+export function exportAiobBaiduEncryption(query) {
+  return request({
+    url: '/aiob/AiobBaiduEncryption/export',
+    method: 'get',
+    params: query
+  })
+}

+ 60 - 0
src/api/aiob/AiobBaiduTask.js

@@ -0,0 +1,60 @@
+import request from '@/utils/request'
+
+// 查询百度AI外呼任务列表
+export function listAiobBaiduTask(query) {
+  return request({
+    url: '/aiob/AiobBaiduTask/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询百度AI外呼任务详细
+export function getAiobBaiduTask(id) {
+  return request({
+    url: '/aiob/AiobBaiduTask/' + id,
+    method: 'get'
+  })
+}
+
+// 新增百度AI外呼任务
+export function addAiobBaiduTask(data) {
+  return request({
+    url: '/aiob/AiobBaiduTask',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改百度AI外呼任务
+export function updateAiobBaiduTask(data) {
+  return request({
+    url: '/aiob/AiobBaiduTask',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除百度AI外呼任务
+export function delAiobBaiduTask(id) {
+  return request({
+    url: '/aiob/AiobBaiduTask/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出百度AI外呼任务
+export function exportAiobBaiduTask(query) {
+  return request({
+    url: '/aiob/AiobBaiduTask/export',
+    method: 'get',
+    params: query
+  })
+}
+// 导出百度AI外呼任务
+export function robotList() {
+  return request({
+    url: '/aiob/AiobBaiduTask/robotList',
+    method: 'get'
+  })
+}

+ 101 - 0
src/api/baidu/BdAccount.js

@@ -0,0 +1,101 @@
+import request from '@/utils/request'
+
+// 查询百度账号列表
+export function listBdAccount(query) {
+  return request({
+    url: '/bd/BdAccount/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询百度账号列表
+export function listAll(query) {
+  return request({
+    url: '/bd/BdAccount/listAll',
+    method: 'get',
+    params: query
+  })
+}
+// 查询百度账号列表
+export function listAllPlan(query) {
+  return request({
+    url: '/bd/BdAccount/listAllPlan',
+    method: 'get',
+    params: query
+  })
+}
+// 查询百度账号列表
+export function listAllUnit(query) {
+  return request({
+    url: '/bd/BdAccount/listAllUnit',
+    method: 'get',
+    params: query
+  })
+}
+// 查询百度账号列表
+export function listAllCreative(query) {
+  return request({
+    url: '/bd/BdAccount/listAllCreative',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询百度账号详细
+export function getBdAccount(id) {
+  return request({
+    url: '/bd/BdAccount/' + id,
+    method: 'get'
+  })
+}
+
+// 新增百度账号
+export function addBdAccount(data) {
+  return request({
+    url: '/bd/BdAccount',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改百度账号
+export function updateBdAccount(data) {
+  return request({
+    url: '/bd/BdAccount',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除百度账号
+export function delBdAccount(id) {
+  return request({
+    url: '/bd/BdAccount/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出百度账号
+export function exportBdAccount(query) {
+  return request({
+    url: '/bd/BdAccount/export',
+    method: 'get',
+    params: query
+  })
+}
+// 导出百度账号
+export function authorizationUrl() {
+  return request({
+    url: '/bd/BdAccount/authorizationUrl',
+    method: 'get',
+  })
+}
+// 导出百度账号
+export function syncAccount(id) {
+  return request({
+    url: '/bd/BdAccount/syncAccount',
+    method: 'get',
+    params:{id}
+  })
+}

+ 38 - 0
src/api/baidu/statistics.js

@@ -0,0 +1,38 @@
+import request from '@/utils/request'
+
+// 查询百度账号列表
+export function conversionStatistics(query) {
+  return request({
+    url: '/baiduStatistics/conversionStatistics',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询百度账号列表
+export function getReportData(query) {
+  return request({
+    url: '/baiduStatistics/getReportData',
+    method: 'get',
+    params: query
+  })
+}
+
+// app投放报表
+export function advSemStatisticsList(query) {
+  return request({
+    url: '/baiduStatistics/selectFsAdvSemStatisticsByDayVo',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出app投放报表
+export function fsAdvSemStatisticsExport(query) {
+  return request({
+    url: '/baiduStatistics/fsAdvSemStatisticsExport',
+    method: 'get',
+    params: query
+  })
+}
+

+ 61 - 0
src/api/bill/billLog.js

@@ -0,0 +1,61 @@
+import request from '@/utils/request'
+
+// 查询订单开票记录列表
+export function listBillLog(query) {
+  return request({
+    url: '/bill/billLog/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询订单开票记录详细
+export function getBillLog(id) {
+  return request({
+    url: '/bill/billLog/' + id,
+    method: 'get'
+  })
+}
+// 查询订单开票记录详细
+export function reopen(id) {
+  return request({
+    url: '/bill/billLog/reopen',
+    method: 'get',
+    params: {id}
+  })
+}
+
+// 新增订单开票记录
+export function addBillLog(data) {
+  return request({
+    url: '/bill/billLog',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改订单开票记录
+export function updateBillLog(data) {
+  return request({
+    url: '/bill/billLog',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除订单开票记录
+export function delBillLog(id) {
+  return request({
+    url: '/bill/billLog/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出订单开票记录
+export function exportBillLog(query) {
+  return request({
+    url: '/bill/billLog/export',
+    method: 'get',
+    params: query
+  })
+}

+ 31 - 0
src/api/billing/wallet.js

@@ -0,0 +1,31 @@
+import request from '@/utils/request'
+
+export function getMyWallet() {
+  return request({
+    url: '/api/fee/wallet/me',
+    method: 'get'
+  })
+}
+
+export function getMyBillingDetails(params) {
+  return request({
+    url: '/api/fee/billing/detail/my',
+    method: 'get',
+    params
+  })
+}
+
+export function getMyConsumeRecords(params) {
+  return request({
+    url: '/company/consumeRecord/myList',
+    method: 'get',
+    params
+  })
+}
+
+export function getMyBalance() {
+  return request({
+    url: '/company/balance/my',
+    method: 'get'
+  })
+}

+ 53 - 0
src/api/callRecord/callRecord.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询外呼记录质检列表
+export function listApi(query) {
+  return request({
+    url: '/company/callRecord/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询外呼记录质检详细
+export function getApi(id) {
+  return request({
+    url: '/company/callRecord/' + id,
+    method: 'get'
+  })
+}
+
+// 新增外呼记录质检
+export function addApi(data) {
+  return request({
+    url: '/callRecord',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改外呼记录质检
+export function updateApi(data) {
+  return request({
+    url: '/callRecord',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除外呼记录质检
+export function delApi(id) {
+  return request({
+    url: '/company/callRecord/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出外呼记录质检
+export function exportApi(query) {
+  return request({
+    url: '/company/callRecord/export',
+    method: 'post',
+    params: query
+  })
+}

+ 53 - 0
src/api/chat/chatDataset.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询知识库列表
+export function listChatDataset(query) {
+  return request({
+    url: '/chat/chatDataset/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询知识库详细
+export function getChatDataset(datasetId) {
+  return request({
+    url: '/chat/chatDataset/' + datasetId,
+    method: 'get'
+  })
+}
+
+// 新增知识库
+export function addChatDataset(data) {
+  return request({
+    url: '/chat/chatDataset',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改知识库
+export function updateChatDataset(data) {
+  return request({
+    url: '/chat/chatDataset',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除知识库
+export function delChatDataset(datasetId) {
+  return request({
+    url: '/chat/chatDataset/' + datasetId,
+    method: 'delete'
+  })
+}
+
+// 导出知识库
+export function exportChatDataset(query) {
+  return request({
+    url: '/chat/chatDataset/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/chat/chatDatasetFile.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询文件列表
+export function listChatDatasetFile(query) {
+  return request({
+    url: '/chat/chatDatasetFile/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询文件详细
+export function getChatDatasetFile(fileId) {
+  return request({
+    url: '/chat/chatDatasetFile/' + fileId,
+    method: 'get'
+  })
+}
+
+// 新增文件
+export function addChatDatasetFile(data) {
+  return request({
+    url: '/chat/chatDatasetFile',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改文件
+export function updateChatDatasetFile(data) {
+  return request({
+    url: '/chat/chatDatasetFile',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除文件
+export function delChatDatasetFile(fileId) {
+  return request({
+    url: '/chat/chatDatasetFile/' + fileId,
+    method: 'delete'
+  })
+}
+
+// 导出文件
+export function exportChatDatasetFile(query) {
+  return request({
+    url: '/chat/chatDatasetFile/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/chat/chatKeyword.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询关键字列表
+export function listChatKeyword(query) {
+  return request({
+    url: '/chat/chatKeyword/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询关键字详细
+export function getChatKeyword(keywordId) {
+  return request({
+    url: '/chat/chatKeyword/' + keywordId,
+    method: 'get'
+  })
+}
+
+// 新增关键字
+export function addChatKeyword(data) {
+  return request({
+    url: '/chat/chatKeyword',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改关键字
+export function updateChatKeyword(data) {
+  return request({
+    url: '/chat/chatKeyword',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除关键字
+export function delChatKeyword(keywordId) {
+  return request({
+    url: '/chat/chatKeyword/' + keywordId,
+    method: 'delete'
+  })
+}
+
+// 导出关键字
+export function exportChatKeyword(query) {
+  return request({
+    url: '/chat/chatKeyword/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/chat/chatMsg.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询聊天消息记录列表
+export function listChatMsg(query) {
+  return request({
+    url: '/chat/chatMsg/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询聊天消息记录详细
+export function getChatMsg(msgId) {
+  return request({
+    url: '/chat/chatMsg/' + msgId,
+    method: 'get'
+  })
+}
+
+// 新增聊天消息记录
+export function addChatMsg(data) {
+  return request({
+    url: '/chat/chatMsg',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改聊天消息记录
+export function updateChatMsg(data) {
+  return request({
+    url: '/chat/chatMsg',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除聊天消息记录
+export function delChatMsg(msgId) {
+  return request({
+    url: '/chat/chatMsg/' + msgId,
+    method: 'delete'
+  })
+}
+
+// 导出聊天消息记录
+export function exportChatMsg(query) {
+  return request({
+    url: '/chat/chatMsg/export',
+    method: 'get',
+    params: query
+  })
+}

+ 61 - 0
src/api/chat/chatMsgLogs.js

@@ -0,0 +1,61 @@
+import request from '@/utils/request'
+
+// 查询消息操作日志列表
+export function listChatMsgLogs(query) {
+  return request({
+    url: '/chat/chatMsgLogs/list',
+    method: 'get',
+    params: query
+  })
+}
+
+export function getChatMsgLogsList(query) {
+  return request({
+    url: '/chat/chatMsgLogs/logsList',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询消息操作日志详细
+export function getChatMsgLogs(logsId) {
+  return request({
+    url: '/chat/chatMsgLogs/' + logsId,
+    method: 'get'
+  })
+}
+
+// 新增消息操作日志
+export function addChatMsgLogs(data) {
+  return request({
+    url: '/chat/chatMsgLogs',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改消息操作日志
+export function updateChatMsgLogs(data) {
+  return request({
+    url: '/chat/chatMsgLogs',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除消息操作日志
+export function delChatMsgLogs(logsId) {
+  return request({
+    url: '/chat/chatMsgLogs/' + logsId,
+    method: 'delete'
+  })
+}
+
+// 导出消息操作日志
+export function exportChatMsgLogs(query) {
+  return request({
+    url: '/chat/chatMsgLogs/export',
+    method: 'get',
+    params: query
+  })
+}

Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff