parent
							
								
									aa4d107806
								
							
						
					
					
						commit
						024627801f
					
				
				 3 changed files with 298 additions and 1 deletions
			
			
		@ -0,0 +1,234 @@ | 
				
			|||||||
 | 
					<script setup> | 
				
			||||||
 | 
					import {defineProps, ref, reactive, computed, watch, onMounted, onBeforeMount} from 'vue' | 
				
			||||||
 | 
					import {ec_api_set_user_data, ec_api_clear_user_data} from '@/apis/ec_api.js' | 
				
			||||||
 | 
					import {ElMessage} from "element-plus"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 接收TabArea组件传递的参数 | 
				
			||||||
 | 
					const props = defineProps(['seat', 'data']) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 定义用户选择的场次变量 | 
				
			||||||
 | 
					const selectSeats = ref([]) | 
				
			||||||
 | 
					const seatList = reactive({}) | 
				
			||||||
 | 
					const row_x = ref(0) | 
				
			||||||
 | 
					const col_y = ref(0) | 
				
			||||||
 | 
					const req_timer = ref(null) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 处理用户选择的数据 | 
				
			||||||
 | 
					async function handle_set_user_data() { | 
				
			||||||
 | 
					  console.log('selectSeats.value', selectSeats.value) | 
				
			||||||
 | 
					  let selectSeatData = [] | 
				
			||||||
 | 
					  props.seat.forEach((item)=> { | 
				
			||||||
 | 
					    if (selectSeats.value.indexOf(item['cineSeatId']) >= 0) { | 
				
			||||||
 | 
					      selectSeatData.push(item) | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					  }) | 
				
			||||||
 | 
					  const req_data = { | 
				
			||||||
 | 
					    api: props.data.path, | 
				
			||||||
 | 
					    member_type: props.data.type, | 
				
			||||||
 | 
					    format: props.data.format, | 
				
			||||||
 | 
					    user_data: JSON.stringify(selectSeatData) | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					  console.log('handle_set_user_data', req_data) | 
				
			||||||
 | 
					  await ec_api_set_user_data(req_data).then( | 
				
			||||||
 | 
					      (req) => { | 
				
			||||||
 | 
					        if (req['result'] === 'success') { | 
				
			||||||
 | 
					          ElMessage({message: '选择的座位已做为后续测试数据!', type: 'success'}) | 
				
			||||||
 | 
					        } else { | 
				
			||||||
 | 
					          ElMessage({message: '设置用户选择座位数据失败!', type: 'error'}) | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					      } | 
				
			||||||
 | 
					  ).catch( | 
				
			||||||
 | 
					      (err) => { | 
				
			||||||
 | 
					        console.log(err) | 
				
			||||||
 | 
					        ElMessage({message: '设置用户选择座位数据失败!', type: 'error'}) | 
				
			||||||
 | 
					      } | 
				
			||||||
 | 
					  ) | 
				
			||||||
 | 
					  clearTimeout(req_timer.value) | 
				
			||||||
 | 
					  req_timer.value = null | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function delay_handle_user_data() { | 
				
			||||||
 | 
					  if (req_timer.value === null) { | 
				
			||||||
 | 
					    req_timer.value = setTimeout(()=>handle_set_user_data(), 1000) | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 清除Redis中用户选择数据 | 
				
			||||||
 | 
					async function handle_clear_user_data() { | 
				
			||||||
 | 
					  const req_data = { | 
				
			||||||
 | 
					    api: props.data.path, | 
				
			||||||
 | 
					    member_type: props.data.type, | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					  console.log('handle_clear_user_data', req_data) | 
				
			||||||
 | 
					  await ec_api_clear_user_data(req_data).then( | 
				
			||||||
 | 
					      (req) => { | 
				
			||||||
 | 
					        if (req['result'] === 'success') { | 
				
			||||||
 | 
					          ElMessage({message: '选择的座位已清除,推荐参数将使用随机值!', type: 'success'}) | 
				
			||||||
 | 
					        } else { | 
				
			||||||
 | 
					          ElMessage({message: '清除用户选择座位数据失败!', type: 'error'}) | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					      } | 
				
			||||||
 | 
					  ).catch( | 
				
			||||||
 | 
					      (err) => { | 
				
			||||||
 | 
					        console.log(err) | 
				
			||||||
 | 
					        ElMessage({message: '清除用户选择座位数据失败!', type: 'error'}) | 
				
			||||||
 | 
					      } | 
				
			||||||
 | 
					  ) | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					onBeforeMount(() => { | 
				
			||||||
 | 
					  console.log('onBeforeMount') | 
				
			||||||
 | 
					  handleSeatData() | 
				
			||||||
 | 
					}) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 处理座位逻辑 | 
				
			||||||
 | 
					function handleSeatData() { | 
				
			||||||
 | 
					  let q = 1 | 
				
			||||||
 | 
					  let m = 1 | 
				
			||||||
 | 
					  let pairValueShuangTemp = '' | 
				
			||||||
 | 
					  let pairValueMultiTemp = '' | 
				
			||||||
 | 
					  row_x.value = parseInt(props.seat.slice(-1)[0]['x']) | 
				
			||||||
 | 
					  // 挂载时生成用于展示的数据源 | 
				
			||||||
 | 
					  props.seat.forEach((item) => { | 
				
			||||||
 | 
					    item['key'] = item['cineSeatId'] | 
				
			||||||
 | 
					    item['disable'] = item['seatStatus'] !== 'ok' || item['type'] === 'road'  // 处理按键可选状态 | 
				
			||||||
 | 
					    // 处理显示文案 | 
				
			||||||
 | 
					    if (item['type'] === 'road') { | 
				
			||||||
 | 
					      item['label'] = '' | 
				
			||||||
 | 
					    } else { | 
				
			||||||
 | 
					      item['label'] = item['rowValue'] + '-' + item['columnValue'] | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					    // 处理按键名称 | 
				
			||||||
 | 
					    switch (item['type']) { | 
				
			||||||
 | 
					      case 'danren': | 
				
			||||||
 | 
					        item['name'] = '单' | 
				
			||||||
 | 
					        break; | 
				
			||||||
 | 
					      case 'baoliu': | 
				
			||||||
 | 
					        item['name'] = '保' | 
				
			||||||
 | 
					        break; | 
				
			||||||
 | 
					      case 'zhendong': | 
				
			||||||
 | 
					        item['name'] = '震' | 
				
			||||||
 | 
					        break; | 
				
			||||||
 | 
					      case 'vip': | 
				
			||||||
 | 
					        item['name'] = 'vip' | 
				
			||||||
 | 
					        break; | 
				
			||||||
 | 
					      case 'shuangren': | 
				
			||||||
 | 
					        item['name'] = '情' | 
				
			||||||
 | 
					        break; | 
				
			||||||
 | 
					      case 'canji': | 
				
			||||||
 | 
					        item['name'] = '残' | 
				
			||||||
 | 
					        break; | 
				
			||||||
 | 
					      case 'multi': | 
				
			||||||
 | 
					        item['name'] = '多' | 
				
			||||||
 | 
					        break; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					    // 处理情侣座和多人座椅 | 
				
			||||||
 | 
					    if (item['pairValue'] !== '') { | 
				
			||||||
 | 
					      if (item['type'] === 'shuangren') { | 
				
			||||||
 | 
					        if (pairValueShuangTemp === '') { | 
				
			||||||
 | 
					          pairValueShuangTemp = item['pairValue'] | 
				
			||||||
 | 
					          item['name'] = item['name'] + '-' + q | 
				
			||||||
 | 
					        }else{ | 
				
			||||||
 | 
					          if (item['pairValue'] === pairValueShuangTemp) { | 
				
			||||||
 | 
					            item['name'] = item['name'] + '-' + q | 
				
			||||||
 | 
					          }else{ | 
				
			||||||
 | 
					            q++ | 
				
			||||||
 | 
					            pairValueShuangTemp = item['pairValue'] | 
				
			||||||
 | 
					            item['name'] = item['name'] + '-' + q | 
				
			||||||
 | 
					          } | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					      } | 
				
			||||||
 | 
					      if (item['type'] === 'multi') { | 
				
			||||||
 | 
					        if (pairValueMultiTemp === '') { | 
				
			||||||
 | 
					          pairValueMultiTemp = item['pairValue'] | 
				
			||||||
 | 
					          item['name'] = item['name'] + '-' + m | 
				
			||||||
 | 
					        }else{ | 
				
			||||||
 | 
					          if (item['pairValue'] === pairValueMultiTemp) { | 
				
			||||||
 | 
					            item['name'] = item['name'] + '-' + m | 
				
			||||||
 | 
					          }else{ | 
				
			||||||
 | 
					            m++ | 
				
			||||||
 | 
					            pairValueMultiTemp = item['pairValue'] | 
				
			||||||
 | 
					            item['name'] = item['name'] + '-' + m | 
				
			||||||
 | 
					          } | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					      } | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!seatList.hasOwnProperty(item['x'])) { | 
				
			||||||
 | 
					      seatList[item['x']] = [] | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					    seatList[item['x']].push(item) | 
				
			||||||
 | 
					  }) | 
				
			||||||
 | 
					  console.log('seatList', seatList) | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					watch(() => selectSeats.value, () => { | 
				
			||||||
 | 
					  clearTimeout(req_timer.value) | 
				
			||||||
 | 
					  req_timer.value = null | 
				
			||||||
 | 
					  delay_handle_user_data() | 
				
			||||||
 | 
					}) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</script> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template> | 
				
			||||||
 | 
					  <hr id="break_line"/> | 
				
			||||||
 | 
					  <div style="font-size: 16px; font-weight: bold; color: #909399; text-align: left; margin-bottom: 10px">选择座位: | 
				
			||||||
 | 
					    <el-tooltip | 
				
			||||||
 | 
					        class="box-item" | 
				
			||||||
 | 
					        effect="dark" | 
				
			||||||
 | 
					        content="点击清除选择后会将后台服务器中记录的选择内容清空,其他接口将通过随机获取的方式从此接口返回的数据中模拟参数" | 
				
			||||||
 | 
					        placement="right" | 
				
			||||||
 | 
					    > | 
				
			||||||
 | 
					      <el-button size="small" style="font-weight: bold;color: #909399" @click="handle_clear_user_data">清除选择 | 
				
			||||||
 | 
					      </el-button> | 
				
			||||||
 | 
					    </el-tooltip> | 
				
			||||||
 | 
					  </div> | 
				
			||||||
 | 
					  <div style="max-width: 1240px; overflow: auto"> | 
				
			||||||
 | 
					    <el-form style="max-width: 600px; margin-left: 20px"> | 
				
			||||||
 | 
					      <el-form-item> | 
				
			||||||
 | 
					        <el-checkbox-group v-model="selectSeats"> | 
				
			||||||
 | 
					          <div class="seat-row" v-for="r in row_x"> | 
				
			||||||
 | 
					            <el-checkbox-button v-for="seat in seatList[r]" :label="seat['key']" :key="seat['key']" | 
				
			||||||
 | 
					                                :disabled="seat['disable']"> | 
				
			||||||
 | 
					              <span>{{ seat['label'] }}</span><br> | 
				
			||||||
 | 
					              <span>{{ seat['name'] }}</span> | 
				
			||||||
 | 
					            </el-checkbox-button> | 
				
			||||||
 | 
					          </div> | 
				
			||||||
 | 
					        </el-checkbox-group> | 
				
			||||||
 | 
					      </el-form-item> | 
				
			||||||
 | 
					    </el-form> | 
				
			||||||
 | 
					  </div> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</template> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped> | 
				
			||||||
 | 
					#break_line { | 
				
			||||||
 | 
					  margin-top: 30px; | 
				
			||||||
 | 
					  margin-bottom: 30px; | 
				
			||||||
 | 
					  background-color: rgba(144, 147, 153, 0.5); | 
				
			||||||
 | 
					  height: 1px; | 
				
			||||||
 | 
					  border: none | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:deep(.el-checkbox-button) { | 
				
			||||||
 | 
					  margin-bottom: 10px; | 
				
			||||||
 | 
					  margin-right: 15px; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:deep(.el-checkbox-button__inner) { | 
				
			||||||
 | 
					  width: 60px; | 
				
			||||||
 | 
					  height: 60px; | 
				
			||||||
 | 
					  align-content: center; | 
				
			||||||
 | 
					  background: #ebebeb; | 
				
			||||||
 | 
					  color: #333; | 
				
			||||||
 | 
					  border: 0 !important; | 
				
			||||||
 | 
					  border-radius: 10px !important; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.seat-row { | 
				
			||||||
 | 
					  display: flex; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</style> | 
				
			||||||
					Loading…
					
					
				
		Reference in new issue