inspectAdd.vue 24 KB

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