examineAddTow.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907
  1. <!-- 开始检查 -->
  2. <template>
  3. <view id="startChecking">
  4. <view class="title">不符合项</view>
  5. <viwe class="list">
  6. <view class="check-for-big-box" v-for="(item,index) in form.detailsList" :key="index">
  7. <view class="grade">
  8. <view class="grade_l">隐患等级:</view>
  9. <picker @change="gradeChange(item,$event)" :value="gradeIndex" :range="gradeArray" class="scope_r">
  10. <view class="grade_r">
  11. <view>{{item.grade}}</view>
  12. <img src="@/images/Version3.3.3/icon_06.png">
  13. </view>
  14. </picker>
  15. </view>
  16. <view class="project" v-if="checkOptionList.length>0">
  17. <view class="project_l">检查项目:</view>
  18. <uni-data-picker :ellipsis="false" :localdata="checkOptionList[index]" :map="{text:'name',value:'id'}"
  19. popup-title="请选择所属目录" @change="(e)=>onchange(e,index)" @nodeclick="onnodeclick"
  20. ref="uniDataPicker" :addType="true" :addIndex="index">
  21. <view class="project_r">{{item.jcxName?item.jcxName:'请选择检查项'}}</view>
  22. </uni-data-picker>
  23. </view>
  24. <view class="point">
  25. <view class="point_l">检查要点:</view>
  26. <textarea class="point_r" type="text" v-model="item.yhMs" maxlength="50" placeholder="未查到此项检查要点,可在此输入添加" placeholder-style="font-size:28rpx;color:#999;"></textarea>
  27. </view>
  28. <view class="check-for-input-max-box">
  29. <view class="left-title-p">隐患描述:</view>
  30. <textarea type="text" v-model="item.yhMs" maxlength="50" placeholder="请输入隐患描述" placeholder-style="font-size:28rpx;color:#999;"></textarea>
  31. </view>
  32. <view class="check-for-img-max-box">
  33. <view class="left-title-p">隐患照片(最多上传5张):</view>
  34. <view class="right-img-box">
  35. <view class="img-box" v-for="(imgUrl,imgIndex) in item.yhImg" :key="imgIndex">
  36. <img class="img-data" :src="configURL+imgUrl">
  37. <img class="position-img" src="@/pages_manage/images/icon_ssp_closure.png" @click="delImg(index,imgIndex)">
  38. </view>
  39. <img class="add-button" src="@/pages_manage/images/icon_07.png" @click="selectImage(item)" v-if="item.yhImg.length<5">
  40. </view>
  41. </view>
  42. <view class="voice">
  43. <view class="voice_t">
  44. <view class="voice_t_l">语音备注:</view>
  45. <img class="voice_t_r" src="@/images/Version3.3.3/icon_ksjc_yysr.png" @longpress.stop="recordButton(item,$event)" @touchmove.stop="cancelButton" @touchend.stop="sendButton(item,$event)">
  46. </view>
  47. <view class="voice_b" v-for="(voiceItem,voiceIndex) in item.voice" :key="voiceIndex">
  48. <view class="voice_b_l" @tap="voicePlay(voiceItem.url)"><img class="add-button" src="@/pages_manage/images/icon_yyt.png"/>{{voiceItem.times}}″</view>
  49. <img class="voice_b_r" src="@/pages_manage/images/Version2.3/icon_sczl_sc.png" @tap="voiceDele(index,voiceIndex)"/>
  50. </view>
  51. </view>
  52. <view class="check-for-big-box-position-img-box" v-if="form.detailsList.length>1" @click="delDetailsList(index)">
  53. <img src="@/pages_manage/images/icon_ssp_closure.png">
  54. </view>
  55. </view>
  56. <view class="add-for-item-p" @click="addDanger()">+ 新增隐患项</view>
  57. </viwe>
  58. <view class="bottom_btn">
  59. <view class="bottom_btn_li" @click="goMinButton(2)" v-for="(item,index) in bottomBtnList" :key="index">{{item}}</view>
  60. </view>
  61. </view>
  62. </template>
  63. <script>
  64. const myaudio = uni.createInnerAudioContext();
  65. import { config } from '@/api/request/config.js'
  66. import { checkRecordAddC,checkRecordAdd,getSelectInfoByRoom, checkOptionList, treeselect,treeDepselect, addTempCheckOption,recordDettailsList,checkRecordUpdate } from '@/api/index.js'
  67. export default {
  68. name: "startChecking",
  69. data() {
  70. return {
  71. configURL:config.base_url,
  72. id:"",
  73. //新增项or固有
  74. isLingshi:0,
  75. //页面子状态
  76. minPageType:1,
  77. //临时存储隐患信息ID
  78. hiddenDangerIdList:[],
  79. //数据
  80. form:{
  81. checkName:'',//检查名称
  82. fjNumber:"",
  83. buildingId:"",
  84. buildingName:"",
  85. laboratoryId:"",
  86. laboratoryName:"",
  87. fzrId:"",
  88. fzrName:"",
  89. fzrLxfs:"",
  90. jcDw:"",
  91. detailsList:[
  92. {
  93. isLingshi:0,
  94. yhImg:[],
  95. voice:[],//语音备忘存储
  96. yhMs:"",
  97. jcxId:"",
  98. jcxName:"",
  99. grade:'一般隐患',//隐患等级
  100. }
  101. ],
  102. },
  103. inspectionUnit:"",
  104. inspectionUnitArray:[],
  105. inspectionUnitArrayData:[],
  106. //搜索回调列表
  107. searchList:[],
  108. searchNullType:true,
  109. //检查项
  110. checkOptionList:[],
  111. checkOptionListExamination:[],
  112. //新增检查项
  113. openIndex:"",
  114. open:false,
  115. jcxSstkMs:[],
  116. jcxSstkNum:'',
  117. //临时数据组
  118. temporaryIdList:[],
  119. //添加项 目录
  120. uniPicker:"请选择所属目录",
  121. //滑动记录
  122. startPoint:{},
  123. liveType:false,
  124. sendLock: true, //发送锁,当为true时上锁,false时解锁发送
  125. recorderManager : wx.getRecorderManager(),
  126. temporaryData:[],
  127. gradeIndex :0,
  128. gradeArray:['一般隐患','重大隐患'],
  129. bottomBtnList:['上一步','保存','提交'],
  130. }
  131. },
  132. onLoad(option) {
  133. this.getCheckOptionListTwo();
  134. this.treeselect();
  135. if(option.id){
  136. this.id = option.id;
  137. this.getInfo();
  138. }else{
  139. this.getCheckOptionList();
  140. }
  141. },
  142. onShow() {
  143. },
  144. methods: {
  145. //隐患等级
  146. gradeChange(item,e){
  147. item.grade=this.gradeArray[e.target.value]
  148. },
  149. //语音备忘播放
  150. async voicePlay(item){
  151. myaudio.src = config.base_url+item;
  152. myaudio.play();
  153. },
  154. //语音备忘删除
  155. async voiceDele(index,voiceIndex){
  156. let self = this;
  157. uni.showModal({
  158. title: '',
  159. cancelColor:'#999999',
  160. confirmColor:'#FF6E6E',
  161. content: '确定删除此语音吗?',
  162. success (res) {
  163. if (res.confirm) {
  164. console.log('用户点击确定')
  165. self.form.detailsList[index].voice.splice(voiceIndex,1);
  166. self.$forceUpdate();
  167. } else if (res.cancel) {
  168. console.log('用户点击取消')
  169. }
  170. }
  171. })
  172. },
  173. //录制
  174. recordButton(item,e){
  175. console.log("按下")
  176. let self = this;
  177. if(item.voice.length>=5){
  178. uni.showToast({
  179. title: '语音备忘最多只能上传5条',
  180. icon:"none",
  181. mask:true,
  182. duration: 2000
  183. });
  184. return
  185. }
  186. this.liveType=true;
  187. console.log('录制',e)
  188. this.startPoint = e.touches[0];//记录长按时开始点信息,后面用于计算上划取消时手指滑动的距离。
  189. const options = {
  190. duration: 60000,
  191. sampleRate: 16000,
  192. numberOfChannels: 1,
  193. encodeBitRate: 48000,
  194. format: 'mp3',
  195. frameSize: 50
  196. }
  197. this.recorderManager.start(options);//开始录音
  198. this.recorderManager.onStart(() => {
  199. console.log('recorder start')
  200. })
  201. this.recorderManager.onError((res) => {
  202. console.log(res);
  203. })
  204. wx.showToast({
  205. title: "正在录音,上划取消发送",
  206. icon: "none",
  207. duration: 60000//先定义个60秒,后面可以手动调用wx.hideToast()隐藏
  208. });
  209. this.sendLock = false;//长按时是不上锁的。
  210. },
  211. //取消
  212. cancelButton(e){
  213. console.log("移动")
  214. let self = this;
  215. this.liveType=false;
  216. console.log('取消',e)
  217. let moveLenght = e.touches[e.touches.length - 1].clientY - this.startPoint.clientY; //移动距离
  218. if (Math.abs(moveLenght) > 50) {
  219. wx.showToast({
  220. title: "松开手指,取消发送",
  221. icon: "none",
  222. duration: 60000
  223. });
  224. this.sendLock = true;//触发了上滑取消发送,上锁
  225. } else {
  226. wx.showToast({
  227. title: "正在录音,上划取消发送",
  228. icon: "none",
  229. duration: 60000
  230. });
  231. this.sendLock = false;//上划距离不足,依然可以发送,不上锁
  232. }
  233. },
  234. //发送
  235. sendButton(item,e){
  236. console.log("松开")
  237. let self = this;
  238. this.liveType=false;
  239. console.log('发送',e)
  240. wx.hideToast();//结束录音、隐藏Toast提示框
  241. this.recorderManager.stop();//结束录音
  242. this.recorderManager.onStop((res) => {
  243. if(!this.sendLock){
  244. this.uploadVoice(item,res.duration,res.tempFilePath);
  245. }
  246. console.log('停止录音', res.tempFilePath)
  247. console.log("sendLock",this.sendLock);
  248. })
  249. },
  250. //上传MP3
  251. async uploadVoice(item,times,tempFilePaths){
  252. var self = this;
  253. uni.uploadFile({
  254. url: config.base_url+'/base/file/upload', //仅为示例,非真实的接口地址
  255. header:{'Authorization':uni.getStorageSync('token')},
  256. filePath: tempFilePaths,
  257. name: 'file',
  258. formData: {
  259. 'user': 'test'
  260. },
  261. success: (uploadFileRes) => {
  262. let res = JSON.parse(uploadFileRes.data);
  263. if(res.code == 200){
  264. console.log("上传成功",res)
  265. console.log(item)
  266. let seconds = Math.round((parseInt(times) % (1000 * 60)) / 1000);
  267. item.voice.push({'times':seconds,'url':res.data.url})
  268. console.log(JSON.stringify(self.voice))
  269. //self.textParseUrlIps(res.data.url);
  270. // self.newData.imgList.push(res.data.url);
  271. }else{
  272. uni.showToast({
  273. title: res.msg,
  274. icon:"none",
  275. mask:true,
  276. duration: 2000
  277. });
  278. }
  279. },
  280. fail: err => {
  281. uni.hideLoading()
  282. },
  283. complete: () => {
  284. }
  285. });
  286. },
  287. //搜索特定检查项
  288. async searchClick(text,index){
  289. console.log("搜索text",text);
  290. console.log("搜索index",index);
  291. let newObj = {
  292. level:4,
  293. searchValue:text
  294. }
  295. const {data} = await checkOptionList(newObj);
  296. if(data.code == 200){
  297. if(data.data[0]){
  298. let list = JSON.parse(JSON.stringify(this.checkOptionList));
  299. list[index] = this.getTreeData(data.data);
  300. this.$set(this,'checkOptionList',JSON.parse(JSON.stringify(list)))
  301. console.log('this.$refs.uniDataPicker',this.$refs.uniDataPicker)
  302. this.$refs.uniDataPicker[index].show();
  303. }else{
  304. uni.showToast({
  305. title: '未找到相关检查项',
  306. icon:"none",
  307. mask:true,
  308. duration: 2000
  309. });
  310. }
  311. }
  312. },
  313. //重置检查项
  314. async resetClick(index){
  315. console.log("重置index",index);
  316. let newObj = {
  317. level:4,
  318. }
  319. const {data} = await checkOptionList(newObj);
  320. if(data.code == 200){
  321. let list = JSON.parse(JSON.stringify(this.checkOptionList));
  322. list[index] = this.getTreeData(data.data);
  323. this.$set(this,'checkOptionList',JSON.parse(JSON.stringify(list)))
  324. this.$refs.uniDataPicker[index].show();
  325. }
  326. },
  327. /**************************检查项***************************/
  328. //获取检查项
  329. async getCheckOptionList() {
  330. let newObj = {
  331. level:4,
  332. }
  333. const {data} = await checkOptionList(newObj);
  334. if(data.code == 200){
  335. let list = this.getTreeData(data.data);
  336. this.checkOptionList.push(JSON.parse(JSON.stringify(list)));
  337. }
  338. },
  339. async getCheckOptionListTwo() {
  340. let newObj = {
  341. level:3,
  342. }
  343. const {data} = await checkOptionList(newObj);
  344. if(data.code == 200){
  345. let list = this.getTreeData(data.data);
  346. this.checkOptionListExamination = JSON.parse(JSON.stringify(list));
  347. }
  348. },
  349. async treeselect() {
  350. let self = this;
  351. const {data} = await treeselect({});
  352. if(data.code == 200){
  353. let list = [];
  354. for(let i=0;i<data.data[0].children.length;i++){
  355. let obj = {
  356. id:data.data[0].children[i].id,
  357. label:data.data[0].children[i].label,
  358. }
  359. if(data.data[0].children[i].children){
  360. for(let o=0;o<data.data[0].children[i].children.length;o++){
  361. let obj = {
  362. id:data.data[0].children[i].children[o].id,
  363. label:data.data[0].children[i].children[o].label,
  364. }
  365. self.inspectionUnitArray.push(data.data[0].children[i].children[o].label)
  366. list.push(obj);
  367. }
  368. }else{
  369. self.inspectionUnitArray.push(data.data[0].children[i].label)
  370. list.push(obj);
  371. }
  372. }
  373. this.inspectionUnitArrayData = list;
  374. }
  375. },
  376. getTreeData(data){
  377. for(var i=0;i<data.length>0;i++){
  378. if(data[i].children == null||data[i].children.length<=0){
  379. // children若为空数组,则将children设为undefined
  380. data[i].children = undefined;
  381. }else {
  382. // children若不为空数组,则继续 递归调用 本方法
  383. this.getTreeData(data[i].children);
  384. }
  385. }
  386. return data;
  387. },
  388. // 图片上传
  389. selectImage(item) {
  390. let self = this;
  391. if(item.yhImg.length>4){
  392. uni.showToast({
  393. title: '最多上传5张图片',
  394. icon:"none",
  395. mask:true,
  396. duration: 2000
  397. });
  398. return
  399. }
  400. wx.chooseImage({
  401. count: 1,
  402. sizeType: ["original", "compressed"],
  403. sourceType: ["album", "camera"],
  404. success: function(res) {
  405. let tempFilePaths = res.tempFilePaths[0];
  406. self.uploadImg(tempFilePaths,item);
  407. }
  408. });
  409. },
  410. async uploadImg(tempFilePaths,item){
  411. var self = this;
  412. uni.showLoading({
  413. title: '上传中',
  414. mask: true
  415. });
  416. uni.uploadFile({
  417. url: config.base_url+'/base/file/upload', //仅为示例,非真实的接口地址
  418. header:{'Authorization':uni.getStorageSync('token')},
  419. filePath: tempFilePaths,
  420. name: 'file',
  421. formData: {
  422. 'user': 'test'
  423. },
  424. success: (uploadFileRes) => {
  425. let res = JSON.parse(uploadFileRes.data);
  426. if(res.code == 200){
  427. item.yhImg.push(res.data.url);
  428. console.log(res.data.url)
  429. }else{
  430. uni.showToast({
  431. title: res.msg,
  432. icon:"none",
  433. mask:true,
  434. duration: 2000
  435. });
  436. }
  437. },
  438. fail: err => {},
  439. complete: () => {
  440. uni.hideLoading()
  441. }
  442. });
  443. },
  444. //删除图片
  445. delImg(index,minIndex){
  446. this.form.detailsList[index].yhImg.splice(minIndex,1);
  447. this.$forceUpdate();
  448. },
  449. //添加隐患
  450. addDanger(){
  451. if(this.form.detailsList.length>19){
  452. uni.showToast({
  453. title: '最多添加20个隐患',
  454. icon:"none",
  455. mask:true,
  456. duration: 2000
  457. });
  458. return
  459. }
  460. let obj = {
  461. isLingshi:0,
  462. yhImg:[],
  463. voice:[],
  464. yhMs:"",
  465. jcxId:"",
  466. jcxName:"",
  467. grade:"一般隐患",
  468. }
  469. this.form.detailsList.push(obj);
  470. this.getCheckOptionList();
  471. this.$forceUpdate();
  472. },
  473. //删除隐患
  474. delDetailsList(index){
  475. this.hiddenDangerIdList.push(this.form.detailsList[index].id)
  476. this.form.detailsList.splice(index,1);
  477. this.$forceUpdate();
  478. },
  479. //子页面切换
  480. goMinButton(type){
  481. let self = this;
  482. if(type == 1){
  483. this.minPageType = 1;
  484. }else if(type == 2){
  485. for(let i=0;i<self.form.detailsList.length;i++){
  486. console.log(self.form.detailsList[i])
  487. console.log(typeof(self.form.detailsList[i].yhMs))
  488. console.log(typeof(self.form.detailsList[i].voice))
  489. let num = i+1;
  490. if(!self.form.detailsList[i].jcxName){
  491. uni.showToast({
  492. title: '第'+num+'未选择隐患项',
  493. icon:"none",
  494. mask:true,
  495. duration: 2000
  496. });
  497. return
  498. }else if(!self.form.detailsList[i].yhMs && self.form.detailsList[i].voice.length<=0){
  499. uni.showToast({
  500. title: '请输入第'+num+'项隐患描述!',
  501. icon:"none",
  502. mask:true,
  503. duration: 2000
  504. });
  505. return
  506. }
  507. }
  508. this.minPageType = 2;
  509. }
  510. },
  511. /**************************搜索项***************************/
  512. //选中固有检查项(新)
  513. onchange(e,index) {
  514. let self = this;
  515. let val = e.detail.value[e.detail.value.length-1].value
  516. let num = 0;
  517. for(let i=0;i<self.temporaryIdList.length;i++){
  518. if(self.temporaryIdList[i] == val){
  519. num++
  520. }
  521. }
  522. if(num == 0){
  523. this.$set(this.form.detailsList[index],'isLingshi',0);
  524. }else{
  525. this.$set(this.form.detailsList[index],'isLingshi',1);
  526. }
  527. let list = [];
  528. let listName=[];
  529. for(let i=0;i<e.detail.value.length;i++){
  530. list.push(e.detail.value[i].value)
  531. if(i<3){
  532. listName.push(e.detail.value[i].text)
  533. }
  534. }
  535. let jcxSstkNum=this.getTreeName(this.checkOptionList[0],e.detail.value[e.detail.value.length-1].value)
  536. this.$set(this.form.detailsList[index],'jcxSstkNum',jcxSstkNum);
  537. this.$set(this.form.detailsList[index],'jcxId',list);
  538. this.$set(this.form.detailsList[index],'jcxSstkMs',listName.join('-'));
  539. this.$set(this.form.detailsList[index],'jcxName',e.detail.value[e.detail.value.length-1].text);
  540. },
  541. //根据id查找父元素
  542. getTreeName(list,id){
  543. let _this=this
  544. for (let i = 0; i < list.length; i++) {
  545. let a=list[i]
  546. if(a.id===id){
  547. return a.code
  548. }else{
  549. if(a.children && a.children.length>0){
  550. let res=_this.getTreeName(a.children,id)
  551. if(res){
  552. return res
  553. }
  554. }
  555. }
  556. }
  557. },
  558. onnodeclick(node) {
  559. console.log("node",node)
  560. },
  561. }
  562. }
  563. </script>
  564. <style lang="stylus" scoped>
  565. #startChecking{
  566. height: 100%;
  567. width: 100%;
  568. position: relative;
  569. .title{
  570. width: 690rpx;
  571. height: 100rpx;
  572. background: #FFFFFF;
  573. border-radius: 20rpx;
  574. margin: 20rpx 30rpx;
  575. font-size: 30rpx;
  576. font-family: PingFang SC-Medium, PingFang SC;
  577. font-weight: 400;
  578. color: #333333;
  579. line-height: 100rpx;
  580. padding-left: 24rpx;
  581. box-sizing: border-box;
  582. }
  583. .list{
  584. .check-for-big-box{
  585. width 690rpx;
  586. //padding-top:30rpx;
  587. margin:0 30rpx 20rpx;
  588. background #fff
  589. border-radius:20rpx;
  590. overflow hidden
  591. position relative;
  592. padding:30rpx;
  593. box-sizing border-box;
  594. /* 隐患等级 */
  595. .grade{
  596. display: flex;
  597. justify-content: flex-start;
  598. .grade_l{
  599. width: 158rpx;
  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. .grade_r{
  608. width: 480rpx;
  609. height: 80rpx;
  610. border-radius: 10rpx;
  611. border: 1rpx solid #E0E0E0;
  612. display: flex;
  613. justify-content: flex-start;
  614. align-items: center;
  615. padding-left: 20rpx;
  616. box-sizing: border-box;
  617. >view{
  618. flex:1;
  619. line-height:80rpx;
  620. font-size: 30rpx;
  621. font-family: PingFang SC-Medium, PingFang SC;
  622. font-weight: 400;
  623. color: #333333;
  624. line-height: 80rpx;
  625. }
  626. >img{
  627. width: 14rpx;
  628. height: 8rpx;
  629. margin-right: 30rpx;
  630. }
  631. }
  632. }
  633. /* 检查项目 */
  634. .project{
  635. .project_l{
  636. width: 158rpx;
  637. text-align: left;
  638. font-size: 30rpx;
  639. font-family: PingFang SC-Medium, PingFang SC;
  640. font-weight: 400;
  641. color: #333333;
  642. line-height: 80rpx;
  643. margin-top: 24rpx;
  644. }
  645. .project_r{
  646. width: 630rpx;
  647. height: 80rpx;
  648. border-radius: 10rpx;
  649. border: 1rpx solid #E0E0E0;
  650. display: flex;
  651. justify-content: flex-start;
  652. align-items: center;
  653. padding-left: 20rpx;
  654. box-sizing: border-box;
  655. }
  656. }
  657. /* 检查要点 */
  658. .point{
  659. .point_l{
  660. width: 158rpx;
  661. text-align: left;
  662. font-size: 30rpx;
  663. font-family: PingFang SC-Medium, PingFang SC;
  664. font-weight: 400;
  665. color: #333333;
  666. line-height: 80rpx;
  667. }
  668. .point_r{
  669. width: 630rpx;
  670. height: 158rpx;
  671. border-radius: 20rpx 20rpx 20rpx 20rpx;
  672. opacity: 1;
  673. border: 1rpx solid #E0E0E0;
  674. padding: 20rpx 14rpx;
  675. box-sizing: border-box;
  676. font-size: 30rpx;
  677. font-family: PingFang SC-Medium, PingFang SC;
  678. font-weight: 400;
  679. color: #333333;
  680. line-height: 34rpx;
  681. }
  682. }
  683. /* 隐患描述 */
  684. .check-for-input-max-box{
  685. .left-title-p{
  686. width:150rpx;
  687. line-height:80rpx;
  688. text-align right
  689. font-size:30rpx;
  690. }
  691. textarea{
  692. width: 630rpx;
  693. height: 158rpx;
  694. border-radius: 20rpx 20rpx 20rpx 20rpx;
  695. border: 1rpx solid #E0E0E0;
  696. padding: 20rpx 14rpx;
  697. box-sizing: border-box;
  698. font-size: 30rpx;
  699. font-family: PingFang SC-Medium, PingFang SC;
  700. font-weight: 400;
  701. color: #333333;
  702. line-height: 34rpx;
  703. }
  704. }
  705. /* 隐患照片 */
  706. .check-for-img-max-box{
  707. .left-title-p{
  708. width: 100%;
  709. text-align: left;
  710. font-size: 30rpx;
  711. font-family: PingFang SC-Medium, PingFang SC;
  712. font-weight: 400;
  713. color: #333333;
  714. line-height: 80rpx;
  715. }
  716. .right-img-box{
  717. .img-box{
  718. display inline-block;
  719. height:200rpx;
  720. width:200rpx;
  721. position relative
  722. margin:0 20rpx 20rpx 0;
  723. border-radius 10rpx;
  724. overflow hidden;
  725. .img-data{
  726. height:200rpx;
  727. width:200rpx;
  728. }
  729. .position-img{
  730. position absolute
  731. right:0;
  732. top:0;
  733. width:36rpx;
  734. height:36rpx;
  735. }
  736. }
  737. .add-button{
  738. margin:0 20rpx 20rpx 0;
  739. border-radius 10rpx;
  740. overflow hidden;
  741. display inline-block
  742. height:200rpx;
  743. width:200rpx;
  744. }
  745. }
  746. }
  747. /* 语音备注 */
  748. .voice{
  749. .voice_t{
  750. height: 80rpx;
  751. display: flex;
  752. justify-content: space-between;
  753. align-items: center;
  754. .voice_t_l{
  755. font-size: 30rpx;
  756. font-family: PingFang SC-Medium, PingFang SC;
  757. font-weight: 400;
  758. color: #333333;
  759. line-height: 80rpx;
  760. }
  761. .voice_t_r{
  762. width: 170rpx;
  763. height: 50rpx;
  764. }
  765. }
  766. .voice_b{
  767. display flex;
  768. justify-content flex-start;
  769. align-items center;
  770. margin-bottom :30rpx;
  771. .voice_b_l{
  772. width: 400rpx;
  773. height: 40rpx;
  774. background:rgba(88,175,255,0.3);
  775. border-radius: 10rpx;
  776. display flex;
  777. justify-content flex-start;
  778. align-items center;
  779. >img{
  780. width: 18rpx;
  781. height: 24rpx;
  782. margin-left:16rpx;
  783. margin-right :20rpx;
  784. }
  785. }
  786. .voice_b_r{
  787. width: 28rpx;
  788. height: 28rpx;
  789. margin-left:20rpx;
  790. }
  791. }
  792. }
  793. .check-for-button-max-box{
  794. display flex
  795. margin-top:30rpx;
  796. margin-bottom:20rpx;
  797. .left-title-p{
  798. width:150rpx;
  799. line-height:88rpx;
  800. text-align right
  801. font-size:30rpx;
  802. }
  803. .button-text-p{
  804. border:1rpx solid #E0E0E0;
  805. width:440rpx;
  806. height:80rpx;
  807. border-radius:10rpx;
  808. line-height :80rpx;
  809. color: #A2A2A2
  810. padding:0 20rpx;
  811. font-size:28rpx;
  812. display:block;
  813. overflow:hidden;
  814. text-overflow:ellipsis;
  815. white-space:nowrap;
  816. }
  817. }
  818. .check-for-big-box-position-img-box{
  819. position absolute
  820. top:0;
  821. right:0;
  822. width:60rpx;
  823. height:60rpx;
  824. img{
  825. width:36rpx;
  826. height:36rpx;
  827. margin:12rpx;
  828. }
  829. }
  830. }
  831. /* 添加隐患项 */
  832. .add-for-item-p{
  833. width:690rpx;
  834. height:100rpx;
  835. border:4rpx dashed #0183FA;
  836. font-size: 30rpx;
  837. font-family: PingFang SC-Medium, PingFang SC;
  838. font-weight: 400;
  839. color: #0183FA;
  840. line-height: 100rpx;
  841. text-align center;
  842. border-radius:20rpx;
  843. margin:40rpx auto 100rpx;
  844. }
  845. }
  846. .bottom_btn{
  847. width: 690rpx;
  848. height: 90rpx;
  849. background: #0183FA;
  850. border-radius: 10rpx 10rpx 10rpx 10rpx;
  851. display: flex;
  852. justify-content: flex-start;
  853. position: fixed;
  854. left: 30rpx;
  855. bottom: 20rpx;
  856. .bottom_btn_li{
  857. flex: 1;
  858. font-size: 30rpx;
  859. font-family: PingFang SC-Medium, PingFang SC;
  860. font-weight: 400;
  861. color: #FFFFFF;
  862. line-height: 90rpx;
  863. text-align: center;
  864. position: relative;
  865. }
  866. .bottom_btn_li::after{
  867. content:'';
  868. position: absolute;
  869. top: 20rpx;
  870. right:0rpx;
  871. width: 1rpx;
  872. height: 60rpx;
  873. background: #D8D8D8;
  874. }
  875. .bottom_btn_li:nth-of-type(3)::after{
  876. display: none;
  877. }
  878. }
  879. }
  880. </style>