yys il y a 3 semaines
Parent
commit
77c19ed308
100 fichiers modifiés avec 6419 ajouts et 50 suppressions
  1. 0 2
      Dockerfile
  2. 3 48
      package.json
  3. 568 0
      public/chat-aggregate.html
  4. 324 0
      public/workflow-canvas.html
  5. 53 0
      src/api/ad/AdDyAccount.js
  6. 60 0
      src/api/ad/AdIqiyiAccount.js
  7. 53 0
      src/api/ad/AdUploadLog.js
  8. 60 0
      src/api/ad/AdYouKuaccount.js
  9. 9 0
      src/api/ad/adAccount.js
  10. 60 0
      src/api/ad/adDomain.js
  11. 61 0
      src/api/ad/adSite.js
  12. 60 0
      src/api/ad/htmlTemplate.js
  13. 5 0
      src/api/admin/ad.js
  14. 78 0
      src/api/admin/aiChatQuality.js
  15. 29 0
      src/api/admin/aiProvider.js
  16. 59 0
      src/api/admin/article.js
  17. 94 0
      src/api/admin/callRecord.js
  18. 34 0
      src/api/admin/course.js
  19. 5 0
      src/api/admin/crm.js
  20. 34 0
      src/api/admin/live.js
  21. 92 0
      src/api/admin/lobster.js
  22. 21 0
      src/api/admin/moduleUsage.js
  23. 51 0
      src/api/admin/product.js
  24. 79 0
      src/api/admin/proxy.js
  25. 34 0
      src/api/admin/qwExternalContact.js
  26. 9 0
      src/api/admin/sop.js
  27. 61 0
      src/api/admin/statistics.js
  28. 5 0
      src/api/admin/storeOrder.js
  29. 44 0
      src/api/admin/sysCompany.js
  30. 61 0
      src/api/admin/sysUser.js
  31. 62 0
      src/api/aiDpctorChat/aiDoctorChat.js
  32. 53 0
      src/api/aiDpctorChat/role.js
  33. 53 0
      src/api/aiob/AiobBaiduCallApi.js
  34. 53 0
      src/api/aiob/AiobBaiduEncryption.js
  35. 60 0
      src/api/aiob/AiobBaiduTask.js
  36. 101 0
      src/api/baidu/BdAccount.js
  37. 38 0
      src/api/baidu/statistics.js
  38. 31 0
      src/api/billing/wallet.js
  39. 53 0
      src/api/callRecord/callRecord.js
  40. 105 0
      src/api/company/aiModel/inboundCallManage.js
  41. 47 0
      src/api/company/approval.js
  42. 61 0
      src/api/company/companyDeduct.js
  43. 68 0
      src/api/company/companyDomain.js
  44. 53 0
      src/api/company/companyLogininfor.js
  45. 53 0
      src/api/company/companyOperLog.js
  46. 53 0
      src/api/company/companyRoleDept.js
  47. 53 0
      src/api/company/companyRoleMenu.js
  48. 192 0
      src/api/company/companyUserAll.js
  49. 53 0
      src/api/company/companyUserPost.js
  50. 53 0
      src/api/company/companyUserRole.js
  51. 53 0
      src/api/company/companyVoice.js
  52. 53 0
      src/api/company/companyVoiceBlacklist.js
  53. 53 0
      src/api/company/companyVoiceConfig.js
  54. 61 0
      src/api/company/companyVoiceMobile.js
  55. 53 0
      src/api/company/companyVoicePackage.js
  56. 53 0
      src/api/company/companyWorkflowManage.js
  57. 92 0
      src/api/company/config.js
  58. 60 0
      src/api/company/dept.js
  59. 62 0
      src/api/company/dict/data.js
  60. 61 0
      src/api/company/dict/type.js
  61. 53 0
      src/api/company/inboundCallManage.js
  62. 53 0
      src/api/company/inboundCallRecord.js
  63. 10 0
      src/api/company/index.js
  64. 47 0
      src/api/company/keyword.js
  65. 129 0
      src/api/company/menu.js
  66. 39 0
      src/api/company/notice.js
  67. 47 0
      src/api/company/post.js
  68. 31 0
      src/api/company/resourceManagement.js
  69. 107 0
      src/api/company/role.js
  70. 103 0
      src/api/company/scheduleReport.js
  71. 47 0
      src/api/company/set.js
  72. 27 0
      src/api/company/traffic.js
  73. 19 0
      src/api/company/trafficLog.js
  74. 144 0
      src/api/company/user.js
  75. 71 0
      src/api/company/workflowExec.js
  76. 53 0
      src/api/complaint/category.js
  77. 66 0
      src/api/complaint/complaint.js
  78. 53 0
      src/api/course/courseLink.js
  79. 10 0
      src/api/course/courseRedPacketStatistics.js
  80. 80 0
      src/api/course/courseWatchComment.js
  81. 53 0
      src/api/course/fsCourseProduct.js
  82. 79 0
      src/api/course/fsCourseProductOrder.js
  83. 53 0
      src/api/course/fsUserCoursePeriodDays.js
  84. 53 0
      src/api/course/push.js
  85. 53 0
      src/api/course/statistics.js
  86. 53 0
      src/api/course/userCourseComment.js
  87. 53 0
      src/api/course/userCourseCommentLike.js
  88. 61 0
      src/api/course/userCourseComplaintRecord.js
  89. 53 0
      src/api/course/userCourseComplaintType.js
  90. 53 0
      src/api/course/userCourseFavorite.js
  91. 53 0
      src/api/course/userCourseNote.js
  92. 53 0
      src/api/course/userCourseNoteLike.js
  93. 47 0
      src/api/course/userCourseOrder.js
  94. 82 0
      src/api/course/userCoursePublic.js
  95. 53 0
      src/api/course/userCourseStudy.js
  96. 53 0
      src/api/course/userCourseStudyLog.js
  97. 77 0
      src/api/course/userTalent.js
  98. 53 0
      src/api/course/userTalentFollow.js
  99. 140 0
      src/api/course/userVideo.js
  100. 53 0
      src/api/course/userVideoComment.js

+ 0 - 2
Dockerfile

@@ -1,5 +1,3 @@
-
-
 #基于官方 NGINX 镜像部署(精简镜像)
 FROM swr.cn-east-2.myhuaweicloud.com/library/nginx:alpine
 

+ 3 - 48
package.json

@@ -7,55 +7,7 @@
   "scripts": {
     "dev": "vue-cli-service serve",
     "build:prod": "vue-cli-service build",
-    "build:prod-ylrz": "vue-cli-service build --mode prod-ylrz",
-    "build:prod-cfryt": "vue-cli-service build --mode prod-cfryt",
-    "build:prod-hsyy": "vue-cli-service build --mode prod-hsyy",
     "build:stage": "vue-cli-service build --mode staging",
-    "build:prod-jz": "vue-cli-service build --mode prod-jz",
-    "build:prod-hzyy": "vue-cli-service build --mode prod-hzyy",
-    "build:prod-jzzx": "vue-cli-service build --mode prod-jzzx",
-    "build:prod-hcl": "vue-cli-service build --mode prod-hcl",
-    "build:prod-test": "vue-cli-service build --mode prod-test",
-    "build:prod-sxjz": "vue-cli-service build --mode prod-sxjz",
-    "build:prod-jnmy": "vue-cli-service build --mode prod-jnmy",
-    "build:prod-knt": "vue-cli-service build --mode prod-knt",
-    "build:prod-knt2": "vue-cli-service build --mode prod-knt2",
-    "build:prod-hdt": "vue-cli-service build --mode prod-hdt",
-    "build:prod-yzt": "vue-cli-service build --mode prod-yzt",
-    "build:prod-xfk": "vue-cli-service build --mode prod-xfk",
-    "build:prod-myhk": "vue-cli-service build --mode prod-myhk",
-    "build:prod-fzbt": "vue-cli-service build --mode prod-fzbt",
-    "build:prod-sft": "vue-cli-service build --mode prod-sft",
-    "build:prod-zsjk": "vue-cli-service build --mode prod-zsjk",
-    "build:prod-lmjy": "vue-cli-service build --mode prod-lmjy",
-    "build:prod-bnkc": "vue-cli-service build --mode prod-bnkc",
-    "build:prod-whhm": "vue-cli-service build --mode prod-whhm",
-    "build:prod-drk": "vue-cli-service build --mode prod-drk",
-    "build:prod-zkzh": "vue-cli-service build --mode prod-zkzh",
-    "build:prod-nmgyt": "vue-cli-service build --mode prod-nmgyt",
-    "build:prod-cqtyt": "vue-cli-service build --mode prod-cqtyt",
-    "build:prod-heyantang": "vue-cli-service build --mode prod-heyantang",
-    "build:prod-bly": "vue-cli-service build --mode prod-bly",
-    "build:prod-qdtst": "vue-cli-service build --mode prod-qdtst",
-    "build:prod-bjczwh": "vue-cli-service build --mode prod-bjczwh",
-    "build:prod-jnlzjk": "vue-cli-service build --mode prod-jnlzjk",
-    "build:prod-jkj": "vue-cli-service build --mode prod-jkj",
-    "build:prod-cqxzt": "vue-cli-service build --mode prod-cqxzt",
-    "build:prod-bjyjb": "vue-cli-service build --mode prod-bjyjb",
-    "build:prod-kyt": "vue-cli-service build --mode prod-kyt",
-    "build:prod-fby": "vue-cli-service build --mode prod-fby",
-    "build:prod-syysy": "vue-cli-service build --mode prod-syysy",
-    "build:prod-hyt": "vue-cli-service build --mode prod-hyt",
-    "build:prod-hst": "vue-cli-service build --mode prod-hst",
-    "build:prod-hat": "vue-cli-service build --mode prod-hat",
-    "build:prod-sczy": "vue-cli-service build --mode prod-sczy",
-    "build:prod-ddgy": "vue-cli-service build --mode prod-ddgy",
-    "build:prod-czt": "vue-cli-service build --mode prod-czt",
-    "build:prod-jnsyj": "vue-cli-service build --mode prod-jnsyj",
-    "build:prod-yxj": "vue-cli-service build --mode prod-yxj",
-    "build:prod-bjzm": "vue-cli-service build --mode prod-bjzm",
-    "build:prod-gzzdy": "vue-cli-service build --mode prod-gzzdy",
-    "build:prod-shdn": "vue-cli-service build --mode prod-shdn",
     "preview": "node build/index.js --preview",
     "lint": "eslint --ext .js,.vue src",
     "test:unit": "jest --clearCache && vue-cli-service test:unit",
@@ -118,9 +70,11 @@
     "sortablejs": "1.8.4",
     "stylus": "^0.54.7",
     "stylus-loader": "^3.0.2",
+    "tt-uploader": "^1.6.1",
     "v-clipboard": "^2.2.3",
     "vod-js-sdk-v6": "^1.7.1-beta.1",
     "vue": "2.6.10",
+    "vue-baidu-map": "^0.21.22",
     "vue-clipboard2": "^0.3.1",
     "vue-count-to": "1.0.13",
     "vue-cropper": "0.4.9",
@@ -129,6 +83,7 @@
     "vue-meta": "^2.4.0",
     "vue-mobile-audio": "^0.1.3",
     "vue-mobile-calendar": "^3.3.0",
+    "vue-monaco": "^1.2.2",
     "vue-router": "3.0.2",
     "vue-splitpane": "1.0.4",
     "vue2-ace-editor": "0.0.15",

+ 568 - 0
public/chat-aggregate.html

@@ -0,0 +1,568 @@
+<!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请求工具函数
+            const request = async (url, options = {}) => {
+                const defaultOptions = {
+                    headers: {
+                        'Content-Type': 'application/json',
+                    },
+                };
+                const response = await fetch(url, { ...defaultOptions, ...options });
+                if (!response.ok) {
+                    throw new Error(`HTTP ${response.status}: ${response.statusText}`);
+                }
+                return await response.json();
+            };
+
+            // 账户列表
+            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>

+ 324 - 0
public/workflow-canvas.html

@@ -0,0 +1,324 @@
+<!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>
+<script src="https://unpkg.com/@vue-flow/core@latest/dist/vue-flow.umd.js"></script>
+<script src="https://unpkg.com/@vue-flow/background@latest/dist/vue-flow-background.umd.js"></script>
+<script src="https://unpkg.com/@vue-flow/minimap@latest/dist/vue-flow-minimap.umd.js"></script>
+<script src="https://unpkg.com/@vue-flow/controls@latest/dist/vue-flow-controls.umd.js"></script>
+<link href="https://unpkg.com/@vue-flow/core@latest/dist/style.css" rel="stylesheet">
+<link href="https://unpkg.com/@vue-flow/minimap@latest/dist/style.css" rel="stylesheet">
+<link href="https://unpkg.com/@vue-flow/controls@latest/dist/style.css" rel="stylesheet">
+
+<style>
+*{margin:0;padding:0;box-sizing:border-box}
+body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;height:100vh;overflow:hidden}
+#app{display:flex;height:100vh}
+.sidebar{width:220px;background:#1a1a2e;color:#fff;padding:12px;overflow-y:auto;flex-shrink:0}
+.sidebar h3{font-size:14px;margin:8px 0;color:#e94560;border-bottom:1px solid #333;padding-bottom:4px}
+.node-item{background:#16213e;margin:4px 0;padding:8px;border-radius:6px;cursor:grab;font-size:12px;border:1px solid #0f3460;transition:all .2s}
+.node-item:hover{background:#0f3460;border-color:#e94560;transform:translateX(2px)}
+.node-item .type-tag{display:inline-block;background:#e94560;color:#fff;padding:1px 6px;border-radius:3px;font-size:10px;margin-right:6px}
+.main{flex:1;position:relative}
+.toolbar{position:absolute;top:10px;left:10px;z-index:10;display:flex;gap:8px}
+.toolbar button{padding:6px 14px;border:none;border-radius:4px;cursor:pointer;font-size:12px}
+.btn-primary{background:#e94560;color:#fff}
+.btn-secondary{background:#0f3460;color:#fff}
+.btn-success{background:#22c55e;color:#fff}
+.prop-panel{width:320px;background:#f8f9fa;border-left:2px solid #dee2e6;padding:12px;overflow-y:auto;flex-shrink:0;font-size:13px}
+.prop-panel h3{color:#1a1a2e;margin-bottom:10px}
+.prop-panel label{display:block;margin:6px 0 2px;color:#555;font-weight:600}
+.prop-panel input,.prop-panel textarea,.prop-panel select{width:100%;padding:6px;border:1px solid #ccc;border-radius:4px;font-size:12px;margin-bottom:6px}
+.prop-panel textarea{min-height:60px;font-family:monospace}
+.vue-flow__node{font-size:12px;min-width:120px;text-align:center}
+.flow-node{padding:8px 12px;border-radius:8px;border:2px solid;background:#fff;box-shadow:0 2px 6px rgba(0,0,0,.1)}
+.flow-node.start{border-color:#22c55e}
+.flow-node.ai{border-color:#8b5cf6}
+.flow-node.msg{border-color:#3b82f6}
+.flow-node.cond{border-color:#f59e0b}
+.flow-node.end{border-color:#ef4444}
+.flow-node.default{border-color:#6b7280}
+.node-name{font-weight:700}
+.node-desc{font-size:10px;color:#888;margin-top:2px}
+.modal-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.5);display:flex;align-items:center;justify-content:center;z-index:1000}
+.modal{background:#fff;border-radius:12px;padding:24px;width:500px;max-height:80vh;overflow-y:auto}
+.modal h4{margin-bottom:12px}
+.modal textarea{width:100%;min-height:120px;margin:8px 0;font-family:monospace;font-size:12px;padding:8px}
+.modal .actions{display:flex;gap:8px;justify-content:flex-end;margin-top:12px}
+</style>
+</head>
+<body>
+<div id="app">
+  <div class="sidebar">
+    <h3>🦞 龙虾引擎</h3>
+    <div v-for="(group,gname) in nodeGroups" :key="gname">
+      <h3>{{gname}}</h3>
+      <div class="node-item" v-for="nt in group" :key="nt.type"
+           @dragstart="onDragStart($event,nt)" draggable="true">
+        <span class="type-tag">{{nt.type}}</span>{{nt.name}}
+      </div>
+    </div>
+    <div style="margin-top:12px;border-top:1px solid #333;padding-top:8px">
+      <button class="btn-primary" style="width:100%;padding:8px;margin:4px 0" @click="showGenerate=true">🤖 AI生成工作流</button>
+      <button class="btn-secondary" style="width:100%;padding:8px;margin:4px 0" @click="exportJson">📋 导出JSON</button>
+      <button class="btn-success" style="width:100%;padding:8px;margin:4px 0" @click="saveWorkflow">💾 保存到服务器</button>
+      <button class="btn-secondary" style="width:100%;padding:8px;margin:4px 0" @click="showLoad=true">📂 加载工作流</button>
+    </div>
+  </div>
+
+  <div class="main" @drop="onDrop" @dragover.prevent>
+    <div class="toolbar">
+      <button class="btn-primary" @click="fitView()">🎯 适应视图</button>
+      <button class="btn-secondary" @click="undo()">↩ 撤销</button>
+    </div>
+    <vue-flow ref="flowRef" v-model="elements" :node-types="nodeTypes"
+      :default-edge-options="{animated:true,style:{stroke:'#64748b',strokeWidth:2}}"
+      @node-click="onNodeClick" @connect="onConnect" style="height:100%;background:#f1f5f9">
+      <template #node-start="props"><div class="flow-node start"><div class="node-name">🚀 {{props.data.label}}</div></div></template>
+      <template #node-ai="props"><div class="flow-node ai"><div class="node-name">🧠 {{props.data.label}}</div></div></template>
+      <template #node-msg="props"><div class="flow-node msg"><div class="node-name">💬 {{props.data.label}}</div></div></template>
+      <template #node-cond="props"><div class="flow-node cond"><div class="node-name">🔀 {{props.data.label}}</div></div></template>
+      <template #node-end="props"><div class="flow-node end"><div class="node-name">🏁 {{props.data.label}}</div></div></template>
+      <template #node-default="props"><div class="flow-node default"><div class="node-name">📌 {{props.data.label}}</div></div></template>
+      <vue-flow-background />
+      <vue-flow-minimap />
+      <vue-flow-controls />
+    </vue-flow>
+  </div>
+
+  <div class="prop-panel" v-if="selectedNode">
+    <h3>节点属性</h3>
+    <label>节点编码</label><input v-model="selectedNode.data.nodeCode">
+    <label>节点名称</label><input v-model="selectedNode.data.label">
+    <label>节点类型</label>
+    <select v-model.number="selectedNode.data.nodeType" @change="onTypeChange">
+      <option v-for="nt in allNodes" :value="nt.type" :key="nt.type">{{nt.type}}-{{nt.name}}</option>
+    </select>
+    <label>下一节点</label><input v-model="selectedNode.data.nextNodeCode" placeholder="next_node_code">
+    <label>话术模板</label><textarea v-model="selectedNode.data.messageTemplate" placeholder="支持 ${变量}"></textarea>
+    <label>条件表达式</label><textarea v-model="selectedNode.data.conditionExpr" placeholder='{"field":"intent","op":"eq","value":"purchase"}'></textarea>
+    <label>节点配置(JSON)</label><textarea v-model="selectedNode.data.nodeConfig" placeholder='{"collectFields":["1","2"]}'></textarea>
+    <label>最大轮次</label><input v-model.number="selectedNode.data.maxRounds" type="number" min="0">
+    <button class="btn-primary" style="width:100%;margin-top:8px;padding:8px" @click="selectedNode=null">关闭</button>
+  </div>
+</div>
+
+<div class="modal-overlay" v-if="showGenerate">
+  <div class="modal">
+    <h4>🤖 AI生成工作流</h4>
+    <label>需求描述</label>
+    <textarea v-model="genReq" placeholder="例如:我需要一个旅游行业的客户跟进流程,包括意图识别、信息收集、发送方案、条件判断、创建跟进任务..."></textarea>
+    <label>行业类型</label>
+    <select v-model="genIndustry">
+      <option value="travel">旅游</option><option value="medical">医美</option>
+      <option value="education">教育</option><option value="insurance">保险</option>
+      <option value="general">通用</option>
+    </select>
+    <label>已有工作流JSON(可选-迭代优化)</label>
+    <textarea v-model="genExisting" placeholder="粘贴已有工作流JSON进行迭代优化...留空则全新生成"></textarea>
+    <label>迭代指令(可选)</label>
+    <input v-model="genInstruction" placeholder="如:增加关怀节点、优化话术、调整条件">
+    <div class="actions">
+      <button class="btn-secondary" @click="showGenerate=false">取消</button>
+      <button class="btn-primary" @click="aiGenerate()">生成</button>
+    </div>
+    <div v-if="genResult" style="margin-top:12px;background:#f0fdf4;padding:10px;border-radius:6px;font-size:12px">
+      <b>评分:{{genResult.score}}</b> {{genResult.details}}
+    </div>
+  </div>
+</div>
+
+<div class="modal-overlay" v-if="showLoad">
+  <div class="modal">
+    <h4>📂 加载工作流</h4>
+    <textarea v-model="loadJson" placeholder="粘贴工作流JSON..."></textarea>
+    <div class="actions">
+      <button class="btn-secondary" @click="showLoad=false">取消</button>
+      <button class="btn-primary" @click="importJson()">加载</button>
+    </div>
+  </div>
+</div>
+</div>
+
+<script>
+const {createApp,ref,computed,reactive,onMounted} = Vue
+const nodeGroups = {
+  '流程控制':[{type:1,name:'开始',icon:'🚀'},{type:99,name:'结束',icon:'🏁'},{type:4,name:'等待',icon:'⏳'}],
+  'AI智能':[{type:2,name:'AI处理',icon:'🧠'},{type:11,name:'知识检索',icon:'🔍'}],
+  '交互触达':[{type:3,name:'发送消息',icon:'💬'},{type:7,name:'信息收集',icon:'📋'},{type:10,name:'HTTP调用',icon:'🌐'}],
+  '逻辑控制':[{type:5,name:'条件判断',icon:'🔀'},{type:13,name:'循环迭代',icon:'🔄'},{type:16,name:'变量赋值',icon:'📝'}],
+  '业务操作':[{type:6,name:'创建任务',icon:'✅'},{type:8,name:'转人工',icon:'👤'},{type:9,name:'标签操作',icon:'🏷'}],
+  '扩展能力':[{type:12,name:'代码执行',icon:'⚡'},{type:14,name:'数据库查询',icon:'🗄'},{type:15,name:'子流程',icon:'📦'}]
+}
+const allNodes = Object.values(nodeGroups).flat()
+
+const typeToCategory = {}
+allNodes.forEach(n => {
+  if (n.type === 1) typeToCategory[n.type] = 'start'
+  else if (n.type === 99) typeToCategory[n.type] = 'end'
+  else if (n.type === 2 || n.type === 11) typeToCategory[n.type] = 'ai'
+  else if (n.type === 3 || n.type === 7 || n.type === 10) typeToCategory[n.type] = 'msg'
+  else if (n.type === 5 || n.type === 13 || n.type === 16) typeToCategory[n.type] = 'cond'
+  else typeToCategory[n.type] = 'default'
+})
+
+const app = createApp({
+  setup(){
+    const flowRef = ref(null)
+    const selectedNode = ref(null)
+    const elements = ref([
+      {id:'1',type:'start',position:{x:300,y:50},data:{label:'开始',nodeCode:'START',nodeType:1,nextNodeCode:'MSG_1',messageTemplate:'',conditionExpr:'',nodeConfig:'{}',maxRounds:0}},
+      {id:'2',type:'msg',position:{x:300,y:180},data:{label:'欢迎消息',nodeCode:'MSG_1',nodeType:3,nextNodeCode:'END',messageTemplate:'您好${customerName},欢迎咨询!',conditionExpr:'',nodeConfig:'{}',maxRounds:0}},
+      {id:'3',type:'end',position:{x:300,y:310},data:{label:'结束',nodeCode:'END',nodeType:99,nextNodeCode:'',messageTemplate:'',conditionExpr:'',nodeConfig:'{}',maxRounds:0}},
+      {id:'e1-2',source:'1',target:'2',animated:true},
+    ])
+    const showGenerate = ref(false), showLoad = ref(false)
+    const genReq = ref(''), genIndustry = ref('travel'), genExisting = ref(''), genInstruction = ref('')
+    const genResult = ref(null), loadJson = ref('')
+    let nodeIdCounter = elements.value.length
+
+    const nodeTypes = {
+      start:{template:'#node-start'}, ai:{template:'#node-ai'}, msg:{template:'#node-msg'},
+      cond:{template:'#node-cond'}, end:{template:'#node-end'}, default:{template:'#node-default'}
+    }
+
+    function onDragStart(ev,nt){
+      ev.dataTransfer.setData('application/json',JSON.stringify(nt))
+      ev.dataTransfer.effectAllowed = 'move'
+    }
+    function onDrop(ev){
+      const nt = JSON.parse(ev.dataTransfer.getData('application/json'))
+      const pos = flowRef.value?.screenToFlowCoordinate?.({x:ev.clientX,y:ev.clientY}) || {x:ev.offsetX,y:ev.offsetY}
+      nodeIdCounter++
+      const cat = typeToCategory[nt.type] || 'default'
+      elements.value.push({
+        id:String(nodeIdCounter), type:cat, position:pos,
+        data:{label:nt.name,nodeCode:nt.name.toUpperCase()+'_'+nodeIdCounter,nodeType:nt.type,
+              nextNodeCode:'',messageTemplate:'',conditionExpr:'',nodeConfig:'{}',maxRounds:0}
+      })
+    }
+    function onNodeClick({node}){ selectedNode.value = node }
+    function onConnect(conn){
+      elements.value.push({id:'e'+conn.source+'-'+conn.target,source:conn.source,target:conn.target,animated:true})
+    }
+    function onTypeChange(){
+      if(selectedNode.value){
+        selectedNode.value.type = typeToCategory[selectedNode.value.data.nodeType] || 'default'
+      }
+    }
+    function fitView(){ flowRef.value?.fitView() }
+    function undo(){ elements.value.pop() }
+    function exportJson(){
+      const nodes = elements.value.filter(e=>e.type&&e.data).map(e=>({nodeCode:e.data.nodeCode,nodeName:e.data.label,nodeType:e.data.nodeType,sortNo:parseInt(e.id),nextNodeCode:e.data.nextNodeCode,messageTemplate:e.data.messageTemplate||'',conditionExpr:e.data.conditionExpr||'',nodeConfig:e.data.nodeConfig||'{}',maxRounds:e.data.maxRounds||0}))
+      const edges = elements.value.filter(e=>e.source&&e.target).map((e,i)=>({edgeKey:'EDGE_'+i,sourceNodeCode:elements.value.find(n=>n.id===e.source)?.data?.nodeCode||'',targetNodeCode:elements.value.find(n=>n.id===e.target)?.data?.nodeCode||'',edgeLabel:''}))
+      const json = JSON.stringify({templateName:'工作流模板',description:'',nodes,edges},null,2)
+      navigator.clipboard.writeText(json).then(()=>alert('已复制到剪贴板'))
+      console.log(json)
+    }
+
+    async function saveWorkflow(){
+      exportJson()
+      const token = localStorage.getItem('company_token') || ''
+      try{
+        const r = await fetch('http://localhost:8006/workflow/lobster/template/save',{
+          method:'POST',headers:{'Content-Type':'application/json','Authorization':'Bearer '+token},
+          body:JSON.stringify(JSON.parse(await navigator.clipboard.readText()))
+        })
+        const d = await r.json()
+        alert(d.code===200?'保存成功!':'保存失败: '+d.msg)
+      }catch(e){alert('请先登录系统获取token,或在控制台复制JSON手动保存')}
+    }
+
+    async function aiGenerate(){
+      genResult.value = null
+      genStatus.value = 'submitting'
+      genProgress.value = '正在提交AI生成任务...'
+      
+      const body = {requirement:genReq.value,industryType:genIndustry.value,modelConfig:{modelA:'doubao-lite',modelB:'doubao-lite',modelC:'doubao-lite'}}
+      if(genExisting.value){
+        body.existingWorkflow = genExisting.value
+        body.modifyInstruction = genInstruction.value||'优化工作流结构'
+      }
+      try{
+        /* 第一步: 提交异步任务, 立即返回recordId */
+        const submitRes = await fetch('/workflow/ai-generator/generate',{
+          method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(body)
+        })
+        const submitData = await submitRes.json()
+        if(submitData.code!==200||!submitData.data||!submitData.data.recordId){
+          genStatus.value = 'error'
+          genProgress.value = '提交失败'
+          alert('AI生成任务提交失败')
+          return
+        }
+
+        const recordId = submitData.data.recordId
+        genProgress.value = 'AI正在生成工作流(模型A生成中)...'
+        
+        /* 第二步: 轮询任务状态, 每3秒查询一次, 最多轮询60次(3分钟) */
+        for(let i=0;i<60;i++){
+          await new Promise(r=>setTimeout(r,3000))
+          const pollRes = await fetch('/workflow/ai-generator/result/'+recordId+'/detail')
+          const pollData = await pollRes.json()
+          if(pollData.code===200&&pollData.data){
+            const result = pollData.data
+            if(result.status==='completed'||result.status==='done'){
+              genResult.value = {score:result.qualityScore||'85',details:result.suggestions||''}
+              elements.value = parseWorkflowJson(result.workflowJson || result.nodes || result)
+              genStatus.value = 'done'
+              genProgress.value = 'AI生成完成! (得分:'+(result.qualityScore||85)+')'
+              return
+            }
+            if(result.status==='failed'){
+              genStatus.value = 'error'
+              genProgress.value = '生成失败: '+(result.errorMsg||'未知错误')
+              return
+            }
+            /* 进度更新 */
+            if(i<5) genProgress.value = 'AI正在生成工作流(模型A生成中)...'
+            else if(i<10) genProgress.value = '模型B优化中...'
+            else genProgress.value = '模型C质检评分中...'
+          }
+        }
+        genStatus.value = 'error'
+        genProgress.value = '超时(3分钟),请重试'
+      }catch(e){
+        genStatus.value = 'error'
+        genProgress.value = '请求失败: '+e.message
+        alert('AI生成请求失败: '+e.message)
+      }
+    }
+
+    function importJson(){
+      try{
+        elements.value = parseWorkflowJson(JSON.parse(loadJson.value))
+        showLoad.value = false
+      }catch(e){alert('JSON格式错误: '+e.message)}
+    }
+
+    function parseWorkflowJson(wf){
+      if(typeof wf==='string') wf = JSON.parse(wf)
+      const nodes = (wf.nodes||[]).map((n,i)=>({id:String(i+1),type:typeToCategory[n.nodeType]||'default',position:{x:300,y:50+i*130},data:{label:n.nodeName||n.name||'',nodeCode:n.nodeCode||'',nodeType:n.nodeType||3,nextNodeCode:n.nextNodeCode||'',messageTemplate:n.messageTemplate||'',conditionExpr:n.conditionExpr||'',nodeConfig:typeof n.nodeConfig==='string'?n.nodeConfig:JSON.stringify(n.nodeConfig),maxRounds:n.maxRounds||0}}))
+      const edgeMap = {}
+      nodes.forEach(n=>{if(n.data.nextNodeCode) edgeMap[n.data.nodeCode]=n.data.nextNodeCode})
+      const edges = (wf.edges||[]).map((e,i)=>({id:'e'+i,source:nodes.find(n=>n.data.nodeCode===e.sourceNodeCode)?.id||'',target:nodes.find(n=>n.data.nodeCode===e.targetNodeCode)?.id||'',animated:true}))
+      nodeIdCounter = nodes.length
+      return [...nodes,...edges]
+    }
+
+    return {nodeGroups,allNodes,flowRef,elements,selectedNode,nodeTypes,
+      showGenerate,showLoad,genReq,genIndustry,genExisting,genInstruction,genResult,loadJson,
+      onDragStart,onDrop,onNodeClick,onConnect,onTypeChange,fitView,undo,exportJson,saveWorkflow,aiGenerate,importJson}
+  }
+})
+app.component('vue-flow',VueFlow.default)
+app.component('vue-flow-background',VueFlowBackground.default)
+app.component('vue-flow-minimap',VueFlowMinimap.default)
+app.component('vue-flow-controls',VueFlowControls.default)
+app.mount('#app')
+</script>
+</body>
+</html>

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

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

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

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

@@ -0,0 +1,78 @@
+import request from '@/utils/request'
+
+// 查询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'
+  })
+}

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

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

@@ -0,0 +1,59 @@
+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 getArticleStatistics() {
+  return request({
+    url: '/admin/article/statistics',
+    method: 'get'
+  })
+}

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

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

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

@@ -0,0 +1,34 @@
+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 getCourseStatistics() {
+  return request({
+    url: '/admin/course/statistics',
+    method: 'get'
+  })
+}

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

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

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

@@ -0,0 +1,34 @@
+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 getLiveStatistics() {
+  return request({
+    url: '/admin/live/statistics',
+    method: 'get'
+  })
+}

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

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

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

@@ -0,0 +1,21 @@
+import request from '@/utils/request'
+
+export function listModuleUsage(query) {
+  return request({ url: '/admin/module-usage/list', 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' })
+}

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

@@ -0,0 +1,51 @@
+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 getProductStatistics() {
+  return request({
+    url: '/admin/product/statistics',
+    method: 'get'
+  })
+}

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

@@ -0,0 +1,79 @@
+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 listServicePrice(query) {
+  return request({ url: '/proxy/servicePrice/list', method: 'get', params: query })
+}
+
+export function getServicePriceByProxy(proxyId) {
+  return request({ url: `/proxy/servicePrice/byProxy/${proxyId}`, method: 'get' })
+}
+
+export function addServicePrice(data) {
+  return request({ url: '/proxy/servicePrice', method: 'post', data })
+}
+
+export function updateServicePrice(data) {
+  return request({ url: '/proxy/servicePrice', method: 'put', data })
+}
+
+export function batchUpdateServicePrice(data) {
+  return request({ url: '/proxy/servicePrice/batch', method: 'put', data })
+}
+
+export function initDefaultPriceConfig(proxyId, proxyName) {
+  return request({ url: `/proxy/servicePrice/init/${proxyId}`, method: 'post', params: { proxyName } })
+}
+
+// ======== 代理-租户关联 ========
+
+export function listProxyTenantRel(query) {
+  return request({ url: '/proxy/tenantRel/list', method: 'get', params: query })
+}
+
+export function getTenantsByProxy(proxyId) {
+  return request({ url: `/proxy/tenantRel/byProxy/${proxyId}`, method: 'get' })
+}
+
+export function bindTenant(proxyId, tenantId, profitShareRatio) {
+  return request({ url: '/proxy/tenantRel/bind', method: 'post', params: { proxyId, tenantId, profitShareRatio } })
+}
+
+export function unbindTenant(tenantId) {
+  return request({ url: `/proxy/tenantRel/unbind/${tenantId}`, method: 'post' })
+}
+
+export function checkTenantBind(tenantId) {
+  return request({ url: `/proxy/tenantRel/checkBind/${tenantId}`, method: 'get' })
+}

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

@@ -0,0 +1,34 @@
+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 getStatistics() {
+  return request({
+    url: '/admin/qwContact/statistics',
+    method: 'get'
+  })
+}

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

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

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

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

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

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

@@ -0,0 +1,44 @@
+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'
+  })
+}
+
+// 禁用租户
+export function disableCompany(companyId) {
+  return request({
+    url: '/admin/company/status/' + companyId,
+    method: 'put',
+    params: { status: 1 }
+  })
+}
+
+// 启用租户
+export function enableCompany(companyId) {
+  return request({
+    url: '/admin/company/status/' + companyId,
+    method: 'put',
+    params: { status: 0 }
+  })
+}
+
+// 获取租户统计信息
+export function getStatistics() {
+  return request({
+    url: '/admin/company/statistics',
+    method: 'get'
+  })
+}

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

@@ -0,0 +1,61 @@
+import request from '@/utils/request'
+
+// 查询所有租户员工列表
+export function listAllUsers(query) {
+  return request({
+    url: '/admin/companyUser/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 根据租户ID查询员工列表
+export function listByCompany(companyId) {
+  return request({
+    url: '/admin/companyUser/byCompany/' + companyId,
+    method: 'get'
+  })
+}
+
+// 获取员工详情
+export function getUserInfo(userId) {
+  return request({
+    url: '/admin/companyUser/' + userId,
+    method: 'get'
+  })
+}
+
+// 禁用员工账户
+export function disableUser(userId) {
+  return request({
+    url: '/admin/companyUser/status/' + userId,
+    method: 'put',
+    params: { status: 1 }
+  })
+}
+
+// 启用员工账户
+export function enableUser(userId) {
+  return request({
+    url: '/admin/companyUser/status/' + userId,
+    method: 'put',
+    params: { status: 0 }
+  })
+}
+
+// 查询员工账户变化记录
+export function listChangeLogs(query) {
+  return request({
+    url: '/admin/companyUser/changeList',
+    method: 'get',
+    params: query
+  })
+}
+
+// 获取统计信息
+export function getStatistics() {
+  return request({
+    url: '/admin/companyUser/statistics',
+    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/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
+  })
+}
+

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

@@ -0,0 +1,31 @@
+import request from '@/utils/request'
+
+export function getMyWallet() {
+  return request({
+    url: '/company/balance/my',
+    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: '/callRecord/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询外呼记录质检详细
+export function getApi(id) {
+  return request({
+    url: '/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: '/callRecord/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出外呼记录质检
+export function exportApi(query) {
+  return request({
+    url: '/callRecord/export',
+    method: 'post',
+    params: query
+  })
+}

+ 105 - 0
src/api/company/aiModel/inboundCallManage.js

@@ -0,0 +1,105 @@
+import request from '@/utils/request'
+
+// 查询呼入配置列表
+export function listAimodelInboundcallmanage(query) {
+  return request({
+    url: '/company/ai_model/inbound_call_manage/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询呼入配置详细
+export function getAimodelInboundcallmanage(id) {
+  return request({
+    url: '/company/ai_model/inbound_call_manage/' + id,
+    method: 'get'
+  })
+}
+
+// 新增呼入配置
+export function addAimodelInboundcallmanage(data) {
+  return request({
+    url: '/company/ai_model/inbound_call_manage',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改呼入配置
+export function updateAimodelInboundcallmanage(data) {
+  return request({
+    url: '/company/ai_model/inbound_call_manage',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除呼入配置
+export function delAimodelInboundcallmanage(id) {
+  return request({
+    url: '/company/ai_model/inbound_call_manage/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出呼入配置
+export function exportAimodelInboundcallmanage(query) {
+  return request({
+    url: '/company/ai_model/inbound_call_manage/export',
+    method: 'post',
+    params: query
+  })
+}
+
+// 查询呼入记录列表
+export function listInboundcallmanageInboundcallrecord(query) {
+  return request({
+    url: '/company/ai_model/inbound_call_manage/record/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询呼入记录详细
+export function getInboundcallmanageInboundcallrecord(id) {
+  return request({
+    url: '/company/ai_model/inbound_call_manage/record/' + id,
+    method: 'get'
+  })
+}
+
+// 新增呼入记录
+export function addInboundcallmanageInboundcallrecord(data) {
+  return request({
+    url: '/company/ai_model/inbound_call_manage/record',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改呼入记录
+export function updateInboundcallmanageInboundcallrecord(data) {
+  return request({
+    url: '/company/ai_model/inbound_call_manage/record',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除呼入记录
+export function delInboundcallmanageInboundcallrecord(id) {
+  return request({
+    url: '/company/ai_model/inbound_call_manage/record/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出呼入记录
+export function exportInboundcallmanageInboundcallrecord(query) {
+  return request({
+    url: '/company/ai_model/inbound_call_manage/record/export',
+    method: 'post',
+    params: query
+  })
+}

+ 47 - 0
src/api/company/approval.js

@@ -0,0 +1,47 @@
+import request from '@/utils/request'
+
+export function listSystemApproval(query) {
+  return request({
+    url: '/system/approval/list',
+    method: 'get',
+    params: query
+  })
+}
+
+export function getSystemApproval(id) {
+  return request({
+    url: '/system/approval/' + id,
+    method: 'get'
+  })
+}
+
+export function addSystemApproval(data) {
+  return request({
+    url: '/system/approval',
+    method: 'post',
+    data: data
+  })
+}
+
+export function updateSystemApproval(data) {
+  return request({
+    url: '/system/approval',
+    method: 'put',
+    data: data
+  })
+}
+
+export function delSystemApproval(id) {
+  return request({
+    url: '/system/approval/' + id,
+    method: 'delete'
+  })
+}
+
+export function exportSystemApproval(query) {
+  return request({
+    url: '/system/approval/export',
+    method: 'post',
+    params: query
+  })
+}

+ 61 - 0
src/api/company/companyDeduct.js

@@ -0,0 +1,61 @@
+import request from '@/utils/request'
+
+// 查询扣款列表
+export function listCompanyDeduct(query) {
+  return request({
+    url: '/company/companyDeduct/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询扣款详细
+export function getCompanyDeduct(deductId) {
+  return request({
+    url: '/company/companyDeduct/' + deductId,
+    method: 'get'
+  })
+}
+
+// 新增扣款
+export function addCompanyDeduct(data) {
+  return request({
+    url: '/company/companyDeduct',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改扣款
+export function updateCompanyDeduct(data) {
+  return request({
+    url: '/company/companyDeduct',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除扣款
+export function delCompanyDeduct(deductId) {
+  return request({
+    url: '/company/companyDeduct/' + deductId,
+    method: 'delete'
+  })
+}
+
+// 导出扣款
+export function exportCompanyDeduct(query) {
+  return request({
+    url: '/company/companyDeduct/export',
+    method: 'get',
+    params: query
+  })
+}
+
+export function audit(data) {
+  return request({
+    url: '/company/companyDeduct/audit',
+    method: 'post',
+    data: data
+  })
+}

+ 68 - 0
src/api/company/companyDomain.js

@@ -0,0 +1,68 @@
+import request from '@/utils/request'
+
+// 查询域名管路列表
+export function listCompanyDomain(query) {
+  return request({
+    url: '/company/companyDomain/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询域名管路详细
+export function getCompanyDomain(id) {
+  return request({
+    url: '/company/companyDomain/' + id,
+    method: 'get'
+  })
+}
+
+// 新增域名管路
+export function addCompanyDomain(data) {
+  return request({
+    url: '/company/companyDomain',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改域名管路
+export function updateCompanyDomain(data) {
+  return request({
+    url: '/company/companyDomain',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除域名管路
+export function delCompanyDomain(id) {
+  return request({
+    url: '/company/companyDomain/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出域名管路
+export function exportCompanyDomain(query) {
+  return request({
+    url: '/company/companyDomain/export',
+    method: 'get',
+    params: query
+  })
+}
+
+export function domainBatchBinding(data){
+  return request({
+    url: '/company/companyDomain/domainBatchBinding',
+    method: 'post',
+    data: data
+  })
+}
+
+export function exportTemplate(){
+  return request({
+    url: '/company/companyDomain/exportTemplate',
+    method: 'get',
+  })
+}

+ 53 - 0
src/api/company/companyLogininfor.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询系统访问记录列表
+export function listCompanyLogininfor(query) {
+  return request({
+    url: '/company/companyLogininfor/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询系统访问记录详细
+export function getCompanyLogininfor(infoId) {
+  return request({
+    url: '/company/companyLogininfor/' + infoId,
+    method: 'get'
+  })
+}
+
+// 新增系统访问记录
+export function addCompanyLogininfor(data) {
+  return request({
+    url: '/company/companyLogininfor',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改系统访问记录
+export function updateCompanyLogininfor(data) {
+  return request({
+    url: '/company/companyLogininfor',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除系统访问记录
+export function delCompanyLogininfor(infoId) {
+  return request({
+    url: '/company/companyLogininfor/' + infoId,
+    method: 'delete'
+  })
+}
+
+// 导出系统访问记录
+export function exportCompanyLogininfor(query) {
+  return request({
+    url: '/company/companyLogininfor/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/company/companyOperLog.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询操作日志记录列表
+export function list(query) {
+  return request({
+    url: '/company/companyOperLog/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询操作日志记录详细
+export function getCompanyOperLog(operId) {
+  return request({
+    url: '/company/companyOperLog/' + operId,
+    method: 'get'
+  })
+}
+
+// 新增操作日志记录
+export function addCompanyOperLog(data) {
+  return request({
+    url: '/company/companyOperLog',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改操作日志记录
+export function xxxxx(data) {
+  return request({
+    url: '/company/companyOperLog',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除操作日志记录
+export function delOperlog(operId) {
+  return request({
+    url: '/company/companyOperLog/' + operId,
+    method: 'delete'
+  })
+}
+
+// 导出操作日志记录
+export function exportOperlog(query) {
+  return request({
+    url: '/company/companyOperLog/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/company/companyRoleDept.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询角色和部门关联列表
+export function listCompanyRoleDept(query) {
+  return request({
+    url: '/company/companyRoleDept/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询角色和部门关联详细
+export function getCompanyRoleDept(roleId) {
+  return request({
+    url: '/company/companyRoleDept/' + roleId,
+    method: 'get'
+  })
+}
+
+// 新增角色和部门关联
+export function addCompanyRoleDept(data) {
+  return request({
+    url: '/company/companyRoleDept',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改角色和部门关联
+export function updateCompanyRoleDept(data) {
+  return request({
+    url: '/company/companyRoleDept',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除角色和部门关联
+export function delCompanyRoleDept(roleId) {
+  return request({
+    url: '/company/companyRoleDept/' + roleId,
+    method: 'delete'
+  })
+}
+
+// 导出角色和部门关联
+export function exportCompanyRoleDept(query) {
+  return request({
+    url: '/company/companyRoleDept/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/company/companyRoleMenu.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询角色和菜单关联列表
+export function listCompanyRoleMenu(query) {
+  return request({
+    url: '/company/companyRoleMenu/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询角色和菜单关联详细
+export function getCompanyRoleMenu(roleId) {
+  return request({
+    url: '/company/companyRoleMenu/' + roleId,
+    method: 'get'
+  })
+}
+
+// 新增角色和菜单关联
+export function addCompanyRoleMenu(data) {
+  return request({
+    url: '/company/companyRoleMenu',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改角色和菜单关联
+export function updateCompanyRoleMenu(data) {
+  return request({
+    url: '/company/companyRoleMenu',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除角色和菜单关联
+export function delCompanyRoleMenu(roleId) {
+  return request({
+    url: '/company/companyRoleMenu/' + roleId,
+    method: 'delete'
+  })
+}
+
+// 导出角色和菜单关联
+export function exportCompanyRoleMenu(query) {
+  return request({
+    url: '/company/companyRoleMenu/export',
+    method: 'get',
+    params: query
+  })
+}

+ 192 - 0
src/api/company/companyUserAll.js

@@ -0,0 +1,192 @@
+import request from '@/utils/request'
+import { praseStrEmpty } from "@/utils/common";
+
+// 查询企微用户列表
+export function qwList(query) {
+  return request({
+    url: '/company/CompanyUserAll/qwList',
+    method: 'get',
+    params: query
+  })
+}
+export function getList(query) {
+  return request({
+    url: '/company/CompanyUserAll/getList',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询用户详细
+export function getUser(userId) {
+  return request({
+    url: '/company/CompanyUserAll/' + praseStrEmpty(userId),
+    method: 'get'
+  })
+}
+
+// 查询用户详细
+export function addInfo(companyId) {
+  return request({
+    url: '/company/CompanyUserAll/addInfo/' +companyId,
+    method: 'get'
+  })
+}
+
+
+// 新增用户
+export function addUser(data) {
+  return request({
+    url: '/company/CompanyUserAll',
+    method: 'post',
+    data: data
+  })
+}
+
+//创建二维码
+export function addCodeUrl(data) {
+  return request({
+    url: '/company/CompanyUserAll/addCodeUrl',
+    method: 'post',
+    data: data
+  })
+}
+
+
+// 修改用户
+export function updateUser(data) {
+  return request({
+    url: '/company/CompanyUserAll',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除用户
+export function delUser(userIds) {
+  return request({
+    url: '/company/CompanyUserAll/' + userIds,
+    method: 'delete'
+  })
+}
+
+// 导出用户
+export function exportUser(query) {
+  return request({
+    url: '/company/CompanyUserAll/export',
+    method: 'get',
+    params: query
+  })
+}
+
+// 用户密码重置
+export function resetUserPwd(userId, password) {
+  const data = {
+    userId,
+    password
+  }
+  return request({
+    url: '/company/CompanyUserAll/resetPwd',
+    method: 'put',
+    data: data
+  })
+}
+
+// 用户状态修改
+export function changeUserStatus(userId, status) {
+  const data = {
+    userId,
+    status
+  }
+  return request({
+    url: '/company/CompanyUserAll/changeStatus',
+    method: 'put',
+    data: data
+  })
+}
+
+// 下载用户导入模板
+export function importTemplate() {
+  return request({
+    url: '/company/CompanyUserAll/importTemplate',
+    method: 'get'
+  })
+}
+
+/**
+ * 获取地区
+ */
+export function getCitysAreaList(query) {
+  return request({
+    url: '/company/CompanyUserAll/getCitysAreaList',
+    method: 'get',
+    params: query
+  })
+}
+
+/**
+ * 批量修改 销售的所属区域(临时的)
+ */
+export function updateCompanyUserAreaList(data) {
+  return request({
+    url: '/company/CompanyUserAll/updateCompanyUserAreaList',
+    method: 'post',
+    data: data
+  })
+}
+
+
+//生成域名
+export function generateSubDomain(query){
+  return request({
+    url: '/company/CompanyUserAll/generateSubDomain',
+    method: 'get',
+    params: query
+  })
+}
+
+// 设置是否需要单独注册会员
+export function setIsRegisterMember(status, data) {
+  return request({
+    url: '/company/CompanyUserAll/setRegister',
+    method: 'put',
+    params: status,
+    data: data
+  })
+}
+
+// 开关是否允许所有方式注册会员
+export function isAllowedAllRegister(status, data) {
+  return request({
+    url: '/company/CompanyUserAll/allowedAllRegister',
+    method: 'put',
+    params: status,
+    data: data
+  })
+}
+
+// 绑定医生
+export function bindDoctorId(data) {
+  return request({
+    url: '/company/CompanyUserAll/bindDoctorId',
+    method: 'post',
+    data: data
+  })
+}
+
+//解绑医生
+export function unBindDoctorId(userId) {
+  return request({
+    url: '/company/CompanyUserAll/unBindDoctorId/'+userId,
+    method: 'get'
+  })
+}
+
+//批量修改用户的角色
+export function updateBatchUserRoles(data) {
+  return request({
+    url: '/company/CompanyUserAll/updateBatchUserRoles',
+    method: 'post',
+    data: data
+  })
+}

+ 53 - 0
src/api/company/companyUserPost.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询用户与岗位关联列表
+export function listCompanyUserPost(query) {
+  return request({
+    url: '/company/companyUserPost/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询用户与岗位关联详细
+export function getCompanyUserPost(userId) {
+  return request({
+    url: '/company/companyUserPost/' + userId,
+    method: 'get'
+  })
+}
+
+// 新增用户与岗位关联
+export function addCompanyUserPost(data) {
+  return request({
+    url: '/company/companyUserPost',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改用户与岗位关联
+export function updateCompanyUserPost(data) {
+  return request({
+    url: '/company/companyUserPost',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除用户与岗位关联
+export function delCompanyUserPost(userId) {
+  return request({
+    url: '/company/companyUserPost/' + userId,
+    method: 'delete'
+  })
+}
+
+// 导出用户与岗位关联
+export function exportCompanyUserPost(query) {
+  return request({
+    url: '/company/companyUserPost/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/company/companyUserRole.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询用户和角色关联列表
+export function listCompanyUserRole(query) {
+  return request({
+    url: '/company/companyUserRole/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询用户和角色关联详细
+export function getCompanyUserRole(userId) {
+  return request({
+    url: '/company/companyUserRole/' + userId,
+    method: 'get'
+  })
+}
+
+// 新增用户和角色关联
+export function addCompanyUserRole(data) {
+  return request({
+    url: '/company/companyUserRole',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改用户和角色关联
+export function updateCompanyUserRole(data) {
+  return request({
+    url: '/company/companyUserRole',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除用户和角色关联
+export function delCompanyUserRole(userId) {
+  return request({
+    url: '/company/companyUserRole/' + userId,
+    method: 'delete'
+  })
+}
+
+// 导出用户和角色关联
+export function exportCompanyUserRole(query) {
+  return request({
+    url: '/company/companyUserRole/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/company/companyVoice.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询企业通话列表
+export function listCompanyVoice(query) {
+  return request({
+    url: '/company/companyVoice/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询企业通话详细
+export function getCompanyVoice(voiceId) {
+  return request({
+    url: '/company/companyVoice/' + voiceId,
+    method: 'get'
+  })
+}
+
+// 新增企业通话
+export function addCompanyVoice(data) {
+  return request({
+    url: '/company/companyVoice',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改企业通话
+export function updateCompanyVoice(data) {
+  return request({
+    url: '/company/companyVoice',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除企业通话
+export function delCompanyVoice(voiceId) {
+  return request({
+    url: '/company/companyVoice/' + voiceId,
+    method: 'delete'
+  })
+}
+
+// 导出企业通话
+export function exportCompanyVoice(query) {
+  return request({
+    url: '/company/companyVoice/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/company/companyVoiceBlacklist.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询黑名单列表
+export function listCompanyVoiceBlacklist(query) {
+  return request({
+    url: '/company/companyVoiceBlacklist/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询黑名单详细
+export function getCompanyVoiceBlacklist(blacklistId) {
+  return request({
+    url: '/company/companyVoiceBlacklist/' + blacklistId,
+    method: 'get'
+  })
+}
+
+// 新增黑名单
+export function addCompanyVoiceBlacklist(data) {
+  return request({
+    url: '/company/companyVoiceBlacklist',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改黑名单
+export function updateCompanyVoiceBlacklist(data) {
+  return request({
+    url: '/company/companyVoiceBlacklist',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除黑名单
+export function delCompanyVoiceBlacklist(blacklistId) {
+  return request({
+    url: '/company/companyVoiceBlacklist/' + blacklistId,
+    method: 'delete'
+  })
+}
+
+// 导出黑名单
+export function exportCompanyVoiceBlacklist(query) {
+  return request({
+    url: '/company/companyVoiceBlacklist/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/company/companyVoiceConfig.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询呼叫频率配置列表
+export function listCompanyVoiceConfig(query) {
+  return request({
+    url: '/company/companyVoiceConfig/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询呼叫频率配置详细
+export function getCompanyVoiceConfig(configId) {
+  return request({
+    url: '/company/companyVoiceConfig/' + configId,
+    method: 'get'
+  })
+}
+
+// 新增呼叫频率配置
+export function addCompanyVoiceConfig(data) {
+  return request({
+    url: '/company/companyVoiceConfig',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改呼叫频率配置
+export function updateCompanyVoiceConfig(data) {
+  return request({
+    url: '/company/companyVoiceConfig',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除呼叫频率配置
+export function delCompanyVoiceConfig(configId) {
+  return request({
+    url: '/company/companyVoiceConfig/' + configId,
+    method: 'delete'
+  })
+}
+
+// 导出呼叫频率配置
+export function exportCompanyVoiceConfig(query) {
+  return request({
+    url: '/company/companyVoiceConfig/export',
+    method: 'get',
+    params: query
+  })
+}

+ 61 - 0
src/api/company/companyVoiceMobile.js

@@ -0,0 +1,61 @@
+import request from '@/utils/request'
+
+// 查询中间号列表
+export function listCompanyVoiceMobile(query) {
+  return request({
+    url: '/company/companyVoiceMobile/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询中间号详细
+export function getCompanyVoiceMobile(mobileId) {
+  return request({
+    url: '/company/companyVoiceMobile/' + mobileId,
+    method: 'get'
+  })
+}
+
+// 新增中间号
+export function addCompanyVoiceMobile(data) {
+  return request({
+    url: '/company/companyVoiceMobile',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改中间号
+export function updateCompanyVoiceMobile(data) {
+  return request({
+    url: '/company/companyVoiceMobile',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除中间号
+export function delCompanyVoiceMobile(mobileId) {
+  return request({
+    url: '/company/companyVoiceMobile/' + mobileId,
+    method: 'delete'
+  })
+}
+
+// 导出中间号
+export function exportCompanyVoiceMobile(query) {
+  return request({
+    url: '/company/companyVoiceMobile/export',
+    method: 'get',
+    params: query
+  })
+}
+
+// 下载用户导入模板
+export function importTemplate() {
+  return request({
+    url: '/company/companyVoiceMobile/importTemplate',
+    method: 'get'
+  })
+}

+ 53 - 0
src/api/company/companyVoicePackage.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询套餐列表
+export function listCompanyVoicePackage(query) {
+  return request({
+    url: '/company/companyVoicePackage/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询套餐详细
+export function getCompanyVoicePackage(packageId) {
+  return request({
+    url: '/company/companyVoicePackage/' + packageId,
+    method: 'get'
+  })
+}
+
+// 新增套餐
+export function addCompanyVoicePackage(data) {
+  return request({
+    url: '/company/companyVoicePackage',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改套餐
+export function updateCompanyVoicePackage(data) {
+  return request({
+    url: '/company/companyVoicePackage',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除套餐
+export function delCompanyVoicePackage(packageId) {
+  return request({
+    url: '/company/companyVoicePackage/' + packageId,
+    method: 'delete'
+  })
+}
+
+// 导出套餐
+export function exportCompanyVoicePackage(query) {
+  return request({
+    url: '/company/companyVoicePackage/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/company/companyWorkflowManage.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询工作流模板管理列表
+export function listCompanyCompanyworkflowmanage(query) {
+  return request({
+    url: '/company/company_workflow_manage/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询工作流模板管理详细
+export function getCompanyCompanyworkflowmanage(id) {
+  return request({
+    url: '/company/company_workflow_manage/' + id,
+    method: 'get'
+  })
+}
+
+// 新增工作流模板管理
+export function addCompanyCompanyworkflowmanage(data) {
+  return request({
+    url: '/company/company_workflow_manage',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改工作流模板管理
+export function updateCompanyCompanyworkflowmanage(data) {
+  return request({
+    url: '/company/company_workflow_manage',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除工作流模板管理
+export function delCompanyCompanyworkflowmanage(id) {
+  return request({
+    url: '/company/company_workflow_manage/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出工作流模板管理
+export function exportCompanyCompanyworkflowmanage(query) {
+  return request({
+    url: '/company/company_workflow_manage/export',
+    method: 'post',
+    params: query
+  })
+}

+ 92 - 0
src/api/company/config.js

@@ -0,0 +1,92 @@
+import request from '@/utils/request'
+
+export function listConfig(query) {
+  return request({
+    url: '/system/config/list',
+    method: 'get',
+    params: query
+  })
+}
+
+export function getConfig(configId) {
+  return request({
+    url: '/system/config/' + configId,
+    method: 'get'
+  })
+}
+
+export function getConfigByKey(configKey) {
+  return request({
+    url: '/system/config/getConfigByKey/' + configKey,
+    method: 'get'
+  })
+}
+
+export function getConfigKey(configKey) {
+  return request({
+    url: '/system/config/configKey/' + configKey,
+    method: 'get'
+  })
+}
+
+export function addConfig(data) {
+  return request({
+    url: '/system/config',
+    method: 'post',
+    data: data
+  })
+}
+
+export function updateConfig(data) {
+  return request({
+    url: '/system/config',
+    method: 'put',
+    data: data
+  })
+}
+
+export function delConfig(configId) {
+  return request({
+    url: '/system/config/' + configId,
+    method: 'delete'
+  })
+}
+
+export function refreshCache() {
+  return request({
+    url: '/system/config/refreshCache',
+    method: 'delete'
+  })
+}
+
+export function exportConfig(query) {
+  return request({
+    url: '/system/config/export',
+    method: 'get',
+    params: query
+  })
+}
+
+export function updateConfigByKey(data) {
+  return request({
+    url: '/system/config/updateConfigByKey',
+    method: 'post',
+    data: data
+  })
+}
+
+export function updateIsTownOn(query) {
+  return request({
+    url: '/system/config/updateIsTownOn',
+    method: 'get',
+    params: query
+  })
+}
+
+export function getGatewayList(query) {
+  return request({
+    url: '/easyCall/gateway/list',
+    method: 'get',
+    params: query
+  })
+}

+ 60 - 0
src/api/company/dept.js

@@ -0,0 +1,60 @@
+import request from '@/utils/request'
+
+export function listDept(query) {
+  return request({
+    url: '/system/dept/list',
+    method: 'get',
+    params: query
+  })
+}
+
+export function listDeptExcludeChild(deptId) {
+  return request({
+    url: '/system/dept/list/exclude/' + deptId,
+    method: 'get'
+  })
+}
+
+export function getDept(deptId) {
+  return request({
+    url: '/system/dept/' + deptId,
+    method: 'get'
+  })
+}
+
+export function treeselect() {
+  return request({
+    url: '/system/dept/treeselect',
+    method: 'get'
+  })
+}
+
+export function roleDeptTreeselect(roleId) {
+  return request({
+    url: '/system/dept/roleDeptTreeselect/' + roleId,
+    method: 'get'
+  })
+}
+
+export function addDept(data) {
+  return request({
+    url: '/system/dept',
+    method: 'post',
+    data: data
+  })
+}
+
+export function updateDept(data) {
+  return request({
+    url: '/system/dept',
+    method: 'put',
+    data: data
+  })
+}
+
+export function delDept(deptId) {
+  return request({
+    url: '/system/dept/' + deptId,
+    method: 'delete'
+  })
+}

+ 62 - 0
src/api/company/dict/data.js

@@ -0,0 +1,62 @@
+import request from '@/utils/request'
+
+export function listData(query) {
+  return request({
+    url: '/system/dict/data/list',
+    method: 'get',
+    params: query
+  })
+}
+
+export function getData(dictCode) {
+  return request({
+    url: '/system/dict/data/' + dictCode,
+    method: 'get'
+  })
+}
+
+export function getDicts(dictType) {
+  return request({
+    url: '/system/dict/data/type/' + dictType,
+    method: 'get'
+  })
+}
+
+export function addData(data) {
+  return request({
+    url: '/system/dict/data',
+    method: 'post',
+    data: data
+  })
+}
+
+export function updateData(data) {
+  return request({
+    url: '/system/dict/data',
+    method: 'put',
+    data: data
+  })
+}
+
+export function delData(dictCode) {
+  return request({
+    url: '/system/dict/data/' + dictCode,
+    method: 'delete'
+  })
+}
+
+export function exportData(query) {
+  return request({
+    url: '/system/dict/data/export',
+    method: 'get',
+    params: query
+  })
+}
+
+export function allList(query) {
+  return request({
+    url: '/system/dict/data/allList',
+    method: 'get',
+    params: query
+  })
+}

+ 61 - 0
src/api/company/dict/type.js

@@ -0,0 +1,61 @@
+import request from '@/utils/request'
+
+export function listType(query) {
+  return request({
+    url: '/system/dict/type/list',
+    method: 'get',
+    params: query
+  })
+}
+
+export function getType(dictId) {
+  return request({
+    url: '/system/dict/type/' + dictId,
+    method: 'get'
+  })
+}
+
+export function addType(data) {
+  return request({
+    url: '/system/dict/type',
+    method: 'post',
+    data: data
+  })
+}
+
+export function updateType(data) {
+  return request({
+    url: '/system/dict/type',
+    method: 'put',
+    data: data
+  })
+}
+
+export function delType(dictId) {
+  return request({
+    url: '/system/dict/type/' + dictId,
+    method: 'delete'
+  })
+}
+
+export function refreshCache() {
+  return request({
+    url: '/system/dict/type/refreshCache',
+    method: 'delete'
+  })
+}
+
+export function exportType(query) {
+  return request({
+    url: '/system/dict/type/export',
+    method: 'get',
+    params: query
+  })
+}
+
+export function optionselect() {
+  return request({
+    url: '/system/dict/type/optionselect',
+    method: 'get'
+  })
+}

+ 53 - 0
src/api/company/inboundCallManage.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询呼入配置列表
+export function listAimodelInboundcallmanage(query) {
+  return request({
+    url: '/company/ai_model/inbound_call_manage/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询呼入配置详细
+export function getAimodelInboundcallmanage(id) {
+  return request({
+    url: '/company/ai_model/inbound_call_manage/' + id,
+    method: 'get'
+  })
+}
+
+// 新增呼入配置
+export function addAimodelInboundcallmanage(data) {
+  return request({
+    url: '/company/ai_model/inbound_call_manage',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改呼入配置
+export function updateAimodelInboundcallmanage(data) {
+  return request({
+    url: '/company/ai_model/inbound_call_manage',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除呼入配置
+export function delAimodelInboundcallmanage(id) {
+  return request({
+    url: '/company/ai_model/inbound_call_manage/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出呼入配置
+export function exportAimodelInboundcallmanage(query) {
+  return request({
+    url: '/company/ai_model/inbound_call_manage/export',
+    method: 'post',
+    params: query
+  })
+}

+ 53 - 0
src/api/company/inboundCallRecord.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询呼入记录列表
+export function listInboundcallmanageInboundcallrecord(query) {
+  return request({
+    url: '/company/ai_model/inbound_call_manage/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询呼入记录详细
+export function getInboundcallmanageInboundcallrecord(id) {
+  return request({
+    url: '/company/ai_model/inbound_call_manage/' + id,
+    method: 'get'
+  })
+}
+
+// 新增呼入记录
+export function addInboundcallmanageInboundcallrecord(data) {
+  return request({
+    url: '/company/ai_model/inbound_call_manage',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改呼入记录
+export function updateInboundcallmanageInboundcallrecord(data) {
+  return request({
+    url: '/company/ai_model/inbound_call_manage',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除呼入记录
+export function delInboundcallmanageInboundcallrecord(id) {
+  return request({
+    url: '/company/ai_model/inbound_call_manage/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出呼入记录
+export function exportInboundcallmanageInboundcallrecord(query) {
+  return request({
+    url: '/company/ai_model/inbound_call_manage/export',
+    method: 'post',
+    params: query
+  })
+}

+ 10 - 0
src/api/company/index.js

@@ -0,0 +1,10 @@
+import request from '@/utils/request'
+
+ 
+export function getCount() {
+  return request({
+    url: '/company/index/getCount',
+    method: 'get'
+  })
+}
+ 

+ 47 - 0
src/api/company/keyword.js

@@ -0,0 +1,47 @@
+import request from '@/utils/request'
+
+export function listKeyword(query) {
+  return request({
+    url: '/system/keyword/list',
+    method: 'get',
+    params: query
+  })
+}
+
+export function getKeyword(keywordId) {
+  return request({
+    url: '/system/keyword/' + keywordId,
+    method: 'get'
+  })
+}
+
+export function addKeyword(data) {
+  return request({
+    url: '/system/keyword',
+    method: 'post',
+    data: data
+  })
+}
+
+export function updateKeyword(data) {
+  return request({
+    url: '/system/keyword',
+    method: 'put',
+    data: data
+  })
+}
+
+export function delKeyword(keywordId) {
+  return request({
+    url: '/system/keyword/' + keywordId,
+    method: 'delete'
+  })
+}
+
+export function exportKeyword(query) {
+  return request({
+    url: '/system/keyword/export',
+    method: 'get',
+    params: query
+  })
+}

+ 129 - 0
src/api/company/menu.js

@@ -0,0 +1,129 @@
+import request from '@/utils/request'
+
+export function listMenu(query) {
+  return request({
+    url: '/system/menu/list',
+    method: 'get',
+    params: query
+  })
+}
+
+export function getMenu(menuId) {
+  return request({
+    url: '/system/menu/' + menuId,
+    method: 'get'
+  })
+}
+
+export function treeselect() {
+  return request({
+    url: '/system/menu/treeselect',
+    method: 'get'
+  })
+}
+
+export function roleMenuTreeselect(roleId) {
+  return request({
+    url: '/system/menu/roleMenuTreeselect/' + roleId,
+    method: 'get'
+  })
+}
+
+export function addMenu(data) {
+  return request({
+    url: '/system/menu',
+    method: 'post',
+    data: data
+  })
+}
+
+export function updateMenu(data) {
+  return request({
+    url: '/system/menu',
+    method: 'put',
+    data: data
+  })
+}
+
+export function delMenu(menuId) {
+  return request({
+    url: '/system/menu/' + menuId,
+    method: 'delete'
+  })
+}
+
+export function tenantMenu(query) {
+  return request({
+    url: '/tenant/tenant/tenantMenu/list',
+    method: 'get',
+    params: query
+  })
+}
+
+export function tenantComMenu(query) {
+  return request({
+    url: '/tenant/tenant/tenantComMenu/list',
+    method: 'get',
+    params: query
+  })
+}
+
+export function getTenantMenu(menuId) {
+  return request({
+    url: '/tenant/tenant/tenantMenu/' + menuId,
+    method: 'get'
+  })
+}
+
+export function addTenantMenu(data) {
+  return request({
+    url: '/tenant/tenant/addTenantMenu',
+    method: 'post',
+    data: data
+  })
+}
+
+export function updateTenantMenu(data) {
+  return request({
+    url: '/tenant/tenant/updateTenantMenu',
+    method: 'put',
+    data: data
+  })
+}
+
+export function delTenantMenu(menuId) {
+  return request({
+    url: '/tenant/tenant/delTenantMenu/' + menuId,
+    method: 'delete'
+  })
+}
+
+export function delTenantComMenu(menuId) {
+  return request({
+    url: '/tenant/tenant/delTenantComMenu/' + menuId,
+    method: 'delete'
+  })
+}
+
+export function addTenantComMenu(data) {
+  return request({
+    url: '/tenant/tenant/addTenantComMenu',
+    method: 'post',
+    data: data
+  })
+}
+
+export function updateTenantComMenu(data) {
+  return request({
+    url: '/tenant/tenant/updateTenantComMenu',
+    method: 'put',
+    data: data
+  })
+}
+
+export function getTenantComMenu(menuId) {
+  return request({
+    url: '/tenant/tenant/getTenantComMenu/' + menuId,
+    method: 'get'
+  })
+}

+ 39 - 0
src/api/company/notice.js

@@ -0,0 +1,39 @@
+import request from '@/utils/request'
+
+export function listNotice(query) {
+  return request({
+    url: '/system/notice/list',
+    method: 'get',
+    params: query
+  })
+}
+
+export function getNotice(noticeId) {
+  return request({
+    url: '/system/notice/' + noticeId,
+    method: 'get'
+  })
+}
+
+export function addNotice(data) {
+  return request({
+    url: '/system/notice',
+    method: 'post',
+    data: data
+  })
+}
+
+export function updateNotice(data) {
+  return request({
+    url: '/system/notice',
+    method: 'put',
+    data: data
+  })
+}
+
+export function delNotice(noticeId) {
+  return request({
+    url: '/system/notice/' + noticeId,
+    method: 'delete'
+  })
+}

+ 47 - 0
src/api/company/post.js

@@ -0,0 +1,47 @@
+import request from '@/utils/request'
+
+export function listPost(query) {
+  return request({
+    url: '/system/post/list',
+    method: 'get',
+    params: query
+  })
+}
+
+export function getPost(postId) {
+  return request({
+    url: '/system/post/' + postId,
+    method: 'get'
+  })
+}
+
+export function addPost(data) {
+  return request({
+    url: '/system/post',
+    method: 'post',
+    data: data
+  })
+}
+
+export function updatePost(data) {
+  return request({
+    url: '/system/post',
+    method: 'put',
+    data: data
+  })
+}
+
+export function delPost(postId) {
+  return request({
+    url: '/system/post/' + postId,
+    method: 'delete'
+  })
+}
+
+export function exportPost(query) {
+  return request({
+    url: '/system/post/export',
+    method: 'get',
+    params: query
+  })
+}

+ 31 - 0
src/api/company/resourceManagement.js

@@ -0,0 +1,31 @@
+import request from '@/utils/request'
+
+export function getDeptResource(deptId) {
+  return request({
+    url: '/system/resourceM/getDeptResource/' + deptId,
+    method: 'get'
+  })
+}
+
+export function getCompanyResource(companyId) {
+  return request({
+    url: '/system/resourceM/getCompanyResource/' + companyId,
+    method: 'get'
+  })
+}
+
+export function addOrEditDeptResource(data) {
+  return request({
+    url: '/system/resourceM/updateDeptResource',
+    method: 'put',
+    data: data
+  })
+}
+
+export function addOrEditCompanyResource(data) {
+  return request({
+    url: '/system/resourceM/updateCompanyResource',
+    method: 'put',
+    data: data
+  })
+}

+ 107 - 0
src/api/company/role.js

@@ -0,0 +1,107 @@
+import request from '@/utils/request'
+
+export function listRole(query) {
+  return request({
+    url: '/system/role/list',
+    method: 'get',
+    params: query
+  })
+}
+
+export function getRole(roleId) {
+  return request({
+    url: '/system/role/' + roleId,
+    method: 'get'
+  })
+}
+
+export function addRole(data) {
+  return request({
+    url: '/system/role',
+    method: 'post',
+    data: data
+  })
+}
+
+export function updateRole(data) {
+  return request({
+    url: '/system/role',
+    method: 'put',
+    data: data
+  })
+}
+
+export function dataScope(data) {
+  return request({
+    url: '/system/role/dataScope',
+    method: 'put',
+    data: data
+  })
+}
+
+export function changeRoleStatus(roleId, status) {
+  const data = {
+    roleId,
+    status
+  }
+  return request({
+    url: '/system/role/changeStatus',
+    method: 'put',
+    data: data
+  })
+}
+
+export function delRole(roleId) {
+  return request({
+    url: '/system/role/' + roleId,
+    method: 'delete'
+  })
+}
+
+export function exportRole(query) {
+  return request({
+    url: '/system/role/export',
+    method: 'get',
+    params: query
+  })
+}
+
+export function allocatedUserList(query) {
+  return request({
+    url: '/system/role/authUser/allocatedList',
+    method: 'get',
+    params: query
+  })
+}
+
+export function unallocatedUserList(query) {
+  return request({
+    url: '/system/role/authUser/unallocatedList',
+    method: 'get',
+    params: query
+  })
+}
+
+export function authUserCancel(data) {
+  return request({
+    url: '/system/role/authUser/cancel',
+    method: 'put',
+    data: data
+  })
+}
+
+export function authUserCancelAll(data) {
+  return request({
+    url: '/system/role/authUser/cancelAll',
+    method: 'put',
+    params: data
+  })
+}
+
+export function authUserSelectAll(data) {
+  return request({
+    url: '/system/role/authUser/selectAll',
+    method: 'put',
+    params: data
+  })
+}

+ 103 - 0
src/api/company/scheduleReport.js

@@ -0,0 +1,103 @@
+import request from '@/utils/request'
+
+// 查询中医档期业绩报表列表
+export function listTcmScheduleReport(query) {
+  return request({
+    url: '/company/scheduleReport/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 中医档期业绩报表统计
+export function listTcmStatisticsReport(query) {
+  return request({
+    url: '/company/scheduleReport/statistics',
+    method: 'get',
+    params: query
+  })
+}
+
+
+// 查询指定档期各团队统计报表
+export function getStatisticsByScheduleId(query) {
+  return request({
+    url: '/company/scheduleReport/getStatisticsByScheduleId',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询中医档期业绩报表详细
+export function getTcmScheduleReport(id) {
+  return request({
+    url: '/company/scheduleReport/' + id,
+    method: 'get'
+  })
+}
+
+// 新增中医档期业绩报表
+export function addTcmScheduleReport(data) {
+  return request({
+    url: '/company/scheduleReport',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改中医档期业绩报表
+export function updateTcmScheduleReport(data) {
+  return request({
+    url: '/company/scheduleReport',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除中医档期业绩报表
+export function delTcmScheduleReport(id) {
+  return request({
+    url: '/company/scheduleReport/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出中医档期业绩统计报表
+export function exportStatisticsScheduleReport(query) {
+  return request({
+    url: '/company/scheduleReport/exportStatistics',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出中医档期业绩报表
+export function exportTcmScheduleReport(query) {
+  return request({
+    url: '/company/scheduleReport/export',
+    method: 'get',
+    params: query
+  })
+}
+
+
+
+
+// 查询中医档期管理列表
+export function listSchedule(query) {
+  return request({
+    url: '/company/scheduleReport/getScheduleList',
+    method: 'get',
+    params: query
+  })
+}
+
+
+// 查询中医档期管理列表
+export function listAllSchedule(query) {
+  return request({
+    url: '/company/scheduleReport/getAllScheduleList',
+    method: 'get',
+    params: query
+  })
+}

+ 47 - 0
src/api/company/set.js

@@ -0,0 +1,47 @@
+import request from '@/utils/request'
+
+export function listSet(query) {
+  return request({
+    url: '/system/set/list',
+    method: 'get',
+    params: query
+  })
+}
+
+export function getSet(userId) {
+  return request({
+    url: '/system/set/' + userId,
+    method: 'get'
+  })
+}
+
+export function addSet(data) {
+  return request({
+    url: '/system/set',
+    method: 'post',
+    data: data
+  })
+}
+
+export function updateSet(data) {
+  return request({
+    url: '/system/set',
+    method: 'put',
+    data: data
+  })
+}
+
+export function delSet(userId) {
+  return request({
+    url: '/system/set/' + userId,
+    method: 'delete'
+  })
+}
+
+export function exportSet(query) {
+  return request({
+    url: '/system/set/export',
+    method: 'get',
+    params: query
+  })
+}

+ 27 - 0
src/api/company/traffic.js

@@ -0,0 +1,27 @@
+import request from '@/utils/request'
+
+export function rechargeTraffic(data) {
+  return request({
+    url: '/company/traffic/rechargeTraffic',
+    method: 'post',
+    data: data
+  })
+}
+
+export function listTrafficRecords(query) {
+  return request({
+    url: '/company/traffic/list',
+    method: 'get',
+    params: query
+  })
+}
+
+///trafficConversion
+export function trafficConversion(data) {
+  return request({
+    url: '/company/traffic/trafficConversion',
+    method: 'get',
+    params: data
+  })
+}
+

+ 19 - 0
src/api/company/trafficLog.js

@@ -0,0 +1,19 @@
+import request from '@/utils/request'
+
+
+export function listTrafficLogExport(query) {
+  return request({
+    url: '/company/trafficLog/export',
+    method: 'get',
+    params: query
+  })
+}
+
+export function listTrafficLog(query) {
+  return request({
+    url: '/company/trafficLog/list',
+    method: 'get',
+    params: query
+  })
+}
+

+ 144 - 0
src/api/company/user.js

@@ -0,0 +1,144 @@
+import request from '@/utils/request'
+import { praseStrEmpty } from "@/utils/common";
+
+export function listUser(query) {
+  return request({
+    url: '/system/user/list',
+    method: 'get',
+    params: query
+  })
+}
+
+export function getUser(userId) {
+  return request({
+    url: '/system/user/' + praseStrEmpty(userId),
+    method: 'get'
+  })
+}
+
+export function addUser(data) {
+  return request({
+    url: '/system/user',
+    method: 'post',
+    data: data
+  })
+}
+
+export function updateUser(data) {
+  return request({
+    url: '/system/user',
+    method: 'put',
+    data: data
+  })
+}
+
+export function delUser(userId) {
+  return request({
+    url: '/system/user/' + userId,
+    method: 'delete'
+  })
+}
+
+export function exportUser(query) {
+  return request({
+    url: '/system/user/export',
+    method: 'get',
+    params: query
+  })
+}
+
+export function resetUserPwd(userId, password) {
+  const data = {
+    userId,
+    password
+  }
+  return request({
+    url: '/system/user/resetPwd',
+    method: 'put',
+    data: data
+  })
+}
+
+export function changeUserStatus(userId, status) {
+  const data = {
+    userId,
+    status
+  }
+  return request({
+    url: '/system/user/changeStatus',
+    method: 'put',
+    data: data
+  })
+}
+
+export function getUserProfile() {
+  return request({
+    url: '/system/user/profile',
+    method: 'get'
+  })
+}
+
+export function updateUserProfile(data) {
+  return request({
+    url: '/system/user/profile',
+    method: 'put',
+    data: data
+  })
+}
+
+export function updateUserPwd(oldPassword, newPassword) {
+  const data = {
+    oldPassword,
+    newPassword
+  }
+  return request({
+    url: '/system/user/profile/updatePwd',
+    method: 'put',
+    params: data
+  })
+}
+
+export function uploadAvatar(data) {
+  return request({
+    url: '/system/user/profile/avatar',
+    method: 'post',
+    data: data
+  })
+}
+
+export function importTemplate() {
+  return request({
+    url: '/system/user/importTemplate',
+    method: 'get'
+  })
+}
+
+export function getAuthRole(userId) {
+  return request({
+    url: '/system/user/authRole/' + userId,
+    method: 'get'
+  })
+}
+
+export function updateAuthRole(data) {
+  return request({
+    url: '/system/user/authRole',
+    method: 'put',
+    params: data
+  })
+}
+
+export function isAdmin() {
+  return request({
+    url: '/system/user/isAdmin',
+    method: 'get'
+  })
+}
+
+export function unBind(userId) {
+  return request({
+    url: '/system/user/unBind',
+    method: 'post',
+    data: { userId: userId }
+  })
+}

+ 71 - 0
src/api/company/workflowExec.js

@@ -0,0 +1,71 @@
+import request from '@/utils/request'
+
+export const workflowExecApi = {
+  start: (workflowId, contactId, initVariables) => {
+    return request({
+      url: '/workflow/lobster-exec/start',
+      method: 'post',
+      params: { workflowId, contactId },
+      data: initVariables
+    })
+  },
+  executeNextNode: (instanceId, customerReply) => {
+    return request({
+      url: '/workflow/lobster-exec/next-node',
+      method: 'post',
+      params: { instanceId, customerReply }
+    })
+  },
+  pause: (instanceId) => {
+    return request({ url: `/workflow/lobster-exec/pause/${instanceId}`, method: 'post' })
+  },
+  resume: (instanceId) => {
+    return request({ url: `/workflow/lobster-exec/resume/${instanceId}`, method: 'post' })
+  },
+  terminate: (instanceId, reason) => {
+    return request({
+      url: `/workflow/lobster-exec/terminate/${instanceId}`,
+      method: 'post',
+      params: { reason }
+    })
+  },
+  getInstanceState: (instanceId) => {
+    return request({ url: `/workflow/lobster-exec/instance/${instanceId}`, method: 'get' })
+  },
+  listInstances: (workflowId) => {
+    return request({
+      url: '/workflow/lobster-exec/instance/list',
+      method: 'get',
+      params: { workflowId }
+    })
+  },
+  getNodeLogs: (instanceId) => {
+    return request({ url: `/workflow/lobster-exec/node-logs/${instanceId}`, method: 'get' })
+  },
+  detectTakeover: (customerMessage, context) => {
+    return request({
+      url: '/workflow/lobster-exec/takeover-detect',
+      method: 'post',
+      params: { customerMessage, context }
+    })
+  },
+  complianceCheck: (content) => {
+    return request({
+      url: '/workflow/lobster-exec/compliance-check',
+      method: 'post',
+      params: { content }
+    })
+  },
+  getComplianceRules: () => {
+    return request({ url: '/workflow/lobster-exec/compliance-rules', method: 'get' })
+  },
+  addComplianceRule: (data) => {
+    return request({ url: '/workflow/lobster-exec/compliance-rule', method: 'post', data })
+  },
+  updateComplianceRule: (id, data) => {
+    return request({ url: `/workflow/lobster-exec/compliance-rule/${id}`, method: 'put', data })
+  },
+  deleteComplianceRule: (id) => {
+    return request({ url: `/workflow/lobster-exec/compliance-rule/${id}`, method: 'delete' })
+  }
+}

+ 53 - 0
src/api/complaint/category.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询投诉分类列表
+export function listCategory(query) {
+  return request({
+    url: '/complaint/category/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询投诉分类详细
+export function getCategory(id) {
+  return request({
+    url: '/complaint/category/' + id,
+    method: 'get'
+  })
+}
+
+// 新增投诉分类
+export function addCategory(data) {
+  return request({
+    url: '/complaint/category',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改投诉分类
+export function updateCategory(data) {
+  return request({
+    url: '/complaint/category',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除投诉分类
+export function delCategory(ids) {
+  return request({
+    url: '/complaint/category/' + ids,
+    method: 'delete'
+  })
+}
+
+// 修改投诉分类状态
+export function changeStatus(data) {
+  return request({
+    url: '/complaint/category/status',
+    method: 'put',
+    data: data
+  })
+}

+ 66 - 0
src/api/complaint/complaint.js

@@ -0,0 +1,66 @@
+import request from '@/utils/request'
+
+export function submitComplaint(data) {
+  return request({
+    url: '/complaint',
+    method: 'post',
+    data: data
+  })
+}
+
+export function getComplaintById(id) {
+  return request({
+    url: `/complaint/${id}`,
+    method: 'get'
+  })
+}
+
+export function getComplaintByNo(complaintNo) {
+  return request({
+    url: `/complaint/no/${complaintNo}`,
+    method: 'get'
+  })
+}
+
+export function getComplaintPage(data) {
+  return request({
+    url: '/complaint/list',
+    method: 'post',
+    data: data
+  })
+}
+
+export function updateComplaint(id, data) {
+  return request({
+    url: `/complaint/${id}`,
+    method: 'put',
+    data: {
+      ...data,
+      type: data.categoryId
+    }
+  })
+}
+
+export function deleteComplaint(id) {
+  return request({
+    url: `/complaint/${id}`,
+    method: 'delete'
+  })
+}
+
+export function handleComplaint(id) {
+  return request({
+    url: `/complaint/${id}`,
+    method: 'put',
+    data: {
+      status: '1'
+    }
+  })
+}
+
+export function getAllCategory() {
+  return request({
+    url: '/complaint/queryAllCategory',
+    method: 'post'
+  })
+}

+ 53 - 0
src/api/course/courseLink.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询短链列表
+export function listCourseLink(query) {
+  return request({
+    url: '/course/courseLink/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询短链详细
+export function getCourseLink(linkId) {
+  return request({
+    url: '/course/courseLink/' + linkId,
+    method: 'get'
+  })
+}
+
+// 新增短链
+export function addCourseLink(data) {
+  return request({
+    url: '/course/courseLink',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改短链
+export function updateCourseLink(data) {
+  return request({
+    url: '/course/courseLink',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除短链
+export function delCourseLink(linkId) {
+  return request({
+    url: '/course/courseLink/' + linkId,
+    method: 'delete'
+  })
+}
+
+// 导出短链
+export function exportCourseLink(query) {
+  return request({
+    url: '/course/courseLink/export',
+    method: 'get',
+    params: query
+  })
+}

+ 10 - 0
src/api/course/courseRedPacketStatistics.js

@@ -0,0 +1,10 @@
+import request from '@/utils/request'
+
+// 查询短链课程看课记录列表
+export function list(query) {
+  return request({
+    url: '/course/courseRedPacketStatistics/list',
+    method: 'get',
+    params: query
+  })
+}

+ 80 - 0
src/api/course/courseWatchComment.js

@@ -0,0 +1,80 @@
+import request from '@/utils/request'
+
+// 查询看课评论列表
+export function listCourseWatchComment(query) {
+  return request({
+    url: '/course/courseWatchComment/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// // 查询看课评论详细
+// export function getCourseWatchComment(commentId) {
+//   return request({
+//     url: '/course/courseWatchComment/' + commentId,
+//     method: 'get'
+//   })
+// }
+
+// // 新增看课评论
+// export function addCourseWatchComment(data) {
+//   return request({
+//     url: '/course/courseWatchComment',
+//     method: 'post',
+//     data: data
+//   })
+// }
+//
+// // 修改看课评论
+// export function updateCourseWatchComment(data) {
+//   return request({
+//     url: '/course/courseWatchComment',
+//     method: 'put',
+//     data: data
+//   })
+// }
+//
+
+// 修改弹幕状态
+export function updateBarrageStatus(data) {
+  return request({
+    url: '/course/courseWatchComment/updateBarrageStatus',
+    method: 'put',
+    data: data
+  })
+}
+// 删除看课评论
+export function delCourseWatchComment(commentId) {
+  return request({
+    url: '/course/courseWatchComment/' + commentId,
+    method: 'delete'
+  })
+}
+
+// 导出看课评论
+export function exportCourseWatchComment(query) {
+  return request({
+    url: '/course/courseWatchComment/export',
+    method: 'get',
+    params: query
+  })
+}
+
+// 手动拉黑外部联系人
+export function addBlack(query) {
+  return request({
+    url: '/course/courseWatchComment/addBlack',
+    method: 'put',
+    params: query
+  })
+}
+
+// 解除拉黑外部联系人
+export function clearBlack(query) {
+  return request({
+    url: '/course/courseWatchComment/clearBlack',
+    method: 'put',
+    params: query
+  })
+}

+ 53 - 0
src/api/course/fsCourseProduct.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询拍单商品列表
+export function listFsCourseProduct(query) {
+  return request({
+    url: '/course/fsCourseProduct/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询拍单商品详细
+export function getFsCourseProduct(id) {
+  return request({
+    url: '/course/fsCourseProduct/' + id,
+    method: 'get'
+  })
+}
+
+// 新增拍单商品
+export function addFsCourseProduct(data) {
+  return request({
+    url: '/course/fsCourseProduct',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改拍单商品
+export function updateFsCourseProduct(data) {
+  return request({
+    url: '/course/fsCourseProduct',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除拍单商品
+export function delFsCourseProduct(id) {
+  return request({
+    url: '/course/fsCourseProduct/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出拍单商品
+export function exportFsCourseProduct(query) {
+  return request({
+    url: '/course/fsCourseProduct/export',
+    method: 'get',
+    params: query
+  })
+}

+ 79 - 0
src/api/course/fsCourseProductOrder.js

@@ -0,0 +1,79 @@
+import request from '@/utils/request'
+
+// 查询拍单商品订单列表
+export function listFsCourseProductOrder(query) {
+  return request({
+    url: '/course/fsCourseProductOrder/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询拍单商品订单详细
+export function getFsCourseProductOrder(courseOrderId) {
+  return request({
+    url: '/course/fsCourseProductOrder/' + courseOrderId,
+    method: 'get'
+  })
+}
+
+// 新增拍单商品订单
+export function addFsCourseProductOrder(data) {
+  return request({
+    url: '/course/fsCourseProductOrder',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改拍单商品订单
+export function updateFsCourseProductOrder(data) {
+  return request({
+    url: '/course/fsCourseProductOrder',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除拍单商品订单
+export function delFsCourseProductOrder(courseOrderId) {
+  return request({
+    url: '/course/fsCourseProductOrder/' + courseOrderId,
+    method: 'delete'
+  })
+}
+
+// 导出拍单商品订单
+export function exportFsCourseProductOrder(query) {
+  return request({
+    url: '/course/fsCourseProductOrder/export',
+    method: 'get',
+    params: query
+  })
+}
+// 导出拍单商品订单(解密手机号)
+export function exportFsCourseProductOrderDecodePhone(query) {
+  return request({
+    url: '/course/fsCourseProductOrder/decodeExport',
+    method: 'get',
+    params: query
+  })
+}
+
+
+// 退款拍商品订单
+export function refund(data) {
+  return request({
+    url: '/course/fsCourseProductOrder/refund',
+    method: 'post',
+    data: data
+  })
+}
+
+// 查询收货人电话
+export function getOrderUserPhone(courseOrderId) {
+  return request({
+    url: '/course/fsCourseProductOrder/queryPhone/' + courseOrderId,
+    method: 'get'
+  })
+}

+ 53 - 0
src/api/course/fsUserCoursePeriodDays.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询营期课程列表
+export function listFsUserCoursePeriodDays(query) {
+  return request({
+    url: '/course/fsUserCoursePeriodDays/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询营期课程详细
+export function getFsUserCoursePeriodDays(id) {
+  return request({
+    url: '/course/fsUserCoursePeriodDays/' + id,
+    method: 'get'
+  })
+}
+
+// 新增营期课程
+export function addFsUserCoursePeriodDays(data) {
+  return request({
+    url: '/course/fsUserCoursePeriodDays',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改营期课程
+export function updateFsUserCoursePeriodDays(data) {
+  return request({
+    url: '/course/fsUserCoursePeriodDays',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除营期课程
+export function delFsUserCoursePeriodDays(id) {
+  return request({
+    url: '/course/fsUserCoursePeriodDays/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出营期课程
+export function exportFsUserCoursePeriodDays(query) {
+  return request({
+    url: '/course/fsUserCoursePeriodDays/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/course/push.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询营销活动推送列表
+export function listPush(query) {
+  return request({
+    url: '/push/push/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询营销活动推送详细
+export function getPush(id) {
+  return request({
+    url: '/push/push/' + id,
+    method: 'get'
+  })
+}
+
+// 新增营销活动推送
+export function addPush(data) {
+  return request({
+    url: '/push/push',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改营销活动推送
+export function updatePush(data) {
+  return request({
+    url: '/push/push',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除营销活动推送
+export function delPush(id) {
+  return request({
+    url: '/push/push/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出营销活动推送
+export function exportPush(query) {
+  return request({
+    url: '/push/push/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/course/statistics.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询会员每日看课统计列表
+export function listStatistics(query) {
+  return request({
+    url: '/course/statistics/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询会员每日看课统计详细
+export function getStatistics(id) {
+  return request({
+    url: '/course/statistics/' + id,
+    method: 'get'
+  })
+}
+
+// 新增会员每日看课统计
+export function addStatistics(data) {
+  return request({
+    url: '/course/statistics',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改会员每日看课统计
+export function updateStatistics(data) {
+  return request({
+    url: '/course/statistics',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除会员每日看课统计
+export function delStatistics(id) {
+  return request({
+    url: '/course/statistics/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出会员每日看课统计
+export function exportStatistics(query) {
+  return request({
+    url: '/course/statistics/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/course/userCourseComment.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询课堂评论列表
+export function listUserCourseComment(query) {
+  return request({
+    url: '/course/userCourseComment/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询课堂评论详细
+export function getUserCourseComment(commentId) {
+  return request({
+    url: '/course/userCourseComment/' + commentId,
+    method: 'get'
+  })
+}
+
+// 新增课堂评论
+export function addUserCourseComment(data) {
+  return request({
+    url: '/course/userCourseComment',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改课堂评论
+export function updateUserCourseComment(data) {
+  return request({
+    url: '/course/userCourseComment',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除课堂评论
+export function delUserCourseComment(commentId) {
+  return request({
+    url: '/course/userCourseComment/' + commentId,
+    method: 'delete'
+  })
+}
+
+// 导出课堂评论
+export function exportUserCourseComment(query) {
+  return request({
+    url: '/course/userCourseComment/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/course/userCourseCommentLike.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询课堂评论点赞列表
+export function listUserCourseCommentLike(query) {
+  return request({
+    url: '/course/userCourseCommentLike/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询课堂评论点赞详细
+export function getUserCourseCommentLike(id) {
+  return request({
+    url: '/course/userCourseCommentLike/' + id,
+    method: 'get'
+  })
+}
+
+// 新增课堂评论点赞
+export function addUserCourseCommentLike(data) {
+  return request({
+    url: '/course/userCourseCommentLike',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改课堂评论点赞
+export function updateUserCourseCommentLike(data) {
+  return request({
+    url: '/course/userCourseCommentLike',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除课堂评论点赞
+export function delUserCourseCommentLike(id) {
+  return request({
+    url: '/course/userCourseCommentLike/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出课堂评论点赞
+export function exportUserCourseCommentLike(query) {
+  return request({
+    url: '/course/userCourseCommentLike/export',
+    method: 'get',
+    params: query
+  })
+}

+ 61 - 0
src/api/course/userCourseComplaintRecord.js

@@ -0,0 +1,61 @@
+import request from '@/utils/request'
+
+// 查询看课投诉记录列表
+export function listUserCourseComplaintRecord(query) {
+  return request({
+    url: '/course/userCourseComplaintRecord/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询看课投诉记录详细
+export function getUserCourseComplaintRecord(recordId) {
+  return request({
+    url: '/course/userCourseComplaintRecord/' + recordId,
+    method: 'get'
+  })
+}
+//查询看课投诉记录详细-客户所属关系
+export function getUserCourseComplaintRecordByUserId(userId) {
+  return request({
+    url: '/course/userCourseComplaintRecord/getInfoByUserId/' + userId,
+    method: 'get'
+  })
+}
+
+//
+// // 新增看课投诉记录
+// export function addUserCourseComplaintRecord(data) {
+//   return request({
+//     url: '/course/userCourseComplaintRecord',
+//     method: 'post',
+//     data: data
+//   })
+// }
+//
+// // 修改看课投诉记录
+// export function updateUserCourseComplaintRecord(data) {
+//   return request({
+//     url: '/course/userCourseComplaintRecord',
+//     method: 'put',
+//     data: data
+//   })
+// }
+
+// 删除看课投诉记录
+export function delUserCourseComplaintRecord(recordId) {
+  return request({
+    url: '/course/userCourseComplaintRecord/' + recordId,
+    method: 'delete'
+  })
+}
+
+// 导出看课投诉记录
+export function exportUserCourseComplaintRecord(query) {
+  return request({
+    url: '/course/userCourseComplaintRecord/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/course/userCourseComplaintType.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询看课投诉类型列表
+export function listUserCourseComplaintType(query) {
+  return request({
+    url: '/course/userCourseComplaintType/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询看课投诉类型详细
+export function getUserCourseComplaintType(complaintTypeId) {
+  return request({
+    url: '/course/userCourseComplaintType/' + complaintTypeId,
+    method: 'get'
+  })
+}
+
+// 新增看课投诉类型
+export function addUserCourseComplaintType(data) {
+  return request({
+    url: '/course/userCourseComplaintType',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改看课投诉类型
+export function updateUserCourseComplaintType(data) {
+  return request({
+    url: '/course/userCourseComplaintType',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除看课投诉类型
+export function delUserCourseComplaintType(complaintTypeIds) {
+  return request({
+    url: '/course/userCourseComplaintType/' + complaintTypeIds,
+    method: 'delete'
+  })
+}
+
+// 导出看课投诉类型
+export function exportUserCourseComplaintType(query) {
+  return request({
+    url: '/course/userCourseComplaintType/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/course/userCourseFavorite.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询课程收藏列表
+export function listUserCourseFavorite(query) {
+  return request({
+    url: '/course/userCourseFavorite/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询课程收藏详细
+export function getUserCourseFavorite(favoriteId) {
+  return request({
+    url: '/course/userCourseFavorite/' + favoriteId,
+    method: 'get'
+  })
+}
+
+// 新增课程收藏
+export function addUserCourseFavorite(data) {
+  return request({
+    url: '/course/userCourseFavorite',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改课程收藏
+export function updateUserCourseFavorite(data) {
+  return request({
+    url: '/course/userCourseFavorite',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除课程收藏
+export function delUserCourseFavorite(favoriteId) {
+  return request({
+    url: '/course/userCourseFavorite/' + favoriteId,
+    method: 'delete'
+  })
+}
+
+// 导出课程收藏
+export function exportUserCourseFavorite(query) {
+  return request({
+    url: '/course/userCourseFavorite/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/course/userCourseNote.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询课堂笔记列表
+export function listUserCourseNote(query) {
+  return request({
+    url: '/course/userCourseNote/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询课堂笔记详细
+export function getUserCourseNote(noteId) {
+  return request({
+    url: '/course/userCourseNote/' + noteId,
+    method: 'get'
+  })
+}
+
+// 新增课堂笔记
+export function addUserCourseNote(data) {
+  return request({
+    url: '/course/userCourseNote',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改课堂笔记
+export function updateUserCourseNote(data) {
+  return request({
+    url: '/course/userCourseNote',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除课堂笔记
+export function delUserCourseNote(noteId) {
+  return request({
+    url: '/course/userCourseNote/' + noteId,
+    method: 'delete'
+  })
+}
+
+// 导出课堂笔记
+export function exportUserCourseNote(query) {
+  return request({
+    url: '/course/userCourseNote/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/course/userCourseNoteLike.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询课堂笔记点赞列表
+export function listUserCourseNoteLike(query) {
+  return request({
+    url: '/course/userCourseNoteLike/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询课堂笔记点赞详细
+export function getUserCourseNoteLike(id) {
+  return request({
+    url: '/course/userCourseNoteLike/' + id,
+    method: 'get'
+  })
+}
+
+// 新增课堂笔记点赞
+export function addUserCourseNoteLike(data) {
+  return request({
+    url: '/course/userCourseNoteLike',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改课堂笔记点赞
+export function updateUserCourseNoteLike(data) {
+  return request({
+    url: '/course/userCourseNoteLike',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除课堂笔记点赞
+export function delUserCourseNoteLike(id) {
+  return request({
+    url: '/course/userCourseNoteLike/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出课堂笔记点赞
+export function exportUserCourseNoteLike(query) {
+  return request({
+    url: '/course/userCourseNoteLike/export',
+    method: 'get',
+    params: query
+  })
+}

+ 47 - 0
src/api/course/userCourseOrder.js

@@ -0,0 +1,47 @@
+import request from '@/utils/request'
+
+export function listUserCourseOrder(query) {
+  return request({
+    url: '/course/userCourseOrder/list',
+    method: 'get',
+    params: query
+  })
+}
+
+export function getUserCourseOrder(orderId) {
+  return request({
+    url: '/course/userCourseOrder/' + orderId,
+    method: 'get'
+  })
+}
+
+export function addUserCourseOrder(data) {
+  return request({
+    url: '/course/userCourseOrder',
+    method: 'post',
+    data: data
+  })
+}
+
+export function updateUserCourseOrder(data) {
+  return request({
+    url: '/course/userCourseOrder',
+    method: 'put',
+    data: data
+  })
+}
+
+export function delUserCourseOrder(orderId) {
+  return request({
+    url: '/course/userCourseOrder/' + orderId,
+    method: 'delete'
+  })
+}
+
+export function exportUserCourseOrder(query) {
+  return request({
+    url: '/course/userCourseOrder/export',
+    method: 'get',
+    params: query
+  })
+}

+ 82 - 0
src/api/course/userCoursePublic.js

@@ -0,0 +1,82 @@
+import request from '@/utils/request'
+
+// 查询课程列表
+export function listUserCourse(query) {
+  return request({
+    url: '/course/userCourse/publicList',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询课程详细
+export function getUserCourse(courseId) {
+  return request({
+    url: '/course/userCourse/public/' + courseId,
+    method: 'get'
+  })
+}
+
+// 新增课程
+export function addUserCourse(data) {
+  return request({
+    url: '/course/userCourse/public',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改课程
+export function updateUserCourse(data) {
+  return request({
+    url: '/course/userCourse',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除课程
+export function delUserCourse(courseId) {
+  return request({
+    url: '/course/userCourse/public/' + courseId,
+    method: 'delete'
+  })
+}
+
+// 导出课程
+export function exportUserCourse(query) {
+  return request({
+    url: '/course/userCourse/publicExport',
+    method: 'get',
+    params: query
+  })
+}
+
+export function getAllCourse() {
+  return request({
+    url: '/course/userCourse/getAllList',
+    method: 'get'
+  })
+}
+
+
+export function updateIsShow(data) {
+  return request({
+    url: '/course/userCourse/publicUpdateIsShow',
+    method: 'post',
+    data: data
+  })
+}
+
+export function putOn(courseIds) {
+  return request({
+    url: '/course/userCourse/publicPutOn/' + courseIds,
+    method: 'post'
+  })
+}
+export function pullOff(courseIds) {
+  return request({
+    url: '/course/userCourse/publicPutOff/' + courseIds,
+    method: 'post'
+  })
+}

+ 53 - 0
src/api/course/userCourseStudy.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询课程用户关联列表
+export function listUserCourseStudy(query) {
+  return request({
+    url: '/course/userCourseStudy/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询课程用户关联详细
+export function getUserCourseStudy(studyId) {
+  return request({
+    url: '/course/userCourseStudy/' + studyId,
+    method: 'get'
+  })
+}
+
+// 新增课程用户关联
+export function addUserCourseStudy(data) {
+  return request({
+    url: '/course/userCourseStudy',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改课程用户关联
+export function updateUserCourseStudy(data) {
+  return request({
+    url: '/course/userCourseStudy',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除课程用户关联
+export function delUserCourseStudy(studyId) {
+  return request({
+    url: '/course/userCourseStudy/' + studyId,
+    method: 'delete'
+  })
+}
+
+// 导出课程用户关联
+export function exportUserCourseStudy(query) {
+  return request({
+    url: '/course/userCourseStudy/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/course/userCourseStudyLog.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询课程用户学习日志列表
+export function listUserCourseStudyLog(query) {
+  return request({
+    url: '/course/userCourseStudyLog/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询课程用户学习日志详细
+export function getUserCourseStudyLog(logId) {
+  return request({
+    url: '/course/userCourseStudyLog/' + logId,
+    method: 'get'
+  })
+}
+
+// 新增课程用户学习日志
+export function addUserCourseStudyLog(data) {
+  return request({
+    url: '/course/userCourseStudyLog',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改课程用户学习日志
+export function updateUserCourseStudyLog(data) {
+  return request({
+    url: '/course/userCourseStudyLog',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除课程用户学习日志
+export function delUserCourseStudyLog(logId) {
+  return request({
+    url: '/course/userCourseStudyLog/' + logId,
+    method: 'delete'
+  })
+}
+
+// 导出课程用户学习日志
+export function exportUserCourseStudyLog(query) {
+  return request({
+    url: '/course/userCourseStudyLog/export',
+    method: 'get',
+    params: query
+  })
+}

+ 77 - 0
src/api/course/userTalent.js

@@ -0,0 +1,77 @@
+import request from '@/utils/request'
+
+// 查询达人列表
+export function listUserTalent(query) {
+  return request({
+    url: '/course/userTalent/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询达人详细
+export function getUserTalent(talentId) {
+  return request({
+    url: '/course/userTalent/' + talentId,
+    method: 'get'
+  })
+}
+
+// 新增达人
+export function addUserTalent(data) {
+  return request({
+    url: '/course/userTalent',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改达人
+export function updateUserTalent(data) {
+  return request({
+    url: '/course/userTalent',
+    method: 'put',
+    data: data
+  })
+}
+
+export function auditUserTalent(data) {
+  return request({
+    url: '/course/userTalent/audit',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除达人
+export function delUserTalent(talentId) {
+  return request({
+    url: '/course/userTalent/' + talentId,
+    method: 'delete'
+  })
+}
+
+// 导出达人
+export function exportUserTalent(query) {
+  return request({
+    url: '/course/userTalent/export',
+    method: 'get',
+    params: query
+  })
+}
+
+export function listBySearch(query) {
+  return request({
+    url: '/course/userTalent/listBySearch',
+    method: 'get',
+    params: query
+  })
+}
+
+//查询所属销售公司
+export function getCompanies(keyword) {
+  return request({
+    url: '/course/userTalent/listCompanyByKeyword/'+keyword,
+    method: 'get'
+  })
+}

+ 53 - 0
src/api/course/userTalentFollow.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询达人关注列表
+export function listUserTalentFollow(query) {
+  return request({
+    url: '/course/userTalentFollow/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询达人关注详细
+export function getUserTalentFollow(id) {
+  return request({
+    url: '/course/userTalentFollow/' + id,
+    method: 'get'
+  })
+}
+
+// 新增达人关注
+export function addUserTalentFollow(data) {
+  return request({
+    url: '/course/userTalentFollow',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改达人关注
+export function updateUserTalentFollow(data) {
+  return request({
+    url: '/course/userTalentFollow',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除达人关注
+export function delUserTalentFollow(id) {
+  return request({
+    url: '/course/userTalentFollow/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出达人关注
+export function exportUserTalentFollow(query) {
+  return request({
+    url: '/course/userTalentFollow/export',
+    method: 'get',
+    params: query
+  })
+}

+ 140 - 0
src/api/course/userVideo.js

@@ -0,0 +1,140 @@
+import request from '@/utils/request'
+
+// 查询课堂视频列表
+export function listUserVideo(query) {
+  return request({
+    url: '/course/userVideo/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询课堂视频详细
+export function getUserVideo(videoId) {
+  return request({
+    url: '/course/userVideo/' + videoId,
+    method: 'get'
+  })
+}
+
+export function getUserVideoItem(videoId) {
+  return request({
+    url: '/course/userVideo/getVideoDetails',
+    method: 'get',
+    params:{
+      videoId:videoId
+    }
+  })
+}
+
+// 新增课堂视频
+export function addUserVideo(data) {
+  return request({
+    url: '/course/userVideo/addVideo',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改课堂视频
+export function updateUserVideo(data) {
+  return request({
+    url: '/course/userVideo',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除课堂视频
+export function delUserVideo(videoId) {
+  return request({
+    url: '/course/userVideo/' + videoId,
+    method: 'delete'
+  })
+}
+
+// 导出课堂视频
+export function exportUserVideo(query) {
+  return request({
+    url: '/course/userVideo/export',
+    method: 'get',
+    params: query
+  })
+}
+
+
+export function getVideoListByCourseId(query) {
+  return request({
+    url: '/course/userVideo/getVideoListByCourseId',
+    method: 'get',
+    params: query
+  })
+}
+
+export function auditUserVideo(data) {
+  return request({
+    url: '/course/userVideo/auditVideo',
+    method: 'post',
+    data: data
+  })
+}
+
+export function putOn(videoIds) {
+  return request({
+    url: '/course/userVideo/putOn/' + videoIds,
+    method: 'post'
+  })
+}
+export function pullOff(videoIds) {
+  return request({
+    url: '/course/userVideo/pullOff/' + videoIds,
+    method: 'post'
+  })
+}
+
+export function getThumbnail(file) {
+  const formData = new FormData();
+  formData.append('file', file);
+  return request({
+    url: '/course/userVideo/getThumbnail',
+    method: 'post',
+    data: formData,
+    headers: {
+      'Content-Type': 'multipart/form-data'
+    }
+  });
+}
+
+
+//火山云视频上传
+export function uploadUserVideo(file,uploadId) {
+  const formData = new FormData();
+  formData.append('file', file);
+  formData.append('uploadId', uploadId)
+  return request({
+    url: '/course/userVideo/uploadUserVideo',
+    method: 'post',
+    data: formData,
+    headers: {
+      'Content-Type': 'multipart/form-data'
+    }
+  });
+}
+
+// 查询火山云视频上传进度
+export function getUploadProgress(uploadId) {
+  return request({
+    url: '/course/userVideo/uploadProgress',
+    method: 'get',
+    params: { uploadId }
+  });
+}
+
+export function HsyAssumeRoleService() {
+  return request({
+    url: '/course/userVideo/HsyAssumeRoleService',
+    method: 'get',
+  });
+}
+
+

+ 53 - 0
src/api/course/userVideoComment.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询课堂视频评论列表
+export function listUserVideoComment(query) {
+  return request({
+    url: '/course/userVideoComment/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询课堂视频评论详细
+export function getUserVideoComment(commentId) {
+  return request({
+    url: '/course/userVideoComment/' + commentId,
+    method: 'get'
+  })
+}
+
+// 新增课堂视频评论
+export function addUserVideoComment(data) {
+  return request({
+    url: '/course/userVideoComment',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改课堂视频评论
+export function updateUserVideoComment(data) {
+  return request({
+    url: '/course/userVideoComment',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除课堂视频评论
+export function delUserVideoComment(commentId) {
+  return request({
+    url: '/course/userVideoComment/' + commentId,
+    method: 'delete'
+  })
+}
+
+// 导出课堂视频评论
+export function exportUserVideoComment(query) {
+  return request({
+    url: '/course/userVideoComment/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