You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

1491 lines
38 KiB

  1. <template>
  2. <view class="details">
  3. <!-- 头部违禁信息 -->
  4. <view class="header">
  5. <view class="h-box">
  6. <view class="h-b-top">
  7. <text class="name">{{ userlistobj.agentName || '' }}</text>
  8. <view class="status">
  9. <text class="pointer"></text>
  10. <text class="item">{{ userlistobj.violatedStatus | ViolatedStatus }}</text>
  11. </view>
  12. </view>
  13. <!-- 详细信息 -->
  14. <view class="h-b-btm">
  15. <view class="item">
  16. <image class="item-imgs" src="@/static/images/img/time.png" mode=""></image>
  17. {{ userlistobj.createTime || '' }}
  18. </view>
  19. <view class="item">
  20. <image class="item-imgs" src="@/static/images/img/voice.png" mode=""></image>
  21. {{ userlistobj.mm || '' }}m
  22. </view>
  23. <view class="item hit">
  24. <image class="item-imgs" src="@/static/images/img/hit.png" mode=""></image>
  25. {{ userlistobj.violatedFrequency || '0' }}
  26. </view>
  27. </view>
  28. </view>
  29. </view>
  30. <!-- tab选择框 -->
  31. <template v-if="isShowMerge">
  32. <u-tabs :list="list" :is-scroll="false" bg-color="transparent" :show-bar="false" :current="current"
  33. @change="change"></u-tabs>
  34. </template>
  35. <template v-if="current == 0">
  36. <scroll-view :scroll-top="scrollTop" lower-threshold='100px' @scrolltolower="ltolower()"
  37. upper-threshold='40px' @scrolltoupper="rolltoupper()" :scroll-into-view="scrollId" scroll-y="true"
  38. class="zhuti text scroll-Y">
  39. <!-- 聊天记录-->
  40. <view class="dialog-block" style="border-bottom: none;">
  41. <block v-for="(item,index) in findTabooWordsList" :key="index">
  42. <view class="text">
  43. <view class="avatar">
  44. <view :style="[SPEAKERSTYLE(item.speaker)]">
  45. <image v-if="item.isShow && item.isShow == 0" :src="Aimg" mode="widthFix"></image>
  46. <text v-else>{{ item.speaker | toCapital }}</text>
  47. </view>
  48. </view>
  49. <view class="contentInfo">
  50. <view class="info">
  51. <text class="AudioUserName">{{ item.speaker | toCapital }}</text>
  52. <text>{{conversionTiame(item.bg/1000)}}</text>
  53. </view>
  54. <view class="contentMain">
  55. <view class="content">
  56. <view v-html="item.onebest"></view>
  57. </view>
  58. <template v-if="isShowMerge">
  59. <image @click="clickbofang(0,item, 'show')" class="play"
  60. src="@/static/images/recordingManagement/play.png"></image>
  61. </template>
  62. </view>
  63. </view>
  64. </view>
  65. </block>
  66. </view>
  67. </scroll-view>
  68. </template>
  69. <template v-if="current == 1">
  70. <!-- 音频 -->
  71. <view class="audio">
  72. <!-- 标记顾问 -->
  73. <view class="headboxbott">
  74. <view class="headovfu">
  75. <u-tabs-swiper ref="tabs" font-size="30" :bold="true" swiper-width="600" :current="roleindex"
  76. @change="tapspagek()" inactive-color="#b1b1b1" active-color="#008ef2" :list="tablist"
  77. :is-scroll="true">
  78. </u-tabs-swiper>
  79. </view>
  80. <view v-if="permissions.bjgw" class="headpade">
  81. <view class="biaoji" @tap="tagtap()">标记</view>
  82. </view>
  83. </view>
  84. </view>
  85. <scroll-view :scroll-top="scrollTop" lower-threshold='100px' @scrolltolower="ltolower()"
  86. upper-threshold='40px' @scrolltoupper="rolltoupper()" :scroll-into-view="scrollId" scroll-y="true"
  87. class="zhuti text scroll-Y">
  88. <!-- 聊天记录-->
  89. <view class="dialog-block" v-for="(dialog,i) in dialogList" :key="i">
  90. <view :id="'dialog'+i" class="fileName">录音文件</view>
  91. <block v-for="(item,index) in dialog.message" :key="index">
  92. <view class="text" :id="'dialog'+csdFileindex+'text'+item.bg"
  93. :class="{active: item.bg < playNow && item.ed > playNow, reverse: Number(item.speaker) % 2 == 0}"
  94. :data-speaker="item.speaker">
  95. <view class="avatar">
  96. <view :style="[SPEAKERSTYLE(item.speaker)]">
  97. <image v-if="item.isShow == 0" :src="Aimg" mode="widthFix"></image>
  98. <text v-else>{{ item.speaker | toCapital }}</text>
  99. </view>
  100. </view>
  101. <view class="contentInfo">
  102. <view class="info">
  103. <text class="AudioUserName">{{ item.speaker | toCapital }}</text>
  104. <text>{{conversionTiame(item.bg/1000)}}</text>
  105. </view>
  106. <view class="contentMain">
  107. <view class="content">
  108. <view v-html="item.onebest"></view>
  109. </view>
  110. <image @click="clickbofang(dialog.backindex,item)" class="play"
  111. src="@/static/images/recordingManagement/play.png"></image>
  112. </view>
  113. </view>
  114. </view>
  115. </block>
  116. </view>
  117. </scroll-view>
  118. </template>
  119. <view class="bottombox">
  120. <!-- 播放块 -->
  121. <template v-if="current == 1">
  122. <view class="bottomhead">
  123. <view class="audio-play" @tap="changePlayState">
  124. <image class="image" mode="widthFix"
  125. :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'">
  126. </image>
  127. </view>
  128. <view class="audio-slider">
  129. <view class="audio-time">
  130. <text>{{currentTimeStr}}</text>
  131. </view>
  132. <slider class="slider" min="0" :max="sliderMax" @change="sliderChangeComplate" block-size="14"
  133. :value="sliderValue" activeColor="blue"></slider>
  134. <view class="audio-time">
  135. <text>{{timeStr}}</text>
  136. </view>
  137. </view>
  138. </view>
  139. </template>
  140. <template v-if="userlistobj.invalidViolatedCause">
  141. <view class="bottomtips">
  142. 无效原因:{{ userlistobj.invalidViolatedCause }}
  143. </view>
  144. </template>
  145. <view class="botbotmm">
  146. <view class="item" @click="preValid">上一条</view>
  147. <template v-if="isShowMerge">
  148. <template v-if="userlistobj.disposeStatus == 0">
  149. <view class="item" @click="setViolated(1)">确认有效</view>
  150. <view class="item" @tap="showTagValid">确认无效</view>
  151. </template>
  152. <template v-if="userlistobj.disposeStatus == 1 && userlistobj.violatedStatus == 1">
  153. <view class="item" @tap="showTagValid">无效</view>
  154. </template>
  155. <template v-if="userlistobj.disposeStatus == 1 && userlistobj.violatedStatus == 2">
  156. <view class="item" @click="setViolated(1)">确认有效</view>
  157. </template>
  158. </template>
  159. <view class="item" @click="nextValid">下一条</view>
  160. </view>
  161. </view>
  162. <!-- 标记顾问 -->
  163. <u-popup v-model="biojiisshow" mode="center">
  164. <view class="bounced">
  165. <view class="jiajinghuatit">标记为顾问</view>
  166. <view
  167. style="width: 95%;display: flex;flex-wrap: wrap;margin: 0 auto;padding-top: 30rpx;padding-bottom: 30rpx;">
  168. <view class="viewclace" :class="roleindexbiaoji == index ? 'bosdttom' : ''"
  169. @click="biaojixuanze(index)" v-for="(item,index) in tablist.slice(1,tablist.length)"
  170. :key="index">
  171. <view>{{item.name}}</view>
  172. </view>
  173. </view>
  174. <view class="bounced3" style="margin-top: 20rpx;">
  175. <view class="bounced3-1" @tap="unmarktap">取消</view>
  176. <view class="bounced3-2" @tap="Confirmthetag">确认</view>
  177. </view>
  178. </view>
  179. </u-popup>
  180. <!-- 标记无效原因 border-radius="16" -->
  181. <u-popup v-model="tagValidShow" mode="center">
  182. <view class="reason">
  183. <text class="resaon-title">无效原因</text>
  184. <view class="resaon-textbox">
  185. <textarea v-model="reasonSrc" placeholder="请输入无效原因" maxlength="60" />
  186. <text class="lastlength">{{ reasonSrc.length }}/60</text>
  187. </view>
  188. <view class="button">
  189. <text @click="inputDone">完成</text>
  190. </view>
  191. </view>
  192. </u-popup>
  193. </view>
  194. </template>
  195. <script>
  196. var util = require("@/utils/util.js");
  197. var config = require("@/config");
  198. export default {
  199. data() {
  200. return {
  201. Aimg: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAACqVBMVEUAAAD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/f3////9/f39/f3////////9/f3////////////9/f3////9/f39/f3////9/f3////////9/f3////9/f3////////////////9/f39/f3////////9/f39/f3////9/f39/f3////////9/f39/f3////////9/f39/f39/f3////////////////+/v7+/v7////+/v7////+/v7////+/v7+/v7////////+/v7+/v7////+/v7////+/v7////////////////////////////+/v7////+/v7////+/v7+/v7////////////+/v7////+/v7////+/v7+/v7////////+/v7////+/v7////////+/v7////////+/v7////+/v7+/v7+/v7////////+/v7+/v7////+/v7+/v7////+/v7////+/v7////+/v7////+/v7+/v7////+/v7+/v7////+/v7////+/v7////+/v7+/v7////+/v5jdC9iAAAA4nRSTlMAAQIDBAUGBwgLDA0ODxARExQVFhgbHB4fICEiIyQmJygpKy4wMTIzNDY3ODk6Oz0+P0BBQkRGR0lKTE5PUFFTVFVXWFlcXV9gYWJjZWZnaGlqa2xtbm9wcXJzdHV2d3h6e319foGBgoODh4mKiouMjI2QkZKSk5OUlpeYmZmam5ycnZ+foKGio6SmqKmpq6yur7CwsbGytba5uru8wMDBwcLCw8XGx8jJysrLzM7P0dLT1dXW1tfY2drc3N7f4OHh5Obm5+jp6uvs7vDx8vLz8/T09fX29/f4+fn6+vz8/f7+RVDt+wAAA55JREFUGBntwf9/1HMAB/DX7XYbuXWV1cyMoixfugrRGNXytW33pbVdJ83XkiMLSb4LJd/zZUi0SKT5FmGS77HUVaixnHP2+kt8vt3Zbp/3+7P3XR5+8XziP1E4uiYcrh1bjMNi6NzXumnoeX3eSOSrpHUv+zi0ogJ5qd3JLN1XuJGzwqW0sW4oclT0Im19XIqcuNdQ4D0vcnEDhdYgB2f+SbFZUHbEdkrsLYeqFko9CEVH7qJUohxqLqODO6BmLR18XwAVRQfpZDxUnExHjVBRR0eroGIZHX0AFe10tA8qdtNZIRR00VEPVLxLRzuh4jk62gIVy+joSaiI0tECqPDT0blQ4f6RDpI+KHmYDjZBzWQ6aIaibZSK+6BoOqViUOXqoER8BJSdlqJYFDm4h0LveJAD7+cUiFciJ1U/01aiGjk65zfaSF6EnE3azQEO1iAPFZuZZes45MUT3cM+emLFyNfwK3fQ8k1sFA6L0cElTzx9d1OVC/8bNG/gzY+GQaKk461gCQZr8iMHSNZD4nySv6wYj0EYFv2UhqcgcTsN70ePhtzER3+lJe6BxXP9jTctvrl1yS1jkLaNlkTbBR6IlF3dyT78sHh+oqkSlrJe/uOH1jGw4apem2I/1yLtGRo6kRZiP73t57mQxb+Z2dqRdikNtyLtBWb78Cz05bomyQH+KIGljIYaWNxxDtC72ouMgsdpZzosHhqqYDmFdraOQNpttHUfLKU0TITlKtra6IZpCu3tgMVPQx0sG2ivDqaVFDgOppk0LIbJm6C9DTB1UCAMU4SGZ2GqocAumL6jQBtMMRq2wLScAik3dMV/UWB/EQwrafgSpk6KlEJ3LIXOgGE9DQdgqKDQSdBNoNAiGL6i6SjowhSaAt1UCm2CzpOk6QTonqfQJdBdSKGkD5pKWqZCU7iHQtdB10KxWmjOpqUJmtMp9gB091LsIWiCtCyFZiHFXoZuHcW+hiZGy0vQvE2xT6DbTolKAI/R8hmA4SmKdUG3jxIhAG/QkigAZlAi6QJQTJk2AF1MGwXcRRkfgJGU2V8EHzP8wBeUqQQwllKTcCozpuFESk0AMJNSC3AxM8KYT6lpAFootRGLmLEQ6ynVCCBAqcSQ1cy4f8ghSs0HcMzvlKp+lRmvVFMqNQ6aaIoyd3Yy49vllOmuh+H4WZFIpFnTpJmjadTM1oQ1oVAgFNQENA0N9f01BIKh8OzGOU3NkbmXzwuV41/wNztgHKhu7WKTAAAAAElFTkSuQmCC",
  202. list: [{
  203. name: '违禁话术'
  204. }, {
  205. name: '音频识别'
  206. }],
  207. current: 0, // tab下表
  208. tablist: [], // 顾问标记列表
  209. roleindex: 0, // 选中顾问下标
  210. luyinList: [], // 录音文件
  211. newluyinList: [],
  212. dialogList: [], // 录音识别列表渲染数据
  213. permissions: {}, // 权限菜单
  214. biojiisshow: false, // 标记顾问弹窗
  215. textindex: 0, //下拉 转写文件下标
  216. toptextindex: 0, //上拉 转写文件下标
  217. dshfkjsdkksodofydwfkhwdfkjh: 0, // 顾问的id之类的
  218. status: 0, // 状态(不明白是什么状态)
  219. speaker: '', // 角色身份
  220. customerId: '', // 楼盘id吧(猜)
  221. infos: {}, // 音频内容
  222. stateisshow: '', //
  223. itemobj: {}, // 本地缓存的音频信息
  224. userlistobj: {}, // 获取到的顾问信息
  225. csdFileindex: 0, // 当前使用录音转写的下标
  226. // 录音信息
  227. innerAudioContext: null, // 音频对象
  228. currentTimeStr: "00:00", //当前进度的时间
  229. timeStr: "00:00", //总的时间
  230. recordPath: "", // 录音地址
  231. audioPlay: false, //当前的播放状态控制
  232. sliderValue: 0, //进度条最小值
  233. sliderMax: 0, //进度条最大值
  234. playNow: 0, // 当前播放时间
  235. audioType: false, // 音频是否自动播放状态
  236. scrollId: "", // 当前播放滚动到的位置
  237. tagValidShow: false, // 标记弹窗
  238. reasonSrc: '', // 标记无效的原因
  239. findTabooWordsList: [], // 违禁词列表
  240. nextPageObj: JSON.parse(uni.getStorageSync('nextPageObj')), // 当前页面筛选内容
  241. isMerge: 0, // 默认合并
  242. }
  243. },
  244. computed: {
  245. conversionTiame() {
  246. return (e) => {
  247. return this.getTime(e);
  248. }
  249. },
  250. // 是否为合并录音
  251. isShowMerge() {
  252. return this.isMerge == 0 ? true : false
  253. }
  254. },
  255. onLoad(option) {
  256. this.status = option.status;
  257. this.customerId = option.customerId;
  258. this.stateisshow = option.stateisshow;
  259. this.itemobj = uni.getStorageSync('searchobj');
  260. if (option.isMerge) this.isMerge = option.isMerge
  261. },
  262. onShow() {
  263. this.permissions = uni.getStorageSync('weapp_session_Menu_data') // 权限
  264. this.roleindex = 0;
  265. if (this.stateisshow == 2) {
  266. this.infos = this.itemobj;
  267. } else {
  268. var pages = getCurrentPages();
  269. var currPage = pages[pages.length - 1]; //当前页面
  270. this.infos = currPage.data.info;
  271. }
  272. this.initAudioFnc()
  273. this.gituserlist()
  274. this.findTabooWords()
  275. },
  276. onUnload() {
  277. //暂停
  278. this.innerAudioContext.pause()
  279. // 销毁
  280. this.innerAudioContext.destroy();
  281. },
  282. methods: {
  283. // 获取违禁词
  284. findTabooWords() {
  285. this.$u.get('/customer/findTabooWords', {
  286. customerId: this.customerId
  287. }).then(res => {
  288. let arr = []
  289. res.map(item => {
  290. if (item.transferContent) {
  291. item.transferContents = JSON.parse(item.transferContent)
  292. arr.push(item.transferContents)
  293. }
  294. })
  295. this.findTabooWordsList = arr
  296. console.log(this.findTabooWordsList, 'findTabooWordsList')
  297. })
  298. },
  299. // 确认无效标记 setViolatedStatus = 2
  300. inputDone() {
  301. if (!this.reasonSrc) {
  302. uni.showToast({
  303. title: '请输入标记无效的原因',
  304. icon: 'none',
  305. duration: 2000
  306. })
  307. return
  308. }
  309. this.setViolated(2)
  310. },
  311. // 下一条
  312. nextValid() {
  313. if (this.nextPageObj.pageSize < this.nextPageObj.num) {
  314. this.innerAudioContext.pause()
  315. this.nextPageObj.pageSize++
  316. this.keyWordsMatching(this.nextPageObj)
  317. } else {
  318. uni.showToast({
  319. title: '已经是最后一条了~',
  320. icon: 'none'
  321. })
  322. }
  323. },
  324. // 上一条
  325. preValid() {
  326. if (this.nextPageObj.pageSize == 1) {
  327. uni.showToast({
  328. title: '没有更早的了~'
  329. })
  330. } else {
  331. this.innerAudioContext.pause()
  332. this.nextPageObj.pageSize--
  333. this.keyWordsMatching(this.nextPageObj)
  334. }
  335. },
  336. // 获取违禁话术详情
  337. keyWordsMatching(params) {
  338. this.$u.post('/customer/findbynum', params).then(res => {
  339. this.customerId = res.results[0].id;
  340. this.current = 0
  341. uni.setStorageSync('nextPageObj', JSON.stringify(this.nextPageObj))
  342. this.resetAudioParams()
  343. this.prohibitedMatch()
  344. }).catch(e => {
  345. this.nextPageObj = JSON.parse(uni.getStorageSync('nextPageObj')), // 当前页面筛选内容
  346. uni.showToast({
  347. title: e.message,
  348. icon: 'none',
  349. duration: 2000
  350. })
  351. })
  352. },
  353. // 违禁词播放位置
  354. prohibitedMatch() {
  355. this.$u.post('/customer/prohibitedMatch', {
  356. customerId: this.customerId
  357. }).then(res => {
  358. let newweijin = res[0];
  359. newweijin.transferContent = JSON.parse(newweijin.transferContent)
  360. var item = {
  361. bg: newweijin.transferContent.bg,
  362. customerId: newweijin.corpusId,
  363. }
  364. // 获取是否有转写的音频
  365. this.$u.post("/corpus/findByPage", {
  366. pageNum: 1,
  367. pageSize: 100,
  368. query: {
  369. customerId: this.customerId,
  370. }
  371. }).then(res => {
  372. if (res == null) {
  373. uni.showToast({
  374. icon: "none",
  375. title: "暂无音频"
  376. })
  377. return
  378. } else {
  379. let newobj = res[0];
  380. this.isMerge = res[0].merge
  381. if (res[0].merge == 0) {
  382. this.infos = item
  383. this.itemobj = item
  384. uni.setStorageSync("searchobj", item); //写入缓存
  385. this.roleindex = 0;
  386. this.innerAudioContext.destroy()
  387. this.initAudioFnc()
  388. this.gituserlist()
  389. this.findTabooWords()
  390. } else {
  391. uni.showToast({
  392. icon: "none",
  393. title: "暂无音频"
  394. })
  395. }
  396. }
  397. })
  398. })
  399. },
  400. // 设置违禁状态
  401. setViolated(status) {
  402. let params = {
  403. customerId: this.customerId,
  404. violatedStatus: status,
  405. invalidViolatedCause: this.reasonSrc,
  406. }
  407. this.$u.post('/customer/setViolatedStatus', params).then(res => {
  408. this.tagValidShow = false
  409. uni.showToast({
  410. title: '标记成功',
  411. duration: 2000
  412. });
  413. this.initAudioFnc()
  414. this.gituserlist()
  415. setTimeout(() => {
  416. this.reasonSrc = ''
  417. }, 2000)
  418. }).catch(e => {
  419. this.tagValidShow = false
  420. uni.showToast({
  421. title: e.message,
  422. duration: 2000
  423. });
  424. })
  425. },
  426. // 展示确认无效原因输入框
  427. showTagValid() {
  428. this.tagValidShow = true
  429. },
  430. //获取用户信息
  431. gituserlist() {
  432. this.$u.get("/matchKeywords/personalReceptionRecord", {
  433. customerId: this.customerId
  434. }).then(res => {
  435. res.endTime1 = res.endTime.substring(0, 19);
  436. this.userlistobj = res;
  437. })
  438. },
  439. //标记顾问
  440. tagtap() {
  441. this.biojiisshow = !this.biojiisshow;
  442. },
  443. //取消标记
  444. unmarktap() {
  445. this.roleindexbiaoji = this.dshfkjsdkksodofydwfkhwdfkjh;
  446. },
  447. //确认标记
  448. Confirmthetag() {
  449. var num = this.roleindexbiaoji + 1;
  450. let params = {
  451. id: this.luyinList[this.csdFileindex].id,
  452. speaker: num,
  453. customerId: this.customerId
  454. }
  455. this.$u.get(config.service.markConsultant, params).then((data) => {
  456. this.biojiisshow = false;
  457. this.biaojiyuyi()
  458. this.fenjiaoseunfo()
  459. uni.showToast({
  460. title: '标记成功',
  461. duration: 2000
  462. });
  463. })
  464. },
  465. // 切换角色展示
  466. tapspagek(index) {
  467. this.roleindex = index;
  468. this.newluyinList = [];
  469. this.fenjiaoseunfo()
  470. this.$forceUpdate()
  471. },
  472. // 初始化音频以及页面数据
  473. init(info) {
  474. this.sliderMax = 0; //进度条最大值
  475. this.timeStr = "00:00"; //总的时间
  476. const parames = {
  477. pageNum: 1,
  478. pageSize: 100,
  479. query: {
  480. customerId: this.customerId
  481. }
  482. }
  483. this.$u.post("/corpus/findByPage", parames).then(res => {
  484. if (res && res.length) {
  485. let alltime = 1 + res[0].recordDuration;
  486. this.calibration = res[0].calibration;
  487. if (this.calibration == 0) {
  488. this.kehuyixiangcenterindex = 0;
  489. } else {
  490. this.kehuyixiangcenterindex = 1;
  491. }
  492. this.alltimeStr = this.getTime(alltime)
  493. if (info.bg != 0) {
  494. this.luyinList = res;
  495. this.recordPath = res[0].recordPath
  496. this.sliderMax = this.getTime(res[0].recordDuration)
  497. this.timeStr = this.getTime(res[0].recordDuration)
  498. this.date = res[0].receptionTime;
  499. this.getCorpusAnalysis(info);
  500. this.creatAudio()
  501. } else {
  502. this.luyinList = res;
  503. this.recordPath = res[0].recordPath
  504. this.sliderMax = this.getTime(res[0].recordDuration)
  505. this.timeStr = this.getTime(res[0].recordDuration)
  506. this.date = res[0].receptionTime;
  507. this.getCorpusAnalysis(info);
  508. this.creatAudio()
  509. }
  510. }
  511. })
  512. },
  513. // 重置进度条
  514. resetAudioParams() {
  515. this.timeStr = "00:00"; //总的时间
  516. this.currentTimeStr = "00:00" //当前进度的时间
  517. this.recordPath = "", // 录音地址
  518. this.audioPlay = false //当前的播放状态控制
  519. this.sliderValue = 0 //进度条最小值
  520. this.sliderMax = 0 //进度条最大值
  521. this.playNow = 0 // 当前播放时间
  522. this.scrollId = "" // 当前播放滚动到的位置
  523. },
  524. // 获取转义后的对话结果
  525. getCorpusAnalysis(info) {
  526. this.dialogList = [];
  527. this.newluyinList = []
  528. uni.request({
  529. url: config.service.getCorpusAnal + '?corpusId=' + this.luyinList[this.csdFileindex].id +
  530. "&bg=" + info.bg + "&speaker=" + this.roleindex, //仅为示例,并非真实接口地址。
  531. method: "GET",
  532. header: {
  533. 'content-type': 'application/json',
  534. 'Access-Token': uni.getStorageSync('weapp_session_login_data').token
  535. },
  536. success: (data) => {
  537. this.tablist = [];
  538. this.roleindexbiaoji = 0;
  539. let jsonInfo = JSON.parse(data.data.data.audioContent);
  540. for (var i = 0; i <= data.data.data.speakerNum; i++) {
  541. if (i === 0) {
  542. this.tablist.push({
  543. name: '全部'
  544. })
  545. } else {
  546. this.tablist.push({
  547. name: String.fromCharCode(i + 64)
  548. })
  549. }
  550. }
  551. if (data.data.data.speaker == null) {
  552. this.dshfkjsdkksodofydwfkhwdfkjh = 0;
  553. } else {
  554. this.tablist[data.data.data.speaker].name = this.tablist[data.data.data.speaker]
  555. .name + "顾问";
  556. this.roleindexbiaoji = data.data.data.speaker - 1;
  557. this.dshfkjsdkksodofydwfkhwdfkjh = data.data.data.speaker - 1;
  558. }
  559. this.speaker = data.data.data.speaker;
  560. //上拉标记点
  561. this.textindex = data.data.data.index;
  562. //下拉标记点
  563. this.toptextindex = data.data.data.index;
  564. jsonInfo.forEach(item => {
  565. item.message = JSON.parse(item.onebest)
  566. item.backindex = this.csdFileindex;
  567. if (info.onebest) {
  568. item.message.forEach(che => {
  569. if (che.onebest == info.onebest) {
  570. che.onebest =
  571. `<font style='color: red'>${che.onebest}</font>`;
  572. }
  573. })
  574. }
  575. })
  576. this.newluyinList = jsonInfo;
  577. this.dialogList.push(jsonInfo[this.textindex]);
  578. this.adasdasdasd(info)
  579. }
  580. })
  581. },
  582. //下一页
  583. ltolower() {
  584. var lengthcz = this.newluyinList.length - 1;
  585. if (this.textindex >= lengthcz) {
  586. uni.showToast({
  587. title: '到底了',
  588. duration: 2000
  589. });
  590. return
  591. } else {
  592. this.textindex = this.textindex + 1;
  593. this.newluyinList[this.textindex].message.forEach(item => {
  594. this.dialogList[0].message.push(item)
  595. })
  596. }
  597. },
  598. //上一页
  599. rolltoupper() {
  600. if (this.toptextindex == 0) {
  601. return
  602. } else {
  603. if (this.dialogList[0] == undefined) {
  604. return
  605. } else {
  606. this.toptextindex = this.toptextindex - 1;
  607. let reverselist = this.newluyinList[this.toptextindex].message;
  608. let runlist = reverselist.reverse();
  609. runlist.forEach(item => {
  610. this.dialogList[0].message.unshift(item)
  611. })
  612. }
  613. }
  614. },
  615. //搜索跳转
  616. adasdasdasd(e) {
  617. const currTimeStr = this.formatTime(parseInt(e.bg / 1000))
  618. this.currentTimeStr = currTimeStr
  619. this.innerAudioContext.seek(parseInt(e.bg / 1000));
  620. console.log('我在这里哦')
  621. if (this.current == 1) {
  622. this.innerAudioContext.play();
  623. } else {
  624. this.scrollId = "dialog" + this.csdFileindex + "text" + e.bg
  625. }
  626. },
  627. //分角色标记刷新
  628. fenjiaoseunfo() {
  629. var bgcd = this.sliderValue * 1000;
  630. this.newluyinList = [];
  631. this.dialogList = [];
  632. uni.request({
  633. url: config.service.getCorpusAnal + '?corpusId=' + this.luyinList[this.csdFileindex].id +
  634. "&bg=" + bgcd + "&speaker=" + this.roleindex, //仅为示例,并非真实接口地址。
  635. method: "GET",
  636. header: {
  637. 'content-type': 'application/json',
  638. 'Access-Token': uni.getStorageSync('weapp_session_login_data').token
  639. },
  640. success: (data) => {
  641. this.tablist = [];
  642. let jsonInfo = JSON.parse(data.data.data.audioContent);
  643. for (var i = 0; i <= data.data.data.speakerNum; i++) {
  644. if (i === 0) {
  645. this.tablist.push({
  646. name: '全部'
  647. })
  648. } else {
  649. this.tablist.push({
  650. name: String.fromCharCode(i + 64)
  651. })
  652. }
  653. }
  654. if (data.data.data.speaker == null) {
  655. this.roleindexbiaoji = 0;
  656. this.dshfkjsdkksodofydwfkhwdfkjh = 0;
  657. } else {
  658. this.tablist[data.data.data.speaker].name = this.tablist[data.data.data.speaker]
  659. .name + "顾问";
  660. this.roleindexbiaoji = data.data.data.speaker - 1;
  661. this.dshfkjsdkksodofydwfkhwdfkjh = data.data.data.speaker - 1;
  662. }
  663. if (this.roleindex > this.tablist.length - 1) {
  664. this.roleindex = this.tablist.length - 1
  665. this.fenjiaoseunfo()
  666. }
  667. this.speaker = data.data.data.speaker;
  668. //上拉标记点
  669. this.textindex = data.data.data.index;
  670. //下拉标记点
  671. this.toptextindex = data.data.data.index;
  672. jsonInfo.forEach(item => {
  673. item.message = JSON.parse(item.onebest)
  674. item.backindex = this.csdFileindex
  675. })
  676. console.log(jsonInfo)
  677. this.newluyinList = jsonInfo;
  678. if (this.textindex == null) {
  679. return
  680. } else {
  681. this.dialogList.push(jsonInfo[this.textindex]);
  682. }
  683. }
  684. })
  685. },
  686. // 选中下标
  687. change(index) {
  688. console.log(index)
  689. this.current = index;
  690. },
  691. // 录音暂停播放
  692. changePlayState() {
  693. if (this.audioPlay == false) {
  694. this.innerAudioContext.play();
  695. } else {
  696. this.innerAudioContext.pause()
  697. }
  698. },
  699. // 初始化音频方法
  700. initAudioFnc(inits) {
  701. this.innerAudioContext = uni.createInnerAudioContext();
  702. this.innerAudioContext.autoplay = false;
  703. this.innerAudioContext.title = '音频';
  704. this.onPlay()
  705. this.onPause()
  706. this.onCanplay()
  707. this.onEnded()
  708. this.onSeeking()
  709. this.onSeeked()
  710. this.TimeUpdate()
  711. this.init(this.infos)
  712. },
  713. //长按点击播放
  714. clickbofang(dialog, item, type) {
  715. if (type == 'show') {
  716. this.current = 1
  717. this.infos = item
  718. this.audioType = true
  719. this.init(this.infos)
  720. return
  721. } else {
  722. this.audioType = false
  723. }
  724. this.innerAudioContext.pause()
  725. this.dialogList.forEach(res => {
  726. res.message.forEach(asd => {
  727. asd.isshow = false;
  728. })
  729. })
  730. this.$forceUpdate()
  731. let platetime = item.bg;
  732. let newtime = item.bg / 1000;
  733. console.log(newtime, 'newTime')
  734. this.dialogList = []
  735. uni.request({
  736. url: config.service.fastForward + '?corpusId=' + this.luyinList[this.csdFileindex].id +
  737. "&bg=" + platetime, //仅为示例,并非真实接口地址。
  738. method: "GET",
  739. header: {
  740. 'content-type': 'application/json',
  741. 'Access-Token': uni.getStorageSync('weapp_session_login_data').token
  742. },
  743. success: (data) => {
  744. this.textindex = data.data.data.index;
  745. this.toptextindex = data.data.data.index;
  746. this.dialogList.push(this.newluyinList[data.data.data.index])
  747. const currTimeStr = this.formatTime(newtime)
  748. console.log(currTimeStr, 'currTimeStr')
  749. this.currentTimeStr = currTimeStr
  750. this.innerAudioContext.seek(newtime);
  751. this.innerAudioContext.play();
  752. }
  753. })
  754. },
  755. //录音实例
  756. creatAudio() {
  757. this.innerAudioContext = uni.createInnerAudioContext();
  758. this.innerAudioContext.autoplay = false;
  759. this.innerAudioContext.src = this.recordPath;
  760. this.innerAudioContext.title = '音频';
  761. this.onPlay()
  762. this.onPause()
  763. this.onCanplay()
  764. this.onEnded()
  765. this.onSeeking()
  766. this.onSeeked()
  767. this.TimeUpdate()
  768. },
  769. onPlay() {
  770. this.innerAudioContext.onPlay(() => {
  771. // 播放监听
  772. console.log('播放!');
  773. this.audioPlay = true;
  774. wx.enableAlertBeforeUnload({
  775. message: "是否确认退出详情页面?",
  776. success: function(res) {
  777. console.log("方法注册成功:", res);
  778. },
  779. fail: function(errMsg) {
  780. console.log("方法注册失败:", errMsg);
  781. },
  782. });
  783. });
  784. },
  785. onPause() {
  786. this.innerAudioContext.onPause(() => {
  787. wx.disableAlertBeforeUnload({
  788. success: function(res) {
  789. console.log(res)
  790. },
  791. fail: function(e) {
  792. console.log(e)
  793. }
  794. });
  795. // 暂停监听
  796. console.log('暂停播放!');
  797. this.audioPlay = false
  798. });
  799. },
  800. onCanplay() {
  801. this.innerAudioContext.onCanplay((callback) => {
  802. console.log("缓冲回调", this.innerAudioContext.duration);
  803. })
  804. },
  805. onEnded() {
  806. this.innerAudioContext.onEnded(() => {
  807. // 结束播放监听
  808. console.log('播放结束!');
  809. this.audioPlay = false;
  810. });
  811. },
  812. onSeeking() {
  813. this.innerAudioContext.onSeeking((res) => {
  814. console.log("进行跳转", res);
  815. })
  816. },
  817. onSeeked() {
  818. this.innerAudioContext.onSeeked((res) => {
  819. console.log("结束跳转", res);
  820. this.$forceUpdate()
  821. });
  822. },
  823. TimeUpdate() {
  824. this.innerAudioContext.onTimeUpdate(() => {
  825. const {
  826. currentTime,
  827. duration
  828. } = this.innerAudioContext;
  829. this.playNow = parseInt(currentTime * 1000)
  830. if (this.dialogList.length == 0) {
  831. return
  832. } else {
  833. const message = this.dialogList[0].message;
  834. for (let i = 0; i < message.length; i++) {
  835. if (Number(message[i].bg) < this.playNow && Number(message[i].ed) > this.playNow) {
  836. this.scrollId = "dialog" + this.csdFileindex + "text" + message[i].bg;
  837. break;
  838. }
  839. }
  840. }
  841. const currTimeStr = this.formatTime(currentTime);
  842. this.sliderValue = parseInt(currentTime);
  843. // 变动的时间
  844. this.currentTimeStr = currTimeStr;
  845. //进度条最大值
  846. this.sliderMax = this.luyinList[this.csdFileindex].recordDuration;
  847. this.$forceUpdate()
  848. });
  849. },
  850. //音频前进回退
  851. sliderChangeComplate(e) {
  852. let platetime = e.detail.value * 1000;
  853. this.dialogList = []
  854. uni.request({
  855. url: config.service.fastForward + '?corpusId=' + this.luyinList[this.csdFileindex].id +
  856. "&bg=" + platetime, //仅为示例,并非真实接口地址。
  857. method: "GET",
  858. header: {
  859. 'content-type': 'application/json',
  860. 'Access-Token': uni.getStorageSync('weapp_session_login_data').token
  861. },
  862. success: (data) => {
  863. this.textindex = data.data.data.index;
  864. this.toptextindex = data.data.data.index;
  865. if (data.data.data.index > this.newluyinList.length) {
  866. this.dialogList.push(this.newluyinList[0])
  867. } else {
  868. this.dialogList.push(this.newluyinList[data.data.data.index])
  869. }
  870. const currTimeStr = this.formatTime(e.detail.value)
  871. this.currentTimeStr = currTimeStr
  872. this.innerAudioContext.seek(e.detail.value);
  873. this.innerAudioContext.play();
  874. }
  875. })
  876. },
  877. // 格式化时间
  878. getTime(time) {
  879. return util.formatSecond(time)
  880. },
  881. // 格式化时间
  882. formatTime(num) {
  883. //格式化时间格式
  884. num = num.toFixed(0);
  885. let second = num % 60;
  886. if (second < 10) second = '0' + second;
  887. let min = Math.floor(num / 60);
  888. if (min < 10) min = '0' + min;
  889. return min + ":" + second;
  890. },
  891. },
  892. filters: {
  893. // violatedStatus
  894. ViolatedStatus(status) {
  895. let str = '';
  896. switch (status) {
  897. case 0:
  898. str = '待处理'
  899. break;
  900. case 1:
  901. str = '有效违禁'
  902. break;
  903. case 2:
  904. str = '无效违禁'
  905. break;
  906. }
  907. return str
  908. },
  909. // 处理状态
  910. DisposeStatus(status) {
  911. let str = '';
  912. switch (status) {
  913. case 0:
  914. str = '待处理'
  915. break;
  916. case 1:
  917. str = '有效违禁'
  918. break;
  919. case 2:
  920. str = '无效违禁'
  921. break;
  922. }
  923. return str
  924. },
  925. }
  926. }
  927. </script>
  928. <style lang="scss" scoped>
  929. .details {
  930. width: 100vw;
  931. height: calc(100vh - var(--window-top));
  932. display: flex;
  933. flex-direction: column;
  934. .header {
  935. padding: 20rpx;
  936. width: 100%;
  937. height: 210rpx;
  938. .h-box {
  939. padding: 0 16rpx;
  940. width: 100%;
  941. height: 100%;
  942. background: #fff;
  943. border-radius: 16rpx;
  944. .h-b-top {
  945. padding: 20rpx 0;
  946. display: flex;
  947. align-items: center;
  948. justify-content: space-between;
  949. .name {
  950. font-size: 30rpx;
  951. font-weight: bold;
  952. }
  953. .status {
  954. display: flex;
  955. align-items: center;
  956. .pointer {
  957. margin: 0 .5em;
  958. width: 12rpx;
  959. height: 12rpx;
  960. border-radius: 50%;
  961. background: #2671E2;
  962. }
  963. }
  964. }
  965. .h-b-btm {
  966. display: flex;
  967. justify-content: space-between;
  968. .item {
  969. flex-shrink: 0;
  970. display: flex;
  971. align-items: center;
  972. &.hit {
  973. color: #E7483C;
  974. font-size: bold;
  975. }
  976. .item-imgs {
  977. margin-right: .5em;
  978. width: 32rpx;
  979. height: 32rpx;
  980. }
  981. }
  982. }
  983. }
  984. }
  985. .audio {
  986. .headboxbott {
  987. width: 100%;
  988. height: 88rpx;
  989. display: flex;
  990. align-items: center;
  991. .headovfu {
  992. flex: 1;
  993. height: 88rpx;
  994. overflow: hidden;
  995. }
  996. .headpade {
  997. width: 160rpx;
  998. height: 60rpx;
  999. display: flex;
  1000. justify-content: center;
  1001. align-items: center;
  1002. border-left: 1px solid #D6D6D6;
  1003. .biaoji {
  1004. min-width: 120rpx;
  1005. height: 48rpx;
  1006. background: #E6625B;
  1007. border-radius: 24rpx;
  1008. text-align: center;
  1009. line-height: 48rpx;
  1010. color: #FFFFFF;
  1011. font-size: 26rpx;
  1012. }
  1013. }
  1014. }
  1015. }
  1016. .scroll-Y {
  1017. flex: 1;
  1018. overflow: auto;
  1019. font-size: 36upx;
  1020. color: #999999;
  1021. background: #FFFFFF;
  1022. margin-top: 30upx;
  1023. overflow-y: scroll;
  1024. width: 100%;
  1025. .dialog-block {
  1026. margin: 20rpx 0;
  1027. border-bottom: 1px solid #ccc;
  1028. .fileName {
  1029. text-align: center;
  1030. margin: 10rpx auto;
  1031. width: 115rpx;
  1032. height: 42rpx;
  1033. line-height: 42rpx;
  1034. background: #EFEFEF;
  1035. border-radius: 4rpx;
  1036. font-size: 20rpx;
  1037. font-weight: 400;
  1038. color: #333333;
  1039. }
  1040. }
  1041. .text {
  1042. margin: 50upx 30upx;
  1043. line-height: 80upx;
  1044. display: flex;
  1045. align-items: center;
  1046. .avatar {
  1047. width: 64upx;
  1048. height: 64upx;
  1049. line-height: 64upx;
  1050. text-align: center;
  1051. font-size: 36rpx;
  1052. border-radius: 50%;
  1053. background: #F2F2F2;
  1054. color: #008EF2;
  1055. image {
  1056. width: 40upx;
  1057. }
  1058. }
  1059. .content {
  1060. margin-left: 30upx;
  1061. line-height: 60rpx;
  1062. text-align: left;
  1063. padding: 0 5px;
  1064. background: #2BC805;
  1065. border-radius: 8upx;
  1066. max-width: 442rpx;
  1067. color: #FFFFFF;
  1068. position: relative;
  1069. .tankuangcss {
  1070. position: absolute;
  1071. top: -140rpx;
  1072. left: -120rpx;
  1073. width: 308rpx;
  1074. height: 130rpx;
  1075. background-color: #333333;
  1076. font-size: 24rpx;
  1077. color: #FFFFFF;
  1078. padding-top: 4rpx;
  1079. padding-bottom: 4rpx;
  1080. display: flex;
  1081. flex-wrap: wrap;
  1082. border-radius: 15rpx;
  1083. z-index: 1000;
  1084. }
  1085. .bottoms {
  1086. top: unset;
  1087. bottom: -140rpx;
  1088. }
  1089. }
  1090. .contentInfo {
  1091. .info {
  1092. color: #ccc;
  1093. font-size: 18rpx;
  1094. font-size: 30rpx;
  1095. padding: 0 28rpx;
  1096. .AudioUserName {
  1097. margin-right: 20rpx;
  1098. }
  1099. }
  1100. }
  1101. .contentMain {
  1102. display: flex;
  1103. .content {
  1104. margin-left: 0;
  1105. margin-right: 30upx;
  1106. }
  1107. .play {
  1108. width: 50rpx;
  1109. height: 50rpx;
  1110. margin-right: 20rpx;
  1111. }
  1112. }
  1113. &.active {
  1114. .content {
  1115. color: #FF7538 !important;
  1116. position: relative;
  1117. }
  1118. }
  1119. &.reverse {
  1120. flex-direction: row-reverse;
  1121. text-align: right;
  1122. .content {
  1123. margin-left: 0;
  1124. margin-right: 30upx;
  1125. background: #F6F6F6;
  1126. color: #999999;
  1127. }
  1128. .contentInfo {
  1129. .info {
  1130. color: #ccc;
  1131. font-size: 18rpx;
  1132. font-size: 30rpx;
  1133. padding: 0 28rpx;
  1134. display: flex;
  1135. flex-direction: row-reverse;
  1136. .AudioUserName {
  1137. margin-left: 10rpx;
  1138. }
  1139. }
  1140. .contentMain {
  1141. display: flex;
  1142. flex-direction: row-reverse;
  1143. align-items: center;
  1144. .content {
  1145. margin-left: 0;
  1146. margin-right: 30upx;
  1147. }
  1148. .play {
  1149. width: 50rpx;
  1150. height: 50rpx;
  1151. margin-right: 20rpx;
  1152. }
  1153. }
  1154. }
  1155. }
  1156. }
  1157. }
  1158. .bottombox {
  1159. width: 100%;
  1160. min-height: 88rpx;
  1161. .bottomhead {
  1162. width: 100%;
  1163. height: 81rpx;
  1164. border-top: 1px solid #E0E0E0;
  1165. border-bottom: 1px solid #E0E0E0;
  1166. display: flex;
  1167. justify-content: space-between;
  1168. align-items: center;
  1169. .audio-slider {
  1170. width: 87%;
  1171. display: flex;
  1172. justify-content: space-between;
  1173. align-items: center;
  1174. padding-right: 30rpx;
  1175. }
  1176. .audio-slider .slider {
  1177. width: 100%;
  1178. padding: 0px 15rpx;
  1179. box-sizing: border-box;
  1180. }
  1181. .audio-time {
  1182. width: 110rpx;
  1183. text-align: right;
  1184. font-size: 26rpx;
  1185. line-height: 28rpx;
  1186. color: #70798D;
  1187. display: flex;
  1188. justify-content: space-between;
  1189. }
  1190. .audio-play {
  1191. width: 48rpx;
  1192. height: 48rpx;
  1193. flex-shrink: 0;
  1194. }
  1195. .audio-play .image {
  1196. width: 100%;
  1197. height: 100%;
  1198. margin-left: 30rpx;
  1199. }
  1200. }
  1201. .bottomtips {
  1202. padding: 0 32rpx;
  1203. min-height: 70rpx;
  1204. display: flex;
  1205. align-items: center;
  1206. background: #FDEBC6;
  1207. }
  1208. .botbotmm {
  1209. width: 100%;
  1210. height: 88rpx;
  1211. display: flex;
  1212. align-items: center;
  1213. .item {
  1214. flex: 1;
  1215. height: 100%;
  1216. display: flex;
  1217. align-items: center;
  1218. justify-content: center;
  1219. border: 1rpx solid #E0E0E0;
  1220. border-top: none;
  1221. }
  1222. }
  1223. }
  1224. .bounced {
  1225. width: 570rpx;
  1226. background: #FFFFFF;
  1227. z-index: 1000;
  1228. border-radius: 10rpx;
  1229. position: fixed;
  1230. left: 50%;
  1231. top: 50%;
  1232. transform: translate(-50%, -50%);
  1233. .headpade {
  1234. margin-top: 10rpx;
  1235. padding: 8rpx 8rpx 8rpx 8rpx;
  1236. background: #108ee9;
  1237. color: #fff;
  1238. border-radius: 16rpx;
  1239. }
  1240. /* 50%为自身尺寸的一半 */
  1241. .jiajinghuatit {
  1242. width: 100%;
  1243. height: 68rpx;
  1244. font-size: 30rpx;
  1245. text-align: center;
  1246. line-height: 68rpx;
  1247. }
  1248. .jiajinghuaview {
  1249. padding: 18rpx 18rpx 18rpx 18rpx;
  1250. display: flex;
  1251. flex-wrap: wrap;
  1252. .jiajinghuaview1 {
  1253. padding: 8rpx 8rpx 8rpx 8rpx;
  1254. font-size: 26rpx;
  1255. border-radius: 12rpx;
  1256. border: 1px solid #979797;
  1257. margin-left: 8rpx;
  1258. }
  1259. .jighuaview2 {
  1260. padding: 8rpx 18rpx 8rpx 18rpx;
  1261. font-size: 26rpx;
  1262. border-radius: 12rpx;
  1263. border: 1px solid #979797;
  1264. margin-left: 20rpx;
  1265. margin-top: 10rpx;
  1266. display: flex;
  1267. .view1-text {
  1268. text-align: center;
  1269. }
  1270. .view1-img {
  1271. width: 50rpx;
  1272. }
  1273. }
  1274. }
  1275. .bounced3 {
  1276. height: 100rpx;
  1277. width: 100%;
  1278. margin-top: 40rpx;
  1279. border-top: 1px solid #dddddd;
  1280. display: flex;
  1281. }
  1282. .bounced3-1 {
  1283. width: 50%;
  1284. height: 100%;
  1285. text-align: center;
  1286. line-height: 100rpx;
  1287. border-right: 1px solid #dddddd;
  1288. font-size: 36rpx;
  1289. color: #999999;
  1290. }
  1291. .bounced3-2 {
  1292. width: 50%;
  1293. height: 100%;
  1294. text-align: center;
  1295. line-height: 100rpx;
  1296. font-size: 36rpx;
  1297. color: #108ee9;
  1298. }
  1299. }
  1300. .reason {
  1301. padding: 0 32rpx 32rpx;
  1302. width: 686rpx;
  1303. min-height: 350rpx;
  1304. display: flex;
  1305. flex-direction: column;
  1306. box-sizing: border-box;
  1307. .resaon-title {
  1308. padding: 24rpx 0;
  1309. flex-shrink: 0;
  1310. line-height: 32rpx;
  1311. font-size: 32rpx;
  1312. box-sizing: border-box;
  1313. }
  1314. .resaon-textbox {
  1315. padding: 12rpx 16rpx 36rpx;
  1316. position: relative;
  1317. flex-grow: 1;
  1318. box-sizing: border-box;
  1319. border: 1rpx solid #979797;
  1320. // border-radius: 16rpx;
  1321. display: flex;
  1322. textarea {
  1323. flex-grow: 1;
  1324. box-sizing: border-box;
  1325. }
  1326. .lastlength {
  1327. position: absolute;
  1328. right: 32rpx;
  1329. bottom: 12rpx;
  1330. font-size: 24rpx;
  1331. box-sizing: border-box;
  1332. }
  1333. }
  1334. .button {
  1335. margin-top: 24rpx;
  1336. width: 100%;
  1337. display: flex;
  1338. justify-content: flex-end;
  1339. text {
  1340. padding: 10rpx 35rpx;
  1341. color: #fff;
  1342. background: #008EF2;
  1343. border-radius: 16rpx;
  1344. }
  1345. }
  1346. }
  1347. }
  1348. /deep/.u-tab-item {
  1349. border: 1rpx solid #dedede;
  1350. }
  1351. </style>