Przeglądaj źródła

票务管理改造

gcz 2 miesięcy temu
rodzic
commit
791be05f6c

+ 9 - 0
src/api/ticketMr/ticketMr.js

@@ -26,6 +26,15 @@ export const saveAndEdit = (data) => {
   })
 }
 
+//获取座位类型列表
+export const seatTypeList = (query) => {
+  return request({
+    url: '/merchant/merchantAuditoriumSeatType/listAll',
+    method: 'get',
+    params: query
+  })
+}
+
 // 删除模板
 export const deleteById = (id) => {
   return request({

+ 113 - 96
src/views/ticket/ticketMr/dialog/addAndEdit.vue

@@ -3,7 +3,7 @@
  * @Author: Sugar.
  * @Date: 2023-11-24 13:55:00
  * @LastEditors: gcz
- * @LastEditTime: 2024-04-22 16:20:30
+ * @LastEditTime: 2025-02-19 09:44:32
  * @FilePath: \great_webui\src\views\ticket\ticketMr\dialog\addAndEdit.vue
  * @Copyright: Copyright (c) 2016~2023 by Sugar., All Rights Reserved.
 -->
@@ -28,75 +28,46 @@
                 clearable
               />
             </el-form-item>
-            <el-form-item label="实名信息:" prop="isAuth" v-if="false">
-              <el-radio v-model="form.isAuth" label="1">全部观影人员均实名</el-radio>
+            <el-form-item label="票档类型:" prop="seatType">
+              <el-select 
+                v-model="form.seatType"
+                placeholder="请选择票档类型"
+                multiple
+                clearable
+                style="width: 100%"
+              >
+                <el-option
+                  v-for="item in seatTypeListArr"
+                  :key="item.id"
+                  :label="item.name"
+                  :value="item.id"
+                />
+              </el-select>
             </el-form-item>
-            <el-form-item label="散客是否实名:" prop="ifRealUser">
-              <el-radio-group v-model="form.ifRealUser">
-                <el-radio :label="0">否</el-radio>
-                <el-radio :label="1">是</el-radio>
-              </el-radio-group>
+            <el-form-item label="包含人数:" prop="personnelNum" v-if="channelType!=='group'">
+              <el-input-number v-model="form.personnelNum" :step="1" step-strictly :min="0" :controls="false" controls-position="right" placeholder="请输入包含人数"></el-input-number>
+                <p>0-表示不限制 其他数字表示限制人数</p>
+              <!-- <span v-if="form.oneMany == 1">0-表示不限制 其他数字表示限制人数</span>
+              <span v-if="form.oneMany == 2">限制人数最少为1人</span> -->
             </el-form-item>
-            <el-form-item label="团购是否实名:" prop="ifRealTeam">
-              <el-radio-group v-model="form.ifRealTeam">
-                <el-radio :label="0">否</el-radio>
+            <el-form-item label="是否实名:" prop="isAuth">
+              <el-radio-group v-model="form.isAuth">
                 <el-radio :label="1">是</el-radio>
+                <el-radio :label="2">否</el-radio>
               </el-radio-group>
             </el-form-item>
-            <el-form-item label="证件要求:" prop="oneMany">
+            <el-form-item label="证件要求:" prop="oneMany" v-if="form.isAuth == 1">
               <el-radio-group v-model="form.oneMany">
                 <el-radio :label="1">一证一人</el-radio>
                 <el-radio :label="2">一证多人</el-radio>
               </el-radio-group>
             </el-form-item>
-            <el-form-item label="包含人数:" prop="personnelNum">
-              <el-input-number v-model="form.personnelNum" :step="1" step-strictly :min="0" :controls="false" controls-position="right" placeholder="请输入包含人数"></el-input-number>
-              <span v-if="form.oneMany == 1">0-表示不限制 其他数字表示限制人数</span>
-              <span v-if="form.oneMany == 2">限制人数最少为1人</span>
-            </el-form-item>
-            <!-- <el-form-item label="包含人数:" v-if="(form.ifRealTeam == 1 || form.ifRealUser == 1) && form.oneMany == 2" prop="personnelNum">
-              <el-input-number v-model="form.personnelNum" :step="1" step-strictly :min="1" :controls="false" controls-position="right" placeholder="请输入包含人数"></el-input-number>
-              
-            </el-form-item> -->
             <el-form-item label="停止售卖时间:" prop="stopSaleTime">
               <span style="margin-right: 5px">开演前</span>
-              <!-- <el-input
-                v-model="form.stopSaleTime"
-                type="number"
-                placeholder="停止售卖时间"
-                clearable
-                style="width: 180px;"
-              >
-              </el-input> -->
               <el-input-number v-model="form.stopSaleTime" :controls="false" controls-position="right" placeholder="停止售卖时间"></el-input-number>
               <span style="margin-left: 5px">分钟内
-                <!-- <i style="font-size: 12px;margin-left: 5px;">注:必须大于核销时间至少30秒</i> -->
               </span>
             </el-form-item>
-            <!-- <el-form-item label="核销时间:" prop="beforeTime">
-              <span style="margin-right: 5px">开演前</span>
-              <el-input
-                v-model="form.beforeTime"
-                @change="changePriceAmount('beforeTime')"
-                type="number"
-                placeholder="核销时间"
-                clearable
-                style="width: 120px;"
-              >
-              </el-input>
-              <span style="margin-left: 5px">分钟内</span>
-            </el-form-item>
-            <el-form-item label="核销播报次数:" prop="verificationSpeaker">
-              <el-input
-                v-model="form.verificationSpeaker"
-                @change="changePriceAmount('verificationSpeaker')"
-                type="number"
-                placeholder="核销播报次数"
-                clearable
-                style="width: 100%;"
-              >
-              </el-input>
-            </el-form-item> -->
             <el-form-item label="票务说明:">
               <el-input
                 type="textarea"
@@ -111,7 +82,7 @@
 
           <!--    销售信息     -->
           <el-tab-pane label="销售信息" name="02">
-            <el-form-item label="销售价:" label-width="100px" prop="salePrice">
+            <!-- <el-form-item label="销售价:" label-width="100px" prop="salePrice">
               <el-input
                 v-model="form.salePrice"
                 placeholder="销售价"
@@ -122,7 +93,7 @@
               >
                 <template slot="append">元</template>
               </el-input>
-            </el-form-item>
+            </el-form-item> -->
             <!-- <el-form-item label="销售有效期:" label-width="100px" prop="saleTimeAll">
               <el-date-picker
               v-model="form.saleTimeAll"
@@ -148,12 +119,12 @@
                 <template slot="append">张</template>
               </el-input>
             </el-form-item>
-            <el-form-item label="售票渠道:" required label-width="100px">
+            <!-- <el-form-item label="售票渠道:" required label-width="100px">
               <el-checkbox v-model="form.channelWx">小程序</el-checkbox>
               <el-checkbox v-model="form.channelWindow">窗口</el-checkbox>
               <el-checkbox v-model="form.channelAutoSale">自助售/取票机</el-checkbox>
               <el-checkbox v-model="form.channelPersonSale">小程序(分销)</el-checkbox>
-            </el-form-item>
+            </el-form-item> -->
             <el-form-item label="税率:" prop="taxRate" label-width="100px">
               <el-select
                 v-model="form.taxRate"
@@ -181,8 +152,8 @@
             </el-form-item>
           </el-tab-pane>
 
-          <!--    退信息     -->
-          <el-tab-pane label="退信息" name="03">
+          <!--    退信息     -->
+          <el-tab-pane label="退信息" name="03">
             <el-form-item label="是否支持退票:" prop="backStatus" label-width="120px">
               <el-radio v-model="form.backStatus" label="0">是</el-radio>
               <el-radio v-model="form.backStatus" label="1">否</el-radio>
@@ -208,6 +179,10 @@
               </el-time-select>
               <span style="padding-left: 10px">可退</span>
             </el-form-item>
+            <el-form-item label="是否允许改签:" prop="allowReSubmit" label-width="120px">
+              <el-radio v-model="form.allowReSubmit" :label="1">是</el-radio>
+              <el-radio v-model="form.allowReSubmit" :label="0">否</el-radio>
+            </el-form-item>
           </el-tab-pane>
 
           <!--    核销信息 -->
@@ -323,7 +298,7 @@
 
 <script>
 // import { updateNoticeMgr } from "@/api/system/noticeMgr";
-import { saveAndEdit, getSelectById } from '@/api/ticketMr/ticketMr'
+import { saveAndEdit, getSelectById,seatTypeList } from '@/api/ticketMr/ticketMr'
 import { getToken } from "@/utils/auth";
 import { pageList } from '@/api/performMr/performMr'
 import FreightMgrIndexMi from "./FreightMgrIndexMi"
@@ -365,9 +340,12 @@ export default {
         id: undefined,
         type: "",
         content: "",
-        isAuth: '1',
+        isAuth: 1,
         backTime: '1',
-        goodsPerform: {}
+        goodsPerform: {},
+        seatType: [],
+        seatTypeList: [],
+        allowReSubmit: 1,
       },
       rules: {
         goodsName: [{ required: true, message: "请输入票务名称", trigger: ["change","blur"] }],
@@ -389,13 +367,16 @@ export default {
         days: [{ required: true, message: "请输入日期", trigger: ["change","blur"] }],
         saleTimeAll: [{required: true, message: "请选择销售有效期", trigger: ["change","blur"]}],
 
-        ifRealUser: [{required: true, message: "请选择散客是否实名", trigger: ["change","blur"]}],
-        ifRealTeam: [{required: true, message: "请选择团购是否实名", trigger: ["change","blur"]}],
-      
+        seatType: [
+          { required: true, message: "请选择票档类型", trigger: ["change","blur"] }
+        ],
         oneMany: [{required: true, message: "请选择实名要求", trigger: ["change","blur"]}],
         personnelNum: [{required: true, message: "请输入包含人数", trigger: ["change","blur"]}],
         
         checkList: [{required: false, message: "请选择核销凭证", trigger: ["change","blur"]}],
+        allowReSubmit: [
+          { required: true, message: "请选择是否允许改签", trigger: ["change","blur"] }
+        ],
       },
       uploadObj: {
         url: process.env.VUE_APP_UPLOAD_FILE_API + "/upload/single/minio",
@@ -405,11 +386,14 @@ export default {
         {id: 1, name: '是', value: 1},
         {id: 2, name: '否', value: 2},
       ],
-      performList: []
+      performList: [],
+      seatTypeListArr: [],
+      channelType: '',
     };
   },
   created() {
     this.getList()
+    this.getSeatTypeList()
   },
   methods: {
     /** 查询主办方列表 */
@@ -431,18 +415,23 @@ export default {
     /**
      * 打开弹框
      * @date 2023-11-22
-     * @param {any} obj
+     * @param {any} title 标题
+     * @param {any} obj 编辑对象
+     * @param {string} channelType 销售渠道
      * @returns {any}
      */
-    openDialog(title, obj) {
+    openDialog(title, obj, channelType) {
       this.open = true;
       this.reset();
       this.activeName = '01';
-      if (obj){
+      this.channelType = channelType;
+      
+      if (obj) {
         this.title = "编辑票务管理";
         this.getSelectByIdApi(obj)
-      }else{
+      } else {
         this.title = "添加票务管理";
+        this.setDefaultChannelValues();
         this.$nextTick(() => {
           this.$refs["form"].clearValidate();
         });
@@ -457,7 +446,8 @@ export default {
           this.form = {}
           this.$set(this.form, 'id', obj.id);
           this.$set(this.form, 'goodsName', obj.goodsName);
-          this.$set(this.form, 'isAuth', '1');
+          this.$set(this.form, 'seatType', obj.seatTypeList ? obj.seatTypeList.map(item => item.seatTypeId) : []);
+          this.$set(this.form, 'isAuth', obj.isAuth);
           this.$set(this.form, 'verificationSpeaker', obj.goodsPerform.verificationSpeaker);
           this.$set(this.form, 'beforeTime', obj.goodsPerform.beforeTime);
           this.$set(this.form, 'stopSaleTime', obj.goodsPerform.stopSaleTime);
@@ -494,12 +484,6 @@ export default {
             this.$set(this.form, 'saleTimeAll', [obj.goodsPerform.saleBeginTime,obj.goodsPerform.saleEndTime]);
           }
 
-          this.$set(this.form, 'ifRealUser', obj.goodsPerform.ifRealUser);  
-          this.$set(this.form, 'ifRealTeam', obj.goodsPerform.ifRealTeam);  
-          // if(obj.goodsPerform.ifRealTeam == 1 || obj.goodsPerform.ifRealUser == 1) {
-          //   this.$set(this.form, 'oneMany', obj.goodsPerform.oneMany);  
-          //   this.$set(this.form, 'personnelNum', obj.goodsPerform.personnelNum);
-          // }
           this.$set(this.form, 'oneMany', obj.goodsPerform.oneMany);  
           this.$set(this.form, 'personnelNum', obj.goodsPerform.personnelNum); 
           this.$set(this.form,'checkList',[])
@@ -509,6 +493,8 @@ export default {
           if(obj.goodsPerform.verificationIdcard == 0) {
             this.form.checkList.push('B')
           }
+          this.$set(this.form, 'seatTypeList', obj.seatTypeList || []);
+          this.$set(this.form, 'allowReSubmit', obj.allowReSubmit);
         });
       });
     },
@@ -537,6 +523,7 @@ export default {
               postMap.id = this.form.id;
             }
             postMap.goodsName = this.form.goodsName;
+            postMap.seatType = this.form.seatType;
             postMap.isAuth = this.form.isAuth;
             postMap.goodsPerform.verificationSpeaker = this.form.verificationSpeaker;
             postMap.goodsPerform.beforeTime = this.form.beforeTime;
@@ -545,10 +532,6 @@ export default {
 
             postMap.salePrice = this.form.salePrice;
             postMap.goodsPerform.buyAstrict = this.form.buyAstrictType == '1' ? this.form.buyAstrict : '-1';
-            if(!(this.form.channelWx || this.form.channelWindow || this.form.channelAutoSale)){
-              this.$message.error("请选择销售渠道!");
-              return false;
-            }
             postMap.taxRate = this.form.taxRate
             postMap.goodsPerform.channelWx = this.form.channelWx ? 0 : 1;
             postMap.goodsPerform.channelWindow = this.form.channelWindow  ? 0 : 1;
@@ -569,16 +552,12 @@ export default {
               postMap.goodsPerform.saleEndTime = this.form.saleTimeAll[1];
             }
 
-            postMap.goodsPerform.ifRealUser = this.form.ifRealUser
-            postMap.goodsPerform.ifRealTeam = this.form.ifRealTeam
-
-
-            // if(this.form.ifRealTeam == 1 || this.form.ifRealUser == 1) {
-            //   postMap.goodsPerform.oneMany = this.form.oneMany
-            //   postMap.goodsPerform.personnelNum = this.form.personnelNum
-            // }
             postMap.goodsPerform.oneMany = this.form.oneMany
             postMap.goodsPerform.personnelNum = this.form.personnelNum
+            // 团购渠道设置包含人数为1
+            if(this.channelType=='group'){
+              postMap.goodsPerform.personnelNum = 1
+            }
 
             if(this.form.checkList.indexOf('A') != -1) {
               postMap.goodsPerform.verificationQrcode = 0
@@ -591,6 +570,13 @@ export default {
               postMap.goodsPerform.verificationIdcard = 1
             }
             
+            postMap.seatTypeList = this.form.seatType.map(id => ({
+              seatTypeId: id
+            }));
+            
+            postMap.channelType = this.channelType;
+            postMap.allowReSubmit = this.form.allowReSubmit;
+            
             this.loading = true;
             const { code } = await saveAndEdit({ ...postMap });
             if (code === 200) {
@@ -624,15 +610,16 @@ export default {
     reset() {
       this.$set(this.form, 'id', '');
       this.$set(this.form, 'goodsName', '');
-      this.$set(this.form, 'isAuth', '1');
+      this.$set(this.form, 'seatType', []);
+      this.$set(this.form, 'isAuth', 1);
       this.$set(this.form, 'verificationSpeaker', '');
       this.$set(this.form, 'detail', '');
       this.$set(this.form, 'goodsPerform', {});
       this.$set(this.form, 'salePrice', '');
       this.$set(this.form, 'buyAstrictType', '1');
       this.$set(this.form, 'buyAstrict', '');
-      this.$set(this.form, 'channelWx', '');
-      this.$set(this.form, 'channelWindow', '');
+      this.$set(this.form, 'channelWx', false);
+      this.$set(this.form, 'channelWindow', false);
       this.$set(this.form, 'beforeTime', '');
 
       this.$set(this.form, 'backStatus', '');
@@ -645,13 +632,12 @@ export default {
       this.$set(this.form, 'stopSaleTime', '');
       this.$set(this.form, 'saleTimeAll', '');
       
-      this.$set(this.form, 'ifRealUser', '');
-      this.$set(this.form, 'ifRealTeam', '');
-
       this.$set(this.form, 'oneMany', '');
       this.$set(this.form, 'personnelNum', undefined);
 
       this.$set(this.form, 'checkList', ['A','B'])
+      this.$set(this.form, 'seatTypeList', []);
+      this.$set(this.form, 'allowReSubmit', 1);
     },
     /**
      * 关闭弹框
@@ -662,6 +648,37 @@ export default {
       // this.reset();
       this.open = false;
     },
+    getSeatTypeList() {
+      seatTypeList().then(response => {
+        this.seatTypeListArr = Array.isArray(response.data.list) ? response.data.list : [];
+      });
+    },
+    // 新增方法 - 根据销售渠道设置默认值
+    setDefaultChannelValues() {
+      // 重置所有渠道为 false
+      this.$set(this.form, 'channelWx', false);
+      this.$set(this.form, 'channelWindow', false);
+      this.$set(this.form, 'channelAutoSale', false);
+      this.$set(this.form, 'channelPersonSale', false);
+
+      // 根据选择的渠道设置对应值为 true
+      switch(this.channelType) {
+        case '1': // 小程序
+          this.$set(this.form, 'channelWx', true);
+          break;
+        case '2': // 窗口
+          this.$set(this.form, 'channelWindow', true);
+          break;
+        case '3': // 自助售/取票机
+          this.$set(this.form, 'channelAutoSale', true);
+          break;
+        case '4': // 小程序(分销)
+          this.$set(this.form, 'channelPersonSale', true);
+          break;
+        default:
+          break;
+      }
+    },
   },
 };
 </script>

+ 32 - 10
src/views/ticket/ticketMr/dialog/details.vue

@@ -2,9 +2,9 @@
  * @Description: 详情弹框
  * @Author: Sugar.
  * @Date: 2023-11-24 13:55:00
- * @LastEditors: Sugar.
- * @LastEditTime: 2023-11-24 13:55:00
- * @FilePath: \cattle_webui\src\views\ticket\ticketMr\dialog\details.vue
+ * @LastEditors: gcz
+ * @LastEditTime: 2025-02-19 10:15:51
+ * @FilePath: \great_webui\src\views\ticket\ticketMr\dialog\details.vue
  * @Copyright: Copyright (c) 2016~2023 by Sugar., All Rights Reserved.
 -->
 <template>
@@ -24,11 +24,14 @@
           <div class="grid-content bg-purple item-class">票务名称: <span>{{ form.goodsName }}</span></div>
         </el-col>
         <el-col :span="12">
-          <div class="grid-content bg-purple item-class">散客是否实名: <span>{{ form.goodsPerform && (form.goodsPerform.ifRealUser==1?'是':form.goodsPerform.ifRealUser==0?'否':'-') }}</span></div>
+          <div class="grid-content bg-purple item-class">是否实名: <span>{{ form.isAuth == 1 ? '是' : '否' }}</span></div>
         </el-col>
-        <el-col :span="12">
+        <!-- <el-col :span="12">
+          <div class="grid-content bg-purple item-class">散客是否实名: <span>{{ form.goodsPerform && (form.goodsPerform.ifRealUser==1?'是':form.goodsPerform.ifRealUser==0?'否':'-') }}</span></div>
+        </el-col> -->
+        <!-- <el-col :span="12">
           <div class="grid-content bg-purple item-class">团购是否实名: <span>{{ form.goodsPerform && (form.goodsPerform.ifRealTeam==1?'是':form.goodsPerform.ifRealTeam==0?'否':'-') }}</span></div>
-        </el-col>
+        </el-col> -->
         <!-- <el-col :span="12" v-if="form.goodsPerform && (form.goodsPerform.ifRealTeam == 1 || form.goodsPerform.ifRealUser == 1)">
           <div class="grid-content bg-purple item-class">实名要求: <span>{{ form.goodsPerform && (form.goodsPerform.oneMany==1?'一证一人':form.goodsPerform.oneMany==2?'一证多人':'-') }}</span></div>
         </el-col>
@@ -44,17 +47,22 @@
         <el-col :span="12">
           <div class="grid-content bg-purple item-class">停止售卖时间: <span>开演前{{ form.goodsPerform && form.goodsPerform.stopSaleTime }}分钟内</span></div>
         </el-col>
-        <el-col :span="12" v-if="form.goodsPerform">
+        <el-col :span="24" v-if="form.goodsPerform">
           <div class="grid-content bg-purple item-class">票务说明: <span>{{ form.goodsPerform.detail || '' }}</span></div>
         </el-col>
+        <el-col :span="24">
+          <div class="grid-content bg-purple item-class">票档类型: 
+            <span>{{ getSeatTypeNames(form.seatTypeList) }}</span>
+          </div>
+        </el-col>
       </el-row>
 
       <!--   演出信息   -->
       <div class="title-class">销售信息</div>
       <el-row>
-        <el-col :span="12">
+        <!-- <el-col :span="12">
           <div class="grid-content bg-purple item-class">销售价: <span>{{ form.salePrice + '元' || '' }}</span></div>
-        </el-col>
+        </el-col> -->
         <!-- <el-col :span="24">
           <div class="grid-content bg-purple item-class">销售有效期: <span>{{ 
             form.goodsPerform && form.goodsPerform.saleBeginTime && form.goodsPerform.saleEndTime ? 
@@ -94,8 +102,15 @@
       </el-row>
 
       <!--   观影须知   -->
-      <div class="title-class">退信息</div>
+      <div class="title-class">退信息</div>
       <el-row>
+        <el-col :span="12">
+          <div class="grid-content bg-purple item-class">是否允许改签:
+             <span v-if="form.allowReSubmit==1">是</span>
+             <span v-if="form.allowReSubmit==0">否</span>
+             <span v-if="form.allowReSubmit==null">-</span>
+          </div>
+        </el-col>
         <el-col :span="24" v-if="form.goodsPerform">
           <div class="grid-content bg-purple item-class">
             是否支持退票:
@@ -180,6 +195,13 @@ export default {
     cancel() {
       this.open = false;
     },
+    // 获取票档名称列表
+    getSeatTypeNames(seatTypeList) {
+      if (!seatTypeList || !Array.isArray(seatTypeList)) {
+        return '-';
+      }
+      return seatTypeList.map(item => item.seatTypeName).join('、') || '-';
+    },
   },
 };
 </script>

+ 290 - 131
src/views/ticket/ticketMr/index.vue

@@ -1,147 +1,201 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item label="票务名称">
-        <el-input
-          v-model="queryParams.goodsName"
-          placeholder="请输入票务名称"
-          clearable
-          style="width: 240px;"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
-      </el-form-item>
-    </el-form>
+    <!-- 左侧销售渠道列表 -->
+    <div class="channel-list">
+      <div class="channel-title">销售渠道</div>
+      <div 
+        class="channel-item"
+        :class="[selectedChannel === '' ? 'active' : '']"
+        @click="handleChannelChange('')"
+      >
+        <span class="channel-index">1</span>
+        <span class="channel-name">所有</span>
+      </div>
+      <div 
+        v-for="(item, index) in channelTypeList" 
+        :key="item.dictCode"
+        :class="['channel-item', selectedChannel === item.value ? 'active' : '']"
+        @click="handleChannelChange(item.value)"
+      >
+        <span class="channel-index">{{ index + 2 }}</span>
+        <span class="channel-name">{{ item.label }}</span>
+      </div>
+    </div>
 
-    <el-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
-        <el-button
-              type="primary"
-              plain
-              icon="el-icon-plus"
-              size="mini"
-              @click="handleAdd"
-              v-hasPermi="['ticketMr:ticketMr:add']"
-            >新增</el-button>
-      </el-col>
-      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
-    </el-row>
-
-    <el-table ref="tables" v-loading="loading" :data="dataList" border>
-      <el-table-column label="序号" align="center" type="index" width="60"></el-table-column>
-      <el-table-column label="票务名称" align="center" prop="goodsName" />
-      <el-table-column label="销售价" align="center">
-        <template slot-scope="scope">
-          <span>¥{{ scope.row.salePrice }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="是否限购" align="center">
-        <template slot-scope="scope">
-          <el-tag type="success" v-if="scope.row.goodsPerform.buyAstrict > -1">是</el-tag>
-          <el-tag type="danger" v-if="scope.row.goodsPerform.buyAstrict == -1">否</el-tag>
-        </template>
-      </el-table-column>
-      <el-table-column label="销售渠道" align="center">
-        <template slot-scope="scope">
-          <span>{{ 
-          (scope.row.goodsPerform.channelWx == 0 ? '小程序' : '') + 
-          ' ' + 
-          (scope.row.goodsPerform.channelWindow == 0 ? '窗口' : '') +
-          ' ' + 
-          (scope.row.goodsPerform.channelAutoSale == 0 ? '自助售/取票机' : '')
-          + ' ' + 
-          (scope.row.goodsPerform.channelPersonSale == 0 ? '小程序-分销' : '')
-          }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="是否可退" align="center">
-        <template slot-scope="scope">
-          <el-tag type="success" v-if="scope.row.goodsPerform.backStatus == 0">可退</el-tag>
-          <el-tag type="danger" v-if="scope.row.goodsPerform.backStatus == 1">不可退</el-tag>
-        </template>
-      </el-table-column>
-      <!-- <el-table-column label="销售有效期" align="center">
-        <template slot-scope="scope">
-          <span>{{ 
-            scope.row.goodsPerform && scope.row.goodsPerform.saleBeginTime && scope.row.goodsPerform.saleEndTime ? 
-            scope.row.goodsPerform.saleBeginTime +'--'+ scope.row.goodsPerform.saleEndTime :
-            '-'
-          }}</span>
-        </template>
-      </el-table-column> -->
-      <el-table-column label="状态" align="center">
-        <template slot-scope="scope">
-          <el-switch
-            @change="ionlineApi(scope.row)"
-            v-model="scope.row.switchValue"
-            :active-value="0"
-            active-color="#13ce66"
-            inactive-color="#ff4949">
-          </el-switch>
-        </template>
-      </el-table-column>
-      <el-table-column label="创建人" align="center" prop="createBy" width="160" />
-      <el-table-column label="添加时间" align="center" prop="createTime" width="160" >
-        <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.createTime) }}</span>
-        </template>
-      </el-table-column>
+    <!-- 右侧内容区 -->
+    <div class="content-container">
+      <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+        <el-form-item label="票务名称">
+          <el-input
+            v-model="queryParams.goodsName"
+            placeholder="请输入票务名称"
+            clearable
+            style="width: 240px;"
+            @keyup.enter.native="handleQuery"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+          <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+        </el-form-item>
+      </el-form>
 
-      <el-table-column label="操作" align="center" width="200" class-name="small-padding fixed-width">
-        <template slot-scope="scope">
+      <el-row :gutter="10" class="mb8">
+        <el-col :span="1.5">
           <el-button
-            size="mini"
-            type="text"
-            @click="openDetails(scope.row)"
-            v-hasPermi="['ticketMr:ticketMr:details']"
-          >详情</el-button>
-          <span v-hasPermi="['ticketMr:ticketMr:edit']" style="display: inline-block;">
-            <el-button
-              size="mini"
-              type="text"
-              style="margin-left: 10px;"
-              @click="handleUpdate(scope.row)"
-              v-if="scope.row.status != 0"
-            >修改</el-button>
-          </span>
-          <span v-hasPermi="['ticketMr:ticketMr:delete']" style="display: inline-block;">
+                type="primary"
+                plain
+                icon="el-icon-plus"
+                size="mini"
+                @click="handleAdd"
+                v-hasPermi="['ticketMr:ticketMr:add']"
+              >新增</el-button>
+        </el-col>
+        <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+      </el-row>
+
+      <el-table ref="tables" v-loading="loading" :data="dataList" border>
+        <el-table-column label="序号" align="center" type="index" width="60"></el-table-column>
+        <el-table-column label="票务名称" align="center" prop="goodsName" />
+        <el-table-column label="票档" align="center">
+          <template slot-scope="scope">
+            <span>{{ getSeatTypeNames(scope.row.seatTypeList) }}</span>
+          </template>
+        </el-table-column>
+        <!-- <el-table-column label="销售价" align="center">
+          <template slot-scope="scope">
+            <span>¥{{ scope.row.salePrice }}</span>
+          </template>
+        </el-table-column> -->
+        <el-table-column label="是否限购" align="center">
+          <template slot-scope="scope">
+            <el-tag type="success" v-if="scope.row.goodsPerform.buyAstrict > -1">是</el-tag>
+            <el-tag type="danger" v-if="scope.row.goodsPerform.buyAstrict == -1">否</el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column label="是否可退" align="center">
+          <template slot-scope="scope">
+            <el-tag type="success" v-if="scope.row.goodsPerform.backStatus == 0">可退</el-tag>
+            <el-tag type="danger" v-if="scope.row.goodsPerform.backStatus == 1">不可退</el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column label="是否实名" align="center">
+          <template slot-scope="scope">
+            <el-tag type="danger" v-if="scope.row.isAuth == 1">需要</el-tag>
+            <el-tag type="success" v-if="scope.row.isAuth == 2">不需要</el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column label="是否允许改签" align="center">
+          <template slot-scope="scope">
+            <el-tag type="danger" v-if="scope.row.allowReSubmit == 0">不允许</el-tag>
+            <el-tag type="success" v-if="scope.row.allowReSubmit == 1">允许</el-tag>
+          </template>
+        </el-table-column>
+        <!-- <el-table-column label="销售渠道" align="center">
+          <template slot-scope="scope">
+            <span>{{ 
+            (scope.row.goodsPerform.channelWx == 0 ? '小程序' : '') + 
+            ' ' + 
+            (scope.row.goodsPerform.channelWindow == 0 ? '窗口' : '') +
+            ' ' + 
+            (scope.row.goodsPerform.channelAutoSale == 0 ? '自助售/取票机' : '')
+            + ' ' + 
+            (scope.row.goodsPerform.channelPersonSale == 0 ? '小程序-分销' : '')
+            }}</span>
+          </template>
+        </el-table-column> -->
+        
+        <!-- <el-table-column label="销售有效期" align="center">
+          <template slot-scope="scope">
+            <span>{{ 
+              scope.row.goodsPerform && scope.row.goodsPerform.saleBeginTime && scope.row.goodsPerform.saleEndTime ? 
+              scope.row.goodsPerform.saleBeginTime +'--'+ scope.row.goodsPerform.saleEndTime :
+              '-'
+            }}</span>
+          </template>
+        </el-table-column> -->
+        <el-table-column label="状态" align="center">
+          <template slot-scope="scope">
+            <el-switch
+              @change="ionlineApi(scope.row)"
+              v-model="scope.row.switchValue"
+              :active-value="0"
+              active-color="#13ce66"
+              inactive-color="#ff4949">
+            </el-switch>
+          </template>
+        </el-table-column>
+        <el-table-column label="创建人" align="center" prop="createBy" width="160" />
+        <el-table-column label="添加时间" align="center" prop="createTime" width="160" >
+          <template slot-scope="scope">
+            <span>{{ parseTime(scope.row.createTime) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="票务说明" align="center">
+          <template slot-scope="scope">
+            <el-tooltip 
+              class="item" 
+              effect="dark" 
+              :content="scope.row.goodsPerform.detail || '-'" 
+              placement="top-start"
+            >
+              <span class="ellipsis">{{ scope.row.goodsPerform.detail || '-' }}</span>
+            </el-tooltip>
+          </template>
+        </el-table-column>
+
+        <el-table-column label="操作" align="center" width="200" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
             <el-button
               size="mini"
               type="text"
-              style="margin-left: 10px;"
-              @click="handleDelete(scope.row,scope.index)"
-            >删除</el-button>
-          </span>
-        </template>
-      </el-table-column>
-    </el-table>
-
-    <pagination
-      v-show="total>0"
-      :total="total"
-      :page.sync="queryParams.pageNum"
-      :limit.sync="queryParams.pageSize"
-      @pagination="getList"
-    />
+              @click="openDetails(scope.row)"
+              v-hasPermi="['ticketMr:ticketMr:details']"
+            >详情</el-button>
+            <span v-hasPermi="['ticketMr:ticketMr:edit']" style="display: inline-block;">
+              <el-button
+                size="mini"
+                type="text"
+                style="margin-left: 10px;"
+                @click="handleUpdate(scope.row)"
+                v-if="scope.row.status != 0"
+              >修改</el-button>
+            </span>
+            <span v-hasPermi="['ticketMr:ticketMr:delete']" style="display: inline-block;">
+              <el-button
+                size="mini"
+                type="text"
+                style="margin-left: 10px;"
+                @click="handleDelete(scope.row,scope.index)"
+              >删除</el-button>
+            </span>
+          </template>
+        </el-table-column>
+      </el-table>
 
-    <!-- 新增/编辑弹框 -->
-    <add-and-edit
-      ref="addAndEdit"
-      @getList="getList"
-    />
+      <pagination
+        v-show="total>0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+      />
 
-    <!-- 详情 -->
-    <details-dia ref="detailsDia"></details-dia>
+      <!-- 新增/编辑弹框 -->
+      <add-and-edit
+        ref="addAndEdit"
+        @getList="getList"
+      />
 
+      <!-- 详情 -->
+      <details-dia ref="detailsDia"></details-dia>
+    </div>
   </div>
 </template>
 
 <script>
 
-import { pageList, deleteById, updateStatus } from '@/api/ticketMr/ticketMr'
+import { pageList, deleteById, updateStatus,seatTypeList } from '@/api/ticketMr/ticketMr'
 import addAndEdit from "./dialog/addAndEdit";
 import detailsDia from "./dialog/details.vue";
 
@@ -187,13 +241,35 @@ export default {
       ],
       visibleStatus: false,
       newObj: {},
-      visibleType: ''
+      visibleType: '',
+      channelTypeList: [],
+      selectedChannel: '', // 当前选中的销售渠道
+      seatTypeListArr: [],
     };
   },
   created() {
     this.getList();
+    this.getDicts("channel_type").then(response => {
+      this.channelTypeList = response.data.map(item => {
+        return {
+          label: item.dictLabel,
+          value: item.dictValue,
+          dictCode: item.dictCode
+        }
+      });
+      // 默认选中"所有"
+      this.selectedChannel = '';
+      this.queryParams.channelType = '';
+      this.getList();
+      this.getSeatTypeList();
+    });
   },
   methods: {
+    getSeatTypeList() {
+      seatTypeList().then(response => {
+        this.seatTypeListArr = Array.isArray(response.data.list) ? response.data.list : [];
+      });
+    },
     /** 查询列表 */
     getList() {
       this.loading = true;
@@ -226,7 +302,11 @@ export default {
     },
     /** 新增按钮操作 */
     handleAdd() {
-      this.$refs["addAndEdit"].openDialog("新增数据", null);
+      if (!this.selectedChannel) {
+        this.$message.warning("请先选择销售渠道!");
+        return;
+      }
+      this.$refs["addAndEdit"].openDialog("新增数据", null, this.selectedChannel);
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
@@ -273,7 +353,86 @@ export default {
       this.visibleStatus = true
       this.visibleType = type;
       this.newObj = obj;
-    }
+    },
+    // 切换销售渠道
+    handleChannelChange(channelValue) {
+      this.selectedChannel = channelValue;
+      this.queryParams.channelType = channelValue;
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    // 获取票档名称
+    getSeatTypeNames(seatTypeList) {
+      if (!seatTypeList || !Array.isArray(seatTypeList)) {
+        return '-';
+      }
+      return seatTypeList.map(item => item.seatTypeName).join('、') || '-';
+    },
   }
 };
 </script>
+
+<style lang="scss" scoped>
+.app-container {
+  display: flex;
+  min-height: calc(100vh - 84px);
+  
+  .channel-list {
+    width: 200px;
+    // min-width: 200px;
+    background: #fff;
+    margin-right: 16px;
+    padding: 16px 0;
+    border-radius: 4px;
+    
+    .channel-title {
+      font-size: 16px;
+      font-weight: bold;
+      padding: 0 16px 16px;
+      border-bottom: 1px solid #eee;
+    }
+    
+    .channel-item {
+      padding: 12px 16px;
+      cursor: pointer;
+      display: flex;
+      align-items: center;
+      
+      &:hover {
+        background: #f5f7fa;
+      }
+      
+      &.active {
+        background: #ecf5ff;
+        color: #409eff;
+      }
+      
+      .channel-index {
+        width: 24px;
+        height: 24px;
+        line-height: 24px;
+        text-align: center;
+        background: #f0f2f5;
+        border-radius: 4px;
+        margin-right: 8px;
+        font-size: 12px;
+      }
+    }
+  }
+  
+  .content-container {
+    flex: 1;
+    background: #fff;
+    padding: 16px;
+    border-radius: 4px;
+  }
+
+  .ellipsis {
+    display: inline-block;
+    width: 100%;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+}
+</style>