index.vue 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966
  1. <template>
  2. <div class="app-container-seat" :style="{height: height}">
  3. <div class="app-container-seat-tool">
  4. <!-- 座位类型 -->
  5. <slot name="info">
  6. <div class="seat-tool-box-seat_info">
  7. <div class="seat-tool-box-seat_type" v-if="seatMapList&&JSON.stringify(seatMapList) != '{}'">
  8. <div style="flex-shrink: 0;">各类型座位的剩余数量:</div>
  9. <div class="seat-tool-box-seat_type-list">
  10. <div
  11. class="seat-tool-box-seat_type-item"
  12. :key="index"
  13. v-for="(item,index) in seatTypeList"
  14. style="margin-left: 10px;align-items: center;"
  15. >
  16. <span :style="{color: item.color?item.color:'none'}">{{item.name ? (item.name+'('+ (item.num||0) +')') : '暂未命名'}}</span>
  17. </div>
  18. </div>
  19. </div>
  20. </div>
  21. </slot>
  22. <div class="seat-tool-box">
  23. <div class="seat-tool-box-slider-box">
  24. <span class="demonstration">座位大小:</span>
  25. <div class="seat-tool-box-slider">
  26. <el-slider
  27. v-model="scaleNum"
  28. :min="30"
  29. :max="100"
  30. @change="scaleNumChange"
  31. ></el-slider>
  32. </div>
  33. </div>
  34. <div>
  35. <el-button size="mini" @click="clearSeatSelectListAll" type="danger">清空已选({{ seatSelectList.length }})</el-button>
  36. </div>
  37. </div>
  38. </div>
  39. <div class="seat-box" :style="{'--scaleNum': scaleNum/100}">
  40. <!-- 选择座位 -->
  41. <div
  42. class="seat-list-box"
  43. v-loading="loading">
  44. <!-- 座位排版 -->
  45. <div
  46. id="sm-scroll-box"
  47. ref="seatbox"
  48. class="dialog"
  49. @mousedown="mousedownFun"
  50. @mouseleave="mouseleaveFun"
  51. @scroll="scrollFun"
  52. >
  53. <div
  54. class="dialog-box"
  55. :style="{width: width*(scaleNum/100) + 'px', margin: justifyContent ? 'auto' : 'unset'}"
  56. >
  57. <div
  58. style="width: 100%;position: absolute;"
  59. class="seat-box-class clearfix"
  60. v-if="seatMapList"
  61. >
  62. <div
  63. class="seat-item-class-box"
  64. v-for="(item1, index1) in seatMapListKey"
  65. :key="item1.key"
  66. >
  67. <div class="seat-item-class seat-box-class-row" style="">{{ index1 != 0 ?((index1) + '排') :'' }}</div>
  68. <div
  69. :class="[
  70. 'seat-item-class',
  71. setShowStatus(item1,item)
  72. ]"
  73. v-for="(item, index) in seatMapList[item1.key]"
  74. :style="{backgroundColor: item.color && !(item.isDisabled || item.status != 1) ? item.color : 'none'}"
  75. @click.stop="seatClick(item)"
  76. @mouseenter="lockOrUnLockDeatilFun($event,item)"
  77. @mouseleave="lockOrUnLockDeatilFun1"
  78. :dragSelectId="item.id"
  79. :index="item1.key +'_'+ index"
  80. :key="index">
  81. <p
  82. v-if="item1.key != 'my_column'"
  83. class="text-class"
  84. >{{ item.status != 1 ? '不可售':(item.name ? item.name : '暂未命名') }}</p>
  85. <p v-else>{{ (index+1) + '号' }}</p>
  86. </div>
  87. </div>
  88. </div>
  89. </div>
  90. <!-- 鼠标拖拽出的遮罩 (定位为 position:absolute)-->
  91. <!-- 遮罩最好是在绑定了mouseover事件的元素内部,并且不要阻止遮罩的冒泡事件。这样鼠标移到了遮罩上面,依然可以利用冒泡执行父元素的mouseover事件,就不会出现遮罩只能扩大,不能缩小的情况了(亲自试过) -->
  92. <div ref="moveSelected" id="moveSelected"></div>
  93. </div>
  94. </div>
  95. </div>
  96. <!-- 提示信息 -->
  97. <div :style="lockStyle" v-if="isLcokShow" class="lock-style-box">
  98. <div><span>锁定人:</span><span>{{ lockObj.auth }}</span></div>
  99. <div><span>锁定原因:</span><span>{{ lockObj.remark }}</span></div>
  100. </div>
  101. </div>
  102. </template>
  103. <script>
  104. import moment from "moment"
  105. import selectListMixin from "./mixins/selectList"
  106. import {
  107. lockOrUnLockApi,
  108. } from '@/api/windowTicketSales/ticketingSales'
  109. import { mapGetters } from 'vuex'
  110. export default {
  111. name: "TicketingSales1",
  112. mixins: [selectListMixin],
  113. dicts: ['channel_type'],
  114. props: {
  115. // 是否限制只能选择同一种类型
  116. isOccupyStatus: {
  117. type: [Boolean],
  118. default: true
  119. },
  120. /**
  121. * 限制座位类型选择数量
  122. *
  123. */
  124. seatTypeLimit: {
  125. type: [Object],
  126. default: ()=>{
  127. return {}
  128. }
  129. },
  130. queryParams: {
  131. type: [Object],
  132. default: ()=>{
  133. return {}
  134. }
  135. },
  136. height: {
  137. type: [String],
  138. default: 'calc( 100vh - 120px )'
  139. },
  140. channelType: {
  141. type: [String],
  142. default: 'window'
  143. }
  144. },
  145. data() {
  146. return {
  147. // 遮罩层
  148. loading: false,
  149. rules: {
  150. },
  151. merchantTheatreAuditoriumListS: [], // 演出厅
  152. merchantPerformTimeListS: [], // 场次
  153. querySeatListS: [], // 座位
  154. goodsPageListS: [], // 票务
  155. goodsPageListSAll: [], // 票务全部
  156. setList: [],
  157. seatMapList: {},
  158. seatMapListKey: [], // key
  159. seatSelectList: [],
  160. seatSelectListNo: [], // 锁定的座位
  161. lockOrUnLockLoading: false,
  162. performId: '',// 剧目ID
  163. scaleNum: 30,
  164. width: 0,
  165. justifyContent: false,
  166. activeName: 'first',
  167. seatTypeList: [],
  168. // 限购条件
  169. ifRealUser: 0,// 散客是否实名:0-否 1-是
  170. ifRealTeam: 0,// 团购是否实名:0否 1-是
  171. oneMany: 0,// 证件要求: 1一证一票,2一证多票
  172. personnelNum: 0,// 人员要求:0-表示不限制 其他数字表示限制人数
  173. isLcokShow: false,
  174. lckTime: null,
  175. seatId: null,
  176. lockStyle: {
  177. },
  178. lockObj: {
  179. auth: '',
  180. remark: ''
  181. },
  182. stockType: null,
  183. };
  184. },
  185. created() {
  186. //this.getSeatTypeList()
  187. },
  188. mounted() {
  189. },
  190. computed: {
  191. ...mapGetters([
  192. 'isBuylock',
  193. ]),
  194. },
  195. methods: {
  196. moment,
  197. setChanneltype(key){
  198. let srt = ''
  199. this.dict.type.channel_type.forEach((item,index)=>{
  200. if(key == item.value) {
  201. srt = item.label
  202. }
  203. })
  204. return srt
  205. },
  206. /** 获取座位 */
  207. async querySeatListFun(type,list,list1,seatTypeList){
  208. try {
  209. this.loading = true
  210. this.performId = ''
  211. this.screenTop = 0
  212. this.scrollLeft = 0
  213. this.seatTypeList = seatTypeList
  214. if(type) { // 是否清除已选
  215. this.seatSelectList = []
  216. this.seatSelectListNo = []
  217. }
  218. this.seatSelectList = list1
  219. this.seatMapList = {}
  220. this.seatList = []
  221. this.querySeatListS = list;
  222. this.setList = list;
  223. if(this.setList && this.setList.length > 0) {
  224. this.setSeatMapList(this.setList);
  225. }
  226. // let res = await querySeatList({
  227. // ...this.queryParams
  228. // })
  229. this.loading = false
  230. } catch (error) {
  231. this.loading = false
  232. console.error("error===",error)
  233. }
  234. },
  235. // 设置座位集合
  236. setSeatMapList(list) {
  237. if(list && list.length > 0) {
  238. let listCopy = {}
  239. let lisyCopy1 = {}
  240. let listNum = JSON.parse(JSON.stringify(this.seatTypeList))
  241. listNum.forEach((item,index)=>{
  242. listNum[index]['num'] = 0
  243. })
  244. list.forEach(item => {
  245. item.isDisabled = item.occupyStatus == 1 || (item.occupyStatus==0 && item.occupyOrderId) ? true : false //(item.occupyStatus != null && (item.occupyStatus == 0 || item.occupyStatus == 1) ? true : false); // 座位是否已被选择
  246. item.isSelect = this.setIsSelect(item);
  247. if(item.rowNo){
  248. listNum.forEach((item1,index)=>{
  249. if(item1.id == item.seatTypeId && item.status ==1 && !item.occupyStatus && item.occupyStatus !=0 ) {
  250. listNum[index]['num'] = listNum[index]['num'] + 1
  251. }
  252. })
  253. if(listCopy['my'+item.rowNo]){
  254. listCopy['my'+item.rowNo].push(item)
  255. }else {
  256. listCopy['my'+item.rowNo] = [item]
  257. }
  258. }
  259. })
  260. this.seatTypeList = JSON.parse(JSON.stringify(listNum))
  261. let width = 0
  262. let flog = 0
  263. let seatMapListKey = []
  264. Object.keys(listCopy).forEach((item)=>{
  265. if(listCopy[item].length>flog) {
  266. flog = listCopy[item].length
  267. }
  268. seatMapListKey.push({
  269. key: item,
  270. sort: Number(item.replace('my',''))
  271. })
  272. })
  273. seatMapListKey.sort((a,b)=>{
  274. return a.sort - b.sort
  275. })
  276. this.seatMapListKey = seatMapListKey
  277. console.log("seatMapListKey=====",seatMapListKey)
  278. this.width = 70*(flog + 1)
  279. this.$nextTick(()=>{
  280. if(this.$refs.seatbox) {
  281. var ele = this.$refs.seatbox
  282. console.log(ele.getBoundingClientRect().width); // 100
  283. if(this.width<ele.getBoundingClientRect().width) {
  284. this.justifyContent = true
  285. }else {
  286. //this.justifyContent = false
  287. this.justifyContent = true
  288. }
  289. //this.$refs.seatbox.scrollTo(this.width/4,0)
  290. }
  291. })
  292. console.log("list====",listCopy)
  293. let columnList = []
  294. listCopy[seatMapListKey[0].key].forEach((item,index)=>{
  295. columnList.push({
  296. ...item,
  297. occupyStatus: 2,
  298. isDisabled: true,
  299. status: 0
  300. })
  301. })
  302. this.seatMapListKey.unshift({
  303. key: "my_column",
  304. sort: -99
  305. })
  306. listCopy['my_column'] = columnList
  307. this.seatMapList = JSON.parse(JSON.stringify(listCopy))
  308. }
  309. },
  310. setIsSelect(item){
  311. if(!this.seatSelectList||this.seatSelectList.length==0){
  312. return false
  313. }
  314. let flog = false
  315. this.seatSelectList.forEach((item1,index1)=>{
  316. if(item.id == item1.id){
  317. flog = true
  318. }
  319. })
  320. return flog
  321. },
  322. // 座位点击事件
  323. seatClick(row) {
  324. console.log("是的发给我大是个的风格====",row,this.seatTypeLimit)
  325. if(!row.seatTypeId){
  326. this.$message.error('未设置的座位不可售卖!!!');
  327. return
  328. }
  329. if(row.isDisabled || row.status == 2){
  330. return false
  331. }
  332. if(this.seatSelectListNo.length>0 && row.occupyStatus != 0) {
  333. this.$message.error('你已选择锁定座位,只能再选择被锁定的座位!!!');
  334. return
  335. }
  336. if(this.seatSelectList.length > 0 && row.occupyStatus == 0 && this.isBuylock === 0){
  337. this.$message.error('此座已被锁定,请先解锁!!!');
  338. return
  339. }
  340. if(this.seatTypeLimit['seatNum_'+row.seatTypeId].isNoSelect){
  341. this.$message.error('该座位类型不可选!!!');
  342. return
  343. }
  344. if(!row.isSelect){
  345. let seatTypeNum = 0
  346. this.seatSelectList.forEach((item,index)=>{
  347. if(item.seatTypeId == row.seatTypeId) {
  348. seatTypeNum++
  349. }
  350. })
  351. if( seatTypeNum >= this.seatTypeLimit['seatNum_'+row.seatTypeId].stockTotal-this.seatTypeLimit['seatNum_'+row.seatTypeId].stockYes ) {
  352. this.$message.error('选择的座位类型已超过库存!!!');
  353. return
  354. }
  355. }
  356. if(row.occupyStatus == 0){
  357. // console.log("weqwrwerewrer")
  358. // this.$confirm('此座已被锁定,请先解锁', '提示', {
  359. // confirmButtonText: '确定',
  360. // cancelButtonText: '取消',
  361. // type: 'warning'
  362. // }).then(() => {
  363. // this.lockOrUnLockFun([row],1)
  364. // }).catch((error) => {
  365. // console.log("error====",error)
  366. // });
  367. row.isSelect = !row.isSelect
  368. if(row.isSelect){
  369. this.seatSelectListNo.push(JSON.parse(JSON.stringify(row)))
  370. }else {
  371. let list = JSON.parse(JSON.stringify(this.seatSelectListNo))
  372. list.forEach((item,index)=>{
  373. if(item.id == row.id) {
  374. this.seatSelectListNo.splice(index, 1)
  375. }
  376. })
  377. }
  378. // 配置该用户 可以购买锁定票
  379. if(this.isBuylock === 1) {
  380. if(row.isSelect) {
  381. this.seatSelectList.push(JSON.parse(JSON.stringify(row)))
  382. } else {
  383. let list = JSON.parse(JSON.stringify(this.seatSelectList))
  384. list.forEach((item,index)=> {
  385. if(item.id == row.id) {
  386. this.seatSelectList.splice(index, 1)
  387. }
  388. })
  389. }
  390. }
  391. this.$emit('selectSeat',this.seatSelectList)
  392. }else if(row.isDisabled || row.status == 2){
  393. return false
  394. }else {
  395. let flog = false;
  396. this.seatSelectList.forEach((item,index)=>{
  397. if(item.seatTypeId != row.seatTypeId ) {
  398. flog = true
  399. }
  400. })
  401. if(flog && this.isOccupyStatus){
  402. this.$message.error('只能选同一类型的座位');
  403. return
  404. }
  405. row.isSelect = !row.isSelect
  406. if(row.isSelect){
  407. this.seatSelectList.push(JSON.parse(JSON.stringify(row)))
  408. }else {
  409. let list = JSON.parse(JSON.stringify(this.seatSelectList))
  410. list.forEach((item,index)=>{
  411. if(item.id == row.id) {
  412. this.seatSelectList.splice(index, 1)
  413. }
  414. })
  415. }
  416. this.$emit('selectSeat',this.seatSelectList)
  417. //this.$forceUpdate()
  418. }
  419. },
  420. /** 删除已选座位 */
  421. delSeatSelect(row){
  422. let list = JSON.parse(JSON.stringify(this.seatSelectList))
  423. list.forEach((item,index)=>{
  424. if(item.id == row.id) {
  425. this.seatSelectList.splice(index, 1)
  426. }
  427. })
  428. Object.keys(this.seatMapList).forEach((item1,index)=>{
  429. this.seatMapList[item1].forEach((item,index)=>{
  430. if(item.id == row.id) {
  431. item.isSelect = !item.isSelect
  432. }
  433. })
  434. })
  435. this.$forceUpdate()
  436. },
  437. increaseViewersFun(){
  438. },
  439. /** 选择tab */
  440. handleClickTab(){
  441. },
  442. /** 显示座位类型 */
  443. setSeatTypeShow(value){
  444. let srt = ''
  445. this.seatTypeList.forEach((item,index)=>{
  446. if(value == item.id) {
  447. srt = item.name
  448. }
  449. })
  450. return srt
  451. },
  452. /** 获取锁定人和锁定备注 */
  453. async lockOrUnLockDeatilFun(e,item) {
  454. try {
  455. if(this.lckTime) {
  456. clearTimeout(this.lckTime)
  457. }
  458. if(item.occupyStatus !== 0) {
  459. if(item.channelType && item.channelType != this.channelType){
  460. this.isLcokShow = true
  461. this.lockObj = {
  462. remark: `该座位仅限${ this.setChanneltype(item.channelType) }渠道购买!!!`,
  463. auth: ''
  464. }
  465. this.lockStyle = {
  466. position: "fixed",
  467. top: (e.y + 10) + 'px',
  468. left: (e.x + 10)+ 'px',
  469. zIndex: 999999
  470. }
  471. return
  472. }else {
  473. this.isLcokShow = false
  474. return
  475. }
  476. }
  477. if(item.id == this.seatId){ return }
  478. this.seatId = item.id
  479. this.isLcokShow = false
  480. this.lckTime = setTimeout(async ()=>{
  481. let res = await lockOrUnLockApi({
  482. auditoriumId: this.queryParams.auditoriumId,
  483. timeId: this.queryParams.timeId || this.queryParams.performTimeId,
  484. seatId: item.id
  485. })
  486. if (res.code == 200) {
  487. this.isLcokShow = true
  488. this.lockObj = {
  489. remark: res.data.remark,
  490. auth: res.data.createBy
  491. }
  492. this.lockStyle = {
  493. position: "fixed",
  494. top: (e.y + 10) + 'px',
  495. left: (e.x + 10)+ 'px',
  496. zIndex: 999999
  497. }
  498. } else {
  499. }
  500. },500)
  501. } catch (error) {
  502. }
  503. },
  504. lockOrUnLockDeatilFun1() {
  505. this.isLcokShow = false
  506. this.seatId = null
  507. },
  508. /** 设置显示状态 */
  509. setShowStatus(item1,item) {
  510. let str = ''
  511. /**
  512. * key == my_column 排和列的 序号位置
  513. *
  514. * occupyStatus null-表示未占用,0-锁定 1-占用
  515. *
  516. * occupyOrderId // 订单待支付锁定
  517. *
  518. * status 0-初始(该状态下不C端显示) 1-可用 2-不可用
  519. *
  520. */
  521. str = item1.key == 'my_column'?'seat-item-class-column':
  522. item.occupyStatus===0?item.occupyOrderId?'order-occupy-status':
  523. item.occupyStatus===0&&item.isSelect?'occupy-status-select occupy-status':
  524. 'occupy-status': item.occupyStatus==1?'occupy-status-no':
  525. item.isDisabled || item.status != 1 ? 'disabled-class' :
  526. item.isSelect ? 'select-class' : ''
  527. if(!str) {
  528. if(item.isSame || item.isUse == 2) { // 是否为不可选的座位类型
  529. str = 'seat_is_same'
  530. }
  531. if(item.channelType && item.channelType != this.channelType) { // 是否属于窗口售卖座位
  532. str = 'seat_channel_type'
  533. }
  534. }
  535. return str
  536. }
  537. }
  538. };
  539. </script>
  540. <style>
  541. .lock-style-box {
  542. padding: 10px;
  543. border-radius: 10px;
  544. position: fixed;
  545. z-index: 99999;
  546. background-color: rgba(0,0,0,0.5);
  547. color: #fff;
  548. font-size: 12px;
  549. }
  550. </style>
  551. <style lang="scss" scoped>
  552. .app-container-seat {
  553. width: 100%;
  554. display: flex;
  555. flex-direction: column;
  556. }
  557. .app-container-seat-tool {
  558. width: 100%;
  559. .seat-tool-box-seat_type {
  560. display: flex;
  561. padding-bottom: 10px;
  562. .seat-tool-box-seat_type-list {
  563. width: 100%;
  564. display: flex;
  565. overflow-x: auto;
  566. flex-wrap: nowrap;
  567. }
  568. .seat-tool-box-seat_type-item {
  569. span {
  570. white-space: nowrap;
  571. }
  572. }
  573. }
  574. .seat-tool-box {
  575. box-sizing: border-box;
  576. display: flex;
  577. align-items: center;
  578. justify-content: space-between;
  579. .seat-tool-box-slider-box {
  580. height: 100%;
  581. display: flex;
  582. align-items: center;
  583. span{
  584. flex-shrink: 0;
  585. font-size: 12px;
  586. }
  587. .seat-tool-box-slider {
  588. width: 100px;
  589. margin-left: 10px;
  590. }
  591. }
  592. }
  593. }
  594. .seat-box {
  595. width: 100%;
  596. flex: auto;
  597. box-sizing: border-box;
  598. display: flex;
  599. position: relative;
  600. .seat-list-box {
  601. width: 100%;//calc(100% - 210px);
  602. //width: 100%;
  603. height: 100%;
  604. box-sizing: border-box;
  605. position: relative;
  606. }
  607. .seat-select-box {
  608. width: 200px;
  609. height: 100%;
  610. flex-shrink: 0;
  611. box-sizing: border-box;
  612. padding: 0 5px;
  613. margin-left: 10px;
  614. border: 1px solid #ccc;
  615. border-radius: 10px;
  616. .seat-select-info {
  617. width: 100%;
  618. height: calc( 100% - 60px );
  619. overflow: hidden;
  620. overflow-y: auto;
  621. .seat-select-item {
  622. border: 1px solid #ccc;
  623. margin-bottom: 5px;
  624. padding: 5px;
  625. border-radius: 5px;
  626. display: flex;
  627. justify-content: space-between;
  628. align-items: center;
  629. font-size: 12px;
  630. >div:first-child {
  631. display: flex;
  632. flex-direction: column;
  633. span:first-child {
  634. font-weight: 600;
  635. }
  636. }
  637. >div:last-child {
  638. span:first-child {
  639. color: #f56c6c;
  640. cursor: pointer;
  641. }
  642. }
  643. }
  644. .seat-select-color-item {
  645. display: flex;
  646. align-items: center;
  647. margin-bottom: 5px;
  648. >span:first-child {
  649. width: 20px;
  650. height: 20px;
  651. flex-shrink: 0;
  652. }
  653. >span:last-child {
  654. font-size: 16px;
  655. font-weight: 600;
  656. margin-left: 10px;
  657. }
  658. }
  659. }
  660. }
  661. }
  662. .seat-list-box::before {
  663. content: "舞台";
  664. position: absolute;
  665. left: 50%;
  666. transform: translateX(-50%);
  667. width: 300px;
  668. height: 30px;
  669. background-color: rgb(204, 204, 204,0.5);
  670. font-size: 18px;
  671. font-weight: 600;
  672. display: flex;
  673. align-items: center;
  674. justify-content: center;
  675. border-radius: 0 0 20px 20px;
  676. z-index: 99;
  677. }
  678. .dialog {
  679. padding: 30px 10px 10px;
  680. width: 100%;
  681. height: 100%;
  682. box-sizing: border-box;
  683. overflow: auto;
  684. border-radius: 10px;
  685. border: 1px solid #323333;
  686. position: relative;
  687. .dialog-box {
  688. position: relative;
  689. }
  690. .upload-btn {
  691. width: 100px;
  692. height: 100px;
  693. background-color: #fbfdff;
  694. border: dashed 1px #c0ccda;
  695. border-radius: 5px;
  696. i {
  697. font-size: 30px;
  698. margin-top: 20px;
  699. }
  700. &-text {
  701. margin-top: -10px;
  702. }
  703. }
  704. .avatar {
  705. cursor: pointer;
  706. }
  707. .title-class{
  708. font-size: 16px;
  709. font-weight: bold;
  710. color: black;
  711. margin-bottom: 20px;
  712. margin-top: 20px;
  713. }
  714. .item-class{
  715. margin-bottom: 20px;
  716. }
  717. .seat-box-class{
  718. padding: 5px;
  719. transform-origin: 50% 0;
  720. transform: scale(var(--scaleNum));
  721. box-sizing: border-box;
  722. /** 是否属于windown座位 */
  723. .seat_is_same {
  724. user-select: none;
  725. }
  726. .seat_is_same:after {
  727. content:"";
  728. display:block;
  729. position:absolute;
  730. top:0;
  731. left:0;
  732. width:100%;
  733. height:100%;
  734. background-color:rgba(0,0,0,0.3);
  735. z-index:-1;
  736. background-image: url('../../assets/jinxuan_1.png');
  737. background-size: 50% 50%;
  738. background-position: 50% 50%;
  739. background-repeat: no-repeat;
  740. z-index: 99;
  741. }
  742. /** 是否属于windown座位 */
  743. .seat_channel_type {
  744. user-select: none;
  745. }
  746. .seat_channel_type:after {
  747. content:"";
  748. display:block;
  749. position:absolute;
  750. top:0;
  751. left:0;
  752. width:100%;
  753. height:100%;
  754. background-color:rgba(0,0,0,0.3);
  755. z-index:-1;
  756. background-image: url('../../assets/jinxuan_1.png');
  757. background-size: 50% 50%;
  758. background-position: 50% 50%;
  759. background-repeat: no-repeat;
  760. z-index: 99;
  761. }
  762. /** 不可售 座位 */
  763. .disabled-class{
  764. background-color: #ffffff;
  765. border: none !important;
  766. user-select: none;
  767. // pointer-events: none;
  768. //cursor: not-allowed !important;
  769. cursor: default !important;
  770. .text-class {
  771. color: #fff !important;
  772. }
  773. }
  774. .no_select-class{
  775. user-select: none;
  776. cursor: not-allowed !important;
  777. }
  778. .select-class{
  779. //background-color: #e85353 !important;
  780. border: 5px solid #1890ff !important;
  781. // color: #eceaea !important;
  782. position: relative;
  783. }
  784. /** 手动锁定 */
  785. .occupy-status:after{
  786. content:"";
  787. display:block;
  788. position:absolute;
  789. top:0;
  790. left:0;
  791. width:100%;
  792. height:100%;
  793. background-color:rgba(0,0,0,0.3);
  794. z-index:-1;
  795. background-image: url('../../assets/jinzhi_1.png');
  796. background-size: 50% 50%;
  797. background-position: 50% 50%;
  798. background-repeat: no-repeat;
  799. z-index: 99;
  800. }
  801. .occupy-status {
  802. //pointer-events: none;
  803. }
  804. /** 锁定被选择 */
  805. .occupy-status-select {
  806. border: 5px solid #ff182f !important;
  807. }
  808. /** 订单待支付锁定 */
  809. .order-occupy-status {
  810. }
  811. .order-occupy-status:after{
  812. content:"";
  813. display:block;
  814. position:absolute;
  815. top:0;
  816. left:0;
  817. width:100%;
  818. height:100%;
  819. background-color:rgba(0,0,0,0.3);
  820. z-index:-1;
  821. background-image: url('../../assets/jinzhi.png');
  822. background-size: 50% 50%;
  823. background-position: 50% 50%;
  824. background-repeat: no-repeat;
  825. z-index: 99;
  826. }
  827. .occupy-status-no {
  828. background-color: #f56c6c !important;
  829. user-select: none;
  830. // pointer-events: none;
  831. cursor: not-allowed !important;
  832. position: relative;
  833. }
  834. .occupy-status-no:after{
  835. content:"";
  836. display:block;
  837. position:absolute;
  838. top:0;
  839. left:0;
  840. width:100%;
  841. height:100%;
  842. background-color:rgba(0,0,0,0.3);
  843. z-index:-1;
  844. background-image: url('../../assets/jinzhi_1.png');
  845. background-size: 50% 50%;
  846. background-position: 50% 50%;
  847. background-repeat: no-repeat;
  848. z-index: 99;
  849. }
  850. .seat-item-class-box {
  851. width: 100%;
  852. display: flex;
  853. flex-wrap: nowrap;
  854. justify-content: center;
  855. margin: auto 0;
  856. text-align: center;
  857. }
  858. .seat-item-class{
  859. flex-shrink: 0;
  860. display: block;
  861. float: left;
  862. width: 60px;
  863. height: 60px;
  864. margin: 5px;
  865. border: 1px solid #4c4d4d;
  866. border-radius: 3px;
  867. cursor: pointer;
  868. position: relative;
  869. user-select: none;
  870. // transform-origin: 50% 50%;
  871. // transform: scale(var(--scaleNum));
  872. z-index: 999;
  873. &:hover{
  874. opacity: 0.6;
  875. }
  876. .text-class{
  877. font-size: 12px;
  878. padding: 5px;
  879. line-height: 16px;
  880. margin: 0;
  881. color: #000;
  882. }
  883. }
  884. }
  885. .seat-box-class-row {
  886. display: flex !important;
  887. align-items: center;
  888. user-select: none;
  889. cursor: not-allowed !important;
  890. border: none !important;
  891. font-weight: 600;
  892. font-size: 24px;
  893. }
  894. .seat-item-class-column {
  895. display: flex !important;
  896. align-items: center;
  897. justify-content: center;
  898. user-select: none;
  899. cursor: not-allowed !important;
  900. border: none !important;
  901. font-weight: 600;
  902. font-size: 24px;
  903. }
  904. }
  905. .dialog::-webkit-scrollbar {
  906. width: 10x !important;
  907. height: 10px !important;
  908. }
  909. .dialog::-webkit-scrollbar {
  910. width: 10px;
  911. height: 10px;
  912. opacity: 0.5;
  913. }
  914. .dialog::-webkit-scrollbar-thumb {
  915. border-radius: 15px;
  916. //background-color: #0257aa;
  917. }
  918. #moveSelected{
  919. position:absolute;
  920. background-color: blue;
  921. opacity:0.3;
  922. border:1px dashed #d9d9d9;
  923. top:0;
  924. left:0;
  925. }
  926. </style>