page-crm-decision.html 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. <div class="container">
  2. <!-- 顶部导航 -->
  3. <header class="app-header">
  4. <div class="header-title">
  5. <i class="fas fa-robot"></i>
  6. <h1>九州宴会 - 销售话术决策助手</h1>
  7. </div>
  8. </header>
  9. <!-- 场景选择 -->
  10. <section class="scene-selector">
  11. <h2 class="input-title">
  12. <i class="fas fa-dharmachakra"></i>
  13. 选择分析场景
  14. </h2>
  15. <div class="scene-options">
  16. <div class="scene-option" [class.active]="selectedScene === 'first-contact'"
  17. (click)="selectScene('first-contact')">
  18. <i class="fas fa-handshake"></i>
  19. <h3>首次接触</h3>
  20. <p>分析初次沟通策略</p>
  21. </div>
  22. <div class="scene-option" [class.active]="selectedScene === 'deep-talk'"
  23. (click)="selectScene('deep-talk')">
  24. <i class="fas fa-comments"></i>
  25. <h3>深度交流</h3>
  26. <p>优化后续跟进策略</p>
  27. </div>
  28. </div>
  29. </section>
  30. <!-- 文件上传区域 -->
  31. <section class="upload-area">
  32. <div class="upload-container">
  33. <label for="file-upload" class="upload-label">
  34. <i class="fas fa-cloud-upload-alt"></i>
  35. <span>上传聊天记录文件</span>
  36. </label>
  37. <input type="file" id="file-upload" #fileInput (change)="onFileSelected($event)" accept=".json" class="hidden">
  38. <p class="upload-hint">支持JSON格式的聊天记录文件</p>
  39. </div>
  40. </section>
  41. <!-- 客户对话分析 -->
  42. <section class="input-area">
  43. <h2 class="chat-title">
  44. <i class="fas fa-comments"></i>
  45. 客户对话分析
  46. <span class="current-role-indicator" [ngClass]="{'customer-indicator': currentRole === 'customer', 'assistant-indicator': currentRole === 'assistant'}">
  47. 当前角色: {{currentRole === 'customer' ? '客户' : '销售顾问'}}
  48. </span>
  49. </h2>
  50. <div class="chat-area" #chatContainer>
  51. <div *ngIf="!messages.length" class="empty-chat">
  52. <i class="fas fa-comments"></i>
  53. <p>请上传聊天记录或开始新的对话</p>
  54. </div>
  55. <div *ngFor="let msg of messages" class="chat-message"
  56. [class.customer-message]="msg.role === 'customer'"
  57. [class.assistant-message]="msg.role === 'assistant'">
  58. <div class="message-header" [class.customer-header]="msg.role === 'customer'"
  59. [class.assistant-header]="msg.role === 'assistant'">
  60. <div class="icon">
  61. <i *ngIf="msg.role === 'customer'" class="fas fa-user"></i>
  62. <i *ngIf="msg.role === 'assistant'" class="fas fa-headset"></i>
  63. </div>
  64. <div>{{msg.role === 'customer' ? '客户' : '销售顾问'}}</div>
  65. </div>
  66. <div class="message-content">{{msg.content}}</div>
  67. <div class="message-time">{{msg.time}}</div>
  68. </div>
  69. </div>
  70. <!-- 客户标签编辑区 -->
  71. <div class="tags-area">
  72. <div class="tags-header">
  73. <div class="tags-title">客户标签</div>
  74. <div class="add-tag" (click)="addTag()">
  75. <i class="fas fa-plus"></i>
  76. <span>添加标签</span>
  77. </div>
  78. </div>
  79. <div class="input-tags">
  80. <div *ngFor="let tag of tags" class="tag" [style.background]="tag.background"
  81. [style.color]="tag.color">
  82. <i [class]="tag.icon"></i>
  83. <span>{{tag.text}}</span>
  84. <span class="delete" (click)="removeTag($event, tag)">
  85. <i class="fas fa-times"></i>
  86. </span>
  87. </div>
  88. </div>
  89. </div>
  90. </section>
  91. <!-- 输入工作区 -->
  92. <section class="input-area">
  93. <h2 class="input-title">
  94. <i class="fas fa-comment-dots"></i>
  95. 添加对话内容
  96. </h2>
  97. <div class="role-selector">
  98. <div class="role-btn" [class.active]="currentRole === 'customer'"
  99. (click)="setRole('customer')">客户消息</div>
  100. <div class="role-btn" [class.active]="currentRole === 'assistant'"
  101. (click)="setRole('assistant')">销售回复</div>
  102. </div>
  103. <div class="input-field">
  104. <textarea class="text-input" placeholder="输入对话内容..." [(ngModel)]="newMessage"
  105. (keydown)="onTextareaKeydown($event)" [disabled]="isProcessing"></textarea>
  106. <div *ngIf="isProcessing" class="processing-indicator">
  107. <i class="fas fa-circle-notch fa-spin"></i>
  108. <span>AI分析中...</span>
  109. </div>
  110. </div>
  111. <div class="action-buttons">
  112. <div class="action-btn save-btn" (click)="sendMessage()" [class.disabled]="isProcessing" [style.pointer-events]="isProcessing ? 'none' : 'auto'">
  113. <i class="fa fa-paper-plane"></i>
  114. <span>发送消息</span>
  115. </div>
  116. <div class="action-btn history-btn" (click)="viewHistory()">
  117. <i class="fa fa-history"></i>
  118. <span>历史记录</span>
  119. </div>
  120. <div class="action-btn" (click)="generateAIResponse()" [class.disabled]="isProcessing" [style.pointer-events]="isProcessing ? 'none' : 'auto'">
  121. <i class="fa fa-robot"></i>
  122. <span>AI回答</span>
  123. </div>
  124. </div>
  125. </section>
  126. <!-- 策略卡片组 -->
  127. <section class="strategy-area">
  128. <h2 class="strategy-title">
  129. <i class="fas fa-cards"></i>
  130. {{sceneTitle}} - 推荐应对策略
  131. </h2>
  132. <div class="cards-container">
  133. {{aicontent}}
  134. <div *ngFor="let strategy of strategies; let i = index"
  135. class="strategy-card"
  136. [class.card-aggressive]="strategy.type === 'aggressive'"
  137. [class.card-neutral]="strategy.type === 'neutral'"
  138. [class.card-conservative]="strategy.type === 'conservative'"
  139. [style.transform]="getCardTransform(i)"
  140. [style.zIndex]="getCardZIndex(i)"
  141. (click)="activateCard(i)">
  142. <div class="card-header">
  143. <div class="card-title">{{strategy.title}}</div>
  144. <div class="card-icon" [style.background]="strategy.iconBg"
  145. [style.color]="strategy.iconColor">
  146. <i [class]="strategy.icon"></i>
  147. </div>
  148. </div>
  149. <div class="card-content">
  150. <p>{{strategy.description}}</p>
  151. <div class="card-highlight">
  152. {{strategy.highlight}}
  153. </div>
  154. <p><strong>适用场景:</strong>{{strategy.applicable}}</p>
  155. <p><strong>优势:</strong>{{strategy.advantage}}</p>
  156. </div>
  157. <div class="card-footer">
  158. <div class="card-hint">成功率: {{strategy.successRate}}</div>
  159. <div class="card-hint"><i class="fas fa-clock"></i> 推荐指数: {{strategy.rating}}</div>
  160. </div>
  161. </div>
  162. </div>
  163. <!-- 卡片导航点 -->
  164. <div class="card-navigation">
  165. <div *ngFor="let strategy of strategies; let i = index"
  166. class="card-nav-btn"
  167. [class.active]="activeCardIndex === i"
  168. (click)="activateCard(i)"></div>
  169. </div>
  170. </section>
  171. <!-- 操作按钮 -->
  172. <div class="action-buttons fixed-buttons">
  173. <div class="action-btn save-btn" (click)="saveRecord()">
  174. <i class="fas fa-save"></i>
  175. <span>保存记录</span>
  176. </div>
  177. <div class="action-btn history-btn" (click)="viewHistory()">
  178. <i class="fas fa-history"></i>
  179. <span>查看历史</span>
  180. </div>
  181. </div>
  182. <!-- 历史记录模态框 -->
  183. <div *ngIf="showHistoryModal" class="history-modal">
  184. <div class="modal-content">
  185. <div class="modal-header">
  186. <h3>历史记录</h3>
  187. <button class="close-btn" (click)="showHistoryModal = false">
  188. <i class="fas fa-times"></i>
  189. </button>
  190. </div>
  191. <div class="modal-body">
  192. <div *ngIf="!chatRecords.length" class="empty-history">
  193. <i class="fas fa-folder-open"></i>
  194. <p>暂无保存的记录</p>
  195. </div>
  196. <div *ngFor="let record of chatRecords" class="history-item" (click)="selectRecord(record)">
  197. <div class="history-header">
  198. <div class="history-title">
  199. <span>{{record.scene === 'first-contact' ? '首次接触' : '深度交流'}}</span>
  200. <span class="history-timestamp">{{formatDate(record.timestamp)}}</span>
  201. </div>
  202. <button class="delete-btn" (click)="deleteRecord(record); $event.stopPropagation()">
  203. <i class="fas fa-trash"></i>
  204. </button>
  205. </div>
  206. <div class="history-preview">
  207. <p class="history-summary">
  208. {{record.messages.length}}条消息 | 策略: {{record.strategies[activeCardIndex].title}}
  209. </p>
  210. </div>
  211. </div>
  212. </div>
  213. </div>
  214. </div>
  215. </div>