conductInspections.vue 25 KB

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