home.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913
  1. <template>
  2. <view class="container">
  3. <!-- 头部选择房间区域 -->
  4. <view class="select-item" @click="navigateToSelect">
  5. <view class="picker-item-logol">
  6. <image class="picker-item-logo-left" src="../../static/room.png"></image>
  7. </view>
  8. <view class="picker-item-label">已选房间</view>
  9. <view class="picker-item-content" v-if="roomSelect=='请选择宿舍'">{{roomSelect}}</view>
  10. <view class="picker-item-content2" v-else>{{roomSelect}}</view>
  11. <view class="picker-item-logor">
  12. <image class="picker-item-logo-right" src="../../static/right.png"></image>
  13. </view>
  14. </view>
  15. <!-- 账单显示区域 -->
  16. <view class="bill">
  17. <!-- 筛选框区域 -->
  18. <view class="choose">
  19. <view class="time">
  20. <uni-data-select :clear="false" placeholder="请选择时间" :localdata="time_range" @change="changeTime">
  21. </uni-data-select>
  22. </view>
  23. <view class="type">
  24. <uni-data-select :clear="false" placeholder="请选择支付状态" :localdata="type_range" @change="changeType">
  25. </uni-data-select>
  26. </view>
  27. </view>
  28. <!-- 没有账单时展示的内容 -->
  29. <view class="null" v-if="!list.length">
  30. <img src="../../static/null.png">
  31. <span>暂无账单,请选择条件查询</span>
  32. </view>
  33. <!-- 有账单时展示的内容 -->
  34. <view class="has" v-else>
  35. <!-- 账单列表区域 -->
  36. <view class="has_bill">
  37. <view class="item" v-for="item in list" :key="item.id">
  38. <view class="item_header">
  39. {{item.payMonth+item.paymentItem}}
  40. </view>
  41. <view class="item_box">
  42. <view class="item_box_1">
  43. 上月表数:{{item.lastElectry}}
  44. </view>
  45. <view class="item_box_2">
  46. 本月表数:{{item.nowElectry}}
  47. </view>
  48. </view>
  49. <view class="item_box">
  50. <view class="item_box_1">
  51. 用量:{{item.nowTonnage}}吨
  52. </view>
  53. <view class="item_box_2">
  54. 补助吨数:{{item.subsidiesTonnage}}吨
  55. </view>
  56. </view>
  57. <view class="item_box" v-if="item.payItemType=='2'">
  58. <view class="item_box_1">
  59. 支付人:{{item.cardNumber}}
  60. </view>
  61. </view>
  62. <view class="item_notes">
  63. 备注:{{item.orderNotice}}
  64. </view>
  65. <view class="item_box">
  66. <view class="item_box_1 font">
  67. {{item.payCreateTime}}
  68. </view>
  69. <view class="item_box_2">
  70. 实付款:{{item.realPayAmount}}
  71. </view>
  72. </view>
  73. <view class="item_button">
  74. <button class="feedback right" type="primary" plain size="mini"
  75. @click="handleFeedback(item)">
  76. 订单反馈
  77. </button>
  78. <button class="feedback" type="warn" size="mini" disabled v-if="item.payItemType=='2'">
  79. 已支付
  80. </button>
  81. <button class="feedback" type="primary" size="mini" @click="navigateToPay(item)" v-else>
  82. 支付
  83. </button>
  84. </view>
  85. </view>
  86. </view>
  87. </view>
  88. </view>
  89. <!-- 电话区域按钮 -->
  90. <view class="phone">
  91. <view class="phone_box">
  92. 咨询电话:
  93. <span @click="handlePhone">82293462</span>
  94. </view>
  95. </view>
  96. <!-- 悬浮按钮区域 -->
  97. <view v-if="roomSelect!='请选择宿舍'" class="suspend_button" @click="goBill" @touchstart="down"
  98. @touchmove.prevent="move" @touchend="end">
  99. 订单查询
  100. </view>
  101. <!-- 订单反馈弹窗区域 -->
  102. <uni-popup ref="popup_feedback" background-color="#fff" :is-mask-click="false">
  103. <view class="popup_view">
  104. <view class="title">{{popTitle}}</view>
  105. <view class="forms">
  106. <uni-forms ref="valiForm" :rules="rules" :modelValue="valiFormData">
  107. <uni-forms-item label="姓名:" required name="feedbackPersonName">
  108. <uni-easyinput v-model="valiFormData.feedbackPersonName" placeholder="请输入姓名" />
  109. </uni-forms-item>
  110. <uni-forms-item label="联系电话:" required name="feedbackPersonPhone">
  111. <uni-easyinput maxlength="11" v-model="valiFormData.feedbackPersonPhone" type="number"
  112. placeholder="请输入联系人手机号码" />
  113. </uni-forms-item>
  114. <uni-forms-item label="宿舍号:" required name="feedbackRoom">
  115. <uni-easyinput v-model="valiFormData.feedbackRoom" placeholder="请输入宿舍号" />
  116. </uni-forms-item>
  117. <uni-forms-item label="反馈信息:" required name="feedbackInfo">
  118. <uni-easyinput type="textarea" v-model="valiFormData.feedbackInfo" placeholder="请输入反馈信息" />
  119. </uni-forms-item>
  120. <uni-forms-item label="上传图片:" name="feedbackImg">
  121. <uni-file-picker limit="3" title="最多上传3张图片" v-model="valiFormData.feedbackImg"
  122. fileMediatype="image" :image-styles="imageStyles" mode="grid" @select="select"
  123. @delete="handleDelete">
  124. </uni-file-picker>
  125. </uni-forms-item>
  126. </uni-forms>
  127. <view class="form_button">
  128. <button type="primary" size="mini" @click="popSubmit('valiForm')">
  129. 提交
  130. </button>
  131. <button type="primary" plain size="mini" @click="close">
  132. 取消
  133. </button>
  134. </view>
  135. </view>
  136. </view>
  137. </uni-popup>
  138. </view>
  139. </template>
  140. <script>
  141. // 引入照片压缩js文件
  142. import * as TranslateImage from '../../util/imageZip.js'
  143. export default {
  144. data() {
  145. return {
  146. // 图片上传组件的样式
  147. imageStyles: {
  148. width: 75,
  149. height: 75,
  150. border: {
  151. color: "#ccc",
  152. width: 1,
  153. style: 'dashed',
  154. radius: '5px'
  155. }
  156. },
  157. // 选择的宿舍绑定数据
  158. roomSelect: "请选择宿舍",
  159. // 悬浮按钮移动标识
  160. flags: false,
  161. maxW: 0,
  162. maxH: 0,
  163. position: {
  164. x: 0,
  165. y: 0
  166. },
  167. nx: 0,
  168. ny: 0,
  169. // 账单数据
  170. list: [],
  171. // 时间筛选框选中值绑定数据
  172. time_value: "",
  173. // 时间筛选框列表绑定数据
  174. time_range: [],
  175. // 支付状态 0是全部 1是未支付 2是已支付
  176. pay_type: 0,
  177. // 支付状态筛选框列表绑定数据
  178. type_range: [{
  179. value: 1,
  180. text: "全部"
  181. },
  182. {
  183. value: 2,
  184. text: "未支付"
  185. },
  186. {
  187. value: 3,
  188. text: "已支付"
  189. },
  190. ],
  191. // 订单反馈弹窗 表格的验证规则
  192. rules: {
  193. feedbackPersonName: {
  194. rules: [{
  195. required: true,
  196. errorMessage: "请输入姓名",
  197. },
  198. {
  199. minLength: 2,
  200. maxLength: 8,
  201. errorMessage: "请输入正确的姓名",
  202. }
  203. ],
  204. },
  205. feedbackPersonPhone: {
  206. rules: [{
  207. required: true,
  208. errorMessage: "请输入联系人手机号码",
  209. },
  210. {
  211. pattern: /^[1]([3-9])[0-9]{9}$/,
  212. errorMessage: '请输入正确的手机号码'
  213. }
  214. ],
  215. },
  216. feedbackRoom: {
  217. rules: [{
  218. required: true,
  219. errorMessage: "请输入宿舍号",
  220. }, ],
  221. },
  222. feedbackInfo: {
  223. rules: [{
  224. required: true,
  225. errorMessage: "请输入反馈信息",
  226. }, ],
  227. },
  228. },
  229. // 订单反馈弹窗 表格绑定数据
  230. valiFormData: {
  231. feedbackPersonName: "",
  232. feedbackPersonPhone: "",
  233. feedbackRoom: "",
  234. feedbackInfo: "",
  235. feedbackImg: []
  236. },
  237. // 弹窗标题
  238. popTitle: "",
  239. // 订单号
  240. orderNo: "",
  241. // 金额
  242. amount: "",
  243. // 微信支付参数
  244. form: {
  245. appId: "",
  246. timeStamp: "",
  247. nonceStr: "",
  248. signType: "",
  249. paySign: "",
  250. package: "",
  251. },
  252. //农商行地址
  253. notifyUrl: "https://chtech.ncjti.edu.cn/jiaofei/jiaofei-api/tuitionpayment/pay/jxnxs/notify/",
  254. };
  255. },
  256. onLoad() {
  257. // 如果之前已经选择过宿舍,则从缓存中读取
  258. if (localStorage.room) {
  259. this.roomSelect = "黄家湖" + localStorage.room
  260. this.getData()
  261. this.getTimeList()
  262. }
  263. },
  264. methods: {
  265. // 获取账单列表数据
  266. async getData() {
  267. if (!this.time_value) {
  268. let date = new Date();
  269. this.time_value = date.getFullYear()
  270. }
  271. let res = await this.$myRequest({
  272. url: "/payableinfowater/queryWaterInfo",
  273. data: {
  274. dorm: localStorage.room,
  275. year: this.time_value,
  276. payStatu: this.pay_type,
  277. },
  278. });
  279. // console.log(res);
  280. if (res.success) {
  281. this.list = res.data
  282. }
  283. },
  284. // 获取时间筛选框时间数组
  285. async getTimeList() {
  286. let res = await this.$myRequest({
  287. url: "/payableinfowater/queryAllYear",
  288. data: {
  289. dorm: localStorage.room,
  290. },
  291. });
  292. // console.log(res);
  293. if (res.success) {
  294. this.time_range = res.data
  295. }
  296. },
  297. // 选择图片回调
  298. select(e) {
  299. e.tempFiles.forEach((item) => {
  300. TranslateImage.translate(item.path, ((res) => {
  301. // 先清空图片数组
  302. this.valiFormData.feedbackImg = []
  303. // 判断图片大小是否过大
  304. if (Number(res.size) > 1000000) {
  305. uni.showModal({
  306. content: `图片过大,请重新上传`,
  307. showCancel: false,
  308. success() {}
  309. })
  310. return
  311. }
  312. uni.showLoading({
  313. title: '上传中'
  314. });
  315. // 上传图片
  316. uni.uploadFile({
  317. url: `http://192.168.161.34:9999/tuitionpayment/feedbackmsg/uploadImage`,
  318. filePath: res.url,
  319. name: 'images',
  320. success: (uploadFileRes) => {
  321. const path = item.path;
  322. this.valiFormData.feedbackImg.push({
  323. url: path,
  324. name: ""
  325. })
  326. uni.hideLoading();
  327. },
  328. fail: () => {
  329. uni.hideLoading();
  330. }
  331. });
  332. }))
  333. })
  334. },
  335. // 删除图片回调
  336. handleDelete(e) {
  337. const num = this.valiFormData.feedbackImg.findIndex(v => v.path === e.tempFilePath);
  338. this.valiFormData.feedbackImg.splice(num, 1);
  339. // console.log(this.valiFormData.feedbackImg);
  340. },
  341. // 订单反馈按钮弹窗
  342. async handleFeedback(item) {
  343. this.popTitle = item.title
  344. this.valiFormData.feedbackPersonName = "";
  345. this.valiFormData.feedbackPersonPhone = "";
  346. this.valiFormData.feedbackRoom = "";
  347. this.valiFormData.feedbackInfo = "";
  348. this.valiFormData.feedbackImg = [];
  349. let res = await this.$myRequest({
  350. url: "/wechat/getUserNameTele",
  351. data: {
  352. cardNumber: localStorage.card_number || "360721199802141618",
  353. },
  354. });
  355. // console.log(res);
  356. if (res.success) {
  357. this.valiFormData.feedbackPersonName = res.data.name
  358. this.valiFormData.feedbackPersonPhone = res.data.telephone
  359. this.valiFormData.feedbackRoom = localStorage.room
  360. }
  361. this.$refs.popup_feedback.open();
  362. },
  363. // 订单反馈弹窗提交按钮回调
  364. popSubmit(ref) {
  365. this.$refs[ref]
  366. .validate()
  367. .then(async (res) => {
  368. // 如果上传了图片,处理图片参数字段
  369. if (res.feedbackImg.length) {
  370. let temList = []
  371. res.feedbackImg.forEach((ele) => {
  372. temList.push(ele.url)
  373. })
  374. res.image = temList.join(";")
  375. }
  376. res.feedbackItemName = "水费缴纳"
  377. // 整理参数
  378. let {
  379. feedbackImg,
  380. ...data
  381. } = res
  382. let result = await this.$myRequest({
  383. url: "/feedbackmsg/save",
  384. method: "post",
  385. data
  386. })
  387. if (result.success) {
  388. uni.showToast({
  389. title: '提交成功',
  390. });
  391. }
  392. this.$refs.popup_feedback.close();
  393. })
  394. .catch((err) => {
  395. console.log("err", err);
  396. });
  397. },
  398. // 订单反馈弹窗取消按钮回调
  399. close() {
  400. this.$refs.popup_feedback.close();
  401. },
  402. // 时间筛选框数据改变回调
  403. changeTime(e) {
  404. if (e != "") {
  405. this.time_range.forEach((element) => {
  406. if (element.value == e) {
  407. this.time_value = element.text
  408. }
  409. })
  410. this.getData()
  411. }
  412. },
  413. // 支付状态筛选框数据改变回调
  414. changeType(e) {
  415. if (e == 1 || e == 2 || e == 3) {
  416. if (e == 1) {
  417. this.pay_type = 0
  418. } else if (e == 2) {
  419. this.pay_type = 1
  420. } else if (e == 3) {
  421. this.pay_type = 2
  422. }
  423. this.getData()
  424. }
  425. },
  426. // 跳转到选择宿舍页面
  427. navigateToSelect() {
  428. uni.navigateTo({
  429. url: '/pages/select/select',
  430. });
  431. },
  432. // 支付回调
  433. navigateToPay(item) {
  434. // console.log(item);
  435. this.amount = item.realPayAmount;
  436. this.getQuery(item)
  437. },
  438. // 处理参数
  439. async getQuery(item) {
  440. // console.log(item);
  441. let res = await this.$myRequest({
  442. url: `/payorder/${item.payForIdentify}/receiveOrder`,
  443. method: "post",
  444. data: {
  445. id: item.id,
  446. studentNo: "",
  447. itemName: item.paymentItem,
  448. payYear: item.payMonth,
  449. payDetail: item.payAmountDetail,
  450. dorm: item.dorm,
  451. payOrderLoan: "",
  452. orderNotice: item.orderNotice,
  453. // payItemType: 1,
  454. payCount: "1",
  455. notPaySize: 0,
  456. nowRealPayAmount: item.realPayAmount,
  457. payerCardNumber: localStorage.card_number || "360721199802141618",
  458. payerName: localStorage.studentName || "陈志斌"
  459. }
  460. })
  461. // console.log(res);
  462. if (res.success) {
  463. this.createPayorder(item)
  464. }
  465. },
  466. // 创建订单
  467. async createPayorder(item) {
  468. let res = await this.$myRequest({
  469. url: `/payorder/${item.payForIdentify}/create`,
  470. method: "post",
  471. data: {
  472. id: item.id,
  473. studentNo: "",
  474. itemName: item.paymentItem,
  475. payYear: item.payMonth,
  476. payDetail: item.payAmountDetail,
  477. dorm: item.dorm,
  478. payOrderLoan: 0,
  479. orderNotice: item.orderNotice,
  480. payCount: "1",
  481. notPaySize: 0,
  482. nowRealPayAmount: item.realPayAmount,
  483. payerCardNumber: localStorage.card_number || "360721199802141618",
  484. payerName: localStorage.studentName || "陈志斌"
  485. },
  486. });
  487. // console.log(res);
  488. if (res.success) {
  489. this.orderNo = res.data[0].orderNo;
  490. if (res.data[0].payMethod == "1") {
  491. // console.log("建行");
  492. this.getjhPay();
  493. } else {
  494. // console.log("农商");
  495. this.getnsPay();
  496. }
  497. }
  498. },
  499. // 建行支付请求
  500. async getjhPay() {
  501. let res = await this.$myRequest({
  502. url: "/pay/ccb/getJsApiParam",
  503. data: {
  504. orderNo: this.orderNo,
  505. openId: localStorage.openId,
  506. secondOrderNo: "",
  507. },
  508. });
  509. // console.log(res);
  510. if (res.success) {
  511. this.form = {
  512. ...res.data,
  513. };
  514. //调起微信支付
  515. this.wxPay();
  516. } else {
  517. uni.showToast({
  518. title: res.message,
  519. icon: "error",
  520. mask: true,
  521. });
  522. }
  523. },
  524. // 微信支付回调
  525. wxPay() {
  526. let that = this;
  527. function onBridgeReady() {
  528. WeixinJSBridge.invoke(
  529. "getBrandWCPayRequest",
  530. that.form,
  531. function(res) {
  532. if (res.errMsg == "get_brand_wcpay_request:ok") {
  533. // 使用以上方式判断前端返回,微信团队郑重提示:
  534. //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
  535. }
  536. }
  537. );
  538. }
  539. // 兼容处理
  540. if (typeof WeixinJSBridge == "undefined") {
  541. if (document.addEventListener) {
  542. document.addEventListener(
  543. "WeixinJSBridgeReady",
  544. onBridgeReady,
  545. false
  546. );
  547. } else if (document.attachEvent) {
  548. document.attachEvent("WeixinJSBridgeReady", onBridgeReady);
  549. document.attachEvent("onWeixinJSBridgeReady", onBridgeReady);
  550. }
  551. } else {
  552. onBridgeReady();
  553. }
  554. },
  555. // 农商支付请求
  556. getnsPay() {
  557. let O = "6fc31630a4d3de99f5e41debbd35b9f0";
  558. let out_no = this.orderNo;
  559. let amount = this.amount;
  560. let appoint_notify = this.notifyUrl;
  561. let mainUrl =
  562. `https://q.jxnxs.com/newpay?O=${O}&out_no=${out_no}&amount=${amount}&appoint_notify=${appoint_notify}`;
  563. window.location.href = mainUrl;
  564. },
  565. // 订单查询悬浮按钮回调
  566. goBill() {
  567. uni.navigateTo({
  568. url: "/pages/bill/bill"
  569. })
  570. },
  571. // 实现移动端拖拽
  572. down(event) {
  573. let suspend_button = document.querySelector(".suspend_button");
  574. this.flags = true;
  575. let touch;
  576. if (event.touches) {
  577. touch = event.touches[0];
  578. } else {
  579. touch = event;
  580. }
  581. this.maxW = document.body.clientWidth - suspend_button.offsetWidth;
  582. this.maxH = document.body.clientHeight - suspend_button.offsetHeight;
  583. this.position.x = touch.clientX - suspend_button.offsetLeft;
  584. this.position.y = touch.clientY - suspend_button.offsetTop;
  585. },
  586. move(event) {
  587. let suspend_button = document.querySelector(".suspend_button");
  588. if (this.flags) {
  589. let touch;
  590. if (event.touches) {
  591. touch = event.touches[0];
  592. } else {
  593. touch = event;
  594. }
  595. this.nx = touch.clientX - this.position.x;
  596. this.ny = touch.clientY - this.position.y;
  597. if (this.nx < 0) {
  598. this.nx = 0;
  599. } else if (this.nx > this.maxW) {
  600. this.nx = this.maxW;
  601. }
  602. if (this.ny < 0) {
  603. this.ny = 0;
  604. } else if (this.ny >= this.maxH) {
  605. this.ny = this.maxH;
  606. }
  607. suspend_button.style.left = this.nx + "px";
  608. suspend_button.style.top = this.ny + "px";
  609. }
  610. },
  611. end() {
  612. this.flags = false;
  613. },
  614. // 拨打电话回调
  615. handlePhone() {
  616. uni.makePhoneCall({
  617. phoneNumber: '82293462'
  618. });
  619. },
  620. }
  621. }
  622. </script>
  623. <style lang="scss" scoped>
  624. .container {
  625. overflow: auto;
  626. height: 100vh;
  627. background-image: url(../../static/bg.png);
  628. background-size: 100% 100%;
  629. .select-item {
  630. margin: 19rpx 0;
  631. display: flex;
  632. background-color: #ffffff;
  633. height: 139rpx;
  634. .picker-item-logol {
  635. width: 88rpx;
  636. display: flex;
  637. justify-content: flex-end;
  638. align-items: center;
  639. .picker-item-logo-left {
  640. width: 58rpx;
  641. height: 58rpx;
  642. }
  643. }
  644. .picker-item-label {
  645. font-size: 30rpx;
  646. width: 161rpx;
  647. height: 139rpx;
  648. line-height: 139rpx;
  649. text-align: center;
  650. }
  651. .picker-item-content {
  652. width: 360rpx;
  653. height: 139rpx;
  654. line-height: 139rpx;
  655. font-size: 36rpx;
  656. text-align: center;
  657. color: #999999;
  658. }
  659. .picker-item-content2 {
  660. width: 360rpx;
  661. height: 139rpx;
  662. line-height: 139rpx;
  663. font-size: 36rpx;
  664. text-align: center;
  665. color: black;
  666. }
  667. .picker-item-logor {
  668. width: 91rpx;
  669. display: flex;
  670. justify-content: center;
  671. align-items: center;
  672. .picker-item-logo-right {
  673. width: 40rpx;
  674. height: 40rpx;
  675. }
  676. }
  677. }
  678. .bill {
  679. margin: 20rpx 0;
  680. min-height: 920rpx;
  681. .choose {
  682. display: flex;
  683. margin: 0 20rpx;
  684. .time {
  685. flex: 1;
  686. padding-right: 40rpx;
  687. }
  688. .type {
  689. flex: 1;
  690. }
  691. }
  692. .null {
  693. display: flex;
  694. flex-direction: column;
  695. align-items: center;
  696. margin: 0 auto;
  697. padding-top: 300rpx;
  698. width: 50%;
  699. height: 400rpx;
  700. img {
  701. height: 90%;
  702. }
  703. span {
  704. margin-top: 30rpx;
  705. }
  706. }
  707. .has {
  708. margin: 0 20rpx;
  709. .has_bill {
  710. margin-top: 20rpx;
  711. .item {
  712. margin-bottom: 20rpx;
  713. border-radius: 10rpx;
  714. background-color: #fff;
  715. .item_header {
  716. height: 96rpx;
  717. line-height: 96rpx;
  718. text-align: center;
  719. font-weight: bold;
  720. border-radius: 10rpx 10rpx 0 0;
  721. background-color: #e7eef5;
  722. }
  723. .item_box {
  724. display: flex;
  725. margin: 0 30rpx;
  726. height: 70rpx;
  727. line-height: 70rpx;
  728. font-weight: bold;
  729. .item_box_1 {
  730. flex: 1.5;
  731. }
  732. .item_box_2 {
  733. flex: 1;
  734. }
  735. .font {
  736. font-weight: normal;
  737. color: #999;
  738. }
  739. }
  740. .item_notes {
  741. margin: 0 30rpx;
  742. height: 60rpx;
  743. line-height: 60rpx;
  744. font-size: 26rpx;
  745. color: #999;
  746. }
  747. .item_button {
  748. display: flex;
  749. justify-content: flex-end;
  750. margin: 10rpx 50rpx;
  751. height: 74rpx;
  752. line-height: 74rpx;
  753. .feedback {
  754. margin: 0;
  755. padding: 0;
  756. width: 140rpx;
  757. height: 65rpx;
  758. line-height: 65rpx;
  759. font-size: 26rpx;
  760. }
  761. .right {
  762. margin-right: 50rpx;
  763. }
  764. }
  765. }
  766. }
  767. }
  768. }
  769. .phone {
  770. display: flex;
  771. justify-content: center;
  772. align-items: center;
  773. margin: 20rpx 0;
  774. height: 70rpx;
  775. .phone_box {
  776. margin-bottom: 20rpx;
  777. span {
  778. color: #4993EA;
  779. }
  780. }
  781. }
  782. .suspend_button {
  783. position: fixed;
  784. left: 80rpx;
  785. bottom: 120rpx;
  786. width: 140rpx;
  787. height: 140rpx;
  788. line-height: 140rpx;
  789. text-align: center;
  790. border-radius: 70rpx;
  791. color: #fff;
  792. background-color: rgba(0, 0, 0, 0.4);
  793. }
  794. .popup_view {
  795. width: 650rpx;
  796. .title {
  797. height: 90rpx;
  798. line-height: 90rpx;
  799. font-size: 36rpx;
  800. font-weight: bold;
  801. text-align: center;
  802. background-color: #e7eef5;
  803. }
  804. .forms {
  805. margin: 40rpx;
  806. width: 550rpx;
  807. .form_button {
  808. display: flex;
  809. text-align: center;
  810. button {
  811. width: 200rpx;
  812. }
  813. }
  814. }
  815. }
  816. }
  817. ::v-deep .uni-select__input-placeholder {
  818. color: #fff;
  819. }
  820. ::v-deep .uniui-bottom::before {
  821. color: #fff;
  822. }
  823. ::v-deep .uni-forms-item__label {
  824. width: 160rpx !important;
  825. }
  826. </style>