AI销管
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

1787 lines
44 KiB

  1. <template>
  2. <view class="translation">
  3. <!-- <view style="width: 690rpx;height: 64rpx;margin: 0 auto;margin-top: 30rpx;background: #F2F2F2;border-radius: 32rpx;
  4. display: flex;align-items: center;" @tap="toKeywordsearch()">
  5. <image style="width: 28rpx;height: 28rpx;margin-left: 30rpx;" src="/static/images/search.png" mode=""></image>
  6. <text style="margin-left: 10rpx;color: #999999;font-size: 24rpx;">请输入关键字</text>
  7. </view> -->
  8. <view class="top" style="margin-top: 30rpx;">
  9. <view class="title">
  10. <view class="call_record_time">{{date}}</view>
  11. </view>
  12. <view class="call_record_time_one">接待时长 {{alltimeStr}}
  13. <u-icon name="list-dot" color="#333" size="48" @click="showFile"></u-icon>
  14. <view class="audoioyouxiao" @click="alllogo()" v-if="permissions.commonly2">
  15. {{userlistobj.validInvalidName||''}}
  16. </view>
  17. <view class="file-change" v-if="isshowFile">
  18. <view class="file-item" @click="filechange(item,index)"
  19. :class="csdFileindex == index ? 'fileactive' : ''" v-for="(item,index) in luyinList"
  20. :key="index">录音文件{{index+1}}</view>
  21. </view>
  22. <view class="diangweitupian" v-if="jiaoseshow">
  23. <image v-if="status==1" @click="tappick()" style="width: 100%;height: 100%;"
  24. src="../../static/images/pike.png" mode=""></image>
  25. <image v-if="status==0" @click="notappick()" style="width: 100%;height: 100%;"
  26. src="../../static/images/nopike.png" mode=""></image>
  27. </view>
  28. </view>
  29. <view class="audio-container">
  30. <view class="audio-play" @tap="changePlayState">
  31. <image class="image" mode="widthFix"
  32. :src="audioPlay ? 'https://qufang.oss-cn-beijing.aliyuncs.com/upload/icon/xcx/jjycrm/pause.png' : 'https://qufang.oss-cn-beijing.aliyuncs.com/upload/icon/xcx/jjycrm/play.png'">
  33. </image>
  34. </view>
  35. <view class="audio-slider">
  36. <view class="audio-time">
  37. <text>{{currentTimeStr}}</text>
  38. </view>
  39. <slider class="slider" min="0" :max="sliderMax" @change="sliderChangeComplate" block-size="14"
  40. :value="sliderValue" activeColor="blue"></slider>
  41. <view class="audio-time">
  42. <text>{{timeStr}}</text>
  43. </view>
  44. </view>
  45. </view>
  46. </view>
  47. <scroll-view :scroll-top="scrollTop" lower-threshold='20px' @scrolltolower="ltolower()"
  48. :scroll-into-view="scrollId" scroll-y="true" class="text scroll-Y">
  49. <!-- tab 栏切换 -->
  50. <view class="tab-box" id="top">
  51. <view class="yinpinshibie" @click="changeTab(0)" :class="{active: tab==0}">
  52. 音频识别
  53. </view>
  54. <view class="rate" @click="changeTab(1)" :class="{active: tab==1}">
  55. 评分
  56. </view>
  57. </view>
  58. <!-- 音频识别模块 -->
  59. <view v-if="tab==0">
  60. <!-- 聊天记录-->
  61. <view class="dialog-block" v-for="(dialog,i) in dialogList" :key="i">
  62. <view :id="'dialog'+i" class="fileName">录音文件
  63. <!-- {{i+1}} -->
  64. </view>
  65. <view class="text" :id="'dialog'+csdFileindex+'text'+item.bg"
  66. :class="{active: item.bg < playNow && item.ed > playNow && i==0}"
  67. v-for="(item,index) in dialog.message" :key="index" :data-speaker="item.speaker">
  68. <view class="avatar">
  69. <text v-if="item.speaker == 1" style="color: #60CBEC;">A</text>
  70. <text v-if="item.speaker == 2" style="color: #EC8B47;">B</text>
  71. <text v-if="item.speaker == 3" style="color: #4F861E;">C</text>
  72. <text v-if="item.speaker == 4" style="color: #9F61C8;">D</text>
  73. <text v-if="item.speaker == 5" style="color: #4980C8;">E</text>
  74. <text v-if="item.speaker == 6" style="color: #60CBEC;">F</text>
  75. <text v-if="item.speaker == 7" style="color: #EC8B47;">G</text>
  76. <text v-if="item.speaker == 8" style="color: #4F861E;">H</text>
  77. <text v-if="item.speaker == 9" style="color: #9F61C8;">I</text>
  78. </view>
  79. <view class="content">
  80. <view @longpress="changanxiaoguo(item,index,i)" v-html="item.onebest"></view>
  81. <view class="tankuangcss" v-if="item.isshow">
  82. <view @click="clickcopy()"
  83. style="width: 60rpx;font-size: 24rpx;text-align: center;margin-left: 24rpx;">复制
  84. </view>
  85. <view @click="Oftenthewrongword()" v-if="permissions.commonly4"
  86. style="width: 80rpx;font-size: 24rpx;text-align: center;margin-left: 22rpx;">常错词
  87. </view>
  88. <view @click="Addtheessence()" v-if="permissions.commonly3"
  89. style="width: 80rpx;font-size: 24rpx;text-align: center;margin-left: 22rpx;">加精华
  90. </view>
  91. <view @click="clickbofang(dialog.backindex,item)"
  92. style="width: 80rpx;font-size: 24rpx;text-align: center;margin-left: 14rpx;">播放
  93. </view>
  94. </view>
  95. </view>
  96. </view>
  97. </view>
  98. </view>
  99. <!-- 评分模块 -->
  100. <view v-if="tab==1" class="rate-box">
  101. <view class="title">总执行率 {{totalRate}}%</view>
  102. <view v-for="(item,index) in ratelist" :key="index" class="u-m-b-14">
  103. <view class="level1">
  104. <view class="level-name u-line-1">
  105. {{item.name}}
  106. </view>
  107. <view class="level-progress">
  108. <view class="color" :style="{width: item.ratepercent/item.rate*100+'%'}"></view>
  109. </view>
  110. <view class="level-rate">{{((item.ratepercent/item.rate).toFixed(2)*100).toFixed()}}%</view>
  111. <image v-if="!item.show" class="arrow rotatearrow" @click="changeshow(item,1)"
  112. src="/static/images/down.png" mode="" />
  113. <image v-else class="arrow" @click="changeshow(item,0)" src="/static/images/up.png" mode="" />
  114. </view>
  115. <view class="level1-subbox" v-if="item.show">
  116. <view class="sub-name" v-for="(subitem,i) in item.children" :key="i">
  117. <view class="subitem-name u-line-1">{{subitem.name}}</view>
  118. <image class="checkimg" v-if="!subitem.selected" src="/static/images/rate-checked.png"
  119. mode="" />
  120. <image class="checkimg" v-else src="/static/images/rate-nocheck.png" mode="" />
  121. </view>
  122. </view>
  123. </view>
  124. </view>
  125. </scroll-view>
  126. <!-- 回到顶部 -->
  127. <view class="backTop" @click="gotoTop">
  128. <image src="/static/images/backTop.png" mode=""></image>
  129. </view>
  130. <!-- 加入常错词 -->
  131. <view class="zhezhoa" v-if="isshow2" @tap="Cancelout"></view>
  132. <view class="bounced" v-if="isshow2">
  133. <view class="tian-view">
  134. <viwe class="tian-view-t1"></viwe>
  135. <viwe class="tian-view-t2">常错词:</viwe>
  136. <viwe class="tian-view-t3">
  137. <input type="text" v-model="thewrongword" class="tian-input" placeholder="请输入" />
  138. </viwe>
  139. </view>
  140. <view class="tian-view">
  141. <viwe class="tian-view-t1"></viwe>
  142. <viwe class="tian-view-t2">正确词:</viwe>
  143. <viwe class="tian-view-t3">
  144. <input class="tian-input" v-model="reswrongword" type="text" placeholder="请输入" />
  145. </viwe>
  146. </view>
  147. <view class="bounced3">
  148. <view class="bounced3-1" @tap="Cancelout">取消</view>
  149. <view class="bounced3-2" @tap="Confirmtheexit">确认</view>
  150. </view>
  151. </view>
  152. <!-- 加精华 -->
  153. <view class="zhezhoa" v-if="isshow3" @tap="Cancelout2"></view>
  154. <view class="bounced" v-if="isshow3">
  155. <view class="jiajinghuatit">加精华</view>
  156. <view style="width: 100%;text-indent: 20rpx;font-size: 28rpx;">选择标签</view>
  157. <view class="jiajinghuaview">
  158. <view class="jighuaview2" v-for="(item,index) in biaoqianlist" :key="index"
  159. :class="biaoqianindex == index ? 'biaoqiantom' : ''">
  160. <view class="view1-text" @click="tapbiaoqianclisck(index)">{{item.name}}</view>
  161. </view>
  162. </view>
  163. <view class="bounced3">
  164. <view class="bounced3-1" @tap="Cancelout2">取消</view>
  165. <view class="bounced3-2" @tap="Confirmtheexit2">确认</view>
  166. </view>
  167. </view>
  168. <view class="zhezhoa" v-if="effective"></view>
  169. <view class="bounced" v-if="effective">
  170. <view class="jiajinghuatit">选择</view>
  171. <view>
  172. <view class="uni-list">
  173. <radio-group @change="radioChange">
  174. <label style="display: flex;align-items: center;font-size: 30rpx;
  175. width: 94%;height: 80rpx;margin: 0 auto;" v-for="(item, index) in effectiveitems" :key="item.value">
  176. <view style="margin-top: 2rpx;flex: 1; text-indent: 20rpx;">{{item.name}}</view>
  177. <view style="width: 80rpx;">
  178. <radio :value="item.value" :checked="index == effectiveindex" />
  179. </view>
  180. </label>
  181. </radio-group>
  182. </view>
  183. <view v-if="effectiveindex==4">
  184. <textarea class="ffectivetext" v-model="effectiveitext" placeholder="备注" />
  185. </view>
  186. </view>
  187. <view class="bounced3">
  188. <view class="bounced3-1" @click="effective=false">取消</view>
  189. <view class="bounced3-2" @click="effectiveAdd()">确认</view>
  190. </view>
  191. </view>
  192. </view>
  193. </template>
  194. <script>
  195. var util = require("../../utils/util.js");
  196. var config = require("../../config");
  197. export default {
  198. data() {
  199. return {
  200. audioPlay: false, //当前的播放状态控制
  201. sliderValue: 0, //进度条最小值
  202. sliderMax: 0, //进度条最大值
  203. innerAudioContext: "", //播放实例
  204. currentTimeStr: "00:00", //当前进度的时间
  205. timeStr: "00:00", //总的时间
  206. recordPath: "",
  207. customerId: "",
  208. luyinList: [], //录音文件
  209. dialogList: [], //录音识别列表
  210. csdFileindex: 0,
  211. isshowFile: false, //录音列表隐藏
  212. date: "", //年月日
  213. tab: 0, // 默认是音频识别
  214. scrollTop: 0,
  215. scrollId: "",
  216. playNow: 0,
  217. alltimeStr: "00:00:00",
  218. ratelist: [], //评分列表
  219. totalRate: "",
  220. thewrongword: "", //错误词
  221. reswrongword: "", //正确词
  222. isshow2: false,
  223. messagelisy: [],
  224. isshow3: false,
  225. biaoqianlist: [],
  226. biaoqianindex: 0,
  227. changanitem: {},
  228. duihuawenjianid: "",
  229. biaoqianid: "",
  230. status: 0,
  231. num: 0, //上拉 转写文件下标
  232. Bnum: 0, //下拉 转写文件下标
  233. itemobj: {},
  234. buildingID: '',
  235. userlistobj: {},
  236. // Menulist:[],
  237. // Menulistisshow:false,
  238. effective: false,
  239. effectiveindex: '0',
  240. effectiveitems: [{
  241. value: '1',
  242. name: '没电指派无录音',
  243. checked: true
  244. },
  245. {
  246. value: '2',
  247. name: '离线指派无录音',
  248. },
  249. {
  250. value: '3',
  251. name: '系统测试误操作'
  252. },
  253. {
  254. value: '4',
  255. name: '非接访场景录音'
  256. },
  257. {
  258. value: '5',
  259. name: '其他'
  260. }
  261. ],
  262. effectiveitext: '',
  263. textItself: '',
  264. argtextindex1: 0,
  265. argtextindex2: 0,
  266. permissions: {
  267. commonly2: false,
  268. commonly3: false,
  269. commonly4: false,
  270. }
  271. };
  272. },
  273. onLoad: function(options) {
  274. this.status = options.status;
  275. this.customerId = options.customerId;
  276. this.itemobj = uni.getStorageSync('searchobj');
  277. this.stateisshow = options.stateisshow;
  278. },
  279. onShow() {
  280. let newmenulist = uni.getStorageSync('weapp_session_Menu_data');
  281. this.permissions.commonly2 = newmenulist.jdwxbj;
  282. this.permissions.commonly3 = newmenulist.swyxal;
  283. this.permissions.commonly4 = newmenulist.ccc;
  284. //1 接待无效标记 jdwxbj
  285. //1 设为优秀案例 swyxal
  286. // 常错词 ccc
  287. this.buildingID = uni.getStorageSync('buildingID').id;
  288. if (this.stateisshow == 2) {
  289. var info = this.itemobj;
  290. } else {
  291. var pages = getCurrentPages();
  292. var currPage = pages[pages.length - 1]; //当前页面
  293. var info = currPage.data.info;
  294. }
  295. this.gituserlist()
  296. this.innerAudioContext = uni.createInnerAudioContext();
  297. this.innerAudioContext.autoplay = false;
  298. this.innerAudioContext.title = '音频';
  299. this.onPlay()
  300. this.onPause()
  301. this.onCanplay()
  302. this.onEnded()
  303. this.onSeeking()
  304. this.onSeeked()
  305. this.TimeUpdate()
  306. this.init(info)
  307. },
  308. // 在组件实例被从页面节点树移除时执行
  309. destroyed: function() {
  310. //暂停
  311. // this.innerAudioContext.pause()
  312. // 销毁
  313. this.innerAudioContext.destroy();
  314. },
  315. // 销毁实例
  316. onUnload: function() {
  317. //暂停
  318. // this.innerAudioContext.pause()
  319. // 销毁
  320. this.innerAudioContext.destroy();
  321. },
  322. methods: {
  323. effectiveAdd() {
  324. if (this.effectiveindex == 4) {
  325. if (this.effectiveitext.length == 0) {
  326. uni.showToast({
  327. title: '备注不能为空',
  328. icon: "none",
  329. duration: 2000
  330. });
  331. return
  332. }
  333. }
  334. this.effective = false;
  335. let parames = {
  336. id: this.customerId,
  337. validInvalid: '',
  338. validInvalid: 1,
  339. invalidReason: Number(this.effectiveindex) + 1,
  340. invalidNote: this.effectiveitext
  341. }
  342. this.$u.post("/customer/updateValidInvalid", parames).then(res => {
  343. console.log(res)
  344. this.gituserlist()
  345. })
  346. },
  347. radioChange(evt) {
  348. this.effectiveitext = "";
  349. for (let i = 0; i < this.effectiveitems.length; i++) {
  350. if (this.effectiveitems[i].value === evt.detail.value) {
  351. this.effectiveindex = i;
  352. break;
  353. }
  354. }
  355. },
  356. //标记
  357. alllogo() {
  358. var that = this;
  359. let msg = '';
  360. if (this.userlistobj.validInvalid != 0) {
  361. msg = '是否标记为"有效录音"?';
  362. uni.showModal({
  363. title: '提示',
  364. content: msg,
  365. success: function(res) {
  366. if (res.confirm) {
  367. let parames = {
  368. id: that.customerId,
  369. validInvalid: '',
  370. invalidReason: 0
  371. }
  372. if (that.userlistobj.validInvalid == 0) {
  373. parames.validInvalid = 1;
  374. } else {
  375. parames.validInvalid = 0;
  376. }
  377. that.$u.post("/customer/updateValidInvalid", parames).then(res => {
  378. console.log(res)
  379. that.gituserlist()
  380. })
  381. }
  382. }
  383. });
  384. } else {
  385. this.effective = true;
  386. }
  387. },
  388. //获取用户信息
  389. gituserlist() {
  390. this.$u.get("/matchKeywords/personalReceptionRecord", {
  391. customerId: this.customerId
  392. }).then(res => {
  393. res.endTime1 = res.endTime.substring(0, 19);
  394. this.userlistobj = res;
  395. })
  396. },
  397. toKeywordsearch() {
  398. this.innerAudioContext.destroy();
  399. this.stateisshow = 1;
  400. uni.navigateTo({
  401. url: '/pages/learning/Keywordsearch?customerId=' + this.customerId + "&status=" + this.status +
  402. "&skpl=" + "1"
  403. })
  404. },
  405. onPlay() {
  406. this.innerAudioContext.onPlay(() => {
  407. // 播放监听
  408. console.log('播放!');
  409. this.audioPlay = true;
  410. wx.enableAlertBeforeUnload({
  411. message: "是否确认退出详情页面?",
  412. success: function(res) {
  413. console.log("方法注册成功:", res);
  414. },
  415. fail: function(errMsg) {
  416. console.log("方法注册失败:", errMsg);
  417. },
  418. });
  419. });
  420. },
  421. onPause() {
  422. this.innerAudioContext.onPause(() => {
  423. wx.disableAlertBeforeUnload({
  424. success: function(res) {
  425. console.log(res)
  426. },
  427. fail: function(e) {
  428. console.log(e)
  429. }
  430. });
  431. // 暂停监听
  432. console.log('暂停播放!');
  433. this.audioPlay = false
  434. });
  435. },
  436. onCanplay() {
  437. this.innerAudioContext.onCanplay((callback) => {
  438. console.log("缓冲回调", this.innerAudioContext.duration);
  439. })
  440. },
  441. onEnded() {
  442. this.innerAudioContext.onEnded(() => {
  443. // 结束播放监听
  444. console.log('播放结束!');
  445. this.audioPlay = false;
  446. this.qeihuanwenjian()
  447. });
  448. },
  449. onSeeking() {
  450. this.innerAudioContext.onSeeking((res) => {
  451. console.log("进行跳转", res);
  452. })
  453. },
  454. onSeeked() {
  455. this.innerAudioContext.onSeeked((res) => {
  456. console.log("结束跳转", res);
  457. this.$forceUpdate()
  458. });
  459. },
  460. TimeUpdate() {
  461. this.innerAudioContext.onTimeUpdate(() => {
  462. const {
  463. currentTime,
  464. duration
  465. } = this.innerAudioContext;
  466. this.playNow = parseInt(currentTime * 1000)
  467. if (this.dialogList.length == 0) {
  468. } else {
  469. const message = this.dialogList[0].message
  470. for (let i = 0; i < message.length; i++) {
  471. if (Number(message[i].bg) < this.playNow && Number(message[i].ed) > this.playNow) {
  472. this.scrollId = "dialog" + this.csdFileindex + "text" + message[i].bg;
  473. break;
  474. }
  475. }
  476. }
  477. const currTimeStr = this.formatTime(currentTime);
  478. this.sliderValue = parseInt(currentTime);
  479. // 变动的时间
  480. this.currentTimeStr = currTimeStr;
  481. //进度条最大值
  482. this.sliderMax = this.luyinList[this.csdFileindex].recordDuration;
  483. console.log(duration)
  484. this.$forceUpdate()
  485. });
  486. },
  487. init(info) {
  488. this.sliderMax = 0; //进度条最大值
  489. this.timeStr = "00:00"; //总的时间
  490. const parames = {
  491. pageNum: 1,
  492. pageSize: 100,
  493. query: {
  494. customerId: this.customerId
  495. }
  496. }
  497. this.$u.post("/corpus/findByPage", parames).then(res => {
  498. if (res && res.length) {
  499. let alltime = 1;
  500. res.forEach(item => {
  501. item.recordDuration = item.recordDuration / 1
  502. alltime += item.recordDuration
  503. })
  504. console.log(res, alltime, "999999999999")
  505. this.alltimeStr = this.getTime(alltime)
  506. if (info) {
  507. res.forEach((item, index) => {
  508. if (item.id == info.id) {
  509. this.luyinList = res;
  510. this.csdFileindex = index;
  511. this.recordPath = res[index].recordPath
  512. this.sliderMax = this.getTime(res[index].recordDuration)
  513. this.timeStr = this.getTime(res[index].recordDuration)
  514. this.date = res[index].receptionTime;
  515. this.isshowFile = false;
  516. this.getCorpusAnalysis(info);
  517. this.creatAudio()
  518. var itc = parseInt(info.bg / 1000)
  519. this.adasdasdasd(itc)
  520. }
  521. })
  522. } else {
  523. this.recordPath = res[0].recordPath
  524. this.sliderMax = this.getTime(res[0].recordDuration)
  525. this.timeStr = this.getTime(res[0].recordDuration)
  526. this.date = res[0].receptionTime
  527. this.innerAudioContext.src = this.recordPath;
  528. // if(uni.getStorageSync('entrance')==2){
  529. // this.changePlayState()
  530. // }
  531. this.luyinList = res;
  532. this.getCorpusAnalysis()
  533. }
  534. }
  535. })
  536. },
  537. //搜索跳转
  538. adasdasdasd(e) {
  539. const currTimeStr = this.formatTime(e)
  540. this.currentTimeStr = currTimeStr
  541. this.innerAudioContext.seek(e);
  542. // if(uni.getStorageSync('entrance')==1){
  543. // return
  544. // }else{
  545. // this.innerAudioContext.play();
  546. // }
  547. },
  548. //下一页
  549. ltolower() {
  550. var lengthcz = this.luyinList.length - 1;
  551. if (this.num >= lengthcz) {
  552. uni.showToast({
  553. title: '到底了',
  554. duration: 2000
  555. });
  556. return
  557. } else {
  558. this.num = this.num + 1;
  559. setTimeout(function() {
  560. uni.hideLoading();
  561. }, 2000);
  562. uni.request({
  563. url: config.service.getCorpusAnalysis + '?corpusId=' + this.luyinList[this.num].id +
  564. "&customerId=" + this.customerId, //仅为示例,并非真实接口地址。
  565. method: "GET",
  566. header: {
  567. 'content-type': 'application/json',
  568. 'Authorization': 'Bearer ' + uni.getStorageSync('weapp_session_login_data').token
  569. },
  570. success: (data) => {
  571. if (data.data.code == 10000) {
  572. if (!data.data.data.audioContent) {
  573. setTimeout(function() {
  574. uni.hideLoading();
  575. }, 2000);
  576. } else {
  577. const jsonInfo = JSON.parse(data.data.data.audioContent);
  578. this.dialogList.push({
  579. message: jsonInfo,
  580. backindex: this.num
  581. });
  582. this.dialogList.forEach((asd, idx) => {
  583. asd.message.forEach((qwe, inde) => {
  584. qwe.isshow = false;
  585. })
  586. })
  587. uni.hideLoading();
  588. }
  589. }
  590. },
  591. fail: () => {
  592. uni.hideLoading();
  593. }
  594. })
  595. }
  596. },
  597. //上一页
  598. rolltoupper() {
  599. if (this.csdFileindex == 0) {
  600. uni.showToast({
  601. title: '到头了',
  602. duration: 2000
  603. });
  604. return
  605. } else if (this.Bnum == 0) {
  606. uni.showToast({
  607. title: '到头了',
  608. duration: 2000
  609. });
  610. return
  611. } else {
  612. this.Bnum = this.Bnum - 1;
  613. setTimeout(function() {
  614. uni.hideLoading();
  615. }, 2000);
  616. uni.request({
  617. url: config.service.getCorpusAnalysis + '?corpusId=' + this.luyinList[this.Bnum].id +
  618. "&customerId=" + this.customerId, //仅为示例,并非真实接口地址。
  619. method: "GET",
  620. header: {
  621. 'content-type': 'application/json',
  622. 'Authorization': 'Bearer ' + uni.getStorageSync('weapp_session_login_data').token
  623. },
  624. success: (data) => {
  625. if (data.data.code == 10000) {
  626. if (!data.data.data.audioContent) {
  627. setTimeout(function() {
  628. uni.hideLoading();
  629. }, 2000);
  630. } else {
  631. const jsonInfo = JSON.parse(data.data.data.audioContent);
  632. this.dialogList.unshift({
  633. message: jsonInfo
  634. });
  635. this.dialogList.forEach((asd, idx) => {
  636. asd.message.forEach((qwe, inde) => {
  637. qwe.isshow = false;
  638. })
  639. })
  640. uni.hideLoading();
  641. }
  642. }
  643. },
  644. fail: () => {
  645. uni.hideLoading();
  646. }
  647. })
  648. }
  649. },
  650. // 取消全部加精
  651. notappick() {
  652. var that = this;
  653. uni.showModal({
  654. title: '提示',
  655. content: '确认取消加精?',
  656. success: function(res) {
  657. if (res.confirm) {
  658. console.log('用户点击确定');
  659. uni.request({
  660. url: config.service.delATD + "?carId=" + that.customerId,
  661. method: "GET",
  662. header: {
  663. 'content-type': 'application/json',
  664. 'Authorization': 'Bearer ' + uni.getStorageSync(
  665. 'weapp_session_login_data').token
  666. },
  667. success: (data) => {
  668. if (data.data.code == 10000) {
  669. that.status = 1
  670. uni.showToast({
  671. title: '取消成功',
  672. duration: 2000
  673. });
  674. } else {
  675. uni.showToast({
  676. title: data.data.message,
  677. duration: 2000
  678. });
  679. }
  680. }
  681. })
  682. } else if (res.cancel) {
  683. console.log('用户点击取消');
  684. }
  685. }
  686. });
  687. },
  688. //全部加精
  689. tappick(i) {
  690. var that = this;
  691. uni.showModal({
  692. title: '提示',
  693. content: '确认加精?',
  694. success: function(res) {
  695. if (res.confirm) {
  696. console.log('用户点击确定');
  697. let objdata = {
  698. "carId": that.customerId, //客户id
  699. "status": 0,
  700. "itemId": that.buildingID,
  701. }
  702. uni.request({
  703. url: config.service.addATD,
  704. method: "POST",
  705. header: {
  706. 'content-type': 'application/json',
  707. 'Authorization': 'Bearer ' + uni.getStorageSync(
  708. 'weapp_session_login_data').token
  709. },
  710. data: objdata,
  711. success: (data) => {
  712. if (data.data.code == 10000) {
  713. that.status = 0
  714. uni.showToast({
  715. title: '加精成功',
  716. duration: 2000
  717. });
  718. } else {
  719. uni.showToast({
  720. title: data.data.message,
  721. duration: 2000
  722. });
  723. }
  724. }
  725. })
  726. } else if (res.cancel) {
  727. console.log('用户点击取消');
  728. }
  729. }
  730. });
  731. },
  732. //标签选择
  733. tapbiaoqianclisck(index) {
  734. this.biaoqianindex = index;
  735. this.biaoqianid = this.biaoqianlist[index].id
  736. },
  737. //复制
  738. clickcopy() {
  739. var that = this;
  740. uni.setClipboardData({
  741. data: that.thewrongword,
  742. success: function() {
  743. that.dialogList.forEach(res => {
  744. res.message.forEach(asd => {
  745. asd.isshow = false;
  746. })
  747. })
  748. that.$forceUpdate();
  749. console.log('success');
  750. }
  751. });
  752. },
  753. //确认加入常错词
  754. Confirmtheexit() {
  755. if (this.thewrongword) {
  756. if (this.reswrongword) {
  757. let parames = {
  758. customerId: this.customerId,
  759. cupid: this.luyinList[this.csdFileindex].id,
  760. wrongWord: this.thewrongword, //错误词
  761. correctWord: this.reswrongword, //正确词
  762. translateHtmlContent: this.messagelisy,
  763. }
  764. this.isshow2 = false;
  765. let sas = this.textItself.replace(this.thewrongword, this.reswrongword)
  766. this.dialogList[this.argtextindex1].message[this.argtextindex2].onebest = sas
  767. this.dialogList.forEach(res => {
  768. res.message.forEach(asd => {
  769. asd.isshow = false;
  770. })
  771. })
  772. this.$u.post("/corpus/addCorrectWord", parames).then(data => {
  773. this.thewrongword = "";
  774. this.reswrongword = "";
  775. })
  776. } else {
  777. uni.showToast({
  778. title: '正确值不能为空',
  779. duration: 2000
  780. });
  781. return
  782. }
  783. } else {
  784. uni.showToast({
  785. title: '错误词不能为空',
  786. duration: 2000
  787. });
  788. return
  789. }
  790. },
  791. //取消加入常错词
  792. Cancelout() {
  793. this.isshow2 = false;
  794. this.dialogList.forEach(res => {
  795. res.message.forEach(asd => {
  796. asd.isshow = false;
  797. })
  798. })
  799. },
  800. //加入长错词
  801. Oftenthewrongword() {
  802. this.reswrongword = "";
  803. this.isshow2 = true;
  804. },
  805. //加精华
  806. Addtheessence() {
  807. this.isshow3 = true;
  808. this.biaoqianlist = []
  809. util.getRequestPromise(config.service.findAllYi, {}, false).then(data => {
  810. this.biaoqianlist = data
  811. this.biaoqianlist.unshift({
  812. name: "逼单话术",
  813. id: 0
  814. })
  815. });
  816. },
  817. // 取消加精
  818. Cancelout2() {
  819. this.isshow3 = false;
  820. this.dialogList.forEach(res => {
  821. res.message.forEach(asd => {
  822. asd.isshow = false;
  823. })
  824. })
  825. },
  826. // 确认加精
  827. Confirmtheexit2() {
  828. if (this.biaoqianid) {
  829. this.biaoqianid = this.biaoqianid
  830. } else {
  831. this.biaoqianid = 0
  832. }
  833. this.isshow3 = false;
  834. this.dialogList.forEach(res => {
  835. res.message.forEach(asd => {
  836. asd.isshow = false;
  837. })
  838. })
  839. let objdata = {
  840. "carId": this.customerId, //客户id
  841. "startTime": this.changanitem.bg, //开始时间
  842. "startFile": this.duihuawenjianid, //对话所在录音文件id
  843. "endTime": this.changanitem.ed, //结束时间
  844. "marketingId": this.biaoqianid, //对应一级父id
  845. "jjTransfer": this.changanitem.onebest, //选中对话
  846. "status": 1
  847. }
  848. uni.request({
  849. url: config.service.addATD,
  850. method: "POST",
  851. header: {
  852. 'content-type': 'application/json',
  853. 'Authorization': 'Bearer ' + uni.getStorageSync('weapp_session_login_data').token
  854. },
  855. data: objdata,
  856. success: (data) => {
  857. if (data.data.code == 10000) {
  858. uni.showToast({
  859. title: '加精成功',
  860. duration: 2000
  861. });
  862. } else {
  863. uni.showToast({
  864. title: data.data.message,
  865. duration: 2000
  866. });
  867. }
  868. }
  869. })
  870. },
  871. //长按对话
  872. changanxiaoguo(item, index, i) {
  873. this.messagelisy = [];
  874. this.changanitem = {};
  875. this.duihuawenjianid = "",
  876. this.dialogList.forEach(res => {
  877. res.message.forEach(asd => {
  878. asd.isshow = false;
  879. })
  880. })
  881. this.changanitem = item;
  882. this.duihuawenjianid = this.luyinList[this.csdFileindex].id;
  883. this.dialogList[i].message[index].isshow = !this.dialogList[i].message[index].isshow;
  884. this.textItself = item.onebest;
  885. let onebest = item.onebest;
  886. this.thewrongword = onebest.replace(/<.*?>/ig, "");
  887. this.thewrongword = item.onebest;
  888. this.messagelisy = this.dialogList[i].message
  889. this.argtextindex1 = i;
  890. this.argtextindex2 = index;
  891. },
  892. //回到顶部
  893. gotoTop() {
  894. this.scrollId = null;
  895. this.$nextTick(() => {
  896. this.scrollId = "top";
  897. })
  898. },
  899. //切换tab
  900. changeTab(type) {
  901. if (type == 0) {
  902. this.tab = 0
  903. } else {
  904. this.tab = 1;
  905. this.getRatelist();
  906. }
  907. },
  908. //录音列表显示隐藏
  909. showFile() {
  910. console.log("111111111111111111111111")
  911. this.isshowFile = !this.isshowFile;
  912. console.log("222222222222222222222")
  913. },
  914. //评分上下显隐
  915. changeshow(item, type) {
  916. if (type == 1) {
  917. item.show = true
  918. } else {
  919. item.show = false
  920. }
  921. },
  922. // 获取评分
  923. getRatelist() {
  924. if (this.ratelist.length == 0) {
  925. this.$u.get("/customer/findzkMByCusId", {
  926. cusId: this.customerId
  927. }).then(res => {
  928. if (res.length) {
  929. let level1 = []
  930. let level2rate = 0
  931. res.forEach(item => {
  932. if (item.pid == 0) {
  933. level1.push({
  934. id: item.marketingId,
  935. rate: item.fraction,
  936. name: item.name,
  937. sort: item.sort,
  938. show: false,
  939. ratepercent: 0,
  940. children: []
  941. })
  942. } else {
  943. if (item.selected == 0) {
  944. level2rate += item.fraction
  945. }
  946. }
  947. })
  948. this.totalRate = level2rate
  949. res.forEach(subitem => {
  950. let subitempid = subitem.pid
  951. level1.forEach(item => {
  952. if (subitempid == item.id) {
  953. if (subitem.selected == 0) {
  954. item.ratepercent += subitem.fraction
  955. }
  956. item.children.push({
  957. id: subitem.id,
  958. rate: subitem.fraction,
  959. selected: subitem.selected,
  960. name: subitem.name
  961. })
  962. }
  963. })
  964. })
  965. level1[0].show = true;
  966. this.ratelist = level1
  967. }
  968. setTimeout(function() {
  969. uni.hideLoading();
  970. }, 1000);
  971. })
  972. }
  973. },
  974. // 获取转义后的对话结果
  975. getCorpusAnalysis(info) {
  976. this.dialogList = [];
  977. uni.request({
  978. url: config.service.getCorpusAnalysis + '?corpusId=' + this.luyinList[this.csdFileindex].id +
  979. "&customerId=" + this.customerId, //仅为示例,并非真实接口地址。
  980. method: "GET",
  981. header: {
  982. 'content-type': 'application/json',
  983. 'Authorization': 'Bearer ' + uni.getStorageSync('weapp_session_login_data').token
  984. },
  985. success: (data) => {
  986. if (data.data.code == 10000) {
  987. if (!data.data.data.audioContent) {
  988. setTimeout(function() {
  989. uni.hideLoading();
  990. }, 2000);
  991. } else {
  992. const jsonInfo = JSON.parse(data.data.data.audioContent);
  993. console.log(jsonInfo)
  994. if (this.luyinList[this.csdFileindex].recordDuration > 360) {
  995. //拿到总条数
  996. var stusnum = jsonInfo.length;
  997. this.dialogList.push({
  998. message: jsonInfo.splice(0, 80),
  999. backindex: this.csdFileindex
  1000. });
  1001. var auth_timetimer = setInterval(() => {
  1002. stusnum -= 100;
  1003. console.log("还剩下" + stusnum)
  1004. if (stusnum <= 0) {
  1005. console.log("停止")
  1006. clearInterval(auth_timetimer);
  1007. } else {
  1008. console.log("添加")
  1009. var newlistwang = [];
  1010. newlistwang = jsonInfo.splice(0, 100);
  1011. console.log("新数组", newlistwang)
  1012. newlistwang.forEach(item => {
  1013. this.dialogList[0].message.push(item)
  1014. })
  1015. }
  1016. }, 1000);
  1017. } else {
  1018. this.dialogList.push({
  1019. message: jsonInfo,
  1020. backindex: this.csdFileindex
  1021. });
  1022. }
  1023. this.dialogList.forEach((asd, idx) => {
  1024. asd.message.forEach((qwe, inde) => {
  1025. qwe.isshow = false;
  1026. })
  1027. })
  1028. setTimeout(function() {
  1029. uni.hideLoading();
  1030. }, 2000);
  1031. }
  1032. } else {
  1033. uni.hideLoading();
  1034. uni.showModal({
  1035. title: '提示',
  1036. content: '请求数据失败,请重新尝试',
  1037. showCancel: false
  1038. });
  1039. }
  1040. },
  1041. fail(error) {
  1042. uni.hideLoading();
  1043. uni.showModal({
  1044. title: '提示',
  1045. content: '网络异常,请重新尝试',
  1046. showCancel: false
  1047. });
  1048. return false;
  1049. }
  1050. });
  1051. },
  1052. getTime(time) {
  1053. return util.formatSecond(time)
  1054. },
  1055. // 录音暂停播放
  1056. changePlayState() {
  1057. if (this.audioPlay == false) {
  1058. this.innerAudioContext.play();
  1059. } else {
  1060. this.innerAudioContext.pause()
  1061. }
  1062. },
  1063. //音频前进回退
  1064. sliderChangeComplate(e) {
  1065. const currTimeStr = this.formatTime(e.detail.value)
  1066. this.currentTimeStr = currTimeStr
  1067. this.innerAudioContext.seek(e.detail.value);
  1068. this.innerAudioContext.play();
  1069. },
  1070. //长按点击播放
  1071. clickbofang(dialog, item) {
  1072. this.innerAudioContext.pause()
  1073. this.dialogList.forEach(res => {
  1074. res.message.forEach(asd => {
  1075. asd.isshow = false;
  1076. })
  1077. })
  1078. this.$forceUpdate()
  1079. if (dialog == this.csdFileindex) {
  1080. let time = parseInt(item.bg / 1000)
  1081. const currTimeStr = this.formatTime(time)
  1082. this.currentTimeStr = currTimeStr
  1083. this.innerAudioContext.seek(time);
  1084. this.innerAudioContext.play();
  1085. return
  1086. } else {
  1087. let time = parseInt(item.bg / 1000)
  1088. this.innerAudioContext.destroy()
  1089. this.csdFileindex = dialog;
  1090. this.recordPath = this.luyinList[dialog].recordPath;
  1091. this.sliderMax = this.getTime(this.luyinList[dialog].recordDuration);
  1092. this.timeStr = this.getTime(this.luyinList[dialog].recordDuration);
  1093. this.date = this.luyinList[dialog].receptionTime;
  1094. this.creatAudio()
  1095. this.getCorpusAnalysis()
  1096. const currTimeStr = this.formatTime(time)
  1097. this.currentTimeStr = currTimeStr
  1098. this.innerAudioContext.seek(time);
  1099. this.innerAudioContext.play();
  1100. }
  1101. },
  1102. // 文件切换播放
  1103. filechange(item, i) {
  1104. this.num = i; //下拉起始位置
  1105. this.Bnum = i;
  1106. this.innerAudioContext.destroy();
  1107. this.csdFileindex = i;
  1108. this.recordPath = item.recordPath;
  1109. this.sliderMax = this.getTime(item.recordDuration);
  1110. this.timeStr = this.getTime(item.recordDuration);
  1111. this.date = item.receptionTime;
  1112. this.isshowFile = false;
  1113. this.creatAudio()
  1114. this.getCorpusAnalysis()
  1115. },
  1116. //录音实例
  1117. creatAudio() {
  1118. this.innerAudioContext = uni.createInnerAudioContext();
  1119. // if(uni.getStorageSync('entrance')==1){
  1120. this.innerAudioContext.autoplay = false;
  1121. // }else{
  1122. // this.innerAudioContext.autoplay = true;
  1123. // }
  1124. this.innerAudioContext.src = this.recordPath;
  1125. this.innerAudioContext.title = '音频';
  1126. this.onPlay()
  1127. this.onPause()
  1128. this.onCanplay()
  1129. this.onEnded()
  1130. this.onSeeking()
  1131. this.onSeeked()
  1132. this.TimeUpdate()
  1133. },
  1134. // 自动播放下一个文件
  1135. qeihuanwenjian() {
  1136. let index = this.csdFileindex + 1;
  1137. if (index < this.luyinList.length) {
  1138. this.csdFileindex = index;
  1139. this.getCorpusAnalysis()
  1140. let item = this.luyinList[this.csdFileindex];
  1141. let i = this.csdFileindex;
  1142. this.filechange(item, i)
  1143. }
  1144. },
  1145. formatTime(num) {
  1146. //格式化时间格式
  1147. num = num.toFixed(0);
  1148. let second = num % 60;
  1149. if (second < 10) second = '0' + second;
  1150. let min = Math.floor(num / 60);
  1151. if (min < 10) min = '0' + min;
  1152. return min + ":" + second;
  1153. },
  1154. changeEditing() {
  1155. this.dialogList.forEach(res => {
  1156. res.message.forEach(asd => {
  1157. asd.isshow = false;
  1158. })
  1159. })
  1160. }
  1161. },
  1162. }
  1163. </script>
  1164. <style lang="scss" scoped>
  1165. .ffectivetext {
  1166. width: 85%;
  1167. margin: 10rpx auto;
  1168. height: 100rpx;
  1169. padding: 20rpx;
  1170. border: 1rpx solid #E4F0FF;
  1171. }
  1172. .biaoqiantom {
  1173. background-color: #008EF2;
  1174. color: #FFFFFF;
  1175. border: none;
  1176. }
  1177. // 表单
  1178. .tian-view {
  1179. width: 570upx;
  1180. background-color: #FFFFFF;
  1181. border-bottom: 1px solid #ededee;
  1182. display: flex;
  1183. min-height: 96rpx;
  1184. .tian-view-t1 {
  1185. width: 20rpx;
  1186. font-size: 34rpx;
  1187. height: 34rpx;
  1188. line-height: 110rpx;
  1189. letter-spacing: 0px;
  1190. color: red;
  1191. }
  1192. .tian-view-t2 {
  1193. width: 30%;
  1194. min-height: 96rpx;
  1195. line-height: 96rpx;
  1196. font-size: 34rpx;
  1197. color: #333;
  1198. }
  1199. .tian-view-t3 {
  1200. width: 61%;
  1201. padding-top: 31rpx;
  1202. padding-bottom: 31rpx;
  1203. display: flex;
  1204. .tian-input {
  1205. width: 98%;
  1206. font-size: 34rpx;
  1207. border: none;
  1208. }
  1209. }
  1210. }
  1211. .zhezhoa {
  1212. position: fixed;
  1213. top: 0;
  1214. left: 0;
  1215. z-index: 999;
  1216. width: 100%;
  1217. height: 100vh;
  1218. opacity: 0.5;
  1219. background-color: #666666;
  1220. }
  1221. .bounced {
  1222. width: 570upx;
  1223. background: #FFFFFF;
  1224. z-index: 1000;
  1225. border-radius: 10upx;
  1226. position: fixed;
  1227. left: 50%;
  1228. top: 50%;
  1229. transform: translate(-50%, -50%);
  1230. /* 50%为自身尺寸的一半 */
  1231. .jiajinghuatit {
  1232. width: 100%;
  1233. height: 68rpx;
  1234. font-size: 30rpx;
  1235. text-align: center;
  1236. line-height: 68rpx;
  1237. }
  1238. .jiajinghuaview {
  1239. padding: 18rpx 18rpx 18rpx 18rpx;
  1240. display: flex;
  1241. flex-wrap: wrap;
  1242. .jiajinghuaview1 {
  1243. padding: 8rpx 8rpx 8rpx 8rpx;
  1244. font-size: 26rpx;
  1245. border-radius: 12rpx;
  1246. border: 1px solid #979797;
  1247. margin-left: 8rpx;
  1248. }
  1249. .jighuaview2 {
  1250. padding: 8rpx 18rpx 8rpx 18rpx;
  1251. font-size: 26rpx;
  1252. border-radius: 12rpx;
  1253. border: 1px solid #979797;
  1254. margin-left: 20rpx;
  1255. margin-top: 10rpx;
  1256. display: flex;
  1257. .view1-text {
  1258. text-align: center;
  1259. }
  1260. .view1-img {
  1261. width: 50rpx;
  1262. }
  1263. }
  1264. }
  1265. .bounced3 {
  1266. height: 100upx;
  1267. width: 100%;
  1268. margin-top: 40upx;
  1269. border-top: 1px solid #dddddd;
  1270. display: flex;
  1271. }
  1272. .bounced3-1 {
  1273. width: 50%;
  1274. height: 100%;
  1275. text-align: center;
  1276. line-height: 100upx;
  1277. border-right: 1px solid #dddddd;
  1278. font-size: 36upx;
  1279. color: #999999;
  1280. }
  1281. .bounced3-2 {
  1282. width: 50%;
  1283. height: 100%;
  1284. text-align: center;
  1285. line-height: 100upx;
  1286. font-size: 36upx;
  1287. color: #108ee9;
  1288. }
  1289. }
  1290. .translation {
  1291. padding-left: 30rpx;
  1292. padding-right: 30rpx;
  1293. background: #FFFFFF;
  1294. display: flex;
  1295. flex-direction: column;
  1296. height: 100vh;
  1297. }
  1298. .translation .top {
  1299. margin: 0 -30upx;
  1300. padding: 0 30upx;
  1301. background: #ffffff;
  1302. border-bottom: 1rpx solid #F2F2F2;
  1303. padding-bottom: 10rpx;
  1304. }
  1305. .translation .top .title {
  1306. display: flex;
  1307. justify-content: space-between;
  1308. .hash {
  1309. color: rgba(21, 144, 233, 1);
  1310. font-size: 24upx;
  1311. }
  1312. }
  1313. .call_record_time {
  1314. height: 44rpx;
  1315. font-size: 28rpx;
  1316. font-weight: 600;
  1317. color: #008EF2;
  1318. line-height: 44rpx;
  1319. }
  1320. .call_record_time_one {
  1321. height: 48rpx;
  1322. font-size: 24rpx;
  1323. font-weight: 500;
  1324. color: #70798d;
  1325. line-height: 48rpx;
  1326. display: flex;
  1327. justify-content: space-between;
  1328. position: relative;
  1329. .audoioyouxiao {
  1330. height: 46rpx;
  1331. position: absolute;
  1332. top: 0rpx;
  1333. right: 140rpx;
  1334. font-size: 30rpx;
  1335. }
  1336. .diangweitupian {
  1337. width: 46rpx;
  1338. height: 46rpx;
  1339. position: absolute;
  1340. top: 0rpx;
  1341. right: 75rpx;
  1342. }
  1343. .file-change {
  1344. position: absolute;
  1345. top: 50rpx;
  1346. right: 0rpx;
  1347. width: 184rpx;
  1348. background: #FFFFFF;
  1349. box-shadow: 0rpx 0rpx 6rpx 2rpx rgba(230, 230, 230, 0.5);
  1350. border-radius: 4rpx;
  1351. z-index: 99;
  1352. height: auto;
  1353. max-height: 600rpx;
  1354. overflow: auto;
  1355. }
  1356. .file-item {
  1357. width: 184rpx;
  1358. height: 60rpx;
  1359. line-height: 60rpx;
  1360. text-align: center;
  1361. font-size: 30rpx;
  1362. font-weight: 400;
  1363. color: #333333;
  1364. border-bottom: 1rpx solid #E2E2E2;
  1365. }
  1366. .file-item:last-child {
  1367. border: 0
  1368. }
  1369. .fileactive {
  1370. color: #008EF2
  1371. }
  1372. }
  1373. .audio-container {
  1374. width: 100%;
  1375. display: flex;
  1376. justify-content: space-between;
  1377. align-items: center;
  1378. .audio-head {
  1379. width: 60rpx;
  1380. height: 60rpx;
  1381. flex-shrink: 0;
  1382. }
  1383. .audio-head .image {
  1384. width: 100%;
  1385. height: 100%;
  1386. }
  1387. .audio-slider {
  1388. width: 96%;
  1389. position: relative;
  1390. padding: 2px 0rpx 0px 20px;
  1391. display: flex;
  1392. justify-content: space-between;
  1393. align-items: center;
  1394. }
  1395. .audio-slider .slider {
  1396. width: 100%;
  1397. padding: 0px 15rpx;
  1398. box-sizing: border-box;
  1399. }
  1400. .audio-time {
  1401. width: 110rpx;
  1402. text-align: right;
  1403. font-size: 24rpx;
  1404. line-height: 28rpx;
  1405. color: #70798D;
  1406. display: flex;
  1407. justify-content: space-between;
  1408. }
  1409. .audio-play {
  1410. width: 40rpx;
  1411. height: 40rpx;
  1412. flex-shrink: 0;
  1413. }
  1414. .audio-play .image {
  1415. width: 100%;
  1416. height: 100%;
  1417. }
  1418. }
  1419. .scroll-Y {
  1420. font-size: 36upx;
  1421. color: #999999;
  1422. background: #FFFFFF;
  1423. margin-top: 30upx;
  1424. flex: 1;
  1425. overflow-y: scroll;
  1426. width: 100%;
  1427. }
  1428. .scroll-Y .text {
  1429. margin: 50upx 30upx;
  1430. line-height: 80upx;
  1431. display: flex;
  1432. align-items: center;
  1433. }
  1434. .scroll-Y .text[data-speaker="2"],
  1435. .scroll-Y .text[data-speaker="4"],
  1436. .scroll-Y .text[data-speaker="6"] {
  1437. flex-direction: row-reverse;
  1438. text-align: right;
  1439. .content {
  1440. margin-left: 0;
  1441. margin-right: 30upx;
  1442. background: #F6F6F6;
  1443. color: #999999;
  1444. }
  1445. }
  1446. .scroll-Y .text .avatar {
  1447. width: 64upx;
  1448. height: 64upx;
  1449. line-height: 64upx;
  1450. text-align: center;
  1451. // border: 1rpx solid red;
  1452. font-size: 36rpx;
  1453. border-radius: 50%;
  1454. background: #F2F2F2;
  1455. color: #008EF2;
  1456. // display: flex;
  1457. // justify-content: center;
  1458. // align-items: center;
  1459. // image {
  1460. // width: 40upx;
  1461. // }
  1462. }
  1463. .scroll-Y .text .content {
  1464. margin-left: 30upx;
  1465. line-height: 60rpx;
  1466. text-align: left;
  1467. padding: 0 5px;
  1468. background: #2BC805;
  1469. border-radius: 8upx;
  1470. max-width: 442rpx;
  1471. color: #FFFFFF;
  1472. position: relative;
  1473. .tankuangcss {
  1474. position: absolute;
  1475. top: -140rpx;
  1476. left: -120rpx;
  1477. width: 308rpx;
  1478. height: 130rpx;
  1479. background-color: #333333;
  1480. font-size: 24rpx;
  1481. color: #FFFFFF;
  1482. padding-top: 4rpx;
  1483. padding-bottom: 4rpx;
  1484. display: flex;
  1485. flex-wrap: wrap;
  1486. border-radius: 15rpx;
  1487. z-index: 1000;
  1488. }
  1489. }
  1490. .scroll-Y .text.active .content {
  1491. color: #38FFF1;
  1492. position: relative;
  1493. }
  1494. .scroll-Y .text.active[data-speaker="2"] .content,
  1495. .scroll-Y .text.active[data-speaker="4"] .content,
  1496. .scroll-Y .text.active[data-speaker="6"] .content {
  1497. color: #FF7538;
  1498. position: relative;
  1499. }
  1500. .tab-box {
  1501. width: 100%;
  1502. display: flex;
  1503. justify-content: center;
  1504. align-items: center;
  1505. .yinpinshibie {
  1506. width: 156rpx;
  1507. height: 50rpx;
  1508. font-size: 36rpx;
  1509. font-weight: 400;
  1510. color: #333333;
  1511. text-align: center;
  1512. line-height: 50rpx;
  1513. letter-spacing: 2rpx;
  1514. margin-right: 188rpx;
  1515. &.active {
  1516. position: relative;
  1517. &::after {
  1518. position: absolute;
  1519. content: '';
  1520. width: 119rpx;
  1521. height: 8rpx;
  1522. background: #008EF2;
  1523. border-radius: 4rpx;
  1524. top: 50rpx;
  1525. right: 0;
  1526. left: 0;
  1527. margin: 0 auto;
  1528. }
  1529. }
  1530. }
  1531. .rate {
  1532. width: 156rpx;
  1533. height: 50rpx;
  1534. font-size: 36rpx;
  1535. font-weight: 400;
  1536. color: #333333;
  1537. line-height: 50rpx;
  1538. letter-spacing: 2rpx;
  1539. text-align: center;
  1540. &.active {
  1541. position: relative;
  1542. &::after {
  1543. position: absolute;
  1544. content: '';
  1545. width: 119rpx;
  1546. height: 8rpx;
  1547. background: #008EF2;
  1548. border-radius: 4rpx;
  1549. top: 50rpx;
  1550. right: 0;
  1551. left: 0;
  1552. margin: 0 auto;
  1553. }
  1554. }
  1555. }
  1556. }
  1557. .backTop {
  1558. width: 60upx;
  1559. height: 60upx;
  1560. background: rgba(211, 235, 253, 1);
  1561. box-shadow: 0upx 0upx 2upx 4upx rgba(38, 161, 255, 0.04);
  1562. border-radius: 50%;
  1563. position: fixed;
  1564. bottom: 200upx;
  1565. right: 8upx;
  1566. display: flex;
  1567. justify-content: center;
  1568. align-items: center;
  1569. image {
  1570. width: 26upx;
  1571. height: 34upx;
  1572. }
  1573. }
  1574. // 评分
  1575. .rate-box {
  1576. padding: 10rpx 20rpx;
  1577. .date {
  1578. width: 300rpx;
  1579. height: 33rpx;
  1580. font-size: 24rpx;
  1581. font-weight: 400;
  1582. color: #333333;
  1583. line-height: 33rpx;
  1584. letter-spacing: 1rpx;
  1585. margin-bottom: 8rpx;
  1586. }
  1587. .title {
  1588. width: 100%;
  1589. height: 42rpx;
  1590. font-size: 30rpx;
  1591. font-weight: 500;
  1592. color: #333333;
  1593. line-height: 42rpx;
  1594. letter-spacing: 2rpx;
  1595. margin-bottom: 20rpx;
  1596. }
  1597. .level1 {
  1598. display: flex;
  1599. align-items: center;
  1600. .level-name {
  1601. width: 104rpx;
  1602. height: 33rpx;
  1603. font-size: 24rpx;
  1604. font-weight: 500;
  1605. color: #333333;
  1606. line-height: 33rpx;
  1607. letter-spacing: 1rpx;
  1608. margin-right: 10rpx;
  1609. }
  1610. .level-progress {
  1611. flex: 1;
  1612. border-radius: 11rpx;
  1613. height: 21rpx;
  1614. background-color: #BEE4FF;
  1615. position: relative;
  1616. .color {
  1617. width: 0;
  1618. position: absolute;
  1619. top: 0;
  1620. left: 0;
  1621. height: 21rpx;
  1622. border-radius: 11rpx 0 0 11rpx;
  1623. background-color: #008EF2;
  1624. }
  1625. }
  1626. .level-rate {
  1627. width: 65rpx;
  1628. height: 33rpx;
  1629. font-size: 24rpx;
  1630. font-weight: 500;
  1631. color: #333333;
  1632. line-height: 33rpx;
  1633. letter-spacing: 1rpx;
  1634. margin: 0 20rpx 0 15rpx;
  1635. }
  1636. .arrow {
  1637. width: 37rpx;
  1638. height: 21rpx;
  1639. padding: 5rpx 20rpx;
  1640. }
  1641. .rotatearrow {
  1642. transform: rotate(270deg);
  1643. }
  1644. }
  1645. .level1-subbox {
  1646. display: flex;
  1647. margin-top: 20rpx;
  1648. flex-wrap: wrap;
  1649. .sub-name {
  1650. width: 50%;
  1651. display: flex;
  1652. margin-bottom: 18rpx;
  1653. .subitem-name {
  1654. width: 104rpx;
  1655. height: 33rpx;
  1656. font-size: 24rpx;
  1657. font-weight: 400;
  1658. color: #999999;
  1659. line-height: 33rpx;
  1660. letter-spacing: 1rpx;
  1661. margin-right: 12rpx;
  1662. }
  1663. .checkimg {
  1664. width: 27rpx;
  1665. height: 27rpx;
  1666. }
  1667. }
  1668. }
  1669. }
  1670. .dialog-block {
  1671. margin: 20rpx 0;
  1672. border-bottom: 1px solid #ccc;
  1673. .fileName {
  1674. text-align: center;
  1675. margin: 10rpx auto;
  1676. width: 115rpx;
  1677. height: 42rpx;
  1678. line-height: 42rpx;
  1679. background: #EFEFEF;
  1680. border-radius: 4rpx;
  1681. font-size: 20rpx;
  1682. font-weight: 400;
  1683. color: #333333;
  1684. }
  1685. }
  1686. </style>