inspectAdd.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857
  1. <!-- 开始检查 -->
  2. <template>
  3. <view class="inspectAdd">
  4. <scroll-view scroll-y @scrolltolower="scrollGet" class="info-max-box">
  5. <view class="tip">{{newData.checkName}}</view>
  6. <view class="items">
  7. <view class="items-t">
  8. <view class="items-t-r">{{newData.hazardCheckCode}} {{newData.hazardCheckName}}</view>
  9. </view>
  10. <view class="items-b">< {{newData.hazardCheckCode2}} {{newData.hazardCheckName2}} <</view>
  11. </view>
  12. <view class="items-number">此检查项在当前实验室累计出现<text>{{newData.hazardCheckNum}}</text>次隐患</view>
  13. <view class="list">
  14. <view class="list-li">
  15. <view>检查要点</view>
  16. <view>
  17. <img src="@/pages_safetyCheck/images/icon_06.png">
  18. </view>
  19. </view>
  20. <view class="hidden-content">{{newData.hazardCheckPoint}}
  21. </view>
  22. <view class="radio_group">
  23. <view class="radio" v-for="(item,index) in radioList" :key="index" @click="radioClick(item)">
  24. <img v-if="!item.checked" src="@/pages_safetyCheck/images/icon_aqjc_5.png">
  25. <img v-if="item.checked" src="@/pages_safetyCheck/images/icon_aqjc_6.png">
  26. <text>{{item.name}}</text>
  27. </view>
  28. </view>
  29. <view class="list-li">
  30. <view>检查隐患</view>
  31. <view>
  32. <img src="@/pages_safetyCheck/images/icon_06.png">
  33. </view>
  34. </view>
  35. <textarea class="describe" type="text" v-model="form.hazardDescribe" maxlength="200"
  36. placeholder="请填写隐患描述" placeholder-style="font-size:24rpx;color:#999;"></textarea>
  37. <view class="check-for-img-max-box">
  38. <view class="left-title-p"></view>
  39. <view class="right-img-box">
  40. <view class="img-box" v-for="(imgUrl,imgIndex) in form.photoList" :key="imgIndex">
  41. <img class="img-data" :src="baseUrl+imgUrl.fileUrl">
  42. <img class="position-img" src="@/pages_safetyCheck/images/icon_ssp_closure.png"
  43. @click="delImg(imgIndex)">
  44. </view>
  45. <img class="add-button" src="@/pages_safetyCheck/images/img_ssp_pz@1x.png"
  46. @click="selectImage()" v-if="form.photoList.length<5">
  47. </view>
  48. </view>
  49. </view>
  50. <view class="voice">
  51. <view class="voice_t">
  52. <view class="voice_t_t" v-if="!voiceList[0]">语音备注:(选填)</view>
  53. <view class="voice_t_b" v-if="voiceList[0]">语音备注:({{voiceList.length}})</view>
  54. </view>
  55. <view class="voice_b" v-if="voiceList[0]" v-for="(voiceItem,voiceIndex) in voiceList" :key="voiceIndex">
  56. <view class="voice_b_l" @tap="voicePlay(voiceItem.fileUrl)">
  57. <img class="add-button" src="@/pages_safetyCheck/images//icon_yybz_yy.png" />
  58. {{voiceItem.fileLength}}″
  59. </view>
  60. <img class="voice_b_r" src="@/pages_safetyCheck/images/icon_yybz_sc.png"
  61. @tap="voiceDele('',voiceIndex)" />
  62. </view>
  63. <view class="voice-btn">
  64. <img class="voice_t_r" src="@/pages_safetyCheck/images/icon_sskz_azsh.png"
  65. @longpress.stop="recordButton(item,$event)" @touchmove.stop="cancelButton"
  66. @touchend.stop="sendButton(item,$event)" />
  67. <text>按住说话</text>
  68. </view>
  69. </view>
  70. </scroll-view>
  71. <view class="sub-btn">
  72. <view @click="submitForm(1)">保存草稿</view>
  73. <view @click="submitForm(2)">提交</view>
  74. </view>
  75. </view>
  76. </template>
  77. <script>
  78. import {
  79. config
  80. } from '@/api/request/config.js'
  81. import {
  82. securityAppCheckPlanCheckInfo,
  83. securityAppCheckSetOptionCheckCommit,
  84. securityAppCheckPhotoGetCheckNumBySub,
  85. } from '@/pages_safetyCheck/api/index.js'
  86. export default {
  87. name: "inspectAdd",
  88. components: {
  89. },
  90. data() {
  91. return {
  92. baseUrl: config.base_url,
  93. form: {
  94. checkFlag: 0,
  95. photoList: [],
  96. },
  97. newData: {},
  98. radioList: [{
  99. id: 1,
  100. name: '符合',
  101. checked: false,
  102. },
  103. {
  104. id: 0,
  105. name: '不符合',
  106. checked: true,
  107. },
  108. ],
  109. voiceList: [],
  110. setOptionId: '', //检查项id
  111. manageId: '', //检查管理id
  112. subId: '',
  113. hazardCheckPro: '',
  114. sendLock: true, //发送锁,当为true时上锁,false时解锁发送
  115. recorderManager: wx.getRecorderManager(),
  116. }
  117. },
  118. onLoad(option) {
  119. let optionData = JSON.parse(decodeURIComponent(option.infoData));
  120. this.$set(this, 'setOptionId', optionData.setOptionId);
  121. this.$set(this, 'manageId', optionData.manageId);
  122. this.$set(this, 'subId', optionData.subId);
  123. this.$set(this, 'hazardCheckPro', optionData.hazardCheckPro);
  124. },
  125. onShow() {
  126. },
  127. mounted() {
  128. this.securityAppCheckPlanCheckInfo();
  129. this.securityAppCheckPhotoGetCheckNumBySub();
  130. },
  131. methods: {
  132. //获取详情
  133. async securityAppCheckPlanCheckInfo() {
  134. let obj = {
  135. setOptionId: this.setOptionId,
  136. manageId: this.manageId,
  137. }
  138. const {
  139. data
  140. } = await securityAppCheckPlanCheckInfo(obj);
  141. if (data.code == 200) {
  142. this.$set(this, 'newData', data.data);
  143. }
  144. },
  145. //获取检查项在当前实验室出现的次数
  146. async securityAppCheckPhotoGetCheckNumBySub() {
  147. let obj = {
  148. subId: this.subId,
  149. hazardCheckPro: this.hazardCheckPro,
  150. }
  151. const {
  152. data
  153. } = await securityAppCheckPhotoGetCheckNumBySub(obj);
  154. if (data.code == 200) {
  155. this.$set(this.newData, 'hazardCheckNum', data.data);
  156. }
  157. },
  158. //提交
  159. async submitForm(status) {
  160. let obj = {
  161. checkFlag: this.form.checkFlag,
  162. checkStatus: status == 1 ? 2 : 1,
  163. hazardDescribe: this.form.hazardDescribe,
  164. setOptionId: this.setOptionId,
  165. photoList: this.form.photoList,
  166. voiceList: this.voiceList,
  167. }
  168. const {
  169. data
  170. } = await securityAppCheckSetOptionCheckCommit(obj);
  171. if (data.code == 200) {
  172. if(status==1){
  173. uni.showToast({
  174. title: '保存成功!',
  175. icon: "none",
  176. mask: true,
  177. duration: 2000
  178. });
  179. }else if(status==2){
  180. uni.showToast({
  181. title: '提交成功!',
  182. icon: "none",
  183. mask: true,
  184. duration: 2000
  185. });
  186. }
  187. }
  188. },
  189. //滚动事件
  190. scrollGet() {},
  191. //单选按钮
  192. radioClick(d) {
  193. let self = this;
  194. d.checked = !d.checked
  195. if (d.checked) {
  196. //如果有选中的,循环把其他选中的取消
  197. this.radioList.forEach(function(item) {
  198. if (item.id == d.id) {
  199. self.$set(self.form, 'checkFlag', item.id);
  200. } else {
  201. item.checked = false;
  202. }
  203. })
  204. } else {
  205. }
  206. },
  207. /******图片上传******/
  208. selectImage() {
  209. let self = this;
  210. if (this.form.photoList.length > 4) {
  211. uni.showToast({
  212. title: '最多上传5张图片',
  213. icon: "none",
  214. mask: true,
  215. duration: 2000
  216. });
  217. return
  218. }
  219. wx.chooseImage({
  220. count: 1,
  221. sizeType: ["original", "compressed"],
  222. sourceType: ["album", "camera"],
  223. success: function(res) {
  224. let tempFilePaths = res.tempFilePaths[0];
  225. self.uploadImg(tempFilePaths);
  226. }
  227. });
  228. },
  229. async uploadImg(tempFilePaths) {
  230. var self = this;
  231. uni.showLoading({
  232. title: '上传中',
  233. mask: true
  234. });
  235. uni.uploadFile({
  236. url: config.base_url + '/system/file/upload', //仅为示例,非真实的接口地址
  237. header: {
  238. 'Authorization': uni.getStorageSync('token')
  239. },
  240. filePath: tempFilePaths,
  241. name: 'file',
  242. formData: {
  243. 'user': 'test'
  244. },
  245. success: (uploadFileRes) => {
  246. let res = JSON.parse(uploadFileRes.data);
  247. if (res.code == 200) {
  248. this.form.photoList.push({
  249. 'fileUrl': res.data.url,
  250. 'fileName': res.data.name
  251. });
  252. console.log(res.data.url)
  253. } else {
  254. uni.showToast({
  255. title: res.msg,
  256. icon: "none",
  257. mask: true,
  258. duration: 2000
  259. });
  260. }
  261. },
  262. fail: err => {},
  263. complete: () => {
  264. uni.hideLoading()
  265. }
  266. });
  267. },
  268. //删除图片
  269. delImg(minIndex) {
  270. this.form.photoList.splice(minIndex, 1);
  271. this.$forceUpdate();
  272. },
  273. /******语音备注 *******/
  274. //语音备忘播放
  275. async voicePlay(item) {
  276. myaudio.src = config.base_url + item;
  277. myaudio.play();
  278. },
  279. //语音备忘删除
  280. async voiceDele(item, voiceIndex) {
  281. let self = this;
  282. uni.showModal({
  283. title: '',
  284. cancelColor: '#999999',
  285. confirmColor: '#FF6E6E',
  286. content: '确定删除此语音吗?',
  287. success(res) {
  288. if (res.confirm) {
  289. console.log('用户点击确定')
  290. this.voiceList.splice(voiceIndex, 1);
  291. self.$forceUpdate();
  292. } else if (res.cancel) {
  293. console.log('用户点击取消')
  294. }
  295. }
  296. })
  297. },
  298. //录制
  299. recordButton(item, e) {
  300. console.log("按下")
  301. let self = this;
  302. if (this.voiceList.length >= 5) {
  303. uni.showToast({
  304. title: '语音备忘最多只能上传5条',
  305. icon: "none",
  306. mask: true,
  307. duration: 2000
  308. });
  309. return
  310. }
  311. this.liveType = true;
  312. console.log('录制', e)
  313. this.startPoint = e.touches[0]; //记录长按时开始点信息,后面用于计算上划取消时手指滑动的距离。
  314. const options = {
  315. duration: 60000,
  316. sampleRate: 16000,
  317. numberOfChannels: 1,
  318. encodeBitRate: 48000,
  319. format: 'mp3',
  320. frameSize: 50
  321. }
  322. this.recorderManager.start(options); //开始录音
  323. this.recorderManager.onStart(() => {
  324. console.log('recorder start')
  325. })
  326. this.recorderManager.onError((res) => {
  327. console.log(res);
  328. })
  329. wx.showToast({
  330. title: "正在录音,上划取消发送",
  331. icon: "none",
  332. duration: 60000 //先定义个60秒,后面可以手动调用wx.hideToast()隐藏
  333. });
  334. this.sendLock = false; //长按时是不上锁的。
  335. },
  336. //取消
  337. cancelButton(e) {
  338. console.log("移动")
  339. let self = this;
  340. this.liveType = false;
  341. console.log('取消', e)
  342. let moveLenght = e.touches[e.touches.length - 1].clientY - this.startPoint.clientY; //移动距离
  343. if (Math.abs(moveLenght) > 50) {
  344. wx.showToast({
  345. title: "松开手指,取消发送",
  346. icon: "none",
  347. duration: 60000
  348. });
  349. this.sendLock = true; //触发了上滑取消发送,上锁
  350. } else {
  351. wx.showToast({
  352. title: "正在录音,上划取消发送",
  353. icon: "none",
  354. duration: 60000
  355. });
  356. this.sendLock = false; //上划距离不足,依然可以发送,不上锁
  357. }
  358. },
  359. //发送
  360. sendButton(item, e) {
  361. console.log("松开")
  362. let self = this;
  363. this.liveType = false;
  364. console.log('发送', e)
  365. wx.hideToast(); //结束录音、隐藏Toast提示框
  366. this.recorderManager.stop(); //结束录音
  367. this.recorderManager.onStop((res) => {
  368. if (!this.sendLock) {
  369. this.uploadVoice(item, res.duration, res.tempFilePath);
  370. }
  371. console.log('停止录音', res.tempFilePath)
  372. console.log("sendLock", this.sendLock);
  373. })
  374. },
  375. //上传MP3
  376. async uploadVoice(item, times, tempFilePaths) {
  377. console.log(item)
  378. console.log(times)
  379. console.log(tempFilePaths)
  380. var self = this;
  381. uni.uploadFile({
  382. url: config.base_url + '/system/file/upload', //仅为示例,非真实的接口地址
  383. header: {
  384. 'Authorization': uni.getStorageSync('token')
  385. },
  386. filePath: tempFilePaths,
  387. name: 'file',
  388. formData: {
  389. 'user': 'test'
  390. },
  391. success: (uploadFileRes) => {
  392. let res = JSON.parse(uploadFileRes.data);
  393. if (res.code == 200) {
  394. console.log("上传成功", res)
  395. console.log(item)
  396. let seconds = Math.round((parseInt(times) % (1000 * 60)) / 1000);
  397. this.voiceList.push({
  398. 'fileLength': seconds,
  399. 'fileUrl': res.data.url,
  400. 'fileName': res.data.name
  401. })
  402. console.log(JSON.stringify(self.voice))
  403. //self.textParseUrlIps(res.data.url);
  404. // self.newData.imgList.push(res.data.url);
  405. } else {
  406. uni.showToast({
  407. title: res.msg,
  408. icon: "none",
  409. mask: true,
  410. duration: 2000
  411. });
  412. }
  413. },
  414. fail: err => {
  415. uni.hideLoading()
  416. },
  417. complete: () => {}
  418. });
  419. },
  420. }
  421. }
  422. </script>
  423. <style lang="stylus" scoped>
  424. .inspectAdd {
  425. height: 100%;
  426. display flex;
  427. box-sizing: border-box;
  428. padding-bottom: 160rpx;
  429. box-sizing: border-box;
  430. #bgColor-A {
  431. color: #FFD400;
  432. }
  433. #bgColor-B {
  434. color: #FF8C00;
  435. }
  436. #bgColor-C {
  437. color: #E11608;
  438. }
  439. .tip {
  440. width: 750rpx;
  441. height: 80rpx;
  442. background: rgba(1, 131, 250, 0.2);
  443. font-weight: normal;
  444. font-size: 28rpx;
  445. color: #0183FA;
  446. line-height: 80rpx;
  447. text-align: center;
  448. }
  449. .items {
  450. width: 690rpx;
  451. min-height: 165rpx;
  452. background: #FFFFFF;
  453. border-radius: 20rpx 20rpx 20rpx 20rpx;
  454. margin: 20rpx 0 0 30rpx;
  455. .items-li {
  456. display: flex;
  457. justify-content: space-between;
  458. align-items: center;
  459. padding: 0 30rpx;
  460. box-sizing: border-box;
  461. border-bottom: 1rpx solid #E0E0E0;
  462. >view:nth-of-type(1) {
  463. font-size: 30rpx;
  464. color: #333333;
  465. line-height: 80rpx;
  466. text-align: left;
  467. }
  468. >view:nth-of-type(2) {
  469. font-size: 28rpx;
  470. color: #666666;
  471. line-height: 80rpx;
  472. text-align: left;
  473. display: flex;
  474. justify-content: space-between;
  475. align-items: center;
  476. }
  477. }
  478. .items-t {
  479. border-bottom: 1rpx solid #E0E0E0;
  480. height: 80rpx;
  481. display: flex;
  482. justify-content: flex-start;
  483. align-items: center;
  484. padding: 0 30rpx;
  485. box-sizing: border-box;
  486. .items-t-l {
  487. width: 175rpx;
  488. height: 50rpx;
  489. background: #E11608;
  490. border-radius: 50rpx 50rpx 50rpx 50rpx;
  491. font-size: 30rpx;
  492. color: #FFFFFF;
  493. line-height: 50rpx;
  494. text-align: center;
  495. margin-right: 14rpx;
  496. }
  497. .items-t-r {
  498. font-size: 30rpx;
  499. color: #333333;
  500. line-height: 42rpx;
  501. text-align: left;
  502. }
  503. }
  504. .items-b {
  505. padding: 0 30rpx;
  506. box-sizing: border-box;
  507. height: 80rpx;
  508. font-size: 28rpx;
  509. color: #666666;
  510. line-height: 80rpx;
  511. text-align: left;
  512. }
  513. }
  514. .items-number {
  515. font-size: 24rpx;
  516. color: #3D3D3D;
  517. line-height: 34rpx;
  518. text-align: right;
  519. margin: 20rpx 60rpx 0 0;
  520. >text {
  521. font-size: 24rpx;
  522. color: #FF0000;
  523. line-height: 34rpx;
  524. text-align: right;
  525. }
  526. }
  527. .list {
  528. width: 690rpx;
  529. margin: 20rpx 30rpx 0;
  530. background: #FFFFFF;
  531. border-radius: 20rpx 20rpx 20rpx 20rpx;
  532. .list-li {
  533. display: flex;
  534. justify-content: space-between;
  535. align-items: center;
  536. padding: 0 30rpx;
  537. box-sizing: border-box;
  538. border-bottom: 1rpx solid #E0E0E0;
  539. >view:nth-of-type(1) {
  540. font-size: 30rpx;
  541. color: #333333;
  542. line-height: 80rpx;
  543. text-align: left;
  544. }
  545. >view:nth-of-type(2) {
  546. font-size: 28rpx;
  547. color: #666666;
  548. line-height: 80rpx;
  549. text-align: left;
  550. display: flex;
  551. justify-content: space-between;
  552. align-items: center;
  553. >img {
  554. width: 24rpx;
  555. height: 12rpx;
  556. margin-left: 10rpx;
  557. }
  558. }
  559. }
  560. .hidden-content {
  561. width: 630rpx;
  562. min-height: 200rpx;
  563. background: #F5F5F5;
  564. border-radius: 20rpx 20rpx 20rpx 20rpx;
  565. margin: 20rpx 30rpx 0;
  566. padding: 20rpx;
  567. box-sizing: border-box;
  568. font-size: 28rpx;
  569. color: #666666;
  570. line-height: 39rpx;
  571. text-align: left;
  572. }
  573. .photo {
  574. display: flex;
  575. justify-content: flex-start;
  576. flex-wrap: wrap;
  577. margin-top: 20rpx;
  578. padding: 0 30rpx;
  579. box-sizing: border-box;
  580. >img {
  581. width: 150rpx;
  582. height: 150rpx;
  583. border-radius: 10rpx 10rpx 10rpx 10rpx;
  584. margin: 0 10rpx 10rpx 0;
  585. }
  586. }
  587. .describe {
  588. width: 636rpx;
  589. height: 120rpx;
  590. border-radius: 10rpx 10rpx 10rpx 10rpx;
  591. border: 1rpx solid #E0E0E0;
  592. margin: 20rpx 0 0 28rpx;
  593. padding: 12rpx 16rpx;
  594. box-sizing: border-box;
  595. }
  596. .check-for-img-max-box {
  597. margin: 20px 28rpx;
  598. .left-title-p {
  599. width: 100%;
  600. text-align: left;
  601. font-size: 30rpx;
  602. font-family: PingFang SC-Medium, PingFang SC;
  603. font-weight: 400;
  604. color: #333333;
  605. line-height: 80rpx;
  606. }
  607. .right-img-box {
  608. .img-box {
  609. display inline-block;
  610. height: 150rpx;
  611. width: 150rpx;
  612. position relative;
  613. margin: 0 14rpx 20rpx 0;
  614. border-radius 10rpx;
  615. overflow hidden;
  616. .img-data {
  617. height: 150rpx;
  618. width: 150rpx;
  619. }
  620. .position-img {
  621. position absolute;
  622. right: 0;
  623. top: 0;
  624. width: 36rpx;
  625. height: 36rpx;
  626. }
  627. }
  628. .img-box:nth-of-type(3n+3) {
  629. margin-right: 0rpx;
  630. }
  631. .add-button {
  632. margin: 0 0rpx 20rpx 0;
  633. border-radius 10rpx;
  634. overflow hidden;
  635. display inline-block;
  636. height: 150rpx;
  637. width: 150rpx;
  638. }
  639. }
  640. }
  641. .list-li:last-of-type {
  642. border: none;
  643. }
  644. .radio_group {
  645. display: flex;
  646. justify-content: flex-end;
  647. padding: 32rpx 30rpx 22rpx 30rpx;
  648. box-sizing: border-box;
  649. border-bottom: 1rpx solid #E0E0E0;
  650. .radio {
  651. display: flex;
  652. justify-content: flex-start;
  653. align-items: center;
  654. >img {
  655. width: 30rpx;
  656. height: 30rpx;
  657. margin-right: 34rpx;
  658. }
  659. >text {
  660. font-size: 30rpx;
  661. color: #333333;
  662. line-height: 42rpx;
  663. text-align: left;
  664. }
  665. }
  666. .radio:nth-of-type(1) {
  667. margin-right: 54rpx;
  668. }
  669. }
  670. }
  671. /* 语音备注 */
  672. .voice {
  673. width: 690rpx;
  674. min-height: 100rpx;
  675. background: #FFFFFF;
  676. border-radius: 20rpx 20rpx 20rpx 20rpx;
  677. margin: 0rpx 30rpx;
  678. padding: 0 30rpx;
  679. box-sizing: border-box;
  680. overflow: hidden;
  681. .voice_t {
  682. height: 100rpx;
  683. display: flex;
  684. justify-content: space-between;
  685. align-items: center;
  686. .voice_t_t {
  687. width: 100%;
  688. font-size: 30rpx;
  689. font-family: PingFang SC-Medium, PingFang SC;
  690. font-weight: 400;
  691. color: #333333;
  692. line-height: 100rpx;
  693. text-align: center;
  694. }
  695. .voice_t_b {
  696. width: 100%;
  697. font-size: 30rpx;
  698. font-family: PingFang SC-Medium, PingFang SC;
  699. font-weight: 400;
  700. color: #333333;
  701. line-height: 100rpx;
  702. text-align: left;
  703. }
  704. }
  705. .voice_b {
  706. display flex;
  707. justify-content flex-start;
  708. align-items center;
  709. margin-bottom: 20rpx;
  710. .voice_b_l {
  711. width: 400rpx;
  712. height: 40rpx;
  713. background: #0183FA;
  714. border-radius: 10rpx;
  715. display flex;
  716. justify-content flex-start;
  717. align-items center;
  718. font-size: 24rpx;
  719. color: #FFFFFF;
  720. line-height: 30rpx;
  721. text-align: left;
  722. >img {
  723. width: 20rpx;
  724. height: 20rpx;
  725. margin-left: 16rpx;
  726. margin-right: 20rpx;
  727. }
  728. }
  729. .voice_b_r {
  730. width: 28rpx;
  731. height: 28rpx;
  732. margin-left: 20rpx;
  733. }
  734. }
  735. .voice-btn {
  736. width: 150rpx;
  737. height: 150rpx;
  738. position: fixed;
  739. right: 24rpx;
  740. bottom: 176rpx;
  741. >img {
  742. width: 150rpx;
  743. height: 150rpx;
  744. position: absolute;
  745. }
  746. >text {
  747. font-size: 24rpx;
  748. color: #999999;
  749. line-height: 30rpx;
  750. text-align: center;
  751. position: absolute;
  752. top: 84rpx;
  753. left: 26rpx;
  754. }
  755. }
  756. }
  757. }
  758. .sub-btn {
  759. display: flex;
  760. justify-content: center;
  761. position: fixed;
  762. left: 30rpx;
  763. bottom: 30rpx;
  764. >view:nth-of-type(1) {
  765. width: 345rpx;
  766. height: 100rpx;
  767. background: #FF8C00;
  768. border-radius: 50rpx 0rpx 0rpx 50rpx;
  769. font-size: 30rpx;
  770. color: #FFFFFF;
  771. line-height: 100rpx;
  772. text-align: center;
  773. }
  774. >view:nth-of-type(2) {
  775. width: 345rpx;
  776. height: 100rpx;
  777. background: #0183FA;
  778. border-radius: 0rpx 50rpx 50rpx 0rpx;
  779. font-size: 30rpx;
  780. color: #FFFFFF;
  781. line-height: 100rpx;
  782. text-align: center;
  783. }
  784. }
  785. </style>