index.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655
  1. <template>
  2. <div class="machine-index">
  3. <div v-show="step==3&&rsType!=3" class="back-btn" @click="onPrev">
  4. <img src="./img/fanhui_icon.png" alt="">
  5. <span>{{times}}s</span>
  6. </div>
  7. <div v-show="step===0" class="tc">
  8. <div class="plr15 pt20">
  9. <van-field v-model="deviceNum" clearable label="" placeholder="请输入设备编号" />
  10. </div>
  11. <div class="tc mt20">
  12. <van-button color="#17b3ec" @click="init" type="primary"> 启动 </van-button>
  13. </div>
  14. </div>
  15. <div v-show="step==1" class="step-1">
  16. <div class="title-banner ">
  17. <img src="./img/biaoti_img.png" alt="">
  18. </div>
  19. <div class="video-swipe">
  20. <van-swipe :autoplay="0" indicator-color="white">
  21. <template v-if="videoList&& videoList.length">
  22. <van-swipe-item v-for="(item, i) in videoList" :key="i">
  23. <video class="swipe-item-video" :autoplay="i==0" loop controls muted :src="setImgUrl(item.url)"></video>
  24. </van-swipe-item>
  25. </template>
  26. <van-swipe-item v-else>
  27. <!-- <img class="swipe-item-img" src="./img/banner01.png"> -->
  28. <video class="swipe-item-video" autoplay loop controls muted src="./img/default.mp4"></video>
  29. </van-swipe-item>
  30. </van-swipe>
  31. </div>
  32. <div class="img-swipe">
  33. <van-swipe :autoplay="3000" indicator-color="white">
  34. <template v-if="imgList && imgList.length">
  35. <van-swipe-item v-for="(item, i) in imgList" :key="i">
  36. <img class="swipe-item-img" :src="setImgUrl(item.url)">
  37. </van-swipe-item>
  38. </template>
  39. <van-swipe-item v-else>
  40. <img class="swipe-item-img" src="./img/banner01.png">
  41. </van-swipe-item>
  42. </van-swipe>
  43. </div>
  44. <div class="banner-list kitbox">
  45. <div class="item">
  46. <img @click="curImg=1;illustrationMskShow=true" src="./img/btn_ccfsm.png" alt="">
  47. <img @click="curImg=2;illustrationMskShow=true" src="./img/btn_qylc.png" alt="">
  48. </div>
  49. <div class="arrow">
  50. <img src="./img/jiantou_icon.png" alt="">
  51. </div>
  52. <div class="item">
  53. <img @click="step=2" src="./img/btn_saoma.png" alt="">
  54. <img @click="sendReadCard" src="./img/btn_ybk.png" alt="">
  55. </div>
  56. </div>
  57. <div class="footer">
  58. <img src="./img/erweima.png" alt="">
  59. </div>
  60. <div class="illustration-mask" v-show="illustrationMskShow">
  61. <div class="illustration-inner">
  62. <img v-show="curImg==1" class="pic" src="./img/chufang_tankang_img.png" alt="">
  63. <img v-show="curImg==2" class="pic" src="./img/quyao_tankuang_img.png" alt="">
  64. <div class="close">
  65. <img @click="illustrationMskShow=false;curImg=''" src="./img/guanbi_btn.png" alt="">
  66. </div>
  67. </div>
  68. </div>
  69. </div>
  70. <Scan @onComplete="onComplete" v-show="step==2" @onBack="step=1"/>
  71. <Result @showOrderDetail="showOrderDetail" @outDrug="sendShipment" @onPrint="SetPrintPage" :rsType.sync="rsType" :orderList="orderList" :orderdetail="orderdetail" v-show="step==3" @onBack="step=2" @onBackIndex="step=1"/>
  72. </div>
  73. </template>
  74. <script>
  75. import Scan from './components/Scan.vue';
  76. import Result from './components/Result.vue';
  77. import medicineAbinetApi from '@/api/api-medicineAbinet'
  78. var countDownFunc
  79. export default {
  80. name: "machineIndex",
  81. components: {
  82. Scan,
  83. Result
  84. },
  85. data() {
  86. return {
  87. deviceNum: this.$route.query.deviceNum || '14912202107000001500000000000000',//14912202107000001500000000000000
  88. step: 0, //0启动页 1首页 2扫码页 3订单页
  89. curImg: '',
  90. illustrationMskShow: false,
  91. socketUrl: '',
  92. path: "ws://yik.ab-inbev.vip/c/websocket/",
  93. socket: "",
  94. mess: [],
  95. layerNo: "0",
  96. wayerNo: "0",
  97. forceClose: false,
  98. heartbitInterval: '',
  99. currindex: 0,
  100. orderdetail: [],
  101. rsType: 0,// 1:订单信息 2订单错误 3订单成功 4出药完成 5订单列表
  102. imgList: [],
  103. videoList: [],
  104. inCheckBarcode: false,
  105. orderInfo: '',
  106. orderList: [],
  107. times: 30
  108. }
  109. },
  110. watch:{
  111. step(n){
  112. if(n!=3){
  113. this.rsType = 0
  114. }
  115. },
  116. rsType(n){
  117. clearInterval(countDownFunc)
  118. if(n!=4 && this.step==3){
  119. this.countDown()
  120. }
  121. }
  122. },
  123. created(){
  124. },
  125. methods: {
  126. onPrev(){
  127. if(this.rsType == 5){
  128. this.step = 1
  129. } else if(this.rsType==1 || this.rsType==2 || this.rsType==4){
  130. var orderLen = this.orderList&&this.orderList.length>1
  131. if(orderLen){
  132. if(this.rsType==4){
  133. this.orderList.splice(this.orderList.indexOf(this.orderInfo), 1)
  134. }
  135. this.rsType = 5
  136. } else {
  137. this.step = 1
  138. }
  139. }
  140. },
  141. devinfoAdvList(){
  142. var p = {
  143. equNum: this.deviceNum
  144. }
  145. medicineAbinetApi
  146. .devinfoAdvList(p)
  147. .then(res=>{
  148. console.log('devinfoAdvList', res)
  149. this.$toast.clear()
  150. if(res.status == 200){
  151. res.detailModelList.forEach(v => {
  152. if(v.categoryCode==2){
  153. this.imgList.push(v)
  154. } else {
  155. this.videoList.push(v)
  156. }
  157. });
  158. } else {
  159. this.$toast(res.message || '获取广告失败')
  160. }
  161. })
  162. .catch(err=>{
  163. console.error(err)
  164. })
  165. },
  166. onComplete(data){
  167. this.checkOrderAndReturn({pickUpNum: data, cardNum: ""})
  168. },
  169. checkOrderAndReturn({pickUpNum="", cardNum=""}){
  170. this.$toast.clear()
  171. this.$loading('加载中..')
  172. let p = {
  173. deviceId: this.deviceNum, //设备编号
  174. pickUpNum, //取药码
  175. cardNum: cardNum //社保卡号 //"DA7292254" ||
  176. }
  177. console.log('params', p)
  178. medicineAbinetApi
  179. .checkOrderAndReturnOrderList(p)
  180. .then(res=>{
  181. console.log('checkOrderAndReturnOrderList', res)
  182. if(res.status == 200){
  183. this.$toast.clear()
  184. if(res.obj && res.obj.orderList && res.obj.orderList.length){
  185. if(res.obj.orderList.length == 1){
  186. this.showOrderDetail(res.obj.orderList[0])
  187. } else {
  188. this.orderList = res.obj.orderList || []
  189. this.rsType = 5
  190. this.step = 3
  191. }
  192. } else {
  193. this.$toast('查不到订单信息')
  194. }
  195. } else {
  196. this.$toast(res.message || '获取订单失败')
  197. }
  198. this.inCheckBarcode = false
  199. })
  200. .catch(err=>{
  201. console.error(err)
  202. this.inCheckBarcode = false
  203. })
  204. },
  205. showOrderDetail(item){
  206. item.drugList.forEach(v=>{
  207. v.success = false
  208. })
  209. this.orderdetail = item.drugList
  210. this.orderInfo = item
  211. this.rsType = item.status==1? 1 : 2
  212. this.step = 3
  213. },
  214. init: function() {
  215. if(!this.deviceNum){
  216. return
  217. }
  218. this.devinfoAdvList()
  219. if(!this.socketUrl){
  220. this.socketUrl = this.path + this.deviceNum + "_T"
  221. }
  222. if (typeof(WebSocket) === "undefined") {
  223. alert("您的浏览器不支持socket")
  224. } else {
  225. // 实例化socket
  226. this.socket = new WebSocket(this.socketUrl)
  227. // 监听socket连接
  228. this.socket.onopen = this.open
  229. // 监听socket错误信息
  230. this.socket.onerror = this.error
  231. // 监听socket消息
  232. this.socket.onmessage = this.getMessage
  233. this.socket.onclose = this.close
  234. this.step = 1
  235. }
  236. },
  237. open: function() {
  238. console.log("socket连接成功")
  239. this.heartbit()
  240. },
  241. error: function() {
  242. this.$dialog.confirm({
  243. title: '',
  244. message: '连接服务器失败',
  245. confirmButtonText: "重试"
  246. })
  247. .then(()=>{
  248. this.init()
  249. })
  250. console.log("连接错误")
  251. },
  252. getMessage: function(msg) {
  253. console.log(msg.data)
  254. this.mess.push(msg.data); //返回数据信息,包含医保瞳
  255. var msgobj = JSON.parse(msg.data)
  256. if (msgobj.type == 'ShipInfo') {
  257. var item = this.orderdetail[this.currindex]
  258. if (msgobj.mess == ( item.layerNo +";"+ item.wayerNo) ) {
  259. this.updateOrderOutStatus(item.id, 2, msgobj.mess)
  260. this.currindex++;
  261. if (this.orderdetail.length > this.currindex) {
  262. this.$loading(`正在出第${this.currindex+1}个药..`)
  263. this.nextShipment(this.orderdetail[this.currindex]);
  264. } else {
  265. this.$toast.clear()
  266. setTimeout(()=>{
  267. this.shipComplete()
  268. }, 200)
  269. }
  270. } else {
  271. this.updateOrderOutStatus(item.id, 3, msgobj.mess)
  272. this.shipComplete(msgobj.mess)
  273. }
  274. } else if (msgobj.type == 'BarCodeInfo') {
  275. if (msgobj.mess.indexOf("异常") != -1) {
  276. this.$toast(msgobj.mess)
  277. console.log(msgobj.mess)
  278. return
  279. }
  280. if(this.inCheckBarcode || this.step!=2){
  281. return
  282. }
  283. this.checkOrderAndReturn({pickUpNum: msgobj.mess})
  284. } else if(msgobj.type == 'CardInfo'){
  285. if (msgobj.mess.indexOf("异常") != -1) {
  286. this.$toast(msgobj.mess)
  287. return
  288. }
  289. var arr = msgobj.mess.split("\n");
  290. var json = {}
  291. arr.forEach(v => {
  292. var tmp = v.split(":")
  293. json[tmp[0]] = tmp[1]
  294. });
  295. this.checkOrderAndReturn({cardNum: json['卡号']})
  296. } else if(msgobj.type == 'PrintComplete'){
  297. this.$dialog.alert({
  298. title: '',
  299. message: '打印完成',
  300. confirmButtonText: "返回首页"
  301. }).then(() => {
  302. this.onPrev()
  303. });
  304. }
  305. },
  306. sendReadCard: function() {
  307. this.$loading('加载中..')
  308. var obj = {
  309. type: "ReadCard",
  310. mess: ""
  311. }
  312. this.socket.send(JSON.stringify(obj));
  313. },
  314. sendShipment: function() {
  315. this.currindex = 0;
  316. this.$loading(`正在出第${this.currindex+1}个药..`)
  317. //循环订单返回的列表,读取第一个
  318. if (this.orderdetail.length > this.currindex) {
  319. this.nextShipment(this.orderdetail[this.currindex]);
  320. } else {
  321. this.shipComplete()
  322. }
  323. },
  324. nextShipment: function(row) {
  325. //检查刷新是否已经完成数据,没有完成继续,这个设计是为了防断网
  326. var obj = {
  327. type: "Shipment",
  328. mess: "{detailid:'" + row.id + "'}", //整串返回
  329. layerNo: row.layerNo,
  330. wayerNo: row.wayerNo
  331. }
  332. this.socket.send(JSON.stringify(obj));
  333. },
  334. send: function() {
  335. var obj = {
  336. type: "读取设备功能列表",
  337. mess: "",
  338. layerNo: this.layerNo,
  339. wayerNo: this.wayerNo,
  340. }
  341. this.socket.send(JSON.stringify(obj));
  342. },
  343. send2: function() {
  344. var obj = {
  345. type: "读取设备功能列表",
  346. mess: ""
  347. }
  348. this.socket.send(JSON.stringify(obj));
  349. },
  350. close: function() {
  351. console.log("socket已经关闭")
  352. if(!this.forceClose){
  353. console.log("socket已经关闭")
  354. this.init()
  355. }
  356. },
  357. heartbit(){
  358. this.heartbitInterval = setInterval(()=>{
  359. var obj = {
  360. type: "heart",
  361. mess: "",
  362. }
  363. this.socket.send(JSON.stringify(obj));
  364. }, 60 * 1000)
  365. },
  366. sendDeviceInfo: function() {
  367. var obj = {
  368. type: "ReadDevice",
  369. mess: ""
  370. }
  371. this.socket.send(JSON.stringify(obj));
  372. },
  373. SetPrintPage: function() {
  374. // string type; //text 文本 |line 间隔行|barcode 条码|qrcode 二维码|reset 重置打印机 |nline 走纸【进行【
  375. // string text; //文本内容
  376. // int nLan;//文本编码类型0:GBK 1:UTF-8
  377. // int nOrgx;//打印的文本位置,各值定义如下:-1 左对齐 -2 居中对齐 -3 右对齐 >=0 在第n点位置开始打印
  378. // int nWidthTimes;//字符宽度放大的倍数,范围[0,7]
  379. // int nHeightTimes;// 字符高度放大的倍数,范围[0,7]
  380. // int FontType;//打印的字体类型,各值定义如下:度值 定义 0: 12*24 1: 9*17
  381. // int nFontStyle;// 打印的字体类型,各值定义如下:需要合并的把两个值相加得到整数回传 值 定义0x00 正常0x08 加粗0x80 1点下划线0x100 2点下划线0x200 倒置打印 0x400 反显、黑底白字0x1000 每个字符顺时针旋转 90
  382. // int nBarcodeType;//打印的条码类型,各值定义如下:值 类型 0x41 UPC-A 0x42 UPC-E 0x43 EAN13 0x44 EAN80x45 CODE39 0x46 ITF0x47 CODABAR0x48 CODE93
  383. // int nUnitWidth;// 打印的条码宽度,值范围[1,6]
  384. // int nUnitHeight;//打印的条码高度,值范围[1,255]
  385. // int FontPosition;//可读字符(HRI)的打印位置,各值定义如下:值 定义 0 不打印1 条码上方2 条码下方 3 条码上方和下方
  386. // int nWidth;// 二维码的宽度,取值范围[1,6}二维码单元宽度越大,QR码越大。
  387. // int nVersion;// 二维码的规格,取值范围[0,16],0表示自动计算版本。 二维码码版本越大,能编码的字符就越多,QR码也越大。
  388. // int nErrlevenl;//二维码纠错等级,取值[1,4]
  389. var printcon =[
  390. {type:"reset"},
  391. {type:"nline"},
  392. {type:"text", text:"智能药房\n小票凭据\n",nLan:0,nOrgx:-2,nWidthTimes:0,nHeightTimes:0,FontType:0,nFontStyle:0},
  393. {type:"text", text:"--------------------------------\n",nLan:0,nOrgx:-2,nWidthTimes:0,nHeightTimes:0,FontType:0,nFontStyle:0},
  394. ];
  395. var allPrice = 0, allcount = 0
  396. var obj = _.groupBy(this.orderdetail.concat([]), 'drugCode')
  397. var list = []
  398. for(var k in obj){
  399. var tem = obj[k]
  400. tem[0].quantity = tem.length
  401. list.push(tem[0])
  402. tem.forEach(v=>{
  403. allPrice += v.price
  404. allcount += 1
  405. })
  406. }
  407. list.forEach(v=>{
  408. printcon.push({
  409. type:"text", text: (v.drugName)+"\n",nLan:0,nOrgx:-1,nWidthTimes:0,nHeightTimes:0,FontType:0,nFontStyle:0
  410. })
  411. printcon.push({
  412. type:"text", text: `单价:${v.price}元 数量:${v.quantity}\n药品编码:${v.drugCode}\n规格:${v.specif}\n剂型:${v.dosForm||''}\n`,nLan:0,nOrgx:-1,nWidthTimes:0,nHeightTimes:0,FontType:0,nFontStyle:0
  413. })
  414. printcon.push({type:"line"})
  415. })
  416. var {date, phone, num, remark, time, community, qrCodeContent} = this.orderInfo
  417. printcon.push({
  418. type:"text", text: `药品总价:${(allPrice).toFixed(2)}元\n药品数量:${allcount}\n订单金额:${allPrice.toFixed(2)}元\n`,nLan:0,nOrgx:-1,nWidthTimes:0,nHeightTimes:0,FontType:0,nFontStyle:0
  419. })
  420. printcon.push({type:"text", text:"--------------------------------\n",nLan:0,nOrgx:-2,nWidthTimes:0,nHeightTimes:0,FontType:0,nFontStyle:0})
  421. printcon.push({
  422. type:"text", text: `商家名称:${community}\n客服电话:${phone}\n药柜编码:${this.deviceNum}\n销售单号:${num}\n取药日期:${date}\n取药时间:${time}\n`,nLan:0,nOrgx:-1,nWidthTimes:0,nHeightTimes:0,FontType:0,nFontStyle:0
  423. })
  424. printcon.push({type:"text", text:"--------------------------------\n",nLan:0,nOrgx:-2,nWidthTimes:0,nHeightTimes:0,FontType:0,nFontStyle:0})
  425. if(remark){
  426. printcon.push({
  427. type:"text", text: `备注:${remark}\n`,nLan:0,nOrgx:-1,nWidthTimes:0,nHeightTimes:0,FontType:0,nFontStyle:0
  428. })
  429. }
  430. if(qrCodeContent){
  431. printcon.push({type:"qrcode",text:"qrCodeContent",nWidth:6,nVersion:0,nErrlevenl:4})
  432. }
  433. printcon.push({type:"nline"})
  434. printcon.push({type:"nline"})
  435. printcon.push({type:"nline"})
  436. printcon.push({type:"nline"})
  437. printcon.push({type:"nline"})
  438. var obj = {
  439. type: "PrintPage",
  440. mess: JSON.stringify(printcon),
  441. }
  442. this.socket.send(JSON.stringify(obj));
  443. },
  444. updateOrderOutStatus(shipmentLogId, status, msg){
  445. var p = {
  446. shipmentLogId,
  447. status,
  448. msg: msg || ''
  449. }
  450. console.log('updateOrderOutStatus', p)
  451. medicineAbinetApi
  452. .updateOrderOutStatus(p)
  453. .then(res=>{
  454. console.log('updateOrderOutStatus', res)
  455. })
  456. .catch(err=>{
  457. console.error(err)
  458. })
  459. },
  460. shipComplete(msg){
  461. this.$toast.clear()
  462. if(msg){
  463. this.$dialog.alert({
  464. title: '',
  465. message: '出药异常中断,请联系管理员',
  466. confirmButtonText: "返回首页"
  467. }).then(() => {
  468. this.step = 1
  469. });
  470. return
  471. }
  472. this.rsType = 4
  473. },
  474. countDown(){
  475. return
  476. this.times = 30
  477. countDownFunc = setInterval(()=>{
  478. if(this.times === 0){
  479. clearInterval(countDownFunc)
  480. this.onPrev()
  481. }
  482. this.times--
  483. }, 1000)
  484. }
  485. },
  486. destroyed() {
  487. this.forceClose = true
  488. clearInterval(this.heartbitInterval)
  489. }
  490. }
  491. </script>
  492. <style lang="scss" scoped>
  493. .machine-index {
  494. width: 100vw;
  495. height: 100vh;
  496. background: url('./img/bg_img.png') no-repeat;
  497. background-size: 100% ;
  498. .step-1{
  499. .title-banner{
  500. padding-top: calc(93px / 6);
  501. img{
  502. display: block;
  503. margin: 0 auto;
  504. width: 230px;
  505. }
  506. }
  507. .video-swipe{
  508. width: 333px;
  509. height: 188px;
  510. margin: calc(90px / 6) auto 0;
  511. overflow: hidden;
  512. border-radius: 7px;
  513. // background-color: #000000;
  514. video{
  515. width: 100%;
  516. height: 100%;
  517. display: block;
  518. }
  519. }
  520. .img-swipe{
  521. width: 333px;
  522. height: 112px;
  523. margin: calc(83px / 6) auto 0;
  524. overflow: hidden;
  525. border-radius: 7px;
  526. background-color: #000000;
  527. img{
  528. width: 100%;
  529. height: 100%;
  530. display: block;
  531. }
  532. }
  533. .banner-list{
  534. width: 333px;
  535. -webkit-box-align: center;
  536. margin: calc(94px / 6) auto 0;
  537. .arrow{
  538. -webkit-box-flex: 1;
  539. img{
  540. display: block;
  541. width: calc(154px / 6);
  542. margin: 0 auto;
  543. }
  544. }
  545. .item{
  546. width: calc(901px / 6);
  547. img{
  548. width: 100%;
  549. height: calc(350px / 6);
  550. display: block;
  551. &:last-child{
  552. margin-top: calc(60px / 6);
  553. }
  554. }
  555. }
  556. }
  557. .footer{
  558. img{
  559. display: block;
  560. width: calc(350px / 6);
  561. margin: calc(100px / 6) auto 0;
  562. }
  563. // position: absolute;
  564. // bottom: calc(466px / 6);
  565. // left: 50%;
  566. // transform: translateX(-50%);
  567. }
  568. .illustration-mask{
  569. position: fixed;
  570. width: 100vw;
  571. height: 100vh;
  572. left: 0;
  573. top: 0;
  574. background: rgba($color: #000000, $alpha: .5);
  575. .illustration-inner{
  576. position: absolute;
  577. left: 50%;
  578. top: 50%;
  579. transform: translateX(-50%) translateY(-50%);
  580. background: #000000;
  581. border-radius: calc(20px / 6);
  582. .pic{
  583. display: block;
  584. width: calc(2000px / 6);
  585. img{
  586. }
  587. }
  588. .close{
  589. position: absolute;
  590. bottom: calc(-300px / 6);
  591. left: 50%;
  592. transform: translateX(-50%);
  593. img{
  594. display: block;
  595. width: calc(209px / 6);
  596. }
  597. }
  598. }
  599. }
  600. }
  601. .van-swipe{
  602. height: 100%;
  603. .swipe-item-img{
  604. width: 100%;
  605. height: 100%;
  606. display: block;
  607. }
  608. .swipe-item-video{
  609. width: 100%;
  610. height: 100%;
  611. display: block;
  612. }
  613. }
  614. .back-btn{
  615. z-index: 2;
  616. position: fixed;
  617. top: calc(200px / 6);
  618. left: calc(127px / 6);
  619. img{
  620. width: calc(100px / 6);
  621. vertical-align: middle;
  622. display: inline-block;
  623. }
  624. span{
  625. vertical-align: middle;
  626. color: #fff;
  627. margin-left: calc(40px / 6);
  628. font-size: calc(80px / 6);
  629. }
  630. }
  631. }
  632. </style>