Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 

2513 rindas
68 KiB

  1. <template>
  2. <div class="box-center" style="cursor: pointer">
  3. <div class="biaotibox">
  4. <div>客户接待详情</div>
  5. <div><i @click="gojianyi()" class="el-icon-close"></i></div>
  6. </div>
  7. <div class="topbox">
  8. <div class="topzuo">
  9. <div class="title" style="display: flex">
  10. <div style="flex-grow: 1">
  11. <span class="span1"
  12. >{{
  13. userinformationlist.visitRecord == 1
  14. ? "首"
  15. : userinformationlist.visitRecord || ""
  16. }}次到访</span
  17. >
  18. <span class="span2">
  19. {{ yibiaoji || "" }}&nbsp;&nbsp;{{
  20. userinformationlist.validInvalidName || ""
  21. }}
  22. </span>
  23. </div>
  24. <div style="flex-shrink: 0; display: flex; color: #2671e2">
  25. <div v-if="rec_index_addJ" @click="Addtodigest()">加精</div>
  26. <div
  27. v-if="rec_index_receflag"
  28. style="margin-left: 20px"
  29. @click="alllogo()"
  30. >
  31. {{ userinformationlist.validInvalidName }}
  32. </div>
  33. <!-- 导出 -->
  34. <div v-if="permissions.cus_index_downLoad_word" class="outDownLoad" @click="exportWord">导出话术</div>
  35. </div>
  36. </div>
  37. <div class="title" style="margin-top: 6px">
  38. <span class="span3">{{ userinformationlist.name || "" }}</span>
  39. <span class="span2">{{ userinformationlist.createTime || "" }}</span>
  40. </div>
  41. <div style="display: flex; width: 100%">
  42. <div class="aplayer" id="aplayer"></div>
  43. <div style="margin-left: -5px; margin-top: 21px" @click="download()">
  44. <img
  45. style="width: 12px; height: 12px"
  46. src="/img/xiaza1.png"
  47. alt=""
  48. />
  49. </div>
  50. </div>
  51. <div class="aplayerSpeed">
  52. <div
  53. style="display: flex; justify-content: space-around; width: 130px"
  54. >
  55. <div @click="aplayerChange('del')" style="cursor: pointer">
  56. 上一首
  57. </div>
  58. <div style="cursor: pointer">
  59. {{ aplayerId / 1 + 1 + "/" + aplayerLength }}
  60. </div>
  61. <div @click="aplayerChange('add')" style="cursor: pointer">
  62. 下一首
  63. </div>
  64. </div>
  65. <div
  66. @click="aplayerSpeed(0.5)"
  67. :class="aplayerSpeedNum == 0.5 ? 'aplayerSpeedFont' : ''"
  68. style="cursor: pointer"
  69. >
  70. 0.5x
  71. </div>
  72. <div
  73. @click="aplayerSpeed(1)"
  74. :class="aplayerSpeedNum == 1 ? 'aplayerSpeedFont' : ''"
  75. style="cursor: pointer"
  76. >
  77. 1.0x
  78. </div>
  79. <div
  80. @click="aplayerSpeed(1.5)"
  81. :class="aplayerSpeedNum == 1.5 ? 'aplayerSpeedFont' : ''"
  82. style="cursor: pointer"
  83. >
  84. 1.5x
  85. </div>
  86. <div
  87. @click="aplayerSpeed(2)"
  88. :class="aplayerSpeedNum == 2 ? 'aplayerSpeedFont' : ''"
  89. style="cursor: pointer"
  90. >
  91. 2.0x
  92. </div>
  93. </div>
  94. </div>
  95. <div class="topyou">
  96. <div style="font-size: 16px">
  97. 客户:<span style="color: #2671e2">{{
  98. userinformationlist.name || ""
  99. }}</span>
  100. </div>
  101. <div style="display: flex; font-size: 15px; margin-top: 8px">
  102. <div style="width: 50%">
  103. <div>负责顾问:{{ userinformationlist.agentName || "" }}</div>
  104. <div style="margin-top: 8px">
  105. 客户等级:
  106. <span v-if="userinformationlist.level"></span>
  107. <span v-if="userinformationlist.level == 1">A</span>
  108. <span v-if="userinformationlist.level == 2">B</span>
  109. <span v-if="userinformationlist.level == 3">C</span>
  110. <span v-if="userinformationlist.level == 4">D</span>
  111. </div>
  112. </div>
  113. <div style="width: 50%">
  114. <div>到访次数:{{ userinformationlist.visitRecord || "" }}次</div>
  115. <div style="margin-top: 8px">客户阶段:</div>
  116. </div>
  117. </div>
  118. <div style="font-size: 15px; margin-top: 8px">
  119. 最近到访时间:{{ userinformationlist.createTime || "" }}
  120. </div>
  121. </div>
  122. </div>
  123. <div class="topbox1">
  124. <div class="topzuo">
  125. <div class="topzuo-zuo">
  126. <div class="zuo-titbox">
  127. <div class="searchbox">
  128. <div style="flex: 1">
  129. <div
  130. style="width: 96%; display: flex; margin: 0 auto"
  131. @click="searchtab()"
  132. >
  133. <div class="input">请输入关键词</div>
  134. <div class="input2">搜索</div>
  135. </div>
  136. </div>
  137. <div
  138. v-if="rec_index_textyh"
  139. style="
  140. width: 100px;
  141. display: flex;
  142. justify-content: center;
  143. align-items: center;
  144. "
  145. >
  146. <div class="searchbutt" @click="texttap()">文本优化</div>
  147. </div>
  148. </div>
  149. <div class="headboxbott">
  150. <div class="headovfu">
  151. <div style="width: 100%; display: flex" class="inner-container">
  152. <div
  153. @click="tapspagek(index)"
  154. :class="{ roleindexclass: roleindex == index }"
  155. class="biaoji1"
  156. v-for="(item, index) in tablist"
  157. :key="index"
  158. >
  159. {{ item.name }}
  160. </div>
  161. </div>
  162. </div>
  163. <div v-if="rec_index_flag" class="headpade">
  164. <div
  165. class="biaoji"
  166. @click="biaoji()"
  167. v-if="userinformationlist.merge == 0"
  168. >
  169. 标记
  170. </div>
  171. </div>
  172. </div>
  173. <div style="width: 100%">
  174. <div class="center2" id="center2">
  175. <!-- roleindex -->
  176. <div
  177. class="text"
  178. :data-bg="item.bg"
  179. :data-ed="item.ed"
  180. v-for="(item, index) in transcriptionlist"
  181. :class="{
  182. right: item.isShow == 1,
  183. actRight: item.isShow == 1,
  184. }"
  185. :key="index"
  186. :data-speaker="item.speaker"
  187. v-if="roleindex == 0 || item.speaker == roleindex"
  188. >
  189. <div class="avatar">
  190. <div>
  191. <div v-if="item.isShow == 1" class="gu">顾</div>
  192. <div v-else class="ke">客</div>
  193. </div>
  194. </div>
  195. <div
  196. class="content123"
  197. @click="checkMsg(item, index)"
  198. style="cursor: pointer"
  199. >
  200. <div class="content123ss">
  201. {{ item.speaker | toCapital }}
  202. {{ item.bg | timestamp }}
  203. </div>
  204. <div class="textcontent">
  205. <div
  206. class="content123s"
  207. :class="{ adjskdjroleindexclass: item.isShow == 1 }"
  208. v-html="item.onebest"
  209. ></div>
  210. <img
  211. @click.stop="play(item)"
  212. src="../../../public/img/play.png"
  213. alt=""
  214. style="flex-shrink: 0; width: 24px; height: 24px"
  215. />
  216. </div>
  217. </div>
  218. </div>
  219. </div>
  220. </div>
  221. </div>
  222. </div>
  223. <div class="topzuo-you" style="overflow-y: auto">
  224. <div
  225. style="
  226. width: 100%;
  227. height: 44px;
  228. border-bottom: 1rpx solid #e0e0e0;
  229. display: flex;
  230. align-items: center;
  231. border-bottom: 1px solid #e0e0e0;
  232. "
  233. >
  234. <div
  235. style="flex: 1; font-size: 16px; color: #333333; text-indent: 5%"
  236. >
  237. 客户意向
  238. </div>
  239. <div
  240. v-if="rec_index_makesure"
  241. style="flex: 1; font-size: 16px; color: #2671e2; text-indent: 70%"
  242. @click="Acqtap()"
  243. >
  244. 校准
  245. </div>
  246. </div>
  247. <div class="pingfenbox">
  248. <div
  249. :class="{ activecllasscet: kehuyixiangcenterindex == 0 }"
  250. @click="customerofintention(0)"
  251. >
  252. 系统分析
  253. </div>
  254. <div
  255. :class="{ activecllasscet: kehuyixiangcenterindex == 1 }"
  256. @click="customerofintention(1)"
  257. >
  258. 人工校准
  259. </div>
  260. </div>
  261. <div
  262. v-if="Getintentionlist && Getintentionlist.length == 0"
  263. style="width: 100%; text-align: center; line-height: 100px"
  264. >
  265. 暂无数据
  266. </div>
  267. <div v-else>
  268. <div
  269. class="intentionBox"
  270. v-for="(item, index) in Getintentionlist"
  271. :key="index"
  272. >
  273. <div class="intentionName">{{ item.name }}</div>
  274. <div class="intentionChe" v-if="kehuyixiangcenterindex == 0">
  275. <div
  276. v-for="(funche, i) in item.newchildren"
  277. :key="i"
  278. v-if="funche.showType == 0"
  279. >
  280. {{ funche.name }}
  281. </div>
  282. <div
  283. class="intentionview"
  284. v-for="(funche, i) in item.newchildren"
  285. :key="i"
  286. v-if="funche.showType == 1"
  287. >
  288. {{ funche.name }}
  289. </div>
  290. </div>
  291. <div class="intentionChe" v-if="kehuyixiangcenterindex == 1">
  292. <div
  293. v-for="(funche, i) in item.newchildren"
  294. :key="i"
  295. v-if="funche.showType == 0"
  296. >
  297. {{ funche.name }}
  298. </div>
  299. <div v-for="(funche, i) in item.newchildren" :key="i">
  300. {{ funche.name }}
  301. </div>
  302. </div>
  303. </div>
  304. </div>
  305. </div>
  306. </div>
  307. <div class="topyou">
  308. <div class="pingfenbox">
  309. <div
  310. :class="{ activecllasscet: zhixingcenterindex == 0 }"
  311. @click="recordclick(0)"
  312. >
  313. 销讲总执行率{{ userinformationlist.fraction || 0 }}%
  314. </div>
  315. <div
  316. v-if="rec_index_todo"
  317. :class="{ activecllasscet: zhixingcenterindex == 1 }"
  318. @click="recordclick(1)"
  319. >
  320. 禁忌执行
  321. </div>
  322. </div>
  323. <div v-if="zhixingcenterindex == 0">
  324. <div
  325. style="
  326. width: 100%;
  327. height: 44px;
  328. border-bottom: 1rpx solid #e0e0e0;
  329. display: flex;
  330. align-items: center;
  331. "
  332. >
  333. <div
  334. style="
  335. width: 60%;
  336. font-size: 16px;
  337. color: #333333;
  338. text-indent: 20px;
  339. "
  340. >
  341. 指标
  342. </div>
  343. <div style="width: 40%; flex: 1; font-size: 16px; color: #333333">
  344. <div style="width: 60px; text-align: center">执行</div>
  345. </div>
  346. </div>
  347. </div>
  348. <!-- v-bind:style="{ height: zxldivhe + 'px' }" -->
  349. <div id="zxldiv" v-if="zhixingcenterindex == 0">
  350. <div class="zxlBox" v-for="(item, index) in ratelist" :key="index">
  351. <div class="zxlLev1" @click="changeshow(index)">
  352. <div style="width: 60%" class="zxlLev1box">
  353. {{ item.name }}
  354. {{
  355. ((item.ratepercent / item.rate).toFixed(2) * 100).toFixed()
  356. }}%
  357. </div>
  358. <div style="width: 40%">
  359. <div style="width: 60px; text-align: center">
  360. <i
  361. v-if="item.show == true"
  362. style="font-size: 18px"
  363. class="el-icon-arrow-up"
  364. ></i>
  365. <i
  366. v-if="item.show == false"
  367. style="font-size: 18px"
  368. class="el-icon-arrow-right"
  369. ></i>
  370. </div>
  371. </div>
  372. </div>
  373. <div
  374. class="zxlLev2"
  375. v-if="item.show"
  376. v-for="(subitem, i) in item.children"
  377. :key="i"
  378. >
  379. <div style="width: 60%" class="zxlLev2tit">
  380. {{ subitem.name }}
  381. </div>
  382. <div style="width: 40%; display: flex; align-items: center">
  383. <div class="zxlzx" v-if="!subitem.selected">执行</div>
  384. <div v-else class="zxlzx2">未执行</div>
  385. </div>
  386. </div>
  387. </div>
  388. </div>
  389. <div
  390. id="zxldiv"
  391. v-if="zhixingcenterindex == 1"
  392. style="padding: 0px 10px 10px 10px"
  393. >
  394. <div
  395. style="margin-top: 10px"
  396. v-for="(item, index) in prohibitedlist"
  397. :key="index"
  398. >
  399. {{ index + 1 }}、{{ item }}
  400. </div>
  401. </div>
  402. </div>
  403. </div>
  404. <el-dialog
  405. title="加入常错词"
  406. :visible.sync="dialogFormVisible"
  407. width="500px"
  408. center
  409. :close-on-click-modal="false"
  410. @close="$refs.form.resetFields()"
  411. >
  412. <el-form :model="form" ref="form" label-width="80px" :rules="rules">
  413. <el-form-item label="常错词" prop="wrongWord">
  414. <el-input v-model="form.wrongWord" :disabled="isNum" maxlength="8" autocomplete="off"></el-input>
  415. </el-form-item>
  416. <el-form-item label="正确词" prop="correctWord">
  417. <el-input
  418. v-model="form.correctWord"
  419. maxlength="8"
  420. autocomplete="off"
  421. ></el-input>
  422. </el-form-item>
  423. </el-form>
  424. <div slot="footer" class="dialog-footer">
  425. <el-button @click="dialogFormVisible = false">取 消</el-button>
  426. <el-button type="primary" @click="subMsg">确 定</el-button>
  427. </div>
  428. </el-dialog>
  429. <el-dialog
  430. title="标记顾问"
  431. :visible.sync="dialogFormVisible11"
  432. center
  433. width="500px"
  434. :close-on-click-modal="false"
  435. >
  436. <div
  437. style="
  438. width: 95%;
  439. display: flex;
  440. flex-wrap: wrap;
  441. margin: 0 auto;
  442. padding-top: 30px;
  443. padding-bottom: 30px;
  444. "
  445. >
  446. <div
  447. class="viewclace"
  448. :class="roleindexbiaoji == index ? 'bosdttom' : ''"
  449. @click="biaojixuanze(index)"
  450. v-for="(item, index) in tablist.slice(1, tablist.length)"
  451. :key="index"
  452. >
  453. <div>{{ item.name }}</div>
  454. </div>
  455. </div>
  456. <div slot="footer" class="dialog-footer">
  457. <el-button @click="unmarktap()">取 消</el-button>
  458. <el-button type="primary" @click="subMsg11">确 定</el-button>
  459. </div>
  460. </el-dialog>
  461. <el-dialog
  462. title="校准"
  463. :visible.sync="dialogFormVisible12"
  464. center
  465. width="500px"
  466. :close-on-click-modal="false"
  467. >
  468. <div style="height: 400px; width: 100%; overflow: auto">
  469. <div
  470. class="intentionBox"
  471. v-for="(item, index) in Acquirecustomerintentlist2"
  472. :key="index"
  473. >
  474. <div class="intentionName">{{ item.name }}</div>
  475. <div class="intentionChe2">
  476. <div
  477. v-for="(item1, i) in item.children"
  478. :key="i"
  479. @click="Edittag(item, item1, index, i)"
  480. :style="{
  481. border:
  482. item1.selected == 0
  483. ? '1px solid #0A6EE9'
  484. : '1px solid #E0E0E0',
  485. }"
  486. >
  487. {{ item1.label }}
  488. </div>
  489. </div>
  490. </div>
  491. </div>
  492. <div slot="footer" class="dialog-footer">
  493. <el-button @click="dialogFormVisible12 = false">取 消</el-button>
  494. <el-button type="primary" @click="intentlist2click()">确 定</el-button>
  495. </div>
  496. </el-dialog>
  497. <el-dialog
  498. title="接待标记"
  499. :visible.sync="dialogFormVisible13"
  500. center
  501. width="500px"
  502. :close-on-click-modal="false"
  503. >
  504. <div style="width: 80%; margin: 0 auto; font-size: 30px">
  505. <div>
  506. <el-radio v-model="effectiveindex" label="1">没电指派无录音</el-radio>
  507. <el-radio v-model="effectiveindex" label="2">离线指派无录音</el-radio>
  508. </div>
  509. <div>
  510. <el-radio v-model="effectiveindex" label="3">系统测试误操作</el-radio>
  511. <el-radio v-model="effectiveindex" label="4">非接访场景录音</el-radio>
  512. </div>
  513. <div>
  514. <el-radio v-model="effectiveindex" label="5">其他</el-radio>
  515. </div>
  516. <div v-if="effectiveindex == 5">
  517. <textarea
  518. v-model="effectiveitext"
  519. style="
  520. width: 100%;
  521. margin-top: 6px;
  522. border: 1px solid #e0e0e0;
  523. height: 100px;
  524. padding: 10px;
  525. font-size: 16px;
  526. "
  527. name=""
  528. placeholder="备注"
  529. cols="30"
  530. rows="10"
  531. ></textarea>
  532. </div>
  533. </div>
  534. <div slot="footer" class="dialog-footer">
  535. <el-button @click="dialogFormVisible13 = false">取 消</el-button>
  536. <el-button type="primary" @click="effectiveAdd()">确 定</el-button>
  537. </div>
  538. </el-dialog>
  539. <div
  540. v-if="dialogFormtext"
  541. @click="dialogFormtext = false"
  542. id="zhezhao"
  543. ></div>
  544. <div v-if="dialogFormtext" class="auDivhhh">
  545. <div
  546. style="
  547. width: 100%;
  548. height: 50px;
  549. line-height: 50px;
  550. text-align: center;
  551. font-size: 20px;
  552. font-weight: 400;
  553. "
  554. >
  555. 文本优化
  556. </div>
  557. <div style="width: 100%; display: flex; height: 32px;justify-content: space-between;padding: 0 15px; margin-bottom: 20px;">
  558. <div style="width: 100%; height: 100%;display: flex;justify-content: center;">
  559. <el-input placeholder="请输入关键词搜索" v-model="searchText" style="width:300px">
  560. <el-button slot="append" icon="el-icon-search"></el-button>
  561. </el-input>
  562. </div>
  563. </div>
  564. <div
  565. class="center3"
  566. style="
  567. width: 95%;
  568. margin: 0 auto;
  569. border: 1px solid #e3e3e3;
  570. height: 430px;
  571. overflow-y: scroll;
  572. "
  573. >
  574. <div
  575. class="text"
  576. :data-bg="item.bg"
  577. :data-ed="item.ed"
  578. v-for="(item, index) in optimizetext1"
  579. :key="index"
  580. :class="{ actRight: item.speaker % 2 == 0 }"
  581. :data-speaker="item.speaker"
  582. >
  583. <div class="buttonzu">
  584. <span style="cursor: pointer" @click="texteditor(item, index)"
  585. >纠正</span
  586. >
  587. &nbsp; &nbsp;
  588. <span style="cursor: pointer" @click="optimdel(item,index)">删除</span>
  589. <span
  590. style="cursor: pointer; margin-left: 10px"
  591. @click="editRole(item, index)"
  592. >修改角色</span
  593. >
  594. </div>
  595. <div class="avatar">
  596. <div>
  597. <img
  598. style="margin: 0 auto"
  599. v-if="item.isShow == 1"
  600. src="http://121.42.63.138:9091/autoSR/static/plugins/audio/images/A.png"
  601. alt=""
  602. />
  603. <div v-else>{{ item.speaker | toCapital }}</div>
  604. </div>
  605. </div>
  606. <div class="content123" style="cursor: pointer">
  607. <div
  608. class="content123s"
  609. :class="{ adjskdjroleindexclass: item.isShow == 1 }"
  610. v-html="item.onebest"
  611. ></div>
  612. </div>
  613. </div>
  614. </div>
  615. <div
  616. style="
  617. display: flex;
  618. margin-top: 12px;
  619. height: 35px;
  620. align-items: center;
  621. justify-content: center;
  622. "
  623. >
  624. <el-button size="small" @click="savedraft(1)">保存并更新文本</el-button>
  625. <el-button size="small" type="primary" @click="savedraft(0)"
  626. >保存草稿</el-button
  627. >
  628. <el-button size="small" type="primary" @click="textrestore()"
  629. >恢复当前文本</el-button
  630. >
  631. <el-button size="small" @click="dialogFormtext = false">取消</el-button>
  632. </div>
  633. </div>
  634. <el-dialog
  635. title="纠正文本"
  636. :visible.sync="texteditorishow"
  637. center
  638. width="600px"
  639. :close-on-click-modal="false"
  640. >
  641. <div>
  642. <span>错误内容:</span>
  643. <span v-html="textareacuowu"></span>
  644. </div>
  645. <div style="margin-top: 10px">
  646. <div>纠正内容:</div>
  647. <div style="margin-top: 6px">
  648. <el-input
  649. type="textarea"
  650. :rows="2"
  651. placeholder="请输入内容"
  652. v-model="textarea"
  653. >
  654. </el-input>
  655. </div>
  656. </div>
  657. <div slot="footer" class="dialog-footer">
  658. <el-button @click="texteditorishow = false">取消</el-button>
  659. <el-button type="primary" @click="summunct()">确认</el-button>
  660. </div>
  661. </el-dialog>
  662. <el-dialog
  663. title="搜索"
  664. :visible.sync="searchisshow"
  665. center
  666. width="500px"
  667. :close-on-click-modal="false"
  668. >
  669. <div style="width: 100%; display: flex; height: 32px">
  670. <div style="width: 75%; height: 100%">
  671. <input
  672. @input="tabinput()"
  673. v-model="inputtest"
  674. class="inputclass"
  675. type="text"
  676. placeholder="请输入搜索内容"
  677. />
  678. </div>
  679. <div style="width: 25%; height: 100%">
  680. <div class="inputclass2" style="margin: 0 auto">搜索</div>
  681. </div>
  682. </div>
  683. <div style="height: 400px; width: 100%; overflow: auto; padding: 15px">
  684. <div
  685. class="searchbox54"
  686. v-for="(item, index) in Searchcontent"
  687. @click="tabseek(item)"
  688. :key="index"
  689. style="cursor: pointer"
  690. >
  691. <div>
  692. <div class="avatar">
  693. <div :style="[spackerColor(item.speaker)]">
  694. {{ item.speaker | toCapital }}
  695. </div>
  696. </div>
  697. </div>
  698. <div>
  699. <div style="font-size: 14px">
  700. {{ formatTime(item.transferContent.bg) }}
  701. </div>
  702. <div
  703. style="padding-top: 4px; font-size: 14px"
  704. v-html="item.text"
  705. ></div>
  706. </div>
  707. </div>
  708. </div>
  709. <div slot="footer" class="dialog-footer">
  710. <el-button @click="searchisshow = false">取 消</el-button>
  711. </div>
  712. </el-dialog>
  713. <el-dialog
  714. title="角色纠正"
  715. :visible.sync="roleVisible"
  716. center
  717. width="600px"
  718. :close-on-click-modal="false"
  719. >
  720. <div style="margin-top: 10px; display: flex; align-items: center">
  721. <div style="line-height: 38px">角色纠正:</div>
  722. <el-select
  723. v-model="roleFlag"
  724. class="rolediv"
  725. placeholder="请选择"
  726. style="height: 38px; display: flex; align-items: center"
  727. filterable
  728. >
  729. <el-option
  730. v-for="(item, index) in roleList"
  731. :key="index"
  732. :label="item.name"
  733. :value="index"
  734. >
  735. </el-option>
  736. </el-select>
  737. <el-button type="primary" @click="addRole">新增角色</el-button>
  738. </div>
  739. <div slot="footer" class="dialog-footer">
  740. <el-button @click="roleVisible = false">取消</el-button>
  741. <el-button type="primary" @click="editSure()">确认</el-button>
  742. </div>
  743. </el-dialog>
  744. </div>
  745. </template>
  746. <script>
  747. import "aplayer/dist/APlayer.min.css";
  748. import APlayer from "aplayer";
  749. import { mapGetters } from "vuex";
  750. import { getStore, setStore } from "@/util/store";
  751. import docxtemplater from "docxtemplater";
  752. import PizZip from "pizzip";
  753. import JSZipUtils from "jszip-utils";
  754. import { saveAs } from "file-saver";
  755. export default {
  756. data() {
  757. return {
  758. recordsText:[],
  759. roleVisible: false,
  760. roleFlag: "0",
  761. roleidx: "",
  762. roleList: [],
  763. dialogFormVisible: false,
  764. dialogFormVisible11: false,
  765. dialogFormVisible12: false,
  766. dialogFormVisible13: false,
  767. texteditorishow: false,
  768. searchisshow: false,
  769. effectiveindex: 1,
  770. effectiveitext: "",
  771. form: {
  772. correctWord: "", //正确词
  773. cupid: "",
  774. wrongWord: "", // 错词
  775. customerId: "",
  776. },
  777. rules: {
  778. correctWord: [
  779. { required: true, message: "请输入正确词", trigger: "blur" },
  780. ],
  781. wrongWord: [{ required: true, message: "请输入错词", trigger: "blur" }],
  782. },
  783. aplayer: null,
  784. aplayerSpeedNum: "1", //点击字体更换
  785. arr: [], //录音文件列表
  786. aplayerId: 0,
  787. aplayerLength: 0, //文件个数
  788. tablist: [
  789. { name: "全部" },
  790. { name: "A" },
  791. { name: "b" },
  792. { name: "c" },
  793. { name: "c" },
  794. { name: "c" },
  795. { name: "c" },
  796. ],
  797. roleindex: 0,
  798. itemIndex: 0, // 0 全部
  799. zhixingcenterindex: 0,
  800. corpusId: 0, //录音文件id
  801. fileId: "", //客户id
  802. recordPath: "", //播放src
  803. transcriptionlist: [], //转写内容
  804. playNow: 0,
  805. userinformationlist: {}, //客户信息
  806. kehuyixiangcenterindex: 0,
  807. AudioIdx: 0, //录音文件顺序
  808. isd: "",
  809. dshfkjsdkksodofydwfkhwdfkjh: "",
  810. roleindexbiaoji: 0,
  811. aplayerSpeedNum: "1", //倍速字体更换
  812. Getintentionlist: [], //客户意向
  813. argtextindex: "", //常错词下标
  814. ratelist: [], //评分集合
  815. prohibitedlist: [], //违禁集合
  816. textItself: "", //原词内容
  817. Acquirecustomerintentlist2: [], //校准列表
  818. dialogFormtext: false,
  819. optimizetext: [], //文本优化list
  820. optimizeobj: {}, //文本优化obj
  821. textarea: "",
  822. textareacuowu: "",
  823. textareaindex: 0,
  824. Searchcontent: [],
  825. inputtest: "",
  826. info: {},
  827. yibiaoji: "",
  828. rec_index_flag: false,
  829. rec_index_addJ: false,
  830. rec_index_wrongword: false,
  831. rec_index_makesure: false,
  832. rec_index_todo: false,
  833. rec_index_receflag: false,
  834. rec_index_textyh: false,
  835. mistakenList:[],
  836. outSpeechSkillList: [], // 导出话术列表
  837. isNum:false,
  838. searchText:"",
  839. };
  840. },
  841. created() {
  842. this.rec_index_flag = this.permissions["rec_index_flag"]; //标记顾问
  843. this.rec_index_addJ = this.permissions["rec_index_addJ"]; //加精
  844. this.rec_index_wrongword = this.permissions["rec_index_wrongword"]; //常错词
  845. this.rec_index_makesure = this.permissions["rec_index_makesure"]; //校准
  846. this.rec_index_todo = this.permissions["rec_index_todo"]; //禁忌
  847. this.rec_index_receflag = this.permissions["rec_index_receflag"]; //接待标记
  848. this.rec_index_textyh = this.permissions["rec_index_textyh"]; //文本优化
  849. console.log(this.permissions)
  850. },
  851. mounted() {
  852. this.fileId = this.$route.query.flag;
  853. this.AudioIdx = this.$route.query.AudioIdx;
  854. this.info = getStore({ name: "userInfo" });
  855. this.init();
  856. },
  857. computed: {
  858. ...mapGetters(["permissions"]),
  859. optimizetext1(){
  860. return this.optimizetext.filter(value => {
  861. return value.onebest.match(this.searchText)
  862. })
  863. }
  864. },
  865. destroyed() {
  866. this.aplayer.destroy();
  867. },
  868. filters: {
  869. // ASCII码转换 大写字母A是65 演讲人是从1开始所以num+64
  870. toCapital(num) {
  871. let str = "";
  872. if (num) {
  873. str = String.fromCharCode(num + 64);
  874. }
  875. return str;
  876. },
  877. timestamp(timestamp) {
  878. if (!timestamp) return "00:00";
  879. let seconds = timestamp / 1000;
  880. let h =
  881. Math.floor(seconds / 3600) < 10
  882. ? "0" + Math.floor(seconds / 3600)
  883. : Math.floor(seconds / 3600);
  884. let m =
  885. Math.floor((seconds / 60) % 60) < 10
  886. ? "0" + Math.floor((seconds / 60) % 60)
  887. : Math.floor((seconds / 60) % 60);
  888. let s =
  889. Math.floor(seconds % 60) < 10
  890. ? "0" + Math.floor(seconds % 60)
  891. : Math.floor(seconds % 60);
  892. return `${h}:${m}:${s}`;
  893. },
  894. },
  895. methods: {
  896. // 格式化话术内容
  897. formatAudioList() {
  898. let list = this.arr[0].audioContent
  899. list = JSON.parse(list)
  900. console.log(list)
  901. list.map(item => {
  902. this.outSpeechSkillList.push({
  903. id: this.$options.filters.toCapital(item.speaker),
  904. times: this.$options.filters.timestamp(item.bg),
  905. content: item.onebest.replace(/<.*?>/gi, "")
  906. })
  907. })
  908. console.log(this.outSpeechSkillList)
  909. },
  910. // 导出word
  911. exportWord() {
  912. // 读取并获得模板文件的二进制内容
  913. JSZipUtils.getBinaryContent("/model.docx", (error, content) => {
  914. console.log(error, content);
  915. // model.docx是模板。我们在导出的时候,会根据此模板来导出对应的数据
  916. // 抛出异常
  917. if (error) {
  918. throw error;
  919. }
  920. // 创建一个PizZip实例,内容为模板的内容
  921. let zip = new PizZip(content);
  922. // 创建并加载docxtemplater实例对象
  923. let doc = new docxtemplater().loadZip(zip);
  924. // 设置模板变量的值
  925. doc.setData({
  926. audioList: this.outSpeechSkillList,
  927. });
  928. try {
  929. // 用模板变量的值替换所有模板变量
  930. doc.render();
  931. } catch (error) {
  932. // 抛出异常
  933. let e = {
  934. message: error.message,
  935. name: error.name,
  936. stack: error.stack,
  937. properties: error.properties,
  938. };
  939. console.log(JSON.stringify({ error: e }));
  940. throw error;
  941. }
  942. // 生成一个代表docxtemplater对象的zip文件(不是一个真实的文件,而是在内存中的表示)
  943. let out = doc.getZip().generate({
  944. type: "blob",
  945. mimeType:
  946. "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
  947. });
  948. // 将目标文件对象保存为目标类型的文件,并命名
  949. saveAs(out, "接待话术.docx");
  950. });
  951. },
  952. // 返回颜色
  953. spackerColor(index) {
  954. let obj = {
  955. color: "",
  956. };
  957. if (index >= 0) {
  958. switch (index) {
  959. case 1:
  960. obj.color = "#4f861e";
  961. break;
  962. case 2:
  963. obj.color = "#4f861e";
  964. break;
  965. case 3:
  966. obj.color = "#4f861e";
  967. break;
  968. case 4:
  969. obj.color = "#60cbec";
  970. break;
  971. case 5:
  972. obj.color = "#9f61c8";
  973. break;
  974. case 6:
  975. obj.color = "#9f61c8";
  976. break;
  977. default:
  978. obj.color = "#9f61c8";
  979. break;
  980. }
  981. } else {
  982. obj = {};
  983. }
  984. return obj;
  985. },
  986. editSure() {
  987. let speaker = this.roleFlag / 1 + 1;
  988. let obj = {};
  989. obj = Object.assign({}, this.optimizetext[this.roleidx]);
  990. obj.onebest = obj.onebest.replace(/<.*?>/gi, "");
  991. let arr = [];
  992. arr.push(obj);
  993. axios({
  994. url: `autoSR/zk/file/updateRole`,
  995. method: "post",
  996. data: {
  997. speaker: speaker,
  998. corpusId: this.corpusId,
  999. transferContent: JSON.stringify(arr),
  1000. customerId: this.fileId,
  1001. },
  1002. }).then((res) => {
  1003. this.optimizetext1[this.roleidx].speaker = this.roleFlag / 1 + 1;
  1004. this.roleVisible = false;
  1005. });
  1006. },
  1007. //修改角色
  1008. editRole(item, idx) {
  1009. this.roleFlag = item.speaker - 1;
  1010. this.roleidx = idx;
  1011. this.roleVisible = true;
  1012. },
  1013. gojianyi() {
  1014. let tag = {
  1015. group: [],
  1016. label: "接待详情",
  1017. params: {},
  1018. query: this.$route.query,
  1019. value: this.$route.fullPath,
  1020. };
  1021. this.$store.commit("DEL_TAG", tag);
  1022. this.$router.go(-1); //返回上一层
  1023. },
  1024. //上一首
  1025. aplayerChange(str) {
  1026. this.aplayer.destroy();
  1027. document.querySelector(".center2").scrollTop = 0;
  1028. if (str == "add") {
  1029. this.aplayerId++;
  1030. if (this.aplayerId >= this.aplayerLength) {
  1031. this.$message("没有下一首啦");
  1032. this.aplayerId--;
  1033. this.bofangchushihua();
  1034. return;
  1035. } else {
  1036. this.arr[this.aplayerId].audioContent != ""
  1037. ? (this.transcriptionlist = JSON.parse(
  1038. this.arr[this.aplayerId].audioContent
  1039. ))
  1040. : (this.transcriptionlist = []);
  1041. this.recordPath = this.arr[this.aplayerId].recordPath;
  1042. }
  1043. } else {
  1044. this.aplayerId--;
  1045. if (this.aplayerId < 0) {
  1046. this.$message("没有上一首啦");
  1047. this.aplayerId++;
  1048. this.bofangchushihua();
  1049. return;
  1050. } else {
  1051. this.arr[this.aplayerId].audioContent != ""
  1052. ? (this.transcriptionlist = JSON.parse(
  1053. this.arr[this.aplayerId].audioContent
  1054. ))
  1055. : (this.transcriptionlist = []);
  1056. this.recordPath = this.arr[this.aplayerId].recordPath;
  1057. }
  1058. }
  1059. this.bofangchushihua();
  1060. this.aplayer.play();
  1061. },
  1062. //点击播放
  1063. tabseek(item) {
  1064. this.centerindex = 0;
  1065. let num = parseInt(item.transferContent.bg / 1000);
  1066. if (item.corpusId == this.arr[this.aplayerId].id) {
  1067. this.aplayer.seek(num);
  1068. } else {
  1069. let idx = this.arr.findIndex((item1) => item1.id == item.corpusId);
  1070. if (idx == -1) {
  1071. this.$message("没有此条录音信息");
  1072. } else {
  1073. this.aplayerId = idx;
  1074. this.aplayer.destroy();
  1075. console.log(idx);
  1076. this.transcriptionlist = JSON.parse(this.arr[idx].audioContent);
  1077. this.recordPath = this.arr[idx].recordPath;
  1078. this.bofangchushihua();
  1079. this.$nextTick(() => {
  1080. this.aplayer.audio.currentTime = num;
  1081. });
  1082. }
  1083. }
  1084. this.searchisshow = false;
  1085. this.aplayer.play();
  1086. },
  1087. //点击搜索
  1088. searchtab() {
  1089. this.inputtest = "";
  1090. this.Searchcontent = [];
  1091. this.searchisshow = true;
  1092. },
  1093. tabinput() {
  1094. if (this.inputtest == "") {
  1095. return;
  1096. } else {
  1097. this.Searchcontent = [];
  1098. this.$api.http
  1099. .keyWordsMatching({
  1100. keyword: this.inputtest,
  1101. customerId: this.fileId,
  1102. })
  1103. .then((res) => {
  1104. let list = res.data;
  1105. // JSON.parse();
  1106. list.map((item) => {
  1107. item.transferContent = JSON.parse(item.transferContent);
  1108. item.text = this.brightKeyword(item.transferContent.onebest);
  1109. });
  1110. this.Searchcontent = list;
  1111. });
  1112. }
  1113. },
  1114. //替换方法
  1115. brightKeyword(val) {
  1116. if (val.indexOf(this.inputtest) !== -1) {
  1117. return val.replace(
  1118. this.inputtest,
  1119. "<text style='color: red'>" + this.inputtest + "</text>"
  1120. );
  1121. } else {
  1122. return val;
  1123. }
  1124. },
  1125. //文本恢复
  1126. textrestore() {
  1127. this.optimizeobj = {};
  1128. this.optimizetext = [];
  1129. this.$api.http
  1130. .findText({ corpusId: this.arr[this.aplayerId].id })
  1131. .then((res) => {
  1132. console.log(res, "文本恢复");
  1133. // return
  1134. this.optimizeobj = res.data;
  1135. this.optimizetext = JSON.parse(res.data.textContent);
  1136. });
  1137. },
  1138. //保存并更新文本 保存草稿
  1139. savedraft(i) {
  1140. this.$api.http
  1141. .saveText({
  1142. saveType: i,
  1143. corpusId: this.arr[this.aplayerId].id,
  1144. id: this.optimizeobj.id,
  1145. textContent: JSON.stringify(this.optimizetext),
  1146. })
  1147. .then((res) => {
  1148. this.dialogFormtext = false;
  1149. this.$message.success("优化完成");
  1150. if (i == 1) {
  1151. this.init();
  1152. }
  1153. });
  1154. },
  1155. //文本编辑确认
  1156. summunct() {
  1157. this.optimizetext1[this.textareaindex].onebest = this.textarea;
  1158. this.texteditorishow = false;
  1159. },
  1160. //文本编辑
  1161. texteditor(item, index) {
  1162. this.textarea = "";
  1163. this.textareaindex = index;
  1164. this.textareacuowu = item.onebest;
  1165. this.texteditorishow = true;
  1166. },
  1167. //文本优化删除
  1168. optimdel(t,i) {
  1169. console.log(i);
  1170. var that = this;
  1171. this.$confirm("此操作将删除该条, 是否继续?", "提示", {
  1172. confirmButtonText: "确定",
  1173. cancelButtonText: "取消",
  1174. type: "warning",
  1175. })
  1176. .then(() => {
  1177. // that.optimizetext.splice(i, 1);
  1178. this.optimizetext = this.optimizetext.filter(tt=>tt.onebest!=t.onebest)
  1179. this.$forceUpdate()
  1180. this.$message({
  1181. type: "success",
  1182. message: "删除成功!",
  1183. });
  1184. })
  1185. .catch(() => {
  1186. // this.$message({
  1187. // type: 'info',
  1188. // message: '已取消删除'
  1189. // });
  1190. });
  1191. },
  1192. //获取文本
  1193. texttap() {
  1194. this.optimizeobj = {};
  1195. this.optimizetext = [];
  1196. this.$api.http
  1197. .findText({ corpusId: this.arr[this.aplayerId].id })
  1198. .then((res) => {
  1199. console.log(res, "获取文本");
  1200. this.optimizeobj = res.data;
  1201. this.optimizetext = JSON.parse(res.data.textContent);
  1202. this.dialogFormtext = true;
  1203. });
  1204. },
  1205. // 接待标记
  1206. alllogo() {
  1207. if (this.userinformationlist.validInvalid != 0) {
  1208. this.$confirm('是否标记为"有效录音"?', "提示", {
  1209. confirmButtonText: "确定",
  1210. cancelButtonText: "取消",
  1211. type: "warning",
  1212. })
  1213. .then(() => {
  1214. this.$api.http
  1215. .updateValidInvalid({
  1216. id: this.fileId,
  1217. validInvalid: 0,
  1218. invalidReason: "",
  1219. houseId: localStorage.getItem("houseId"),
  1220. })
  1221. .then((res) => {
  1222. this.$message({
  1223. type: "success",
  1224. message: "操作成功!",
  1225. });
  1226. this.init();
  1227. });
  1228. })
  1229. .catch(() => {
  1230. // this.$message({
  1231. // type: "info",
  1232. // message: "已取消操作",
  1233. // });
  1234. });
  1235. } else {
  1236. this.dialogFormVisible13 = true;
  1237. }
  1238. },
  1239. //无效标记
  1240. effectiveAdd() {
  1241. if (this.effectiveindex == 5) {
  1242. if (this.effectiveitext.length == 0) {
  1243. this.$message({
  1244. type: "error",
  1245. message: "备注不能为空!",
  1246. });
  1247. return;
  1248. }
  1249. }
  1250. this.$api.http
  1251. .updateValidInvalid({
  1252. id: this.fileId,
  1253. validInvalid: "",
  1254. validInvalid: 1,
  1255. invalidReason: Number(this.effectiveindex),
  1256. invalidNote: this.effectiveitext,
  1257. houseId: localStorage.getItem("houseId"),
  1258. })
  1259. .then((res) => {
  1260. this.dialogFormVisible13 = false;
  1261. this.$message({
  1262. type: "success",
  1263. message: "操作成功!",
  1264. });
  1265. this.init();
  1266. });
  1267. },
  1268. //加精華
  1269. Addtodigest() {
  1270. var that = this;
  1271. if (that.arr[that.aplayerId].status == 0) {
  1272. that
  1273. .$confirm("取消加精,是否继续?", "提示", {
  1274. confirmButtonText: "确定",
  1275. cancelButtonText: "取消",
  1276. type: "warning",
  1277. })
  1278. .then(() => {
  1279. that.$api.http.delATD({ carId: that.fileId }).then((res) => {
  1280. that.$message({
  1281. type: "success",
  1282. message: "操作成功!",
  1283. });
  1284. this.init();
  1285. });
  1286. })
  1287. .catch(() => {
  1288. // that.$message({
  1289. // type: "info",
  1290. // message: "已取消操作",
  1291. // });
  1292. });
  1293. } else {
  1294. that
  1295. .$confirm("加精,是否继续?", "提示", {
  1296. confirmButtonText: "确定",
  1297. cancelButtonText: "取消",
  1298. type: "warning",
  1299. })
  1300. .then(() => {
  1301. that.$api.http
  1302. .addATD({ carId: that.fileId, status: 0 })
  1303. .then((res) => {
  1304. that.$message({
  1305. type: "success",
  1306. message: "加精成功!",
  1307. });
  1308. this.init();
  1309. });
  1310. })
  1311. .catch(() => {
  1312. // that.$message({
  1313. // type: "info",
  1314. // message: "已取消加精",
  1315. // });
  1316. });
  1317. }
  1318. },
  1319. //确认校准
  1320. intentlist2click() {
  1321. let param = {
  1322. keywordIds: "",
  1323. id: this.fileId,
  1324. };
  1325. let str = [];
  1326. this.Acquirecustomerintentlist2.map((item) => {
  1327. item.children.map((item1) => {
  1328. if (item1.selected == 0) {
  1329. str.push(item1.keywordsId);
  1330. }
  1331. });
  1332. });
  1333. str = str.join(",");
  1334. param.keywordIds = str;
  1335. this.$api.http.updateManualCalibration(param).then((res) => {
  1336. this.dialogFormVisible12 = false;
  1337. this.findCARKeywords();
  1338. });
  1339. },
  1340. // 选择校准
  1341. Edittag(item, item1, index, i) {
  1342. if (this.Acquirecustomerintentlist2[index].children[i].selected == 0) {
  1343. this.Acquirecustomerintentlist2[index].children[i].selected = 1;
  1344. } else {
  1345. this.Acquirecustomerintentlist2[index].children[i].selected = 0;
  1346. }
  1347. this.$forceUpdate();
  1348. },
  1349. //获取校准列表
  1350. Acqtap() {
  1351. this.dialogFormVisible12 = true;
  1352. this.$api.http
  1353. .findSystemAnalysis({ customerId: this.fileId, type: 2 })
  1354. .then((res) => {
  1355. let newlist = res.data || [];
  1356. if (newlist.length == 0) {
  1357. this.$message.success("暂无数据");
  1358. } else {
  1359. newlist.forEach((item1) => {
  1360. item1.children.map((item) => {
  1361. if (item.isInterval == 0) {
  1362. item.label =
  1363. item.name + item.unit + "-" + item.endName + item.unit;
  1364. } else {
  1365. item.label = item.name;
  1366. }
  1367. item.value = item.id;
  1368. });
  1369. });
  1370. this.Acquirecustomerintentlist2 = newlist;
  1371. }
  1372. });
  1373. },
  1374. addRole() {
  1375. console.log("添加角色");
  1376. this.tablist.push({
  1377. name: String.fromCharCode(this.tablist.length + 64),
  1378. });
  1379. this.roleList.push({
  1380. name: String.fromCharCode(this.roleList.length + 65),
  1381. });
  1382. },
  1383. //标记
  1384. biaoji() {
  1385. this.dialogFormVisible11 = true;
  1386. },
  1387. //取消标记
  1388. unmarktap() {
  1389. this.dialogFormVisible11 = false;
  1390. this.roleindexbiaoji = this.dshfkjsdkksodofydwfkhwdfkjh;
  1391. },
  1392. // 标记选择
  1393. biaojixuanze(index) {
  1394. this.roleindexbiaoji = index;
  1395. },
  1396. //确认标记
  1397. subMsg11() {
  1398. var num = this.roleindexbiaoji + 1;
  1399. this.$api.http
  1400. .markConsultant({
  1401. speaker: num,
  1402. id: this.isd,
  1403. customerId: this.fileId,
  1404. houseId: localStorage.getItem("houseId"),
  1405. })
  1406. .then((res) => {
  1407. this.dialogFormVisible11 = false;
  1408. this.init();
  1409. this.biaojiall();
  1410. this.$message.success("保存成功");
  1411. });
  1412. },
  1413. biaojiall() {
  1414. this.$api.http
  1415. .toMatchKeywords({
  1416. carId: this.fileId,
  1417. })
  1418. .then((res) => {});
  1419. },
  1420. // 获取用户信息
  1421. init() {
  1422. this.$api.http
  1423. .personalReceptionRecord({ customerId: this.fileId })
  1424. .then((res) => {
  1425. this.userinformationlist = res.data;
  1426. this.userinformationlist.endTime =
  1427. this.userinformationlist.endTime.substring(0, 19);
  1428. if (this.userinformationlist.calibration == 0) {
  1429. this.kehuyixiangcenterindex = 0;
  1430. } else {
  1431. this.kehuyixiangcenterindex = 1;
  1432. }
  1433. this.findCARKeywords();
  1434. this.findBannedWordsByCusId();
  1435. this.Getsthetransliteratecontent();
  1436. });
  1437. },
  1438. //常错词确认
  1439. subMsg() {
  1440. if (this.mistakenList.indexOf(this.form.wrongWord) != -1) {
  1441. this.$message.error("错误词已添加过~");
  1442. return;
  1443. }else{
  1444. if(this.form.wrongWord.length>8){
  1445. this.$message.warning("常错词不能超过8个字!");
  1446. return;
  1447. }else{
  1448. let reg = /^[0-9]+$/
  1449. if(reg.test(this.form.wrongWord)){
  1450. this.$message.warning("常错词不能为纯数字!");
  1451. return;
  1452. }else{
  1453. this.$refs.form.validate((valid) => {
  1454. if (valid) {
  1455. // this.form.correctWord = this.form.correctWord.replace(/[^\w\u4e00-\u9fa5]/g,"")
  1456. // this.form.wrongWord = this.form.wrongWord.replace(/[^\w\u4e00-\u9fa5]/g,"")
  1457. this.dialogFormVisible = false;
  1458. let sas = this.textItself.replace(
  1459. this.form.wrongWord,
  1460. this.form.correctWord
  1461. );
  1462. this.transcriptionlist[this.argtextindex].onebest = sas;
  1463. this.subWrongMsg();
  1464. }
  1465. });
  1466. }
  1467. }
  1468. }
  1469. },
  1470. //常错词提交
  1471. subWrongMsg() {
  1472. this.$api.http
  1473. .addCorrectWord({
  1474. correctWord: this.form.correctWord,
  1475. cupid: this.form.cupid,
  1476. wrongWord: this.form.wrongWord,
  1477. customerId: this.fileId,
  1478. houseId: this.userinformationlist.projectId,
  1479. translateHtmlContent:this.arr[this.aplayerId].audioContent
  1480. })
  1481. .then((res) => {
  1482. this.$message.success("保存成功");
  1483. });
  1484. },
  1485. // 播放
  1486. play(item) {
  1487. let num = parseInt(item.bg / 1000);
  1488. this.aplayer.seek(num);
  1489. this.searchisshow = false;
  1490. this.aplayer.play();
  1491. },
  1492. //常错词点击
  1493. checkMsg(row, index) {
  1494. this.correctListFun()
  1495. if (this.rec_index_wrongword == false) {
  1496. return;
  1497. }
  1498. this.aplayer.pause();
  1499. this.form.cupid = this.arr[this.aplayerId].id;
  1500. this.textItself = row.onebest;
  1501. let onebest = row.onebest;
  1502. this.form.wrongWord = onebest.replace(/<.*?>/gi, "");
  1503. this.dialogFormVisible = true;
  1504. this.argtextindex = index;
  1505. this.isNum = false;
  1506. let reg = /^[0-9]+$/
  1507. if (reg.test(this.form.wrongWord)) {
  1508. this.isNum = true
  1509. }
  1510. },
  1511. correctListFun() {
  1512. let obj = {
  1513. houseId : localStorage.getItem("houseId")
  1514. };
  1515. this.$api.api.correctList(obj).then((res) => {
  1516. this.mistakenList = res.data.map((item) => {
  1517. return item.wrongWord;
  1518. });
  1519. console.log(this.mistakenList, this.correctList);
  1520. });
  1521. },
  1522. // 销讲词禁忌tab
  1523. recordclick(i) {
  1524. this.zhixingcenterindex = i;
  1525. },
  1526. // 销讲词折叠
  1527. changeshow(index) {
  1528. this.ratelist[index].show = !this.ratelist[index].show;
  1529. },
  1530. //获取销讲词违禁词
  1531. findBannedWordsByCusId() {
  1532. this.$api.http
  1533. .findBannedWordsByCusId({ cusId: this.fileId })
  1534. .then((res) => {
  1535. let list1 = res.data.SalesTalk || [];
  1536. let list2 = res.data.ProhibitedWords || [];
  1537. let level1 = []; // 一级
  1538. list1.forEach((item) => {
  1539. if (item.pid == 0) {
  1540. level1.push({
  1541. id: item.marketingId,
  1542. rate: item.fraction,
  1543. name: item.name,
  1544. percent: 0,
  1545. ratepercent: 0,
  1546. show: false,
  1547. children: [],
  1548. });
  1549. }
  1550. });
  1551. list1.forEach((item) => {
  1552. level1.forEach((el) => {
  1553. if (item.pid == el.id) {
  1554. if (item.selected == 0) {
  1555. el.ratepercent += item.fraction;
  1556. }
  1557. el.children.push({
  1558. id: item.id,
  1559. rate: item.fraction,
  1560. selected: item.selected,
  1561. name: item.name,
  1562. });
  1563. }
  1564. });
  1565. });
  1566. if (level1.length != 0) {
  1567. level1[0].show = true;
  1568. }
  1569. this.ratelist = level1;
  1570. this.prohibitedlist = list2;
  1571. });
  1572. },
  1573. //系统分析切换人工校准
  1574. customerofintention(i) {
  1575. this.kehuyixiangcenterindex = i;
  1576. this.findCARKeywords();
  1577. },
  1578. //获去系统分析,人工校准
  1579. findCARKeywords() {
  1580. this.Getintentionlist = [];
  1581. if (this.kehuyixiangcenterindex == 0) {
  1582. this.$api.http
  1583. .findCARKeywords({ customerId: this.fileId })
  1584. .then((res) => {
  1585. let newlist = res.data || [];
  1586. if (newlist.length == 0) {
  1587. this.Getintentionlist = [];
  1588. return;
  1589. } else {
  1590. newlist.forEach((item) => {
  1591. item.newchildren = [];
  1592. item.children.forEach((fut) => {
  1593. if (fut.selected == 0) {
  1594. item.newchildren.push(fut);
  1595. }
  1596. });
  1597. });
  1598. newlist.forEach((item) => {
  1599. item.children.forEach((chen) => {
  1600. if (chen.isInterval == 0) {
  1601. chen.name =
  1602. chen.name + chen.unit + "-" + chen.endName + chen.unit;
  1603. } else {
  1604. chen.name = chen.name;
  1605. }
  1606. });
  1607. });
  1608. this.Getintentionlist = newlist;
  1609. }
  1610. });
  1611. } else {
  1612. this.$api.http
  1613. .findSystemAnalysis({ customerId: this.fileId, type: 1 })
  1614. .then((res) => {
  1615. if (res.data == null) {
  1616. this.Getintentionlist = [];
  1617. return;
  1618. }
  1619. res.data.forEach((item) => {
  1620. item.newchildren = [];
  1621. item.children.forEach((fut) => {
  1622. if (fut.selected == 0) {
  1623. item.newchildren.push(fut);
  1624. }
  1625. });
  1626. });
  1627. res.data.forEach((item) => {
  1628. item.children.forEach((chen) => {
  1629. if (chen.isInterval == 0) {
  1630. chen.name =
  1631. chen.name + chen.unit + "-" + chen.endName + chen.unit;
  1632. } else {
  1633. chen.name = chen.name;
  1634. }
  1635. });
  1636. });
  1637. this.Getintentionlist = res.data;
  1638. });
  1639. }
  1640. },
  1641. //获取转写内容和播放列表
  1642. Getsthetransliteratecontent() {
  1643. this.$api.http.findByCusIdcusId({ cusId: this.fileId }).then((res) => {
  1644. let audopbj = res.data;
  1645. this.recordPath = audopbj[this.AudioIdx].recordPath;
  1646. audopbj[this.AudioIdx].audioContent != ""
  1647. ? (this.transcriptionlist = JSON.parse(
  1648. audopbj[this.AudioIdx].audioContent
  1649. ))
  1650. : (this.transcriptionlist = []);
  1651. // this.transcriptionlist=JSON.parse(audopbj[this.AudioIdx].audioContent)
  1652. this.tablist = [];
  1653. if (this.userinformationlist.yon == 0) {
  1654. this.isd = audopbj[this.AudioIdx].id;
  1655. console.log(audopbj[this.AudioIdx].speakerNum, "speakerNum");
  1656. for (var i = 0; i <= audopbj[this.AudioIdx].speakerNum; i++) {
  1657. if (i == 0) {
  1658. this.tablist.push({
  1659. name: "全部",
  1660. });
  1661. } else if (i == 1) {
  1662. this.tablist.push({
  1663. name: "A",
  1664. });
  1665. } else if (i == 2) {
  1666. this.tablist.push({
  1667. name: "B",
  1668. });
  1669. } else if (i == 3) {
  1670. this.tablist.push({
  1671. name: "C",
  1672. });
  1673. } else if (i == 4) {
  1674. this.tablist.push({
  1675. name: "D",
  1676. });
  1677. } else if (i == 5) {
  1678. this.tablist.push({
  1679. name: "E",
  1680. });
  1681. } else if (i == 6) {
  1682. this.tablist.push({
  1683. name: "F",
  1684. });
  1685. } else if (i == 7) {
  1686. this.tablist.push({
  1687. name: "G",
  1688. });
  1689. } else if (i == 8) {
  1690. this.tablist.push({
  1691. name: "H",
  1692. });
  1693. } else if (i == 9) {
  1694. this.tablist.push({
  1695. name: "I",
  1696. });
  1697. } else if (i == 10) {
  1698. this.tablist.push({
  1699. name: "J",
  1700. });
  1701. } else if (i == 11) {
  1702. this.tablist.push({
  1703. name: "K",
  1704. });
  1705. } else if (i == 12) {
  1706. this.tablist.push({
  1707. name: "L",
  1708. });
  1709. } else if (i == 13) {
  1710. this.tablist.push({
  1711. name: "M",
  1712. });
  1713. } else if (i == 14) {
  1714. this.tablist.push({
  1715. name: "N",
  1716. });
  1717. } else if (i == 15) {
  1718. this.tablist.push({
  1719. name: "O",
  1720. });
  1721. } else {
  1722. this.tablist.push({
  1723. name: "P",
  1724. });
  1725. }
  1726. }
  1727. this.roleList = this.tablist.slice(1);
  1728. if (audopbj[this.AudioIdx].speaker == null) {
  1729. this.yibiaoji = "未标记";
  1730. this.roleindexbiaoji = 0;
  1731. this.dshfkjsdkksodofydwfkhwdfkjh = 0;
  1732. } else {
  1733. this.yibiaoji = "已标记";
  1734. this.tablist[audopbj[this.AudioIdx].speaker].name =
  1735. this.tablist[audopbj[this.AudioIdx].speaker].name + "顾问";
  1736. this.roleindexbiaoji = audopbj[this.AudioIdx].speaker - 1;
  1737. this.dshfkjsdkksodofydwfkhwdfkjh =
  1738. audopbj[this.AudioIdx].speaker - 1;
  1739. }
  1740. }
  1741. this.corpusId = audopbj[this.AudioIdx].id;
  1742. this.aplayerId = this.AudioIdx;
  1743. this.aplayerLength = audopbj.length;
  1744. this.arr = res.data;
  1745. this.bofangchushihua();
  1746. this.formatAudioList()
  1747. });
  1748. },
  1749. tapspagek(i) {
  1750. this.roleindex = i;
  1751. this.itemIndex = i;
  1752. },
  1753. //播放实例
  1754. bofangchushihua() {
  1755. var that = this;
  1756. this.$nextTick(() => {
  1757. this.aplayer = new APlayer({
  1758. container: document.getElementById("aplayer"),
  1759. theme: "#2671E2",
  1760. audio: [
  1761. {
  1762. url: this.recordPath,
  1763. cover:
  1764. "https://qufang.oss-cn-beijing.aliyuncs.com/recording/1626251359408.png",
  1765. },
  1766. ],
  1767. });
  1768. //结束的回调
  1769. this.aplayer.on("ended", function () {
  1770. console.log("player ended");
  1771. });
  1772. this.aplayer.on("timeupdate", function () {
  1773. that.drawActive(that.aplayer.audio.currentTime * 1000);
  1774. });
  1775. });
  1776. },
  1777. //音频播放中
  1778. drawActive(playTime) {
  1779. var that = this;
  1780. that.playNow = playTime;
  1781. $(".center2 .text").each(function (index) {
  1782. if (this.dataset.bg < playTime && playTime < this.dataset.ed) {
  1783. $(this).addClass("activecoloc");
  1784. that.$nextTick(() => {
  1785. document.querySelector(".center2").scrollTop =
  1786. $(".center2 .activecoloc")[0].offsetTop - 380;
  1787. });
  1788. } else {
  1789. $(this).removeClass("activecoloc");
  1790. }
  1791. });
  1792. },
  1793. //倍速更改
  1794. aplayerSpeed(num) {
  1795. this.aplayer.audio.playbackRate = num;
  1796. this.aplayerSpeedNum = num;
  1797. },
  1798. //格式化时间
  1799. formatTime(num) {
  1800. num = parseInt(num / 1000);
  1801. //格式化时间格式
  1802. num = num.toFixed(0);
  1803. let second = num % 60;
  1804. if (second < 10) second = "0" + second;
  1805. let min = Math.floor(num / 60);
  1806. if (min < 10) min = "0" + min;
  1807. return min + ":" + second;
  1808. },
  1809. //下载
  1810. download() {
  1811. console.log(this.recordPath);
  1812. saveAs(`http://81.70.55.170:9999/autoSR/zk/file/filedownload?videoSrc=${this.recordPath}`, "audio.mp3");
  1813. return
  1814. this.exportMethodPost("/autoSR/zk/file/filedownload", "接待详情", {
  1815. videoSrc: this.recordPath,
  1816. });
  1817. },
  1818. exportMethodPost(url, name, data = {}) {
  1819. axios({
  1820. method: "get",
  1821. url: url,
  1822. params: data,
  1823. timeout: 10*60*1000,
  1824. responseType: "blob",
  1825. })
  1826. .then((res) => {
  1827. console.log(res, 'adasdjslakd')
  1828. let blob = new Blob([res], { type: "audio/*" });
  1829. saveAs(blob, "audio.mp3");
  1830. // let date = new Date();
  1831. // let time = date.toLocaleDateString();
  1832. // const a = document.createElement('a');
  1833. // document.body.appendChild(a)
  1834. // a.style.display = 'none'
  1835. // // 使用获取到的blob对象创建的url
  1836. // const url = window.URL.createObjectURL(res);
  1837. // a.href = url;
  1838. // // 指定下载的文件名,就‘’写默认的下载名字。不指定他就根据上传名直接下载了宝。
  1839. // a.download = '';
  1840. // a.click();
  1841. // document.body.removeChild(a)
  1842. // // 移除blob对象的url
  1843. // window.URL.revokeObjectURL(url);
  1844. })
  1845. .catch((error) => {
  1846. console.log(error);
  1847. this.$message.error('请求超时')
  1848. });
  1849. },
  1850. },
  1851. };
  1852. </script>
  1853. <style scoped lang="scss" >
  1854. #avue-view {
  1855. overflow: hidden;
  1856. }
  1857. #zxldiv {
  1858. overflow-y: scroll;
  1859. // height: 100%;
  1860. height: calc(80vh - 248px);
  1861. }
  1862. .biaotibox {
  1863. width: 100%;
  1864. height: 30px;
  1865. display: flex;
  1866. font-size: 20px;
  1867. font-weight: 600;
  1868. line-height: 20px;
  1869. }
  1870. .biaotibox > div:nth-of-type(1) {
  1871. width: 50%;
  1872. }
  1873. .biaotibox > div:nth-of-type(2) {
  1874. width: 50%;
  1875. font-size: 30px;
  1876. text-align: right;
  1877. }
  1878. .center2 {
  1879. padding-left: 10px;
  1880. padding-right: 10px;
  1881. width: 100%;
  1882. // height: 100%;
  1883. height: calc(80vh - 265px);
  1884. overflow-y: scroll;
  1885. }
  1886. .box-center {
  1887. width: 100%;
  1888. height: 100%;
  1889. padding: 15px;
  1890. min-width: 1000px;
  1891. padding-bottom: 100px;
  1892. background: #ffffff;
  1893. }
  1894. .inputclass {
  1895. width: 100%;
  1896. height: 32px;
  1897. line-height: 32px;
  1898. background: #ffffff;
  1899. border-radius: 2px 0px 0px 2px;
  1900. text-indent: 6px;
  1901. border: 1px solid #e0e0e0;
  1902. }
  1903. .inputclass2 {
  1904. width: 70px;
  1905. height: 32px;
  1906. line-height: 32px;
  1907. background: #2671e2;
  1908. border-radius: 4px 4px 4px 4px;
  1909. color: #ffffff;
  1910. text-align: center;
  1911. }
  1912. // 播放
  1913. .text {
  1914. width: 100%;
  1915. font-size: 12px;
  1916. line-height: 20px;
  1917. display: flex;
  1918. align-items: center;
  1919. margin: 18px 0px;
  1920. position: relative;
  1921. }
  1922. .actRight[data-speaker] {
  1923. flex-direction: row-reverse;
  1924. text-align: left;
  1925. }
  1926. .right[data-speaker] {
  1927. flex-direction: row-reverse;
  1928. text-align: left;
  1929. .textcontent {
  1930. flex-direction: row-reverse;
  1931. text-align: left;
  1932. }
  1933. }
  1934. .content123 .content123s {
  1935. color: #32363d;
  1936. background: #f4f5f7;
  1937. font-size: 14px;
  1938. padding: 5px 14px;
  1939. border-radius: 8px;
  1940. margin: 0 12px;
  1941. line-height: 1.5;
  1942. max-width: 365px;
  1943. }
  1944. .textcontent {
  1945. display: flex;
  1946. align-items: center;
  1947. }
  1948. .content123ss {
  1949. padding: 5px 14px;
  1950. max-width: 365px;
  1951. margin: 0 12px;
  1952. }
  1953. .activecoloc .content123 div {
  1954. color: #ff7538 !important;
  1955. }
  1956. .center2 .text .avatar {
  1957. width: 34px;
  1958. height: 34px;
  1959. background-color: #ccc;
  1960. border-radius: 50%;
  1961. display: flex;
  1962. justify-content: center;
  1963. align-items: center;
  1964. }
  1965. .gu {
  1966. width: 28px;
  1967. height: 28px;
  1968. border-radius: 50%;
  1969. background: #3ca953;
  1970. color: #fff;
  1971. font-size: 16px !important;
  1972. font-weight: bold !important;
  1973. display: flex;
  1974. align-items: center;
  1975. justify-content: center;
  1976. }
  1977. .ke {
  1978. width: 28px;
  1979. height: 28px;
  1980. border-radius: 50%;
  1981. color: #fff;
  1982. font-size: 16px !important;
  1983. font-weight: bold !important;
  1984. display: flex;
  1985. align-items: center;
  1986. justify-content: center;
  1987. }
  1988. .center2 .text .avatar div {
  1989. width: 100%;
  1990. height: 100%;
  1991. text-align: center;
  1992. color: #ffffff;
  1993. font-size: 24px;
  1994. display: flex;
  1995. align-items: center;
  1996. justify-content: center;
  1997. }
  1998. .aplayerSpeedFont {
  1999. color: #2671e2;
  2000. }
  2001. .center3 {
  2002. padding-left: 10px;
  2003. padding-right: 10px;
  2004. padding-top: 10px;
  2005. }
  2006. .center3 .text {
  2007. width: 100%;
  2008. font-size: 12px;
  2009. line-height: 20px;
  2010. display: flex;
  2011. align-items: center;
  2012. margin: 26px 0px;
  2013. position: relative;
  2014. }
  2015. .center3 .text .avatar {
  2016. width: 38px;
  2017. height: 38px;
  2018. /*background-color: #f2f2f2;*/
  2019. background-color: #ccc;
  2020. border-radius: 50%;
  2021. margin-left: 15px;
  2022. display: flex;
  2023. justify-content: center;
  2024. align-items: center;
  2025. }
  2026. .center3 .text .avatar img {
  2027. width: 28px;
  2028. height: 28px;
  2029. display: block;
  2030. }
  2031. .center3 .text .avatar div {
  2032. width: 100%;
  2033. height: 100%;
  2034. text-align: center;
  2035. line-height: 38px;
  2036. color: #ffffff;
  2037. font-size: 24px;
  2038. }
  2039. .buttonzu {
  2040. position: absolute;
  2041. left: 70px;
  2042. top: -20px;
  2043. }
  2044. .actRight[data-speaker] .buttonzu {
  2045. position: absolute;
  2046. right: 70px;
  2047. top: -20px;
  2048. text-align: right;
  2049. }
  2050. //指标执行率
  2051. .zxlBox {
  2052. width: 100%;
  2053. .zxlLev1 {
  2054. width: 100%;
  2055. height: 40px;
  2056. line-height: 40px;
  2057. display: flex;
  2058. align-items: center;
  2059. background: #f8f8f8;
  2060. font-size: 15px;
  2061. }
  2062. .zxlLev1box {
  2063. text-indent: 20px;
  2064. }
  2065. .zxlLev2 {
  2066. width: 100%;
  2067. height: 40px;
  2068. line-height: 40px;
  2069. display: flex;
  2070. border-bottom: 1px solid #f8f8f8;
  2071. font-size: 14px;
  2072. .zxlzx {
  2073. width: 60px;
  2074. height: 24px;
  2075. line-height: 24px;
  2076. background: #2671e2;
  2077. text-align: center;
  2078. color: #ffffff;
  2079. border-radius: 4px;
  2080. }
  2081. .zxlzx2 {
  2082. width: 60px;
  2083. height: 24px;
  2084. line-height: 24px;
  2085. background: #f2f2f2;
  2086. text-align: center;
  2087. color: #999999;
  2088. border-radius: 4px;
  2089. }
  2090. }
  2091. .zxlLev2tit {
  2092. line-height: 40px;
  2093. text-indent: 20px;
  2094. }
  2095. }
  2096. //客户意向
  2097. .intentionBox {
  2098. width: 94%;
  2099. margin: 0 auto;
  2100. padding-bottom: 12px;
  2101. border-bottom: 1px solid #e0e0e0;
  2102. }
  2103. .intentionChe {
  2104. width: 100%;
  2105. display: flex;
  2106. flex-wrap: wrap;
  2107. .intentionview {
  2108. padding: 4px 10px;
  2109. border: 1px solid #e0e0e0;
  2110. background: #e0e0e0;
  2111. margin-left: 6px;
  2112. border-radius: 6px;
  2113. font-size: 14px;
  2114. margin-top: 10px;
  2115. }
  2116. }
  2117. .intentionName {
  2118. font-size: 16px;
  2119. margin-top: 10px;
  2120. }
  2121. .intentionChe div {
  2122. padding: 4px 10px;
  2123. background: #f4f8fd;
  2124. margin-left: 6px;
  2125. border-radius: 6px;
  2126. color: #2671e2;
  2127. font-size: 14px;
  2128. margin-top: 10px;
  2129. }
  2130. .intentionChe2 {
  2131. width: 100%;
  2132. display: flex;
  2133. flex-wrap: wrap;
  2134. }
  2135. .intentionChe2 div {
  2136. padding: 4px 10px;
  2137. border: 1px solid #e0e0e0;
  2138. margin-left: 6px;
  2139. border-radius: 6px;
  2140. font-size: 14px;
  2141. margin-top: 10px;
  2142. }
  2143. .topbox {
  2144. width: 100%;
  2145. height: 140px;
  2146. display: flex;
  2147. .topzuo {
  2148. width: 75%;
  2149. min-width: 700px;
  2150. height: 140px;
  2151. background: #ffffff;
  2152. border: 1px solid #e0e0e0;
  2153. padding: 10px;
  2154. position: relative;
  2155. .title {
  2156. color: #32363d;
  2157. .span1 {
  2158. font-size: 16px;
  2159. font-weight: 600;
  2160. margin-left: 2px;
  2161. }
  2162. .span2 {
  2163. font-size: 14px;
  2164. margin-left: 10px;
  2165. }
  2166. .span3 {
  2167. font-size: 16px;
  2168. margin-left: 2px;
  2169. }
  2170. }
  2171. .outDownLoad {
  2172. margin: 0 0 0 0.5em;
  2173. }
  2174. }
  2175. .topyou {
  2176. width: 24%;
  2177. min-width: 300px;
  2178. height: 140px;
  2179. padding: 10px;
  2180. background: #ffffff;
  2181. border: 1px solid #e0e0e0;
  2182. margin-left: 20px;
  2183. }
  2184. }
  2185. .input {
  2186. width: 94%;
  2187. height: 32px;
  2188. line-height: 32px;
  2189. background: #ffffff;
  2190. border-radius: 2px 0px 0px 2px;
  2191. text-indent: 6px;
  2192. border: 1px solid #e0e0e0;
  2193. }
  2194. .input2 {
  2195. width: 70px;
  2196. height: 32px;
  2197. line-height: 32px;
  2198. background: #2671e2;
  2199. border-radius: 0px 2px 2px 0px;
  2200. color: #ffffff;
  2201. text-align: center;
  2202. }
  2203. .topbox1 {
  2204. width: 100%;
  2205. display: flex;
  2206. margin-top: 12px;
  2207. height: calc(80vh - 156px);
  2208. .topzuo {
  2209. width: 75%;
  2210. min-width: 700px;
  2211. height: 100%;
  2212. display: flex;
  2213. .topzuo-zuo {
  2214. width: 60%;
  2215. height: 100%;
  2216. background: #ffffff;
  2217. border: 1px solid #e0e0e0;
  2218. .zuo-titbox {
  2219. width: 100%;
  2220. height: 100px;
  2221. border-bottom: 1px solid #e0e0e0;
  2222. .searchbox {
  2223. width: 100%;
  2224. height: 50px;
  2225. display: flex;
  2226. margin-top: 6px;
  2227. justify-content: center;
  2228. align-items: center;
  2229. .searchbutt {
  2230. width: 80px;
  2231. height: 32px;
  2232. line-height: 32px;
  2233. background: #2671e2;
  2234. border-radius: 2px;
  2235. color: #ffffff;
  2236. // margin-left: 20px;
  2237. text-align: center;
  2238. }
  2239. }
  2240. }
  2241. }
  2242. .topzuo-you {
  2243. width: 39%;
  2244. height: 100%;
  2245. margin-left: 18px;
  2246. background: #ffffff;
  2247. border: 1px solid #e0e0e0;
  2248. }
  2249. }
  2250. .topyou {
  2251. width: 24%;
  2252. min-width: 300px;
  2253. height: 100%;
  2254. background: #ffffff;
  2255. border: 1px solid #e0e0e0;
  2256. margin-left: 20px;
  2257. }
  2258. }
  2259. .roleindexclass {
  2260. background: #2671e2;
  2261. color: #ffffff;
  2262. }
  2263. .headboxbott {
  2264. width: 100%;
  2265. height: 50px;
  2266. display: flex;
  2267. align-items: center;
  2268. }
  2269. .headovfu {
  2270. flex: 1;
  2271. height: 40px;
  2272. overflow: hidden;
  2273. margin-top: 10px;
  2274. }
  2275. .headpade {
  2276. width: 100px;
  2277. height: 40px;
  2278. display: flex;
  2279. justify-content: center;
  2280. align-items: center;
  2281. }
  2282. .biaoji {
  2283. min-width: 70px;
  2284. height: 30px;
  2285. background: #e6625b;
  2286. border-radius: 24px;
  2287. text-align: center;
  2288. line-height: 30px;
  2289. color: #ffffff;
  2290. }
  2291. .biaoji1 {
  2292. width: 70px;
  2293. height: 30px;
  2294. text-align: center;
  2295. line-height: 30px;
  2296. margin-left: 10px;
  2297. flex-shrink: 0;
  2298. border-radius: 4px;
  2299. }
  2300. .inner-container {
  2301. overflow-x: scroll;
  2302. height: 40px;
  2303. }
  2304. /*滚动条样式*/
  2305. .inner-container::-webkit-scrollbar {
  2306. height: 4px;
  2307. }
  2308. .inner-container::-webkit-scrollbar-thumb {
  2309. border-radius: 10px;
  2310. -webkit-box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2);
  2311. background: rgba(0, 0, 0, 0.2);
  2312. }
  2313. .inner-container::-webkit-scrollbar-track {
  2314. -webkit-box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2);
  2315. border-radius: 0;
  2316. background: rgba(0, 0, 0, 0.1);
  2317. }
  2318. .aplayer {
  2319. box-shadow: none;
  2320. /*width: 80%;*/
  2321. width: 95.3%;
  2322. }
  2323. .aplayer-author {
  2324. display: none;
  2325. }
  2326. .aplayerSpeed {
  2327. display: flex;
  2328. /*justify-content: space-around;*/
  2329. justify-content: space-between;
  2330. padding: 0 10px;
  2331. font-size: 14px;
  2332. color: #999;
  2333. /*width: 616px;*/
  2334. width: 86.5%;
  2335. margin: 0 auto;
  2336. position: absolute;
  2337. left: 78px;
  2338. bottom: 12px;
  2339. }
  2340. /deep/.aplayer-pic {
  2341. width: 60px !important;
  2342. height: 60px !important;
  2343. }
  2344. /deep/.aplayer-music {
  2345. display: none !important;
  2346. }
  2347. .aplayer-controller {
  2348. margin-top: 15px;
  2349. }
  2350. .aplayerSpeedFont {
  2351. color: #2671e2;
  2352. }
  2353. /deep/.aplayer-info {
  2354. padding: 22px 7px 0px 10px;
  2355. }
  2356. .pingfenbox {
  2357. width: 100%;
  2358. height: 46px;
  2359. line-height: 46px;
  2360. border-bottom: 1px solid #e0e0e0;
  2361. display: flex;
  2362. }
  2363. .pingfenbox div {
  2364. flex: 1;
  2365. text-align: center;
  2366. font-size: 16px;
  2367. }
  2368. .activecllasscet {
  2369. color: #2671e2;
  2370. border-bottom: 2px solid #2671e2;
  2371. }
  2372. .viewclace {
  2373. height: 30px;
  2374. text-align: center;
  2375. line-height: 30px;
  2376. border-radius: 14px;
  2377. margin-right: 34px;
  2378. margin-top: 16px;
  2379. font-size: 16px;
  2380. border: 1px solid;
  2381. padding-left: 18px;
  2382. padding-right: 18px;
  2383. }
  2384. .bosdttom {
  2385. color: #ffffff;
  2386. background-color: #2671e2;
  2387. }
  2388. #zhezhao {
  2389. width: 100%;
  2390. height: 100vh;
  2391. position: fixed;
  2392. top: 0;
  2393. left: 0;
  2394. z-index: 1000;
  2395. opacity: 0.5;
  2396. background-color: #666666;
  2397. }
  2398. .auDivhhh {
  2399. width: 600px;
  2400. height: 540px;
  2401. border-radius: 4px;
  2402. z-index: 1003;
  2403. position: fixed;
  2404. left: 50%;
  2405. top: 50%;
  2406. transform: translate(-50%, -50%);
  2407. background: #ffffff;
  2408. }
  2409. .searchbox54 .avatar img {
  2410. /*width: 53px;*/
  2411. /*height: 53px;*/
  2412. width: 32px;
  2413. height: 32px;
  2414. display: block;
  2415. }
  2416. .searchbox54 .avatar {
  2417. width: 40px;
  2418. height: 40px;
  2419. /*background-color: #f2f2f2;*/
  2420. background-color: #ccc;
  2421. border-radius: 50%;
  2422. margin-left: 5px;
  2423. display: flex;
  2424. justify-content: center;
  2425. align-items: center;
  2426. }
  2427. .searchbox54 {
  2428. width: 100%;
  2429. min-height: 72px;
  2430. border-bottom: 1px solid #e0e0e0;
  2431. display: flex;
  2432. font-size: 16px;
  2433. color: #666666;
  2434. padding-bottom: 20px;
  2435. }
  2436. .searchbox54 > div:nth-of-type(1) {
  2437. width: 17%;
  2438. height: 100%;
  2439. text-align: center;
  2440. margin-top: 18px;
  2441. }
  2442. .searchbox54 > div:nth-of-type(2) {
  2443. width: 83%;
  2444. margin-top: 20px;
  2445. }
  2446. .adjskdjroleindexclass {
  2447. background: #3ca953 !important;
  2448. color: #ffffff !important;
  2449. }
  2450. </style>