checkAfterScanning.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747
  1. <template>
  2. <view class="checkAfterScanning">
  3. <view class="checkAfterScanning_title">标本核对</view>
  4. <view class="page_item_cont">
  5. <view class="page_item_cont_T">
  6. <view class="page_item_cont_title">
  7. <view> 工单单号 </view>
  8. <view class="text_big">{{info.gdCode}}</view>
  9. </view>
  10. <view class="page_item_cont_title">
  11. <view class="text_title"> 科室名称 </view>
  12. <view class="text_big">{{info.LCDept}}</view>
  13. </view>
  14. <view class="page_item_cont_title">
  15. <view> 扫描标本数量 </view>
  16. <view class="text_big" @click="goToSpeDetail()"><text class="underline">{{info.total}}</text>只</view>
  17. </view>
  18. <view class="page_item_cont_title2">
  19. 检验科室标本数量:
  20. </view>
  21. <view class="page_item_cont_title" v-for="(item, i) in info.data" :key="i">
  22. <template v-if="taskTypeConfig.speExpandTube == 1">
  23. <uni-collapse :border="false">
  24. <uni-collapse-item titleBorder="none" :open="taskTypeConfig.speDefaultExpandTube == 1">
  25. <template v-slot:title>
  26. <view class="page_item_cont_title_coll">
  27. <view>{{item.deptName}}</view>
  28. <view class="text_big" style="padding-right: 20rpx;" @click.stop="goToSpeDetail(item.deptName,item.deptQrCode)"><text class="underline">{{item.speCount}}</text>只</view>
  29. </view>
  30. </template>
  31. <view class="content">
  32. <view class="list" v-for="x in item.tubeTypeData" :key="x.id" @click="viewSpe(item.deptName,item.deptQrCode,x.tubeTypeId)">
  33. {{x.tubeTypeName}}:<text class="underline-item">{{x.speCount}}</text>
  34. </view>
  35. </view>
  36. </uni-collapse-item>
  37. </uni-collapse>
  38. </template>
  39. <template v-else>
  40. <view class="page_item_cont_title_coll" style="width: 100%;">
  41. <view>{{item.deptName}}</view>
  42. <view class="text_big" @click.stop="goToSpeDetail(item.deptName,item.deptQrCode)"><text class="underline">{{item.speCount}}</text>只</view>
  43. </view>
  44. </template>
  45. </view>
  46. </view>
  47. </view>
  48. <view class="foot_btn_spe" v-if="enterDynamicDigitalKey==0">
  49. <view class="btn1" @click="Scanning_complete('scan')">核对完成</view>
  50. <view class="btn3" @click="goBack">返回</view>
  51. </view>
  52. <view class="foot_btn_spe" v-if="enterDynamicDigitalKey==1">
  53. <view class="btn1" @click="Scanning_complete('scan')">扫码交接</view>
  54. <view class="btn1" @click="isShowKey()">数字交接</view>
  55. <view class="btn3" @click="goBack">返回</view>
  56. </view>
  57. <!-- 弹窗 -->
  58. <showModel :title="models.title" :icon="models.icon" :disjunctor="models.disjunctor" :content="models.content"
  59. @ok="ok" @cancel="cancel" :operate="models.operate"></showModel>
  60. <!-- 弹窗 -->
  61. <showModel :title="models2.title" :icon="models2.icon" :disjunctor="models2.disjunctor" :content="models2.content"
  62. @ok="ok2" @know="know2" @cancel="cancel2" :operate="models2.operate"></showModel>
  63. <!-- 动态密钥 -->
  64. <numberKeyModel v-if="showKey" :keyArr="keyArr" @cancel="showKey = false" @confirm="confirmKey($event)"></numberKeyModel>
  65. </view>
  66. </template>
  67. <script>
  68. import {
  69. get,
  70. post,
  71. SM,
  72. webHandle
  73. } from "../../http/http.js";
  74. import numberKeyModel from "../../components/numberKeyModel/numberKeyModel.vue";
  75. export default {
  76. data() {
  77. return {
  78. taskTypeConfig: {},
  79. handoverId: undefined,
  80. handoverDeptId: undefined,
  81. info: {},
  82. wcFlag: false,
  83. queryObj: {}, //路由传递过来的数据
  84. // 弹窗model
  85. models: {
  86. disjunctor: false,
  87. },
  88. // 完成扫描弹窗model1
  89. models2: {
  90. disjunctor: false,
  91. },
  92. showKey:false,
  93. keyNum:4, //密钥位数
  94. isNumberKey:false, //是否开启动态密钥
  95. keyArr: [],
  96. enterDynamicDigitalKey:null,
  97. keyType:null,
  98. contentData:null,
  99. };
  100. },
  101. components: {
  102. numberKeyModel
  103. },
  104. methods: {
  105. viewSpe(deptName, qrCode, id){
  106. uni.navigateTo({
  107. url: `../viewSpe/viewSpe?deptName=${deptName}&workOrderId=${encodeURIComponent(JSON.stringify([this.queryObj.id]))}&deptCode=${qrCode}&tubeTypeId=${id}&isScan=1&specimensCheck=1`,
  108. });
  109. },
  110. confirmKey(data){
  111. this.Scanning_complete('key')
  112. this.contentData = data
  113. this.showKey = false
  114. },
  115. isShowKey(){
  116. this.showKey = true
  117. },
  118. // 获取配置
  119. getConfig() {
  120. // 判断开关
  121. const userData = uni.getStorageSync("userData");
  122. let postData = {
  123. idx: 0,
  124. sum: 9999,
  125. hospitalConfig:{
  126. hosId:userData.user.currentHospital.id,
  127. model:"all"
  128. }
  129. };
  130. post("/simple/data/fetchDataList/hospitalConfig",postData).then((result) => {
  131. if (result.status == 200) {
  132. this.keyArr = []
  133. for(let i of result.list){
  134. if(i.key=='digitalSecretKey'){
  135. if(i.value==1){
  136. this.isNumberKey = true
  137. }else{
  138. this.isNumberKey = false
  139. }
  140. }else if(i.key=='numberDigitalSecretKey'){
  141. this.keyNum = Number(i.value)
  142. }
  143. }
  144. for(let i = 0; i < this.keyNum; i++){
  145. this.keyArr.push({
  146. value:null
  147. })
  148. }
  149. }
  150. });
  151. uni.showLoading({
  152. title: "加载中",
  153. mask: true,
  154. });
  155. // 查询标本配送业务
  156. post("/simple/data/fetchDataList/taskType",{
  157. "idx": 0,
  158. "sum": 10,
  159. "taskType": {
  160. "simpleQuery": true,
  161. "hosId": {
  162. "id": userData.user.currentHospital.id
  163. },
  164. "associationType": {
  165. "key": "association_types",
  166. "value": "specimen"
  167. }
  168. }
  169. }).then((res) => {
  170. if (res.status == 200) {
  171. let taskTypeDTO = res.list[0];
  172. if(taskTypeDTO){
  173. // 查询业务页面控制-标本
  174. post("/simple/data/fetchDataList/taskTypeConfig",{
  175. "idx": 0,
  176. "sum": 10,
  177. "taskTypeConfig": {
  178. taskTypeDTO,
  179. }
  180. }).then((res) => {
  181. if (res.status == 200) {
  182. let data = res.list[0];
  183. uni.hideLoading();
  184. if(data){
  185. this.taskTypeConfig = data || {};
  186. // 输入动态数字密钥
  187. this.enterDynamicDigitalKey = data.enterDynamicDigitalKey
  188. console.log(55555,this.enterDynamicDigitalKey)
  189. }
  190. } else {
  191. uni.hideLoading();
  192. uni.showToast({
  193. icon: "none",
  194. title: res.msg || "接口获取数据失败!",
  195. });
  196. }
  197. });
  198. }else{
  199. uni.hideLoading();
  200. }
  201. } else {
  202. uni.hideLoading();
  203. uni.showToast({
  204. icon: "none",
  205. title: res.msg || "接口获取数据失败!",
  206. });
  207. }
  208. });
  209. },
  210. // 获取核对信息
  211. getInfo(gdId){
  212. uni.showLoading({
  213. title: '加载中',
  214. mask: true
  215. });
  216. post("/api/specimensCheck", {gdIds:gdId}).then((res) => {
  217. uni.hideLoading();
  218. if (res.status == 200) {
  219. console.log(res)
  220. res.LCDept = res.LCDept.join(',');
  221. this.info = res;
  222. } else {
  223. uni.showToast({
  224. icon: "none",
  225. title: res.msg || "接口获取数据失败!",
  226. });
  227. }
  228. })
  229. },
  230. // 返回
  231. goBack() {
  232. uni.navigateBack();
  233. },
  234. // 业务页面控制-标本-收取时需扫描二维码
  235. beforeScanning(fn) {
  236. this.handoverId = undefined;//扫动态码或静态码,后端会返回交接人,核对完成接口传过去
  237. this.handoverDeptId = undefined;//扫动态码或静态码,后端会返回科室,核对完成接口传过去
  238. // 判断开关
  239. const userData = uni.getStorageSync("userData");
  240. console.log('userData', userData);
  241. uni.showLoading({
  242. title: "加载中",
  243. mask: true,
  244. });
  245. // 查询标本配送业务
  246. post("/simple/data/fetchDataList/taskType",{
  247. "idx": 0,
  248. "sum": 10,
  249. "taskType": {
  250. "simpleQuery": true,
  251. "hosId": {
  252. "id": userData.user.currentHospital.id
  253. },
  254. "associationType": {
  255. "key": "association_types",
  256. "value": "specimen"
  257. }
  258. }
  259. }).then((res) => {
  260. if (res.status == 200) {
  261. let taskTypeDTO = res.list[0];
  262. if(taskTypeDTO){
  263. // 查询业务页面控制-标本
  264. post("/simple/data/fetchDataList/taskTypeConfig",{
  265. "idx": 0,
  266. "sum": 10,
  267. "taskTypeConfig": {
  268. taskTypeDTO,
  269. }
  270. }).then((res) => {
  271. if (res.status == 200) {
  272. let data = res.list[0];
  273. if(data){
  274. // 收取时需扫描二维码
  275. if(data.arriveScanCode == 1){
  276. // 扫描科室二维码
  277. uni.hideLoading();
  278. if(this.keyType=='key'){
  279. let postData = {
  280. code: this.contentData,
  281. type: 'specimen',
  282. hosId: userData.user.currentHospital.id,
  283. orderId: +this.queryObj.id,
  284. };
  285. console.log(postData)
  286. uni.showLoading({
  287. title: "加载中",
  288. mask: true,
  289. });
  290. post("/workerOrder/arriveScanCheck", postData).then((res) => {
  291. uni.hideLoading();
  292. if (res.state == 200) {
  293. this.handoverId = res.handover;//扫动态码或静态码,后端会返回交接人,核对完成接口传过去
  294. this.handoverDeptId = res.handoverDeptId;//扫动态码或静态码,后端会返回科室,核对完成接口传过去
  295. fn();
  296. } else {
  297. uni.showToast({
  298. icon: "none",
  299. title: res.msg || "接口获取数据失败!",
  300. });
  301. }
  302. })
  303. }else{
  304. SM().then((content) => {
  305. let postData = {
  306. code: content,
  307. type: 'specimen',
  308. hosId: userData.user.currentHospital.id,
  309. orderId: +this.queryObj.id,
  310. };
  311. console.log(postData)
  312. uni.showLoading({
  313. title: "加载中",
  314. mask: true,
  315. });
  316. post("/workerOrder/arriveScanCheck", postData).then((res) => {
  317. uni.hideLoading();
  318. if (res.state == 200) {
  319. this.handoverId = res.handover;//扫动态码或静态码,后端会返回交接人,核对完成接口传过去
  320. this.handoverDeptId = res.handoverDeptId;//扫动态码或静态码,后端会返回科室,核对完成接口传过去
  321. fn();
  322. } else {
  323. uni.showToast({
  324. icon: "none",
  325. title: res.msg || "接口获取数据失败!",
  326. });
  327. }
  328. })
  329. }).catch(err => {
  330. });
  331. }
  332. }else{
  333. uni.hideLoading();
  334. fn();
  335. }
  336. }else{
  337. uni.hideLoading();
  338. fn();
  339. }
  340. } else {
  341. uni.hideLoading();
  342. uni.showToast({
  343. icon: "none",
  344. title: res.msg || "接口获取数据失败!",
  345. });
  346. }
  347. });
  348. }else{
  349. uni.hideLoading();
  350. uni.showToast({
  351. icon: "none",
  352. title: "未查询到标本配送业务!",
  353. });
  354. }
  355. } else {
  356. uni.hideLoading();
  357. uni.showToast({
  358. icon: "none",
  359. title: res.msg || "接口获取数据失败!",
  360. });
  361. }
  362. });
  363. },
  364. // 完成核对
  365. Scanning_complete(type) {
  366. this.keyType = type
  367. this.beforeScanning(() => {
  368. if (
  369. this.queryObj.type1 == "plan-spe-ddd-2" ||
  370. this.queryObj.type1 == "spe-ddd-2"
  371. ) {
  372. this.wcFlag = true;
  373. this.models = {
  374. disjunctor: true,
  375. title: "提示",
  376. content: "是否确定标本已核对完成?",
  377. icon: "warn",
  378. operate: {
  379. ok: "确定",
  380. cancel: "取消",
  381. },
  382. };
  383. } else if (
  384. this.queryObj.type1 == "plan-spe-dsd-2" ||
  385. this.queryObj.type1 == "plan-spe-dsd-3" ||
  386. this.queryObj.type1 == "spe-dsd-2" ||
  387. this.queryObj.type1 == "spe-dsd-3"
  388. ) {
  389. this.wcFlag = false;
  390. this.models = {
  391. disjunctor: true,
  392. title: "提示",
  393. content: "是否确定标本已核对完成?",
  394. icon: "warn",
  395. operate: {
  396. ok: "确定",
  397. cancel: "取消",
  398. },
  399. };
  400. } else {
  401. this.gotoOver();
  402. }
  403. });
  404. },
  405. // 跳转完成工单页面
  406. gotoOver() {
  407. uni.navigateTo({
  408. url: `../scanning/scanning?type=${this.queryObj.type}&type1=${
  409. this.queryObj.type1
  410. }&id=${encodeURIComponent(JSON.stringify([this.queryObj.id]))}&deptCode=${
  411. this.queryObj.deptCode
  412. }&dept=${this.queryObj.dept}&speNum=${this.queryObj.speNum}&content=${this.queryObj.content}`,
  413. });
  414. },
  415. // 确定
  416. ok() {
  417. this.models.disjunctor = false;
  418. let postData = {
  419. ids: [this.queryObj.id],
  420. sign: true,
  421. deptQrCode: this.queryObj.deptCode
  422. };
  423. uni.showLoading({
  424. title: '加载中',
  425. mask: true
  426. });
  427. post("/workerOrder/expectedAndActual", postData).then((ress) => {
  428. uni.hideLoading();
  429. if (ress.status == 200) {
  430. if (this.wcFlag) {
  431. //正常完成扫描
  432. this.overFinish()
  433. } else {
  434. this.gotoOver();
  435. }
  436. } else if (ress.status == 1000035) {
  437. let content = '';
  438. if (this.queryObj.type1 === 'spe-ddd-2' || this.queryObj.type1 === 'plan-spe-ddd-2') {
  439. //待到达
  440. content =
  441. `系统内预计标本<strong class="red">${ress.expectReceiveNum}</strong>只,您扫描收取标本<strong class="red">${ress.actualReceiveNum}</strong>只,其中<strong class="red">${ress.notReceiveNum}</strong>只未扫描;`;
  442. } else {
  443. //待送达
  444. this.content =
  445. `本工单已签到<strong class="red">${ress.scanSet?ress.scanSet.join('、'):''}</strong>,剩余需签到科室<strong class="red">${ress.notScanSet?ress.notScanSet.join('、'):''}</strong>,总签收<strong class="red">${ress.totalAcceptance}</strong>只,剩余<strong class="red">${ress.notAcceptance}</strong>只未签收,您确定完成工单吗?`;
  446. content =
  447. `您在<strong class="red">${ress.deptName}</strong>检验科扫描了<strong class="red">${ress.deptScanNum}</strong>个标本,还需扫描<strong class="red">${ress.deptNotScanNum}</strong>标本。`;
  448. }
  449. // 取消弹窗 2022年10月10日
  450. this.ok2();
  451. // this.models2 = {
  452. // disjunctor: true,
  453. // title: "提示",
  454. // content,
  455. // icon: "warn",
  456. // operate: {
  457. // ok: "确定",
  458. // cancel: "取消",
  459. // },
  460. // };
  461. } else {
  462. uni.showToast({
  463. icon: "none",
  464. title: ress.msg || "接口获取数据失败!",
  465. });
  466. }
  467. })
  468. },
  469. // 取消
  470. cancel() {
  471. this.models.disjunctor = false;
  472. },
  473. // 确定
  474. ok2() {
  475. this.models2.disjunctor = false;
  476. let postData = {
  477. ids: [this.queryObj.id],
  478. deptQrCode: this.queryObj.deptCode
  479. };
  480. uni.showLoading({
  481. title: '加载中',
  482. mask: true
  483. });
  484. post("/workerOrder/expectedAndActual", postData).then((ress) => {
  485. uni.hideLoading();
  486. if (ress.status == 200) {
  487. if (this.wcFlag) {
  488. this.overFinish()
  489. } else {
  490. this.gotoOver();
  491. }
  492. } else {
  493. uni.showToast({
  494. icon: "none",
  495. title: ress.msg || "接口获取数据失败!",
  496. });
  497. }
  498. })
  499. },
  500. // 取消
  501. cancel2() {
  502. this.models2.disjunctor = false;
  503. },
  504. know2() {
  505. this.models2.disjunctor = false;
  506. uni.navigateTo({
  507. url: "../receiptpage/receiptpage",
  508. });
  509. },
  510. // 正常完成扫描
  511. overFinish() {
  512. let data = {
  513. type: this.queryObj.type1,
  514. ids: [this.queryObj.id],
  515. };
  516. //只要是标本轮巡1对多或者多对多
  517. // plan-spe-dsd-2 1对多
  518. // plan-spe-dsd-3 多对多
  519. if (
  520. this.queryObj.type1 === "plan-spe-ddd-2" ||
  521. this.queryObj.type1 === "plan-spe-dsd-2" ||
  522. this.queryObj.type1 === "plan-spe-dsd-3"
  523. ) {
  524. post("/workerOrder/finishPlanSpes", data).then((res) => {
  525. // uni.hideLoading()
  526. if (res.status == 200) {
  527. this.models2 = {
  528. disjunctor: true,
  529. title: "提示",
  530. content: `完成扫描成功`,
  531. icon: "success",
  532. operate: {
  533. know: "返回",
  534. },
  535. };
  536. } else {
  537. uni.showToast({
  538. icon: "none",
  539. title: res.msg || "接口获取数据失败!",
  540. });
  541. }
  542. });
  543. } else {
  544. data.handover = this.handoverId || undefined;
  545. data.handoverDeptId = this.handoverDeptId || undefined;
  546. post("/workerOrder/finishSpes", data).then((res) => {
  547. // uni.hideLoading()
  548. if (res.status == 200) {
  549. uni.navigateTo({
  550. url: "../receiptpage/receiptpage",
  551. });
  552. } else {
  553. uni.showToast({
  554. icon: "none",
  555. title: res.msg || "接口获取数据失败!",
  556. });
  557. }
  558. });
  559. }
  560. },
  561. // 跳转到已扫描标本详情页
  562. goToSpeDetail(deptName='', qrCode=''){
  563. uni.navigateTo({
  564. url: `../noScanSpecimen/noScanSpecimen?deptName=${deptName}&workOrderId=${encodeURIComponent(JSON.stringify([this.queryObj.id]))}&deptCode=${qrCode}&isScan=1&specimensCheck=1`,
  565. });
  566. }
  567. },
  568. onLoad(options) {
  569. console.log(options);
  570. this.queryObj = options;
  571. this.getInfo(this.queryObj.id);
  572. this.getConfig();
  573. // #ifdef APP-PLUS
  574. webHandle("no", "app");
  575. // #endif
  576. // #ifdef H5
  577. webHandle("no", "wx");
  578. // #endif
  579. },
  580. };
  581. </script>
  582. <style lang="less" scoped>
  583. /deep/ .uni-collapse-item--border{
  584. border-bottom-color: #fff !important;
  585. }
  586. /deep/ .uni-collapse-item__title-arrow{
  587. margin-right: 0 !important;
  588. }
  589. .checkAfterScanning {
  590. .checkAfterScanning_title {
  591. padding: 50rpx 0;
  592. font-size: 46rpx;
  593. font-weight: 550;
  594. text-align: center;
  595. // border-bottom: 1px solid #ccc;
  596. }
  597. .page_item_cont {
  598. height: 73vh;
  599. overflow-y: auto;
  600. padding: 0 20rpx;
  601. text-align: left;
  602. position: relative;
  603. .text_title{
  604. flex-shrink: 0;
  605. margin-right: 16rpx;
  606. }
  607. .text_big {
  608. font-size: 32rpx;
  609. font-weight: 700;
  610. // margin-top: 10rpx;
  611. }
  612. .underline{
  613. text-decoration: underline;
  614. }
  615. .underline-item{
  616. // text-decoration: underline;
  617. // margin-right: 40rpx;
  618. }
  619. .page_item_cont_T {
  620. padding-top: 28rpx;
  621. padding-bottom: 28rpx;
  622. font-size: 28rpx;
  623. background: #fff;
  624. border: 1px solid #CBCBCB;
  625. border-radius: 10rpx;
  626. padding: 20rpx;
  627. .page_item_cont_title {
  628. height: 100%;
  629. font-size: 32rpx;
  630. display: flex;
  631. justify-content: space-between;
  632. align-items: center;
  633. margin-top: 10rpx;
  634. .content{
  635. display: flex;
  636. flex-wrap: wrap;
  637. .list{
  638. font-size: 28rpx;
  639. height: 60rpx;
  640. line-height: 60rpx;
  641. width: 50%;
  642. border-bottom: 1rpx solid #E6E6E6;
  643. }
  644. }
  645. }
  646. .page_item_cont_title2{
  647. margin-top: 36rpx;
  648. margin-bottom: 18rpx;
  649. height: 100%;
  650. font-size: 32rpx;
  651. font-weight: bold;
  652. display: flex;
  653. align-items: center;
  654. }
  655. }
  656. .page_item_cont_title_coll{
  657. display: flex;
  658. justify-content: space-between;
  659. align-items: center;
  660. margin-right: 8rpx;
  661. }
  662. .page_item_cont_B {
  663. padding-top: 28rpx;
  664. margin-bottom: 28rpx;
  665. .page_item_cont_title {
  666. font-size: 32rpx;
  667. display: flex;
  668. justify-content: space-between;
  669. }
  670. .page_item_cont_title1 {
  671. height: 60rpx;
  672. line-height: 60rpx;
  673. font-size: 32rpx;
  674. padding-left: 64rpx;
  675. }
  676. }
  677. }
  678. .foot_btn {
  679. line-height: 88rpx;
  680. height: 100rpx;
  681. margin-top: 40rpx;
  682. display: flex;
  683. justify-content: center;
  684. .btn1,
  685. .btn2,
  686. .btn3 {
  687. height: 88rpx;
  688. flex: 1;
  689. margin: 0 1%;
  690. background-image: linear-gradient(to right, #72c172, #3bb197);
  691. color: #fff;
  692. border-radius: 8rpx;
  693. font-size: 32rpx;
  694. margin-top: 16rpx;
  695. text-align: center;
  696. }
  697. }
  698. .foot_btn_spe {
  699. line-height: 88rpx;
  700. height: 100rpx;
  701. margin-top: 40rpx;
  702. text-align: center;
  703. display: flex;
  704. justify-content: space-between;
  705. flex-wrap: wrap;
  706. &::after {
  707. content: '';
  708. flex: 1;
  709. }
  710. view {
  711. height: 88rpx;
  712. width: 48%;
  713. margin: 0 1%;
  714. background-image: linear-gradient(to right, #72c172, #3bb197);
  715. color: #fff;
  716. border-radius: 8rpx;
  717. font-size: 32rpx;
  718. margin-top: 16rpx;
  719. }
  720. }
  721. }
  722. </style>