ticketingSales.vue 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841
  1. <template>
  2. <div class="app-container app-container-me">
  3. <el-form
  4. :model="queryParams"
  5. ref="queryForm"
  6. size="small"
  7. :inline="true"
  8. :rules="rules"
  9. label-width="80px">
  10. <el-form-item label="演出厅" prop="auditoriumId">
  11. <el-select
  12. v-model="queryParams.auditoriumId"
  13. placeholder="演出厅"
  14. clearable
  15. style="width: 100%"
  16. @change="changeTime($event,'auditoriumId')"
  17. >
  18. <el-option
  19. v-for="dict in merchantTheatreAuditoriumListS"
  20. :key="dict.id"
  21. :label="dict.name"
  22. :value="dict.id"
  23. />
  24. </el-select>
  25. </el-form-item>
  26. <el-form-item label="场次时间" prop="performDate">
  27. <el-date-picker
  28. type="date"
  29. placeholder="选择场次时间"
  30. v-model="queryParams.performDate"
  31. @change="changeTime($event,'performDate')"
  32. value-format="yyyy-MM-dd"
  33. ></el-date-picker>
  34. </el-form-item>
  35. <el-form-item label="场次" prop="timeId">
  36. <el-select
  37. v-model="queryParams.timeId"
  38. placeholder="场次"
  39. clearable
  40. style="width: 100%"
  41. @change="changeTime($event,'timeId')"
  42. >
  43. <el-option
  44. v-for="dict in merchantPerformTimeListS"
  45. :key="dict.id"
  46. :label="dict.timeSnapshot+'('+dict.performTimeStart+'-'+dict.performTimeEnd+')'"
  47. :value="dict.id"
  48. />
  49. </el-select>
  50. </el-form-item>
  51. <el-form-item label="票务类型" prop="goodsId">
  52. <el-select
  53. v-model="queryParams.goodsId"
  54. placeholder="票务类型"
  55. clearable
  56. style="width: 100%"
  57. @change="changeTime($event,'goodsId')"
  58. >
  59. <el-option
  60. v-for="dict in goodsPageListS"
  61. :key="dict.id"
  62. :label="dict.goodsName"
  63. :value="dict.id"
  64. :disabled="dict.status==1 || dict.goodsPerform.channelWindow != 0"
  65. />
  66. </el-select>
  67. </el-form-item>
  68. <el-form-item>
  69. <el-button :loading="loading" type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
  70. <el-button :loading="loading" icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
  71. </el-form-item>
  72. </el-form>
  73. <div class="seat-tool-box">
  74. <span class="demonstration">座位大小</span>
  75. <div>
  76. <el-slider v-model="scaleNum" :min="30" :max="100"></el-slider>
  77. </div>
  78. </div>
  79. <div class="seat-box" :style="{'--scaleNum': scaleNum/100}">
  80. <!-- 选择座位 -->
  81. <div class="seat-list-box" v-loading="loading">
  82. <!-- 座位排版 -->
  83. <div id="seatbox-me" ref="seatbox" class="dialog">
  84. <div class="dialog-box" :style="{width: width*(scaleNum/100) + 'px', margin: justifyContent ? 'auto' : 'unset'}">
  85. <div
  86. style="width: 100%;position: absolute;"
  87. class="seat-box-class clearfix" v-if="seatMapList"
  88. >
  89. <div
  90. class="seat-item-class-box"
  91. v-for="(item1, index1) in seatMapListKey"
  92. :key="item1.key"
  93. >
  94. <div
  95. class="seat-item-class"
  96. :class="item.occupyStatus==0?'occupy-status': item.occupyStatus==1?'occupy-status-no':item.isDisabled || item.status != 1 ? 'disabled-class' : item.isSelect ? 'select-class' : ''"
  97. v-for="(item, index) in seatMapList[item1.key]"
  98. :style="{backgroundColor: item.color ? item.color : 'none'}"
  99. @click.stop="seatClick(item)"
  100. :key="index">
  101. <p class="text-class">{{ item.status != 1 ? '不可售':(item.name ? item.name : '暂未命名') }}</p>
  102. </div>
  103. </div>
  104. </div>
  105. </div>
  106. </div>
  107. <div style="margin-top: 5px; margin-left: 30px;display: flex;">
  108. <div style="flex-shrink: 0;">
  109. 已勾选:{{ seatSelectList.length }}个座位
  110. </div>
  111. <div style="width: 100%;display: flex;justify-content: center;height: 30px;">
  112. <el-button size="mini" type="warning" :loading="lockOrUnLockLoading" @click="lockOrUnLockFun(seatSelectList,0)">锁定</el-button>
  113. <el-button size="mini" type="primary" @click="increaseViewersFun">购票</el-button>
  114. </div>
  115. </div>
  116. </div>
  117. <div class="seat-select-box">
  118. <div class="seat-select-box-top">
  119. <el-tabs v-model="activeName" @tab-click="handleClickTab">
  120. <el-tab-pane label="已选座位" name="first"></el-tab-pane>
  121. <!-- <el-tab-pane label="座位图例" name="second"></el-tab-pane> -->
  122. </el-tabs>
  123. </div>
  124. <div class="seat-select-info" v-if="activeName=='first'">
  125. <div
  126. class="seat-select-item"
  127. :key="index"
  128. v-for="(item,index) in seatSelectList">
  129. <div>
  130. <span>{{item.name ? item.name : '暂未命名'}}</span>
  131. <span>{{ setSeatTypeShow(item.seatTypeId) }}</span>
  132. </div>
  133. <div>
  134. <span @click="delSeatSelect(item)">删除</span>
  135. </div>
  136. </div>
  137. </div>
  138. <div class="seat-select-info" v-if="activeName=='second'">
  139. <div
  140. class="seat-select-color-item"
  141. :key="index"
  142. v-for="(item,index) in seatTypeList">
  143. <span :style="{backgroundColor: item.color?item.color:'none'}"></span>
  144. <span>{{item.name ? item.name : '暂未命名'}}</span>
  145. </div>
  146. </div>
  147. </div>
  148. </div>
  149. <!-- 添加观影人 -->
  150. <increaseViewers ref="increaseViewers" @clearDialogVisible="clearDialogVisible" />
  151. </div>
  152. </template>
  153. <script>
  154. import {
  155. querySeatList,
  156. merchantPerformTimeList,
  157. lockOrUnLock,
  158. merchantTheatreAuditoriumList,
  159. goodsPageList,
  160. } from '@/api/windowTicketSales/ticketingSales'
  161. import increaseViewers from "./model/increaseViewers"
  162. import moment from "moment"
  163. import { pageList as getSeatType } from '@/api/seatTypeMr/seatTypeMr'
  164. export default {
  165. name: "TicketingSales1",
  166. components: {
  167. increaseViewers
  168. },
  169. data() {
  170. return {
  171. // 遮罩层
  172. loading: false,
  173. // 查询参数
  174. queryParams: {
  175. timeId: '',
  176. performDate: null,
  177. auditoriumId: null,
  178. goodsId: null,
  179. },
  180. rules: {
  181. auditoriumId: [
  182. { required: true, message: '请选择选择演出厅', trigger: ['blur','change'] }
  183. ],
  184. performDate: [
  185. { required: true, message: '请选择时间', trigger: ['blur','change'] }
  186. ],
  187. timeId: [
  188. { required: true, message: '请选择场次', trigger: ['blur','change'] }
  189. ],
  190. goodsId: [
  191. { required: true, message: '请选择票务类型', trigger: ['blur','change'] }
  192. ],
  193. },
  194. merchantTheatreAuditoriumListS: [], // 演出厅
  195. merchantPerformTimeListS: [], // 场次
  196. querySeatListS: [], // 座位
  197. goodsPageListS: [], // 票务
  198. goodsPageListSAll: [], // 票务全部
  199. setList: [],
  200. seatMapList: [],
  201. seatMapListKey: [], // key
  202. seatSelectList: [],
  203. lockOrUnLockLoading: false,
  204. performId: '',// 剧目ID
  205. scaleNum: 30,
  206. width: 0,
  207. justifyContent: false,
  208. activeName: 'first',
  209. seatTypeList: [],
  210. };
  211. },
  212. created() {
  213. this.merchantTheatreAuditoriumListFun()
  214. this.goodsPageListFun()
  215. this.getSeatTypeList()
  216. },
  217. mounted() {
  218. this.$set(this.queryParams,'performDate',moment().format("yyyy-MM-DD"))
  219. },
  220. methods: {
  221. moment,
  222. /** 票务信息 */
  223. async goodsPageListFun(){
  224. try {
  225. let res = await goodsPageList({
  226. pageNum: 1,
  227. pageSize: 999,
  228. classifyId: 1,
  229. goodsType: 2,
  230. })
  231. if(res.code == 200){
  232. this.goodsPageListSAll = res.data.rows
  233. // let list = []
  234. // res.data.rows.forEach((item,index)=>{
  235. // if(item.status != 1) {
  236. // list.push(item)
  237. // }
  238. // })
  239. // this.goodsPageListS = list
  240. }
  241. } catch (error) {
  242. }
  243. },
  244. /** 获取演出厅 */
  245. async merchantTheatreAuditoriumListFun(){
  246. try {
  247. let res = await merchantTheatreAuditoriumList({
  248. pageNum: 1,
  249. pageSize: 999
  250. })
  251. if(res.code == 200){
  252. this.merchantTheatreAuditoriumListS = res.data.rows
  253. if(this.merchantTheatreAuditoriumListS.length>0){
  254. this.$set(this.queryParams,'auditoriumId',this.merchantTheatreAuditoriumListS[0].id)
  255. this.changeTime(this.queryParams.auditoriumId,'auditoriumId')
  256. }
  257. }
  258. } catch (error) {
  259. }
  260. },
  261. /** 获取场次 */
  262. async merchantPerformTimeListFun(){
  263. try {
  264. let param = this.queryParams;
  265. param.status = 1;
  266. let res = await merchantPerformTimeList(param)
  267. if(res.code == 200){
  268. console.log('merchantPerformTimeListS',res.data.rows);
  269. this.merchantPerformTimeListS = res.data.rows
  270. }
  271. } catch (error) {
  272. }
  273. },
  274. /** 座位锁定/解锁 */
  275. async lockOrUnLockFun(listS,type){
  276. try {
  277. this.lockOrUnLockLoading = true
  278. let list = []
  279. listS.forEach((item,index)=>{
  280. list.push({
  281. "auditoriumId": this.queryParams.auditoriumId,
  282. "seatId": item.id,
  283. "timeId": this.queryParams.timeId
  284. })
  285. })
  286. let res = await lockOrUnLock({
  287. type: type,
  288. seatList: list
  289. })
  290. this.lockOrUnLockLoading = false
  291. if(res.code) {
  292. this.$message({
  293. showClose: true,
  294. message: res.msg,
  295. type: 'success'
  296. });
  297. this.querySeatListFun(true)
  298. }
  299. } catch (error) {
  300. this.lockOrUnLockLoading = false
  301. this.$message({
  302. showClose: true,
  303. message: "操作失败!!!",
  304. type: 'error'
  305. });
  306. console.error('error===',error)
  307. }
  308. },
  309. /** 获取座位 */
  310. async querySeatListFun(type){
  311. try {
  312. this.loading = true
  313. this.performId = ''
  314. if(type) { // 是否清除已选
  315. this.seatSelectList = []
  316. }
  317. this.seatMapList = {}
  318. this.seatList = []
  319. let res = await querySeatList({
  320. ...this.queryParams
  321. })
  322. if(res.code == 200){
  323. this.querySeatListS = res.data;
  324. this.setList = res.data;
  325. if(this.setList && this.setList.length > 0) {
  326. this.setSeatMapList(this.setList);
  327. }
  328. }
  329. this.loading = false
  330. } catch (error) {
  331. this.loading = false
  332. console.error("error===",error)
  333. }
  334. },
  335. // 设置座位集合
  336. setSeatMapList(list) {
  337. if(list && list.length > 0) {
  338. let listCopy = {}
  339. let lisyCopy1 = {}
  340. list.forEach(item => {
  341. item.isDisabled = (item.occupyStatus != null && (item.occupyStatus == 0 || item.occupyStatus == 1) ? true : false); // 座位是否已被选择
  342. item.isSelect = this.setIsSelect(item);
  343. if(item.rowNo){
  344. if(listCopy['my'+item.rowNo]){
  345. listCopy['my'+item.rowNo].push(item)
  346. }else {
  347. listCopy['my'+item.rowNo] = [item]
  348. }
  349. }
  350. })
  351. let width = 0
  352. let flog = 0
  353. let seatMapListKey = []
  354. Object.keys(listCopy).forEach((item)=>{
  355. if(listCopy[item].length>flog) {
  356. flog = listCopy[item].length
  357. }
  358. seatMapListKey.push({
  359. key: item,
  360. sort: Number(item.replace('my',''))
  361. })
  362. })
  363. seatMapListKey.sort((a,b)=>{
  364. return a.sort - b.sort
  365. })
  366. this.seatMapListKey = seatMapListKey
  367. console.log("seatMapListKey=====",seatMapListKey)
  368. this.width = 70*flog
  369. this.$nextTick(()=>{
  370. if(this.$refs.seatbox) {
  371. var ele = document.getElementById('seatbox-me');
  372. console.log(ele.getBoundingClientRect().width); // 100
  373. if(this.width<ele.getBoundingClientRect().width) {
  374. this.justifyContent = true
  375. }else {
  376. //this.justifyContent = false
  377. this.justifyContent = true
  378. }
  379. //this.$refs.seatbox.scrollTo(this.width/4,0)
  380. }
  381. })
  382. console.log("list====",listCopy)
  383. this.seatMapList = JSON.parse(JSON.stringify(listCopy))
  384. }
  385. },
  386. setIsSelect(item){
  387. if(!this.seatSelectList||this.seatSelectList.length==0){
  388. return false
  389. }
  390. let flog = false
  391. this.seatSelectList.forEach((item1,index1)=>{
  392. if(item.id == item1.id){
  393. flog = true
  394. }
  395. })
  396. return flog
  397. },
  398. /** 选择场次时间 */
  399. changeTime(value,type){
  400. console.log("fsdfsdf----",value,type)
  401. if(type == 'timeId') {
  402. this.$set(this.queryParams,'goodsId','')
  403. if(value) {
  404. let flog = false
  405. let list2 = []
  406. this.merchantPerformTimeListS.forEach((item,index)=>{
  407. if(item.id==value) {
  408. let list = item.goodsIds ? item.goodsIds.split(','): []
  409. list.forEach((item,index)=>{
  410. this.goodsPageListSAll.forEach((item1,index1)=>{
  411. if(item1.id == item) {
  412. flog = true
  413. list2.push({
  414. ...item1
  415. })
  416. }
  417. })
  418. })
  419. }
  420. })
  421. if(flog) {
  422. this.goodsPageListS = JSON.parse(JSON.stringify(list2))
  423. }else {
  424. this.goodsPageListS = JSON.parse(JSON.stringify(this.goodsPageListSAll))
  425. }
  426. }else {
  427. this.goodsPageListS = []
  428. }
  429. }
  430. this.changeTimeCheck(value,type)
  431. },
  432. /** 选择场次时间 */
  433. changeTimeCheck(value,type){
  434. console.log("fsdfsdf")
  435. if(this.queryParams && this.queryParams.timeId && type != 'timeId' && type != 'goodsId') {
  436. console.log('sdfsdfsdf',this.queryParams)
  437. this.$set(this.queryParams,'timeId','')
  438. this.$set(this.queryParams,'goodsId','')
  439. this.merchantPerformTimeListS = []
  440. this.goodsPageListS = []
  441. }
  442. if(this.queryParams.auditoriumId&&this.queryParams.performDate){
  443. // 获取场次
  444. this.merchantPerformTimeListFun()
  445. }
  446. this.performId = ''
  447. this.seatSelectList = []
  448. this.seatMapList = {}
  449. this.seatList = []
  450. this.handleQuery()
  451. },
  452. /** 设置 场次 对应得剧目ID */
  453. changePerformId(value){
  454. console.log("value=====",value)
  455. this.performId = ''
  456. this.merchantPerformTimeListS.forEach((item,index)=>{
  457. if(item.id == value){
  458. this.performId = item.performId
  459. }
  460. })
  461. },
  462. /** 搜索按钮操作 */
  463. handleQuery() {
  464. this.$refs.queryForm.validate((valid) => {
  465. if (valid) {
  466. this.querySeatListFun();
  467. } else {
  468. console.log('error submit!!');
  469. return false;
  470. }
  471. });
  472. },
  473. /** 重置按钮操作 */
  474. resetQuery() {
  475. this.$refs.queryForm.resetFields()
  476. this.performId = ''
  477. this.seatSelectList = []
  478. this.seatMapList = {}
  479. this.seatList = []
  480. this.handleQuery();
  481. },
  482. // 座位点击事件
  483. seatClick(row) {
  484. console.log(row)
  485. if(row.occupyStatus == 0){
  486. console.log("weqwrwerewrer")
  487. this.$confirm('此座已被锁定,请先解锁', '提示', {
  488. confirmButtonText: '确定',
  489. cancelButtonText: '取消',
  490. type: 'warning'
  491. }).then(() => {
  492. this.lockOrUnLockFun([row],1)
  493. }).catch((error) => {
  494. console.log("error====",error)
  495. });
  496. }else if(row.isDisabled || row.status == 2){
  497. return false
  498. }else {
  499. let flog = false;
  500. this.seatSelectList.forEach((item,index)=>{
  501. if(item.seatTypeId != row.seatTypeId ) {
  502. flog = true
  503. }
  504. })
  505. if(flog){
  506. this.$message.error('只能选同一类型得座位');
  507. return
  508. }
  509. row.isSelect = !row.isSelect
  510. if(row.isSelect){
  511. this.seatSelectList.push(JSON.parse(JSON.stringify(row)))
  512. }else {
  513. let list = JSON.parse(JSON.stringify(this.seatSelectList))
  514. list.forEach((item,index)=>{
  515. if(item.id == row.id) {
  516. this.seatSelectList.splice(index, 1)
  517. }
  518. })
  519. }
  520. this.$forceUpdate()
  521. }
  522. },
  523. /** 删除已选座位 */
  524. delSeatSelect(row){
  525. row.isSelect = !row.isSelect
  526. if(row.isSelect){
  527. this.seatSelectList.push(JSON.parse(JSON.stringify(row)))
  528. }else {
  529. let list = JSON.parse(JSON.stringify(this.seatSelectList))
  530. list.forEach((item,index)=>{
  531. if(item.id == row.id) {
  532. this.seatSelectList.splice(index, 1)
  533. }
  534. })
  535. }
  536. Object.keys(this.seatMapList).forEach((item1,index)=>{
  537. this.seatMapList[item1].forEach((item,index)=>{
  538. if(item.id == row.id) {
  539. item.isSelect = !item.isSelect
  540. }
  541. })
  542. })
  543. this.$forceUpdate()
  544. },
  545. increaseViewersFun(){
  546. if(this.seatSelectList.length>0){
  547. this.changePerformId(this.queryParams.timeId)
  548. this.$refs.increaseViewers.initData(this.seatSelectList,{
  549. ...this.queryParams,
  550. performId:this.performId
  551. })
  552. }else {
  553. this.$alert('请先选择座位!!!', '提示', {
  554. confirmButtonText: '确定',
  555. callback: action => {
  556. }
  557. });
  558. }
  559. },
  560. /** 弹窗关闭 */
  561. clearDialogVisible(){
  562. //this.
  563. this.querySeatListFun(true)
  564. },
  565. /** 选择tab */
  566. handleClickTab(){
  567. },
  568. /** 获取座位类型 说明 */
  569. getSeatTypeList() {
  570. getSeatType({
  571. pageNum: 1,
  572. pageSize: 999,
  573. })
  574. .then(response => {
  575. this.seatTypeList = response.data.rows;
  576. }
  577. );
  578. },
  579. /** 显示座位类型 */
  580. setSeatTypeShow(value){
  581. let srt = ''
  582. this.seatTypeList.forEach((item,index)=>{
  583. if(value == item.id) {
  584. srt = item.name
  585. }
  586. })
  587. return srt
  588. },
  589. }
  590. };
  591. </script>
  592. <style lang="scss" scoped>
  593. .app-container-me {
  594. width: 100%;
  595. height: calc( 100vh - 120px );
  596. }
  597. .seat-tool-box {
  598. height: 20px;
  599. box-sizing: border-box;
  600. display: flex;
  601. align-items: center;
  602. span{
  603. flex-shrink: 0;
  604. font-size: 12px;
  605. }
  606. >div {
  607. width: 100px;
  608. margin-left: 10px;
  609. }
  610. }
  611. .seat-box {
  612. width: 100%;
  613. height: calc( 100% - 100px ) ;
  614. box-sizing: border-box;
  615. display: flex;
  616. position: relative;
  617. .seat-list-box {
  618. width: calc(100% - 210px);
  619. //width: 100%;
  620. height: 100%;
  621. box-sizing: border-box;
  622. position: relative;
  623. }
  624. .seat-select-box {
  625. width: 200px;
  626. height: 100%;
  627. flex-shrink: 0;
  628. box-sizing: border-box;
  629. padding: 0 5px;
  630. margin-left: 10px;
  631. border: 1px solid #ccc;
  632. border-radius: 10px;
  633. .seat-select-info {
  634. width: 100%;
  635. height: calc( 100% - 60px );
  636. overflow: hidden;
  637. overflow-y: auto;
  638. .seat-select-item {
  639. border: 1px solid #ccc;
  640. margin-bottom: 5px;
  641. padding: 5px;
  642. border-radius: 5px;
  643. display: flex;
  644. justify-content: space-between;
  645. align-items: center;
  646. font-size: 12px;
  647. >div:first-child {
  648. display: flex;
  649. flex-direction: column;
  650. span:first-child {
  651. font-weight: 600;
  652. }
  653. }
  654. >div:last-child {
  655. span:first-child {
  656. color: #f56c6c;
  657. cursor: pointer;
  658. }
  659. }
  660. }
  661. .seat-select-color-item {
  662. display: flex;
  663. align-items: center;
  664. margin-bottom: 5px;
  665. >span:first-child {
  666. width: 20px;
  667. height: 20px;
  668. flex-shrink: 0;
  669. }
  670. >span:last-child {
  671. font-size: 16px;
  672. font-weight: 600;
  673. margin-left: 10px;
  674. }
  675. }
  676. }
  677. }
  678. }
  679. .seat-list-box::before {
  680. content: "舞台";
  681. position: absolute;
  682. left: 50%;
  683. transform: translateX(-50%);
  684. width: 300px;
  685. height: 30px;
  686. background-color: rgb(204, 204, 204,0.5);
  687. font-size: 18px;
  688. font-weight: 600;
  689. display: flex;
  690. align-items: center;
  691. justify-content: center;
  692. border-radius: 0 0 20px 20px;
  693. z-index: 99;
  694. }
  695. .dialog {
  696. padding: 30px 10px 10px;
  697. width: 100%;
  698. height: 100%;
  699. box-sizing: border-box;
  700. overflow: auto;
  701. border-radius: 10px;
  702. border: 1px solid #323333;
  703. .dialog-box {
  704. position: relative;
  705. }
  706. .upload-btn {
  707. width: 100px;
  708. height: 100px;
  709. background-color: #fbfdff;
  710. border: dashed 1px #c0ccda;
  711. border-radius: 5px;
  712. i {
  713. font-size: 30px;
  714. margin-top: 20px;
  715. }
  716. &-text {
  717. margin-top: -10px;
  718. }
  719. }
  720. .avatar {
  721. cursor: pointer;
  722. }
  723. .title-class{
  724. font-size: 16px;
  725. font-weight: bold;
  726. color: black;
  727. margin-bottom: 20px;
  728. margin-top: 20px;
  729. }
  730. .item-class{
  731. margin-bottom: 20px;
  732. }
  733. .seat-box-class{
  734. padding: 5px;
  735. transform-origin: 50% 0;
  736. transform: scale(var(--scaleNum));
  737. box-sizing: border-box;
  738. .disabled-class{
  739. background-color: #aaabad;
  740. user-select: none;
  741. // pointer-events: none;
  742. cursor: not-allowed !important;
  743. }
  744. .select-class{
  745. //background-color: #e85353 !important;
  746. border: 5px solid #1890ff !important;
  747. // color: #eceaea !important;
  748. position: relative;
  749. }
  750. .occupy-status:after{
  751. content:"";
  752. display:block;
  753. position:absolute;
  754. top:0;
  755. left:0;
  756. width:100%;
  757. height:100%;
  758. background-color:rgba(0,0,0,0.3);
  759. z-index:-1;
  760. background-image: url('../../assets/jinzhi.png');
  761. background-size: 50% 50%;
  762. background-position: 50% 50%;
  763. background-repeat: no-repeat;
  764. z-index: 99;
  765. }
  766. .occupy-status {
  767. //pointer-events: none;
  768. }
  769. .occupy-status-no {
  770. background-color: #f56c6c !important;
  771. user-select: none;
  772. // pointer-events: none;
  773. cursor: not-allowed !important;
  774. }
  775. .seat-item-class-box {
  776. width: 100%;
  777. display: flex;
  778. flex-wrap: nowrap;
  779. justify-content: center;
  780. margin: auto 0;
  781. text-align: center;
  782. }
  783. .seat-item-class{
  784. flex-shrink: 0;
  785. display: block;
  786. float: left;
  787. width: 60px;
  788. height: 60px;
  789. margin: 5px;
  790. border: 1px solid #4c4d4d;
  791. border-radius: 3px;
  792. cursor: pointer;
  793. position: relative;
  794. user-select: none;
  795. // transform-origin: 50% 50%;
  796. // transform: scale(var(--scaleNum));
  797. &:hover{
  798. opacity: 0.6;
  799. }
  800. .text-class{
  801. font-size: 12px;
  802. padding: 5px;
  803. line-height: 16px;
  804. margin: 0;
  805. color: #000;
  806. }
  807. }
  808. }
  809. }
  810. </style>