details.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762
  1. <!-- 任务详情 -->
  2. <template>
  3. <s-layout
  4. class="task_details_page"
  5. title="任务详情"
  6. navbar="inner"
  7. :bgStyle="state.page"
  8. :navbarStyle="state.navigationBar"
  9. showBackButton
  10. :showExportButton="state.taskInfo.status===10"
  11. @export="handleExport"
  12. >
  13. <view class="task_cont">
  14. <scroll-view class="task_scroll" :scroll-y="!state.showIntentionSelect" @scrolltolower="scrolltolower">
  15. <view class="task_details">
  16. <view class="task_details_cont">
  17. <view class="top">
  18. <view class="name_box">
  19. <view class="name">{{state.taskInfo.name}} </view>
  20. <view class="time">{{formatDate(state.taskInfo.planTime,'YYYY-MM-DD HH:mm')}}</view>
  21. </view>
  22. <view class="verbal">{{state.taskInfo.typeName}}</view>
  23. </view>
  24. <view class="cont">
  25. <view class="detail_item">
  26. <view class="label">高意向数量</view>
  27. <view class="num">{{state.taskInfo.highIntentionCount}}</view>
  28. </view>
  29. <view class="detail_item">
  30. <view class="label">拨打数量</view>
  31. <view class="num">{{state.taskInfo.lingCount||0}}</view>
  32. </view>
  33. </view>
  34. <view class="bottom">
  35. <view class="detail_item">
  36. <view class="label">接通率:</view>
  37. <view class="num">{{((state.taskInfo.answerRate||0)*100).toFixed(2)*100/100}}%</view>
  38. </view>
  39. <view class="detail_item">
  40. <view class="label">未接通率:</view>
  41. <view class="num">{{((state.taskInfo.notAnswerRate||0)*100).toFixed(2)*100/100}}%</view>
  42. </view>
  43. <view class="detail_item">
  44. <view class="label">号码无效率:</view>
  45. <view class="num">{{((state.taskInfo.invalidRate||0)*100).toFixed(2)*100/100}}%</view>
  46. </view>
  47. </view>
  48. </view>
  49. </view>
  50. <s-empty v-if="state.pagination.total === 0&&state.loadStatus != 'loading'" icon="/static/order-empty.png" text="暂无记录" />
  51. <view v-else class="task_list">
  52. <view class="intention_select_vaule">
  53. <view class="select_vaule" @tap="state.showIntentionSelect=true;state.showIntentionNames=JSON.parse(JSON.stringify(state.intentionNames))">{{state.intentionNames.length?state.intentionNames.join(','):'全部意向'}}</view>
  54. </view>
  55. <view v-if="state.showIntentionSelect" class="intention_select">
  56. <view class="intention_select_bg">
  57. <view class="select_cont">
  58. <view class="select_vaule" @tap="state.showIntentionSelect=false">{{state.intentionNames.length?state.intentionNames.join(','):'全部意向'}}</view>
  59. <view class="intention_list">
  60. <view class="intention_item" :class="{'select_item':!state.intentionNames.length}" @tap="state.intentionNames=[]">全部意向</view>
  61. <view class="intention_item" :class="{'select_item':state.intentionNames.includes(item)}" v-for="(item, index) in state.intentionList" :key="index" @tap="onIntention(item)">{{item}}</view>
  62. </view>
  63. <view class="group_btn">
  64. <view class="cancel_btn" @tap="state.showIntentionSelect=false;state.intentionNames=JSON.parse(JSON.stringify(state.showIntentionNames))">取消</view>
  65. <view class="confirm_btn" @tap="onConfirm">确认</view>
  66. </view>
  67. </view>
  68. </view>
  69. </view>
  70. <view class="task_item" :class="{'show_down':item.showDown}" v-for="(item, index) in state.pagination.list" :key="index">
  71. <view class="task_title" @tap="onDown(item)">
  72. <view class="left">
  73. <view class="title">
  74. <view class="name">{{item.phone}}</view>
  75. <!-- <image v-if="item.callStatus===2" class="status_icon" src="/static/status_icon1.png"></image> -->
  76. <div v-if="item.intentionName" class="intention">{{item.intentionName}}</div>
  77. </view>
  78. <view v-if="item.callTime" class="time">{{formatDate(item.callTime)}}</view>
  79. </view>
  80. <view class="right">
  81. <image v-if="item.callStatus===2&&item.recordName" class="down_icon" src="/static/down_icon.png"></image>
  82. </view>
  83. </view>
  84. <div class="concern" v-if="!!item.concern">
  85. <div class="label">客户关注点:</div>
  86. <div class="concern_list">
  87. <div class="concern_item" v-for="(name,index) in item.concern.split(',')" :key="index">{{name}}</div>
  88. </div>
  89. </div>
  90. <view class="down_box">
  91. <view class="sound_play">
  92. <slider :value="item.currentTime" step="1" block-size="8" block-color="#24D688" backgroundColor="#BBDECF" activeColor="#24D688" min="0" :max="item.duration" @changing="sliderChanging($event,item,index)" />
  93. <view class="slider_time">
  94. <view class="play_time">{{Math.floor(item.currentTime/60)}}:{{Math.floor(item.currentTime%60)>=10?Math.floor(item.currentTime%60):'0'+Math.floor(item.currentTime%60)}}</view>
  95. <view class="total_time">{{Math.floor(item.duration/60)}}:{{item.duration%60>=10?item.duration%60:'0'+item.duration%60}}</view>
  96. </view>
  97. <view class="play_tool">
  98. <image class="play_tool_icon" src="/static/play_tool_icon1.png" @tap="changePlay(-15,item,index)"></image>
  99. <image v-if="item.isPlaying" class="play_tool_icon" src="/static/play_tool_icon4.png" @tap="pauseAudio"></image>
  100. <image v-else class="play_tool_icon" src="/static/play_tool_icon2.png" @tap="playAudio(item,index)"></image>
  101. <image class="play_tool_icon" src="/static/play_tool_icon3.png" @tap="changePlay(15,item,index)"></image>
  102. </view>
  103. </view>
  104. <!-- <view class="ai_analyse">
  105. <view class="label">AI分析:</view>
  106. <view class="cont">星光五菱,这个名宇一听就让人心生向往!最近在海吉星买水果的路上,偶遇一辆五菱新车,名为五这辆车真的是太酷了!两种类型可选,纯电和动,
  107. 满足不同的需求。后脸造型有气势,一看就知道不是普通的车</view>
  108. </view> -->
  109. </view>
  110. </view>
  111. <!-- 加载更多 -->
  112. <uni-load-more
  113. v-if="state.pagination.total > 0"
  114. :status="state.loadStatus"
  115. :content-text="{
  116. contentdown: '上拉加载更多',
  117. }"
  118. @tap="loadMore"
  119. />
  120. </view>
  121. </scroll-view>
  122. </view>
  123. </s-layout>
  124. </template>
  125. <script setup>
  126. import _ from 'lodash-es';
  127. import $helper from '@/common/helper';
  128. import { ref, computed, reactive } from 'vue';
  129. import { onShow, onLoad, onUnload, onPageScroll, onReachBottom, onPullDownRefresh } from '@dcloudio/uni-app';
  130. import sheep from '@/common';
  131. import taskApi from '@/common/api/member/task'
  132. import { formatDate, isWxBrowser } from '@/common/helper/utils'
  133. const state = reactive({
  134. navigationBar: {},
  135. page: {
  136. backgroundColor: '#FFFFFF',
  137. backgroundImage: '/static/homeTopBg.png'
  138. },
  139. pagination: {
  140. list: [],
  141. total: 0,
  142. page: 1,
  143. pageCount: 10,
  144. },
  145. sliderValue: 10,
  146. sliderMaxValue: 210,
  147. taskInfo: {},
  148. innerAudioContext: null,
  149. isPlaying: false,
  150. currentIndex: 0,
  151. intentionNames:[],
  152. showIntentionSelect:false,
  153. intentionList: [],
  154. showIntentionNames:[]
  155. })
  156. onShow(async () => {
  157. //onShow中获取列表,保证跳转后页面为最新状态
  158. await getTaskDetail(state.taskInfo.id);
  159. });
  160. onLoad((options) => {
  161. state.taskInfo.id = options.id
  162. getPhoneList()
  163. getIntentionList()
  164. })
  165. onUnload(()=>{
  166. if (state.innerAudioContext) {
  167. try {
  168. state.innerAudioContext.pause();
  169. state.innerAudioContext.destroy()
  170. state.innerAudioContext = null
  171. } catch (e) {
  172. //TODO handle the exception
  173. }
  174. }
  175. })
  176. async function handleExport(){
  177. if(isWxBrowser()){
  178. uni.showToast({
  179. title:'请在浏览器打开导出',
  180. icon: 'none'
  181. })
  182. }else{
  183. uni.showLoading({
  184. title:'导出中'
  185. })
  186. let res = await taskApi.phoneExport({
  187. intentionNames: state.intentionNames,
  188. taskId: state.taskInfo.id,
  189. page: state.pagination.page,
  190. pageCount: state.pagination.pageCount,
  191. })
  192. uni.hideLoading()
  193. const { code, data, msg } = res
  194. if (code === 1) {
  195. let url = 'https://wl-1306604067.cos.ap-guangzhou.myqcloud.com/' + data.filePyth
  196. let a = document.createElement('a')
  197. a.href = url
  198. a.download = data.filePyth.substr(data.filePyth.lastIndexOf('/') + 1)
  199. document.body.appendChild(a)
  200. a.click()
  201. } else {
  202. uni.showToast({
  203. title: msg,
  204. })
  205. }
  206. }
  207. }
  208. function onIntention(val){
  209. if(state.intentionNames.includes(val)){
  210. state.intentionNames = state.intentionNames.filter(item=>item!=val)
  211. }else{
  212. state.intentionNames.push(val)
  213. }
  214. }
  215. function onConfirm(){
  216. if (state.innerAudioContext) {
  217. try {
  218. state.innerAudioContext.pause()
  219. state.innerAudioContext.destroy()
  220. state.innerAudioContext = null
  221. state.currentIndex = 0
  222. } catch (e) {
  223. //TODO handle the exception
  224. }
  225. }
  226. state.pagination.list = []
  227. state.pagination.total = 0
  228. state.pagination.page = 1
  229. getPhoneList()
  230. state.showIntentionSelect=false
  231. }
  232. async function getTaskDetail(id) {
  233. let res = await taskApi.taskDetail(id)
  234. if (res.code === 1) {
  235. state.taskInfo = res.data
  236. } else {
  237. sheep.$router.back()
  238. }
  239. }
  240. async function getIntentionList () {
  241. let res = await taskApi.intentionList(state.taskInfo.id)
  242. let { data, code, msg } = res
  243. if (code === 1) {
  244. state.intentionList = data
  245. } else {
  246. uni.showToast({
  247. title: msg,
  248. icon: 'none'
  249. })
  250. }
  251. }
  252. async function getPhoneList () {
  253. state.loadStatus = 'loading'
  254. let response = await taskApi.phoneList({
  255. intentionNames: state.intentionNames,
  256. taskId: state.taskInfo.id,
  257. page: state.pagination.page,
  258. pageCount: state.pagination.pageCount,
  259. })
  260. let { data, code, msg } = response
  261. if (code === 1) {
  262. state.pagination.list = _.concat(state.pagination.list, data.records)
  263. state.pagination.total = data.total
  264. state.loadStatus = state.pagination.list.length < state.pagination.total ? 'more' : 'noMore';
  265. } else {
  266. uni.showToast({
  267. title: msg,
  268. icon: 'none'
  269. })
  270. }
  271. }
  272. function initAudio() {
  273. state.innerAudioContext = uni.createInnerAudioContext()
  274. // 监听事件
  275. state.innerAudioContext.onPlay(() => {
  276. state.pagination.list[state.currentIndex].isPlaying = true
  277. })
  278. state.innerAudioContext.onPause(() => {
  279. state.pagination.list[state.currentIndex].isPlaying = false
  280. })
  281. state.innerAudioContext.onTimeUpdate(() => {
  282. state.pagination.list[state.currentIndex].currentTime = state.innerAudioContext.currentTime
  283. })
  284. }
  285. function playAudio(item,index){
  286. if(!state.innerAudioContext){
  287. initAudio()
  288. }
  289. state.innerAudioContext.pause()
  290. state.pagination.list[state.currentIndex].isPlaying = false
  291. state.innerAudioContext.src = item.recordName
  292. if(item.currentTime){
  293. state.innerAudioContext.seek(item.currentTime>=item.duration?0:item.currentTime)
  294. }
  295. state.currentIndex = index
  296. state.innerAudioContext.play()
  297. }
  298. function pauseAudio(){
  299. state.innerAudioContext.pause()
  300. }
  301. function seekAudio(currentTime){
  302. state.innerAudioContext.seek(currentTime)
  303. state.innerAudioContext.play()
  304. }
  305. function onDown(item){
  306. if(item.callStatus===2){
  307. item.showDown=!item.showDown
  308. if(item.showDown){
  309. item.currentTime = item.currentTime||0
  310. }
  311. }
  312. }
  313. function sliderChanging(event,item,index){
  314. item.currentTime = event.detail.value
  315. if(item.isPlaying&&index===state.currentIndex){
  316. seekAudio(item.currentTime)
  317. }
  318. }
  319. function changePlay(val,item,index){
  320. let currentTime = item.currentTime + val
  321. if(currentTime<0){
  322. currentTime = 0
  323. }
  324. if(currentTime>item.duration){
  325. currentTime = item.duration
  326. }
  327. item.currentTime = currentTime
  328. if(item.isPlaying&&index===state.currentIndex){
  329. seekAudio(item.currentTime)
  330. }
  331. }
  332. // 加载更多
  333. function loadMore() {
  334. if (state.loadStatus === 'noMore') {
  335. return
  336. }
  337. state.pagination.page++
  338. getPhoneList()
  339. }
  340. // 上拉加载更多
  341. onReachBottom(() => {
  342. loadMore()
  343. })
  344. function scrolltolower(){
  345. loadMore()
  346. }
  347. // 下拉刷新
  348. onPullDownRefresh(() => {
  349. if (state.innerAudioContext) {
  350. try {
  351. state.innerAudioContext.pause();
  352. state.innerAudioContext.destroy()
  353. state.innerAudioContext = null
  354. state.currentIndex = 0
  355. } catch (e) {
  356. //TODO handle the exception
  357. }
  358. }
  359. state.pagination.list = []
  360. state.pagination.total = 0
  361. state.pagination.page = 1
  362. getPhoneList()
  363. setTimeout(function () {
  364. uni.stopPullDownRefresh()
  365. }, 800);
  366. });
  367. onPageScroll((e) => {});
  368. </script>
  369. <style lang="scss" scoped>
  370. .task_cont{
  371. flex: 1;
  372. overflow: hidden;
  373. .task_scroll{
  374. height: 100%;
  375. }
  376. }
  377. .task_details{
  378. padding-top: 20rpx;
  379. }
  380. .task_details_cont{
  381. width: 690rpx;
  382. margin: 0 auto;
  383. box-sizing: border-box;
  384. .top{
  385. margin-bottom:30rpx;
  386. .name_box{
  387. display: flex;
  388. justify-content: space-between;
  389. .name{
  390. font-weight: bold;
  391. font-size: 32rpx;
  392. color: #222222;
  393. line-height: 48rpx;
  394. flex: 1;
  395. margin-right: 20rpx;
  396. padding-bottom: 20rpx;
  397. }
  398. .time{
  399. font-weight: 400;
  400. font-size: 24rpx;
  401. color: #86B29F;
  402. line-height: 34rpx;
  403. }
  404. }
  405. .verbal{
  406. font-weight: 400;
  407. font-size: 28rpx;
  408. color: #666666;
  409. line-height:40rpx;
  410. }
  411. }
  412. .cont{
  413. display: flex;
  414. align-items: center;
  415. justify-content: space-between;
  416. gap:20rpx;
  417. .detail_item{
  418. flex: 1;
  419. display: flex;
  420. flex-direction: column;
  421. width: 336rpx;
  422. height: 152rpx;
  423. padding: 20rpx 30rpx;
  424. box-sizing: border-box;
  425. .num{
  426. margin-bottom: 10rpx;
  427. font-weight: bold;
  428. font-size: 40rpx;
  429. line-height: 48rpx;
  430. }
  431. .label{
  432. font-weight: 400;
  433. font-size: 24rpx;
  434. color: #666666;
  435. line-height: 34rpx;
  436. margin-bottom: 20rpx;
  437. }
  438. }
  439. .detail_item:nth-child(1){
  440. background: url('/static/num_bg1.png') no-repeat center/cover;
  441. .num{
  442. color: #FFA64E;
  443. }
  444. }
  445. .detail_item:nth-child(2){
  446. background: url('/static/num_bg2.png') no-repeat center/cover;
  447. .num{
  448. color: #24D688;
  449. }
  450. }
  451. }
  452. .bottom{
  453. display: flex;
  454. align-items: center;
  455. justify-content: space-between;
  456. padding: 20rpx 0;
  457. .detail_item{
  458. display: flex;
  459. align-items: center;
  460. flex: 1;
  461. font-size: 24rpx;
  462. line-height: 34rpx;
  463. .num{
  464. color: #222222;
  465. }
  466. .label{
  467. color: #666666;
  468. }
  469. }
  470. .detail_item:nth-child(1){
  471. .num{
  472. color: #1677FF;
  473. }
  474. }
  475. .detail_item:nth-child(2){
  476. .num{
  477. color: #FF4E4E;
  478. }
  479. }
  480. .detail_item:nth-child(3){
  481. .num{
  482. color: #CCCCCC;
  483. }
  484. }
  485. }
  486. }
  487. .task_list{
  488. min-height: calc(100% - 384rpx);
  489. padding-top: 30rpx;
  490. background: #FFFFFF;
  491. border-radius: 30rpx 30rpx 0 0;
  492. position: relative;
  493. box-sizing: border-box;
  494. .intention_select_vaule,
  495. .intention_select{
  496. padding: 0 30rpx;
  497. height: 50rpx;
  498. .select_vaule{
  499. display: inline-block;
  500. border-radius: 10rpx;
  501. font-weight: 500;
  502. font-size: 24rpx;
  503. color: #222222;
  504. min-width: 176rpx;
  505. max-width: 300rpx;
  506. height: 50rpx;
  507. line-height: 50rpx;
  508. padding: 0 48rpx 0 16rpx;
  509. box-sizing: border-box;
  510. cursor: pointer;
  511. white-space: nowrap; /* 防止文本换行 */
  512. overflow: hidden; /* 隐藏溢出的文本 */
  513. text-overflow: ellipsis; /* 显示省略符号来代表被修剪的文本 */
  514. }
  515. }
  516. .intention_select_vaule{
  517. padding-bottom: 30rpx;
  518. .select_vaule{
  519. background: #FAFAFA url('/static/down_icon@2x.png') no-repeat right 8rpx center/32rpx 32rpx;
  520. }
  521. }
  522. .intention_select{
  523. height: 100%;
  524. width: 100%;
  525. position: absolute;
  526. left: -30rpx;
  527. top: 0;
  528. z-index: 10;
  529. .select_vaule{
  530. background: #FAFAFA url('/static/up_icon@2x.png') no-repeat right 8rpx center/32rpx 32rpx;
  531. }
  532. .intention_select_bg{
  533. height: 100%;
  534. width: 100%;
  535. background: rgba(0, 0, 0, 0.4);
  536. border-radius: 30rpx 30rpx 0 0;
  537. overflow: hidden;
  538. }
  539. .select_cont{
  540. width: 100%;
  541. background: #FFFFFF;
  542. border-radius: 0 0 30rpx 30rpx;
  543. box-sizing: border-box;
  544. padding: 30rpx 0 0 0;
  545. .select_vaule{
  546. margin: 0 30rpx 16rpx;
  547. }
  548. .intention_list{
  549. display: flex;
  550. flex-wrap: wrap;
  551. gap: 30rpx 20rpx;
  552. padding: 14rpx 30rpx 60rpx;
  553. box-sizing: border-box;
  554. max-height: 400rpx;
  555. overflow-y: auto;
  556. .intention_item{
  557. padding: 0 32rpx;
  558. height: 58rpx;
  559. line-height: 58rpx;
  560. border-radius: 20rpx;
  561. border: 2rpx solid #F2F2F2;
  562. font-weight: 400;
  563. font-size: 24rpx;
  564. color: #222222;
  565. }
  566. .select_item{
  567. background: #EDFFF7;
  568. border: 2rpx solid #EDFFF7;
  569. color: #24D688;
  570. }
  571. }
  572. .group_btn{
  573. display: flex;
  574. align-items: center;
  575. .cancel_btn,
  576. .confirm_btn{
  577. flex: 1;
  578. height: 100rpx;
  579. line-height: 100rpx;
  580. text-align: center;
  581. font-weight: 400;
  582. font-size: 28rpx;
  583. }
  584. .cancel_btn{
  585. background: #F7F7F7;
  586. border-radius: 0rpx 0rpx 0rpx 30rpx;
  587. color: #222222;
  588. }
  589. .confirm_btn{
  590. background: #24D688;
  591. border-radius: 0rpx 0rpx 30rpx 0rpx;
  592. color: #FFFFFF;
  593. }
  594. }
  595. }
  596. }
  597. .task_item{
  598. padding: 30rpx 20rpx;
  599. width: 690rpx;
  600. background: #FAFAFA;
  601. border-radius: 30rpx;
  602. box-sizing: border-box;
  603. margin: 0 auto 30rpx;
  604. .task_title{
  605. display: flex;
  606. justify-content: space-between;
  607. align-items: center;
  608. padding: 0 10rpx;
  609. .left{
  610. .title{
  611. display: flex;
  612. align-items: center;
  613. .status_icon{
  614. width: 120rpx;
  615. height: 48rpx;
  616. }
  617. .name{
  618. font-weight: bold;
  619. font-size: 32rpx;
  620. color: #222222;
  621. line-height: 48rpx;
  622. text-overflow: ellipsis;
  623. overflow: hidden;
  624. white-space: nowrap;
  625. margin-right: 10rpx;
  626. }
  627. .intention{
  628. height: 48rpx;
  629. background: rgba(53, 232, 154, 0.5);
  630. border-radius: 24rpx;
  631. //font-weight: bold;
  632. font-size: 24rpx;
  633. color: #222222;
  634. line-height: 50rpx;
  635. padding: 0 24rpx;
  636. }
  637. }
  638. .time{
  639. font-weight: 400;
  640. font-size: 24rpx;
  641. color: #CCCCCC;
  642. line-height: 34rpx;
  643. margin-top: 10rpx;
  644. }
  645. }
  646. .right{
  647. .down_icon,
  648. .up_icon{
  649. width: 48rpx;
  650. height: 48rpx;
  651. }
  652. }
  653. }
  654. .concern{
  655. display: flex;
  656. align-items: flex-start;
  657. padding: 0 10rpx;
  658. padding-top: 20rpx;
  659. .label{
  660. font-weight: 400;
  661. font-size: 24rpx;
  662. color: #999999;
  663. height: 38rpx;
  664. line-height: 38rpx;
  665. margin-right: 10rpx;
  666. white-space: nowrap;
  667. }
  668. .concern_list{
  669. display: flex;
  670. flex-wrap: wrap;
  671. gap: 16rpx;
  672. .concern_item{
  673. height: 38rpx;
  674. line-height: 38rpx;
  675. padding: 0 16rpx;
  676. background: rgba(36,214,136,0.05);
  677. border-radius: 20rpx;
  678. border: 2rpx solid #24D688;
  679. box-sizing: border-box;
  680. font-weight: 400;
  681. font-size: 24rpx;
  682. color: #24D688;
  683. }
  684. }
  685. }
  686. .down_box{
  687. padding-top: 46rpx;
  688. display: none;
  689. .sound_play{
  690. :deep(uni-slider){
  691. margin: 0 8px;
  692. .uni-slider-handle-wrapper{
  693. height: 4rpx;
  694. border-radius: 4rpx;
  695. .uni-slider-tap-area{
  696. padding: 20rpx 0;
  697. }
  698. }
  699. }
  700. .slider_time{
  701. display: flex;
  702. justify-content: space-between;
  703. font-weight: 400;
  704. font-size: 20rpx;
  705. color: #CCCCCC;
  706. line-height: 30rpx;
  707. margin-bottom: 30rpx;
  708. }
  709. .play_tool{
  710. display: flex;
  711. justify-content: center;
  712. .play_tool_icon{
  713. width: 48rpx;
  714. height: 48rpx;
  715. margin: 0 30rpx;
  716. }
  717. }
  718. }
  719. .ai_analyse{
  720. width: 650rpx;
  721. background: #DFF7EC;
  722. border-radius: 30rpx;
  723. padding: 20rpx 20rpx 50rpx;
  724. box-sizing: border-box;
  725. margin-top: 30rpx;
  726. .label{
  727. font-weight: 500;
  728. font-size: 28rpx;
  729. color: #222222;
  730. line-height: 40rpx;
  731. margin-bottom: 16rpx;
  732. }
  733. .cont{
  734. font-weight: 400;
  735. font-size: 24rpx;
  736. color: #222222;
  737. line-height: 40rpx;
  738. }
  739. }
  740. }
  741. }
  742. .show_down{
  743. background: #EDFFF7;
  744. .down_box{
  745. display: block;
  746. }
  747. }
  748. }
  749. .show_slist{
  750. height: calc(100% - 322rpx);
  751. overflow: hidden;
  752. }
  753. </style>