Browse Source

伟大转折客服端功能开发完成,代码提交

shipeng556 1 month ago
parent
commit
ef8b7f4210

+ 1 - 1
.env.development

@@ -1,5 +1,5 @@
 # 页面标题
-VUE_APP_TITLE = 伟大转折窗口售票系统(开发)
+VUE_APP_TITLE = 伟大转折客户服务中心管理系统(开发)
 
 # 开发环境配置
 ENV = 'development'

+ 1 - 1
.env.production

@@ -1,5 +1,5 @@
 # 页面标题
-VUE_APP_TITLE = 伟大转折窗口售票系统
+VUE_APP_TITLE = 伟大转折客户服务中心管理系统
 
 # 生产环境配置
 ENV = 'production'

+ 1 - 1
.env.staging

@@ -1,5 +1,5 @@
 # 页面标题
-VUE_APP_TITLE =剧场票务管理系统
+VUE_APP_TITLE = 伟大转折客户服务中心管理系统
 
 NODE_ENV = staging
 

+ 1 - 1
package.json

@@ -1,7 +1,7 @@
 {
   "name": "ruoyi",
   "version": "3.8.6",
-  "description": "伟大转折窗口售票系统",
+  "description": "伟大转折客户服务中心管理系统",
   "author": "达泽",
   "license": "MIT",
   "scripts": {

+ 2 - 1
src/api/login.js

@@ -10,7 +10,8 @@ export function login(username, password, code, uuid) {
   }
   return request({
     // url: '/system/auth/login',
-    url: '/system/auth/ticketSale/login',
+    // url: '/system/auth/ticketSale/login',
+    url: '/system/auth/coustomer/login',
     headers: {
       isToken: false
     },

+ 131 - 0
src/api/order/service.js

@@ -0,0 +1,131 @@
+import request from '@/utils/request'
+
+
+// 临期提醒 分页查询
+export const pageExpiryList = (query) => {
+  return request({
+    url: '/order/orderViewers/expirylist',
+    method: 'get',
+    params: query
+  })
+}
+// 临期场次
+export const pagePerformTimeList = (query) => {
+  return request({
+    url: '/merchant/merchantPerformTime/selectExpiryList',
+    method: 'get',
+    params: query
+  })
+}
+
+
+
+// 售后登记 分页查询
+export const pageList = (query) => {
+  return request({
+    url: '/order/orderAfterRegister/list',
+    method: 'get',
+    params: query
+  })
+}
+
+
+// 客诉记录 分页查询
+export const customRecordApi = (query) => {
+  return request({
+    url: '/order/orderCustomRecord/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 添加售后登记
+export const orderAfterRegister = (data) => {
+  return request({
+    url: '/order/orderAfterRegister/insert',
+    method: 'post',
+    data: data
+  })
+}
+// 修改售后登记
+export const orderAfterRegisterUpdate = (data) => {
+  return request({
+    url: '/order/orderAfterRegister/update',
+    method: 'put',
+    data: data
+  })
+}
+// 删除客诉记录
+export const delRecordById = (id) => {
+  return request({
+    url: '/order/orderCustomRecord/delete',
+    method: 'delete',
+    params: {id:id}
+  })
+}
+
+// 通过订单id 查售后登记id
+export const addOneAfterRegister = (data) => {
+  return request({
+    url: '/order/orderAfterRegister/addOneAfterRegister',
+    method: 'post',
+    data: data
+  })
+}
+
+// id获取详情
+export function getDetailById(id) {
+  return request({
+    url: '/order/orderAfterRegister/getById?id=' + id,
+    method: 'get'
+  })
+}
+// 删除
+export const delRegisterById = (id) => {
+  return request({
+    url: '/order/orderAfterRegister/delete',
+    method: 'delete',
+    params: {id:id}
+  })
+}
+// 获取用户退款通知列表
+export function getUserList() {
+  return request({
+    url: '/order/refundNoticeUser/getUserList',
+    method: 'get'
+  })
+}
+// 通知消息 已读
+export const updateReadApi = (data) => {
+  return request({
+    url: '/order/refundNoticeUser/updateRead',
+    method: 'put',
+    data: data
+  })
+}
+
+// 添加客诉
+export const recordAddApi = (data) => {
+  return request({
+    url: '/order/orderCustomRecord/insert',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改客诉
+export const recordUpdatApi = (data) => {
+  return request({
+    url: '/order/orderCustomRecord/update',
+    method: 'put',
+    data: data
+  })
+}
+
+// 客诉详情
+export function getRecordById(id) {
+  return request({
+    url: '/order/orderCustomRecord/getById?id=' + id,
+    method: 'get'
+  })
+}

+ 103 - 18
src/components/RuoYi/Bell/index.vue

@@ -1,44 +1,129 @@
 <template>
-  <div v-hasPermi="['team:earlyWarning:isShow']">
-    <el-badge :value="total" class="item">
-      <svg-icon icon-class="bell" @click="goTo" />
+  <div v-hasPermi="['team:notice:isShow']">
+    <el-badge :value="msgNum" class="item">
+      <el-popover placement="left-start" width="380" trigger="manual" v-model="visible">
+        <div style="margin: 10px 6px;">
+          <div class="info-box" v-for="item in UnreadList" :key="item.id">
+            <div>{{ item.memberName }}客户的退票审核已{{ item.status == 1 ? '通过' : '驳回' }}</div>
+            <el-button type="primary" @click="viewInfo(item)">查看</el-button>
+          </div>
+        </div>
+        <svg-icon slot="reference" icon-class="bell" @click="goTo" />
+      </el-popover>
+      <!-- <svg-icon icon-class="bell" @click="goTo" /> -->
     </el-badge>
-    
   </div>
 </template>
 
 <script>
-import { 
-  WaitRepaymentTotal
-} from '@/api/team/teamMr'
+// import {
+//   WaitRepaymentTotal
+// } from '@/api/team/teamMr'
+import { getUserList, updateReadApi } from '@/api/order/service';
 export default {
   name: 'RuoYiBell',
   data() {
     return {
-      total: 0,// 预警待办数
+      total: 0,// 审核消息通知数
+      visible: false,
+      noticeList: [],
+      UnreadList: [],
+      pollInterval: null,
+      msgNum: '',
     }
   },
   created() {
-    this.getNumTotal();
+    // this.getNumTotal();
+    // this.getNoticeList();
+  },
+  mounted() {
+    this.startPolling();
+  },
+  beforeDestroy() {
+    // 组件销毁前停止轮询
+    this.stopPolling();
   },
   methods: {
-    getNumTotal() {
-      WaitRepaymentTotal(this.queryParams).then(response => {
-          this.total = response.data.total
-      }).catch(()=>{
+    startPolling() {
+      this.visible = false
+      // 先清除可能存在的定时器
+      if (this.pollInterval) {
+        clearInterval(this.pollInterval);
+      }
+      // 立即执行一次
+      this.getNoticeList();
+      // 开始轮询
+      this.pollInterval = setInterval(() => {
+        this.getNoticeList();
+      }, 20000); // 每20秒请求一次
+    },
+    stopPolling() {
+      if (this.pollInterval) {
+        clearInterval(this.pollInterval);
+        this.pollInterval = null;
+      }
+    },
+    // getNumTotal() {
+    //   WaitRepaymentTotal(this.queryParams).then(response => {
+    //     this.total = response.data.total
+    //   }).catch(() => {
+    //   })
+    // },
+    // 获取通知消息数量
+    getNoticeList() {
+      getUserList().then(response => {
+        this.noticeList = response.data.rows
+        this.UnreadList = this.noticeList.filter(ele => ele.isRead == 0)
+        if (this.UnreadList.length != 0) {
+          this.visible = true
+          setTimeout(() => {
+            this.visible = false
+          }, 5000);
+          this.msgNum = this.UnreadList.length;
+        }
+      }).catch(() => {
+      })
+    },
+    // 跳转到查票 页面
+    async viewInfo(item) {
+      // this.$router.push('/team/earlyWarning');
+      let res = await updateReadApi({ id: item.id })
+      this.visible = false
+      this.$router.push({
+        path: "/service/orderMr",
+        query: {
+          orderId: item.orderId,
+        }
       })
     },
     goTo() {
-      this.$router.push('/team/earlyWarning');
+      // this.$router.push('/team/earlyWarning');
+      if (this.UnreadList.length != 0) {
+        this.visible = true
+        setTimeout(() => {
+          this.visible = false
+        }, 5000);
+      }
     }
   }
 }
 </script>
 <style lang="css" scoped>
 ::v-deep .el-badge__content.is-fixed {
-    position: absolute;
-    top: 10px;
-    right: 15px;
-  }
+  position: absolute;
+  top: 8px;
+  right: 15px;
+}
 
+.info-box {
+  padding: 8px 15px;
+  margin-bottom: 10px;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  font-size: 15px;
+  border: 1px solid #eee;
+  border-radius: 3px;
+  background-color: #efeeee;
+}
 </style>

+ 2 - 2
src/layout/components/Navbar.vue

@@ -8,7 +8,7 @@
     <div class="right-menu">
       <template v-if="device!=='mobile'">
         
-        <el-tooltip content="预警待办" effect="dark" placement="bottom">
+        <el-tooltip content="消息通知" effect="dark" placement="bottom">
             <ruo-yi-bell id="ruoyi-bell" class="right-menu-item hover-effect" />
         </el-tooltip>
 
@@ -110,7 +110,7 @@ export default {
       }).then(() => {
         this.$store.dispatch('LogOut').then(() => {
           // location.href = '/index';
-          location.href = '/window/ticket';
+          location.href = '/service/orderMr';
         })
       }).catch(() => {});
     }

+ 7 - 7
src/router/index.js

@@ -64,7 +64,7 @@ export const constantRoutes = [
   {
     path: '',
     component: Layout,
-    redirect: '/window/ticket',
+    redirect: '/service/orderMr',
     hidden: true,
     children: [
       // {
@@ -73,12 +73,12 @@ export const constantRoutes = [
       //   name: 'Index',
       //   meta: { title: '首页', icon: 'dashboard', affix: true }
       // },
-      {
-        path: '/window/ticket',
-        component: (resolve) => require(['@/views/windowTicketSales/ticket'], resolve),
-        name: 'Ticket',
-        meta: { title: '售票', icon: 'dashboard', affix: true }
-      }
+      // {
+      //   path: '/service/orderMr',
+      //   component: (resolve) => require(['@/views/order/orderMr/index'], resolve),
+      //   name: 'OrderMr',
+      //   meta: { title: '查票', icon: 'dashboard', affix: true }
+      // }
     ]
   },
   {

+ 2 - 2
src/utils/request.js

@@ -94,7 +94,7 @@ service.interceptors.response.use(res => {
           isRelogin.show = false;
           store.dispatch('LogOut').then(() => {
             // location.href = '/index';
-            location.href = '/window/ticket';
+            location.href = '/service/orderMr';
           })
       }).catch(() => {
         isRelogin.show = false;
@@ -108,7 +108,7 @@ service.interceptors.response.use(res => {
           isRelogin.show = false;
           store.dispatch('LogOut').then(() => {
             // location.href = '/index';
-            location.href = '/window/ticket';
+            location.href = '/service/orderMr';
           })
       }).catch(() => {
         isRelogin.show = false;

+ 2 - 2
src/views/login.vue

@@ -159,8 +159,8 @@ export default {
           this.$store.dispatch("Login", this.loginForm).then(() => {
             // this.$router.push({ path: this.redirect || "/" }).catch(()=>{});
             console.log(this.redirect,'this.redirect');
-            this.$router.push({ path: this.redirect || "/window/ticket" }).catch(()=>{});
-          }).catch(() => {window
+            this.$router.push({ path: this.redirect || "/service/orderMr" }).catch(()=>{});
+          }).catch(() => {
             this.loading = false;
             if (this.captchaEnabled) {
               this.getCode();

File diff suppressed because it is too large
+ 300 - 399
src/views/order/orderMr/index.vue


+ 452 - 0
src/views/register/addPage.vue

@@ -0,0 +1,452 @@
+<template>
+  <div class="app-container app-container-scheduling" :style="{ '--q-height': qHeight }">
+      <p class="p-text">{{ subTitle }}</p>
+      <el-divider></el-divider>
+    <div class="app-container-query" ref="queryFormBox">
+      <el-form :model="queryParams" v-if="isFlag == 'add'" ref="queryForm" size="small" :inline="true"
+        v-show="showSearch" label-width="68px">
+        <el-form-item label="订单号">
+          <el-input v-model="queryParams.orderId" placeholder="请输入订单号" clearable style="width: 240px;"
+            @keyup.enter.native="handleQuery" />
+        </el-form-item>
+        <el-form-item label="购票人手机号" label-width="100px">
+          <el-input v-model="queryParams.memberMobile" placeholder="请输入购票人手机号" clearable style="width: 240px;"
+            @keyup.enter.native="handleQuery" />
+        </el-form-item>
+        <el-form-item label="场次时间" label-width="70px">
+          <el-date-picker style="width: 250px;" v-model="queryParams.performDate" @change="pagePerformTimeListFun"
+            type="date" value-format="yyyy-MM-dd">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="场次">
+          <el-select v-model="queryParams.performTimeId" placeholder="场次" clearable style="width: 100%">
+            <el-option v-for="dict in pagePerformTimeList" :key="dict.id"
+              :label="dict.timeSnapshot + '(' + dict.performTimeStart + '-' + dict.performTimeEnd + ')'"
+              :value="dict.id" />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button style="margin-left: 10px;" 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>
+
+    <div class="app-container-table-box">
+      <div class="app-container-table-info">
+        <el-table ref="multipleTable" max-height="380px" class="section-table" @selection-change="handleSelectionChange"
+          v-loading="loading" :data="dataList" border style="width: 100%">
+          <!-- selection 列:隐藏表头 checkbox,显示自定义文字 -->
+          <el-table-column type="selection" width="55"></el-table-column>
+          <!-- <el-table-column label="序号" align="center" type="index" width="60"></el-table-column> -->
+          <el-table-column label="日期" align="center" prop="performDate" />
+          <el-table-column label="姓名" align="center" prop="memberName1" width="150" />
+          <el-table-column label="手机号" align="center" prop="memberMobile" />
+          <el-table-column label="购票平台" align="center" prop="source">
+            <template slot-scope="scope">
+              <dict-tag :options="dict.type.order_form_type" :value="scope.row.source" />
+            </template>
+          </el-table-column>
+          <el-table-column label="订单编号" align="center" prop="id" width="180" />
+          <!-- <el-table-column label="剧目名称" align="center" prop="performName" />
+          <el-table-column label="票务名称" align="center" prop="goodsName" /> -->
+          <el-table-column label="票种类别" align="center" prop="seatTypeName" />
+          <el-table-column label="场次" width="180" align="center" prop="performDate">
+            <template slot-scope="scope">
+              <span>{{ scope.row.performDate }}&nbsp;&nbsp;({{ scope.row.performTimeStart + '-' +
+                scope.row.performTimeEnd
+              }})</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="数量" align="center" prop="quantity" />
+          <el-table-column label="金额" align="center" prop="realPrice">
+            <template slot-scope="scope">
+              <span v-if="scope.row.status != 0">¥{{ scope.row.realPrice }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="订单状态" align="center" prop="status">
+            <template slot-scope="scope">
+              <dict-tag :options="dict.type.order_status_type" :value="scope.row.status" />
+            </template>
+          </el-table-column>
+
+        </el-table>
+      </div>
+      <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
+        @pagination="getList" />
+      <el-form :model="addForm" ref="addForm" :rules="addFormRules" size="small" label-width="90px"
+        style="margin: 30px 5% 0;">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="类型" prop="typeName">
+              <el-input v-model="addForm.typeName" placeholder="请输入类型" :disabled="isFlag == 'detail'" clearable
+                style="width: 300px;" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="客诉平台" prop="coustomPlatform">
+              <el-input v-model="addForm.coustomPlatform" placeholder="请输入客诉平台" :disabled="isFlag == 'detail'" clearable
+                style="width: 300px;" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="涉及部门" prop="deptName">
+              <el-input v-model="addForm.deptName" placeholder="请输入涉及部门" :disabled="isFlag == 'detail'" clearable
+                style="width: 300px;" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="客诉状态" prop="status">
+              <el-select v-model="addForm.status" placeholder="请选择" :disabled="isFlag == 'detail'"
+                style="width: 300px;">
+                <el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="诉求" prop="requestContent">
+              <el-input v-model="addForm.requestContent" type="textarea" :rows="2" placeholder="请输入诉求"
+                :disabled="isFlag == 'detail'" clearable style="width: 80%;" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="处理结果" prop="handlerResult">
+              <el-input v-model="addForm.handlerResult" type="textarea" :rows="2" placeholder="请输入处理结果"
+                :disabled="isFlag == 'detail'" clearable style="width: 80%;" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="记录人">
+              <el-input v-model="addForm.createBy" disabled placeholder="请输入记录人" clearable style="width: 300px;" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="记录时间">
+              <el-input v-model="addForm.createTime" disabled placeholder="请输入记录时间" clearable style="width: 300px;" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24" style="display: flex;justify-content: center;">
+            <el-button class="btn-warp" @click="handleCancel">{{ isFlag == 'detail' ? '关闭' : '取消' }}</el-button>
+            <el-button v-if="isFlag != 'detail'" class="btn-warp" type="primary" @click="handleSubmit">确定</el-button>
+          </el-col>
+        </el-row>
+      </el-form>
+    </div>
+
+  </div>
+</template>
+
+<script>
+
+import { pageList } from '@/api/order/orderMr';
+import { pagePerformTimeList } from "@/api/schedulingMr/schedulingMr"
+import { orderAfterRegister, getDetailById, orderAfterRegisterUpdate } from '@/api/order/service';
+import moment from "moment"
+import { mapGetters } from 'vuex'
+export default {
+  name: "addPage",
+  dicts: ['order_form_type', 'order_status_type'],
+  // components: { detailsDia },
+  data() {
+    return {
+      qHeight: '0px',
+      resizeObserver: null,
+      // 遮罩层
+      loading: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 用户表格数据
+      dataList: [],
+      // 日期范围
+      dateRange: [],
+      statusOptions: [{
+        label: '待处理',
+        value: 1
+      }, {
+        label: '处理中',
+        value: 2
+      }, {
+        label: '处理完成',
+        value: 3
+      }],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        orderId: "",
+      },
+      pagePerformTimeList: [], // 场次列表
+      addForm: {
+        typeName: "",
+        deptName: "",
+        coustomPlatform: "",
+        requestContent: "",
+        handlerResult: "",
+        status: 1,
+        createTime: "",
+        createBy: "",
+      },
+      addFormRules: {
+        typeName: [
+          { required: true, message: '请输入类型', trigger: ['blur'] }
+        ],
+        deptName: [
+          { required: true, message: '请输入部门', trigger: ['blur'] }
+        ],
+        coustomPlatform: [
+          { required: true, message: '请输入客诉平台', trigger: ['blur'] }
+        ],
+        requestContent: [
+          { required: true, message: '请输入诉求', trigger: ['change', 'blur'] }
+        ],
+        handlerResult: [
+          { required: true, message: '请输入处理结果', trigger: ['change', 'blur'] }
+        ]
+      },
+      selectList: [],  // 存储选中的行数据
+      selectedId: [], // 选中订单id
+      isFlag: "add",
+      subTitle: ""
+
+      // multiPerformDate: false,
+      // fixed: 'left',
+
+    };
+  },
+  computed: {
+    ...mapGetters([
+      'name',
+    ]),
+  },
+  created() {
+    let router = this.$router.currentRoute.query
+    this.isFlag = router.type
+    this.isFlag == 'add' ? this.subTitle = '添加售后登记' : this.isFlag == 'edit' ? this.subTitle = '修改售后登记' : this.subTitle = '售后登记详情'
+    if (this.isFlag == 'add') {
+      this.selectedId = [];
+      this.selectList = [];
+      this.queryParams.orderId = router.orderId || ''
+      if (router.performDate) {
+        this.$set(this.queryParams, 'performDate', router.performDate)
+      } else {
+        this.$set(this.queryParams, 'performDate', moment().format("yyyy-MM-DD"))
+      }
+      this.$set(this.addForm, 'createTime', moment().format("yyyy-MM-DD hh:mm:ss"))
+      this.$set(this.addForm, 'createBy', this.name)
+      console.log(this.addForm,'this.addForm');
+      this.pagePerformTimeListFun(this.queryParams.performDate)
+    } else {
+      this.queryParams.orderId = router.orderId
+      this.$set(this.queryParams, 'performDate', router.performDate)
+      this.getRegistInfo(router.infoId)
+    }
+
+    this.getList();
+
+  },
+  activated() {
+    this.getList();
+  },
+  mounted() {
+    this.resizeObserver = new ResizeObserver(entries => {
+      for (let entry of entries) {
+        const { width, height } = entry.contentRect;
+        this.qHeight = height + 'px'
+      }
+    });
+    this.resizeObserver.observe(this.$refs.queryFormBox);
+  },
+  methods: {
+    handleSelectionChange(val) {
+      this.selectList = val;
+    },
+    // 保存登记
+    handleSubmit() {
+      this.$refs.addForm.validate(async (valid) => {
+        if (this.isFlag == 'add' && this.selectList.length != 0) {
+          this.selectedId = this.selectList.map(ele => ele.id)
+        }
+        if (this.isFlag != 'add') {
+          this.selectedId = [this.queryParams.orderId]
+        }
+        if (this.selectedId.length == 0) {
+          this.$message.info('请选择需要售后登记的订单!')
+          return
+        }
+        if (valid) {
+          try {
+            if (!this.addForm.id) {
+              let res1 = await orderAfterRegister({ ...this.addForm, orderIds: this.selectedId })
+              if (res1.code == 200) {
+                this.$modal.msgSuccess("新增成功");
+                this.selectedId = [];
+                this.selectList = [];
+                const obj = { path: "/service/register", query: { orderId: this.queryParams.orderId } };
+                this.$tab.closeOpenPage(obj);
+              } else {
+                throw new Error(res1)
+              }
+            } else {
+              let res2 = await orderAfterRegisterUpdate({ ...this.addForm, orderIds: this.selectedId })
+              if (res2.code == 200) {
+                this.$modal.msgSuccess("修改成功");
+                this.selectedId = [];
+                this.selectList = [];
+                const obj = { path: "/service/register", query: { orderId: this.queryParams.orderId } };
+                this.$tab.closeOpenPage(obj);
+              } else {
+                throw new Error(res2)
+              }
+            }
+          } catch (error) {
+            console.error("error=====", error)
+          }
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
+    // 关闭页面 返回列表页
+    handleCancel() {
+      this.selectedId = [];
+      const obj = { path: "/service/register", query: { orderId: this.queryParams.orderId } };
+      this.$tab.closeOpenPage(obj);
+    },
+    // 查询订单列表
+    getList() {
+      this.loading = true;
+      pageList(this.queryParams)
+        .then(response => {
+          this.dataList = response.data.rows;
+          this.total = response.data.total;
+          this.loading = false;
+        }).catch(() => {
+          this.dataList = [];
+          this.total = 0;
+          this.loading = false;
+        })
+    },
+    // 查询订单列表
+    getRegistInfo(id) {
+      getDetailById(id).then(response => {
+        this.addForm = response.data;
+      }).catch(() => {
+
+      })
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.dateRange = [];
+      this.$set(this.queryParams, 'orderId', '');
+      this.$set(this.queryParams, 'memberMobile', '');
+      this.$set(this.queryParams, 'performDate', '');
+      this.$set(this.queryParams, 'performTimeId', '');
+      this.queryParams.pageNum = 1;
+      this.handleQuery();
+    },
+    async pagePerformTimeListFun(value) {
+      try {
+        this.pagePerformTimeList = []
+        this.$set(this.queryParams, 'performTimeId', null)
+        if (!value) {
+          return
+        }
+        let { data, code } = await pagePerformTimeList({
+          performDate: value,
+          pageNum: 1,
+          pageSize: 999
+        })
+        this.pagePerformTimeList = [].concat(data.rows)
+      } catch (error) {
+
+      }
+    }
+
+  },
+  beforeDestroy() {
+    this.resizeObserver.unobserve(this.$refs.queryFormBox);
+    this.resizeObserver.disconnect();
+  },
+};
+</script>
+<style scoped lang="scss">
+.app-container {
+  height: calc(100vh - 110px);
+  box-sizing: border-box;
+}
+
+// .section-table thead .el-table-column--selection .cell {
+//   display: none;
+// }
+.p-text {
+  font-size: 20px;
+  font-weight: 600;
+  color: #333;
+}
+
+
+.app-container-table-box {
+  height: calc(100% - var(--q-height));
+
+  .btn-warp {
+    width: 120px;
+    height: 40px;
+    margin: 0 20px;
+  }
+
+  .app-container-table-info {
+    //height: calc(100% - 100px);
+    height: auto;
+  }
+
+  //::v-deep .section-table thead .el-table-column--selection .cell {
+  //  display: none;
+  //}
+
+  .custom-header ::v-deep(.el-checkbox) {
+    display: none !important;
+  }
+
+  /* 可选:如果你想让表头文字居中对齐 */
+  ::v-deep .custom-header {
+    text-align: center;
+    width: 100%;
+    /* 如果需要,可以设置字体大小、颜色等 */
+    font-weight: normal;
+    color: #606266;
+  }
+}
+
+
+.app-container-scheduling ::v-deep .el-select__tags {
+  flex-wrap: inherit !important;
+  overflow-x: auto !important;
+}
+
+.app-container-scheduling ::v-deep .el-form-item__content {
+  position: relative;
+}
+
+.app-container-scheduling ::v-deep .el-form-item__content .query_clear {
+  position: absolute;
+  top: -15px;
+  right: -10px;
+  display: none;
+  cursor: pointer;
+  z-index: 99;
+}
+
+.app-container-scheduling ::v-deep .el-form-item__content:hover .query_clear {
+  display: block;
+}
+</style>

+ 466 - 0
src/views/register/dialog/editBox.vue

@@ -0,0 +1,466 @@
+<template>
+  <el-dialog :title="title" :visible.sync="open" width="90%" append-to-body :close-on-click-modal="false"
+    @close="cancel">
+    <div class="app-container">
+      <div class="app-container-query">
+        <el-form :model="queryParams" v-if="isFlag == 'add'" ref="queryForm" size="small" :inline="true"
+          v-show="showSearch" label-width="68px">
+          <el-form-item label="订单号">
+            <el-input v-model="queryParams.orderId" placeholder="请输入订单号" clearable style="width: 200px;"
+              @keyup.enter.native="handleQuery" />
+          </el-form-item>
+          <el-form-item label="购票人手机号" label-width="100px">
+            <el-input v-model="queryParams.memberMobile" placeholder="请输入购票人手机号" clearable style="width: 200px;"
+              @keyup.enter.native="handleQuery" />
+          </el-form-item>
+          <el-form-item label="场次时间" label-width="70px">
+            <el-date-picker style="width: 200px;" v-model="queryParams.performDate" @change="pagePerformTimeListFun"
+              type="date" value-format="yyyy-MM-dd">
+            </el-date-picker>
+          </el-form-item>
+          <el-form-item label="场次">
+            <el-select v-model="queryParams.performTimeId" placeholder="场次" clearable style="width: 200px">
+              <el-option v-for="dict in pagePerformTimeList" :key="dict.id"
+                :label="dict.timeSnapshot + '(' + dict.performTimeStart + '-' + dict.performTimeEnd + ')'"
+                :value="dict.id" />
+            </el-select>
+          </el-form-item>
+          <el-form-item>
+            <el-button style="margin-left: 10px;" 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>
+      <div class="app-container-table-box">
+        <div class="app-container-table-info">
+          <el-table ref="multipleTable" max-height="380px" class="section-table"
+            @selection-change="handleSelectionChange" v-loading="loading" :data="dataList" border style="width: 100%">
+            <!-- selection 列:隐藏表头 checkbox,显示自定义文字 -->
+            <el-table-column type="selection" width="55"></el-table-column>
+            <!-- <el-table-column label="序号" align="center" type="index" width="60"></el-table-column> -->
+            <el-table-column label="日期" align="center" prop="performDate" />
+            <el-table-column label="姓名" align="center" prop="memberName1" width="150" />
+            <el-table-column label="手机号" align="center" prop="memberMobile" />
+            <el-table-column label="购票平台" align="center" prop="source">
+              <template slot-scope="scope">
+                <dict-tag :options="dict.type.order_form_type" :value="scope.row.source" />
+              </template>
+            </el-table-column>
+            <el-table-column label="订单编号" align="center" prop="id" width="180" />
+            <!-- <el-table-column label="剧目名称" align="center" prop="performName" />
+          <el-table-column label="票务名称" align="center" prop="goodsName" /> -->
+            <el-table-column label="票种类别" align="center" prop="seatTypeName" />
+            <el-table-column label="场次" width="180" align="center" prop="performDate">
+              <template slot-scope="scope">
+                <span>{{ scope.row.performDate }}&nbsp;&nbsp;({{ scope.row.performTimeStart + '-' +
+                  scope.row.performTimeEnd
+                }})</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="数量" align="center" prop="quantity" />
+            <el-table-column label="金额" align="center" prop="realPrice">
+              <template slot-scope="scope">
+                <span v-if="scope.row.status != 0">¥{{ scope.row.realPrice }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="订单状态" align="center" prop="status">
+              <template slot-scope="scope">
+                <dict-tag :options="dict.type.order_status_type" :value="scope.row.status" />
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+        <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize" @pagination="getList" />
+        <el-divider style="margin-bottom: 30px;"></el-divider>
+        <el-form :model="addForm" ref="addForm" :rules="addFormRules" size="small" label-width="90px"
+          style="margin: 0 30px">
+          <el-row>
+            <el-col :span="8">
+              <el-form-item label="客户名称" prop="coustomName">
+                <el-input v-model="addForm.coustomName" placeholder="请输入类型" :disabled="isFlag == 'detail'" clearable />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="客户电话" prop="coustomPhone">
+                <el-input v-model="addForm.coustomPhone" placeholder="请输入类型" :disabled="isFlag == 'detail'" clearable />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="投诉日期" prop="requstDate">
+                <el-date-picker v-model="addForm.requstDate" type="datetime" :disabled="isFlag == 'detail'"
+                  value-format="yyyy-MM-dd hh:mm:ss" style="width: 100%;">
+                </el-date-picker>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="内容" prop="content">
+                <el-input v-model="addForm.content" type="textarea" :rows="2" placeholder="请输入诉求"
+                  :disabled="isFlag == 'detail'" clearable />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="类型" prop="typeName">
+                <el-input v-model="addForm.typeName" placeholder="请输入类型" :disabled="isFlag == 'detail'" clearable />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="客诉平台" prop="coustomPlatform">
+                <el-input v-model="addForm.coustomPlatform" placeholder="请输入客诉平台" :disabled="isFlag == 'detail'"
+                  clearable />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="涉及部门" prop="deptName">
+                <el-input v-model="addForm.deptName" placeholder="请输入涉及部门" :disabled="isFlag == 'detail'" clearable />
+              </el-form-item>
+            </el-col>
+            <!-- <el-col :span="12">
+              <el-form-item label="客诉状态" prop="status">
+                <el-select v-model="addForm.status" placeholder="请选择" >
+                  <el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value">
+                  </el-option>
+                </el-select>
+              </el-form-item>
+            </el-col> -->
+            <el-col :span="24">
+              <el-form-item label="诉求" prop="requestContent">
+                <el-input v-model="addForm.requestContent" type="textarea" :rows="2" placeholder="请输入诉求"
+                  :disabled="isFlag == 'detail'" clearable />
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="处理结果" prop="handlerResult">
+                <el-input v-model="addForm.handlerResult" type="textarea" :rows="2" placeholder="请输入处理结果"
+                  :disabled="isFlag == 'detail'" clearable />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="记录人">
+                <el-input v-model="addForm.createBy" disabled placeholder="请输入记录人" clearable />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="记录时间">
+                <el-input v-model="addForm.createTime" disabled placeholder="请输入记录时间" clearable />
+              </el-form-item>
+            </el-col>
+            <!-- <el-col :span="24" style="display: flex;justify-content: center;">
+              <el-button class="btn-warp" @click="handleCancel">{{ isFlag == 'detail' ? '关闭' : '取消' }}</el-button>
+              <el-button v-if="isFlag != 'detail'" class="btn-warp" type="primary" @click="handleSubmit">确定</el-button>
+            </el-col> -->
+          </el-row>
+        </el-form>
+      </div>
+    </div>
+    <span slot="footer" class="dialog-footer">
+      <!-- <el-button @click="cancel()" :loading="loading">取消</el-button>
+      <el-button type="primary" @click="submitForm()" :loading="loading">
+        <span v-if="loading">提交中...</span>
+        <span v-else>确认增加</span>
+      </el-button> -->
+      <el-button class="btn-warp" @click="handleCancel">{{ isFlag == 'detail' ? '关闭' : '取消' }}</el-button>
+      <el-button v-if="isFlag != 'detail'" class="btn-warp" type="primary" @click="handleSubmit">确定</el-button>
+    </span>
+  </el-dialog>
+</template>
+
+<script>
+
+import { pageList } from '@/api/order/orderMr';
+import { pagePerformTimeList } from "@/api/schedulingMr/schedulingMr"
+import { recordAddApi, getRecordById, recordUpdatApi } from '@/api/order/service';
+import moment from "moment"
+import { mapGetters } from 'vuex'
+export default {
+  name: "editBox",
+  dicts: ['order_form_type', 'order_status_type'],
+  // components: { detailsDia },
+  data() {
+    return {
+      qHeight: '0px',
+      resizeObserver: null,
+      // 遮罩层
+      loading: true,
+      open: false,
+      title: "",
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 用户表格数据
+      dataList: [],
+      statusOptions: [{
+        label: '待处理',
+        value: 1
+      }, {
+        label: '处理中',
+        value: 2
+      }, {
+        label: '处理完成',
+        value: 3
+      }],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        orderId: "",
+      },
+      pagePerformTimeList: [], // 场次列表
+      addForm: {
+        typeName: "",
+        deptName: "",
+        coustomPlatform: "",
+        content: "",
+        requestContent: "",
+        handlerResult: "",
+        status: 1,
+        createTime: "",
+        createBy: "",
+      },
+      addFormRules: {
+        typeName: [
+          { required: true, message: '请输入类型', trigger: ['blur'] }
+        ],
+        deptName: [
+          { required: true, message: '请输入部门', trigger: ['blur'] }
+        ],
+        coustomPlatform: [
+          { required: true, message: '请输入客诉平台', trigger: ['blur'] }
+        ],
+        requestContent: [
+          { required: true, message: '请输入诉求', trigger: ['change', 'blur'] }
+        ],
+        content: [
+          { required: true, message: '请输入内容', trigger: ['change', 'blur'] }
+        ],
+        handlerResult: [
+          { required: true, message: '请输入处理结果', trigger: ['change', 'blur'] }
+        ]
+      },
+      selectList: [],  // 存储选中的行数据
+      selectedId: [], // 选中订单id
+      isFlag: "add"
+
+      // multiPerformDate: false,
+      // fixed: 'left',
+
+    };
+  },
+  computed: {
+    ...mapGetters([
+      'name',
+    ]),
+  },
+  created() { },
+  activated() {
+    this.getList();
+  },
+  mounted() {
+  },
+  methods: {
+    // 打开弹框
+    async openDialog(obj, type) {
+      try {
+        this.isFlag = type;
+        this.open = true;
+        type == 'add' ? this.title = '添加客诉' : type == 'edit' ? this.title = '修改客诉' : this.title = '客诉详情'
+        if (this.isFlag == 'add') {
+          // this.queryParams.orderId = router.orderId || ''
+          this.dataList = []
+          this.addForm = {
+            typeName: "",
+            deptName: "",
+            coustomPlatform: "",
+            content: "",
+            requestContent: "",
+            handlerResult: "",
+            status: 1,
+            createTime: "",
+            createBy: "",
+          }
+          this.$set(this.queryParams, 'performDate', moment().format("yyyy-MM-DD"))
+          this.$set(this.addForm, 'createTime', moment().format("yyyy-MM-DD hh:mm:ss"))
+          this.$set(this.addForm, 'createBy', this.name)
+          await this.pagePerformTimeListFun(this.queryParams.performDate)
+          await this.getList()
+        } else {
+          this.queryParams.orderId = obj.orderId
+          this.$set(this.queryParams, 'performDate', obj.performDate)
+          await this.getRecordInfo(obj.id)
+          await this.getList();
+        }
+      } catch (error) {
+        // console.error(error)
+        this.open = false;
+      }
+
+    },
+    handleSelectionChange(val) {
+      this.selectList = val;
+    },
+    // 保存 客诉
+    handleSubmit() {
+      this.$refs.addForm.validate(async (valid) => {
+        if (this.isFlag == 'add' && Array.isArray(this.selectList) && this.selectList.length > 0) {
+          this.selectedId = this.selectList.map(ele => ele.id)
+        }
+        if (this.isFlag != 'add') {
+          this.selectedId = [this.queryParams.orderId]
+        }
+        if (this.selectedId.length == 0) {
+          this.$message.info('请选择需要客诉的订单!')
+          return
+        }
+        if (valid) {
+          try {
+            if (!this.addForm.id) {
+              let res = await recordAddApi({ ...this.addForm, orderIds: this.selectedId })
+              if (res.code == 200) {
+                this.$modal.msgSuccess("新增成功");
+                // const obj = { path: "/service/register", query: { orderId: this.queryParams.orderId } };
+                // this.$tab.closeOpenPage(obj);
+                this.cancel();
+                this.$emit("getList");
+              } else {
+                throw new Error(res)
+              }
+            } else {
+              let res = await recordUpdatApi({ ...this.addForm, orderIds: this.selectedId })
+              if (res.code == 200) {
+                this.$modal.msgSuccess("修改成功");
+                this.cancel();
+                this.$emit("getList");
+              } else {
+                throw new Error(res)
+              }
+            }
+          } catch (error) {
+            console.error("error=====", error)
+          }
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+
+
+    },
+    // 关闭页面 返回列表页
+    handleCancel() {
+      // const obj = { path: "/service/record", query: { orderId: this.queryParams.orderId } };
+      // this.$tab.closeOpenPage(obj);
+      this.$emit("getList");
+      this.cancel();
+    },
+    // 查询订单列表
+    getList() {
+      this.loading = true;
+      pageList(this.queryParams)
+        .then(response => {
+          this.dataList = response.data.rows;
+          this.total = response.data.total;
+          this.loading = false;
+        }).catch(() => {
+          this.dataList = [];
+          this.total = 0;
+          this.loading = false;
+        })
+    },
+    // 查询 客诉详情
+    getRecordInfo(id) {
+      getRecordById(id).then(response => {
+        this.addForm = response.data;
+      }).catch(() => {
+
+      })
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    // 关闭弹框
+    cancel() {
+      this.open = false;
+      this.$set(this.queryParams, 'orderId', '');
+      this.$set(this.queryParams, 'memberMobile', '');
+      this.$set(this.queryParams, 'performDate', '');
+      this.$set(this.queryParams, 'performTimeId', '');
+      this.selectedId = []
+      this.selectList = []
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.$set(this.queryParams, 'orderId', '');
+      this.$set(this.queryParams, 'memberMobile', '');
+      this.$set(this.queryParams, 'performDate', '');
+      this.$set(this.queryParams, 'performTimeId', '');
+      this.queryParams.pageNum = 1;
+      this.handleQuery();
+    },
+    async pagePerformTimeListFun(value) {
+      try {
+        this.pagePerformTimeList = []
+        this.$set(this.queryParams, 'performTimeId', null)
+        if (!value) {
+          return
+        }
+        let { data, code } = await pagePerformTimeList({
+          performDate: value,
+          pageNum: 1,
+          pageSize: 999
+        })
+        this.pagePerformTimeList = [].concat(data.rows)
+      } catch (error) {
+
+      }
+    },
+
+  },
+  beforeDestroy() {
+  },
+};
+</script>
+<style scoped lang="scss">
+.app-container {
+  box-sizing: border-box;
+}
+
+// .section-table thead .el-table-column--selection .cell {
+//   display: none;
+// }
+
+
+.app-container-table-box {
+
+  // .btn-warp {
+  //   width: 120px;
+  //   height: 40px;
+  //   margin: 0 20px;
+  // }
+
+  .app-container-table-info {
+    //height: calc(100% - 100px);
+    height: auto;
+  }
+
+  //::v-deep .section-table thead .el-table-column--selection .cell {
+  //  display: none;
+  //}
+
+  .custom-header ::v-deep(.el-checkbox) {
+    display: none !important;
+  }
+
+  /* 可选:如果你想让表头文字居中对齐 */
+  ::v-deep .custom-header {
+    text-align: center;
+    width: 100%;
+    /* 如果需要,可以设置字体大小、颜色等 */
+    font-weight: normal;
+    color: #606266;
+  }
+}
+</style>

+ 241 - 0
src/views/register/index.vue

@@ -0,0 +1,241 @@
+<template>
+  <div class="app-container app-container-scheduling" :style="{ '--q-height': qHeight }">
+    <div class="app-container-query" ref="queryFormBox">
+      <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.memberName1" placeholder="请输入名称" clearable style="width: 240px;"
+            @keyup.enter.native="handleQuery" />
+        </el-form-item>
+        <el-form-item label="订单编号">
+          <el-input v-model="queryParams.orderId" placeholder="请输入订单编号" clearable style="width: 240px;"
+            @keyup.enter.native="handleQuery" />
+        </el-form-item>
+        <el-form-item label="客诉状态">
+          <el-select v-model="queryParams.status" placeholder="请选择客诉状态" @keyup.enter.native="handleQuery"
+            style="width: 240px;">
+            <el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button style="margin-left: 10px;" 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>
+
+    <div class="app-container-table-box">
+      <el-row :gutter="10" class="mb8">
+        <el-button type="primary" size="mini" v-hasPermi="['register:register:add']" @click="addRegister(null, 'add')">新增</el-button>
+        <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+      </el-row>
+      <div class="app-container-table-info">
+        <el-table ref="tables" height="100%" v-loading="loading" :data="dataList" border>
+          <el-table-column label="序号" align="center" fixed="left" type="index" width="60"></el-table-column>
+          <el-table-column label="日期" align="center" fixed="left" prop="performDate" width="100" />
+          <el-table-column label="姓名" align="center" fixed="left" prop="memberName1" width="150" />
+          <el-table-column label="电话" align="center" prop="memberMobile" width="100" />
+          <el-table-column label="平台" align="center" prop="channelType">
+            <template slot-scope="scope">
+              <dict-tag :options="dict.type.channel_type" :value="scope.row.channelType" />
+            </template>
+          </el-table-column>
+          <el-table-column label="订单编号" align="center" prop="orderId" width="170" />
+          <el-table-column label="票种类别" align="center" prop="seatTypeName" />
+          <el-table-column label="数量" align="center" prop="quantity" />
+          <el-table-column label="金额" align="center" prop="realPrice">
+            <template slot-scope="scope">
+              <span v-if="scope.row.status != 0">¥{{ scope.row.realPrice }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="场次" width="120" align="center" prop="performDate">
+            <template slot-scope="scope">
+              <span>{{ scope.row.performDate }} <br /> ({{ scope.row.performTimeStart + '-' + scope.row.performTimeEnd
+              }})</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="客诉状态" align="center" prop="status">
+            <template slot-scope="scope">
+              <span v-if="scope.row.status == 1">待处理</span>
+              <span v-if="scope.row.status == 2">处理中</span>
+              <span v-if="scope.row.status == 3">处理完成</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="客诉类别" align="center" prop="typeName" width="100" />
+          <el-table-column label="订单状态" align="center" prop="orderStatus">
+            <template slot-scope="scope">
+              <dict-tag :options="dict.type.order_status_type" :value="scope.row.orderStatus" />
+            </template>
+          </el-table-column>
+          <!-- <el-table-column label="剧目名称" align="center" prop="performName" />
+          <el-table-column label="票务名称" align="center" prop="goodsName" /> -->
+          <el-table-column label="客诉详情" align="center" prop="requestContent" show-overflow-tooltip width="170" />
+          <el-table-column label="处理结果" align="center" prop="handlerResult" show-overflow-tooltip width="170" />
+          <el-table-column label="经办人" align="center" prop="updateBy" width="100" />
+          <el-table-column label="投诉渠道" align="center" prop="coustomPlatform" />
+          <el-table-column label="操作" align="center" fixed="right" width="140" class-name="small-padding fixed-width">
+            <template slot-scope="scope">
+              <el-button size="mini" type="text" v-hasPermi="['register:register:detail']"
+                @click="addRegister(scope.row, 'detail')">详情</el-button>
+              <el-button size="mini" type="text" v-hasPermi="['register:register:edit']"
+                @click="addRegister(scope.row, 'edit')">编辑</el-button>
+              <el-button size="mini" type="text" v-hasPermi="['register:register:delete']"
+                @click="deleteRegister(scope.row)">删除</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+
+      <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
+        @pagination="getList" />
+    </div>
+
+  </div>
+</template>
+
+<script>
+
+import { pageList, delRegisterById } from '@/api/order/service';
+// import detailsDia from "./dialog/details";
+import moment from "moment"
+export default {
+  name: "Register",
+  dicts: ['order_status_type', 'channel_type'],
+  data() {
+    return {
+      qHeight: '0px',
+      resizeObserver: null,
+      // 遮罩层
+      loading: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 用户表格数据
+      dataList: null,
+      statusOptions: [{
+        label: '待处理',
+        value: 1
+      }, {
+        label: '处理中',
+        value: 2
+      }, {
+        label: '处理完成',
+        value: 3
+      }],
+
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        memberName1: '',
+        orderId: '',
+        status: 1,
+      },
+      fixed: 'left',
+
+    };
+  },
+  created() {
+    let router = this.$router.currentRoute.query
+    if (router.orderId) {
+      this.$set(this.queryParams, 'orderId', router.orderId)
+    }
+    this.getList();
+  },
+  activated() {
+    this.getList();
+  },
+  mounted() {
+    this.resizeObserver = new ResizeObserver(entries => {
+      for (let entry of entries) {
+        const { width, height } = entry.contentRect;
+        this.qHeight = height + 'px'
+      }
+      if (document.body.clientWidth < 765) {
+        this.fixed = false
+      } else {
+        this.fixed = 'left'
+      }
+    });
+    this.resizeObserver.observe(this.$refs.queryFormBox);
+  },
+  methods: {
+    /** 查询列表 */
+    getList() {
+      this.loading = true;
+      pageList(this.queryParams)
+        .then(response => {
+          this.dataList = response.data.rows;
+          this.total = response.data.total;
+          this.loading = false;
+        }).catch(() => {
+          this.dataList = [];
+          this.total = 0;
+          this.loading = false;
+        })
+    },
+    // 添加、编辑、详情 售后登记
+    addRegister(row, type) {
+      this.$router.push({
+        path: "/service/addPage",
+        query: {
+          orderId: type != 'add' ? row.orderId : '',
+          infoId: type != 'add' ? row.id : '',
+          performDate: type == 'add' ? '' : row.performDate,
+          type: type
+        }
+      })
+    },
+    // 删除 售后登记
+    deleteRegister(row) {
+      this.$modal.confirm('是否确认删除该条售后登记的数据?').then(function () {
+        return delRegisterById(row.id);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => { });
+
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.$set(this.queryParams, 'memberName1', '');
+      this.$set(this.queryParams, 'orderId', '');
+      this.$set(this.queryParams, 'status', '');
+      this.queryParams.pageNum = 1;
+      this.handleQuery();
+    },
+
+  },
+  beforeDestroy() {
+    this.resizeObserver.unobserve(this.$refs.queryFormBox);
+    this.resizeObserver.disconnect();
+  },
+};
+</script>
+<style scoped lang="scss">
+.app-container {
+  height: calc(100vh - 110px);
+  box-sizing: border-box;
+}
+
+.app-container-table-box {
+  height: calc(100% - var(--q-height));
+
+  .app-container-table-info {
+    height: calc(100% - 100px);
+  }
+}
+
+
+.app-container-scheduling ::v-deep .el-select__tags {
+  flex-wrap: inherit !important;
+  overflow-x: auto !important;
+}
+</style>

+ 502 - 0
src/views/register/notice.vue

@@ -0,0 +1,502 @@
+<template>
+  <div class="app-container app-container-scheduling" :style="{ '--q-height': qHeight }">
+    <div class="app-container-query" ref="queryFormBox">
+      <el-form :model="queryParams" ref="queryForm" :rules="rules" size="small" :inline="true" v-show="showSearch"
+        label-width="100px">
+        <el-form-item label="演出厅" prop="auditoriumId">
+          <el-select v-model="queryParams.auditoriumId" placeholder="演出厅" clearable style="width: 100%"
+            @change="changeTime($event, 'auditoriumId')">
+            <el-option v-for="dict in merchantTheatreAuditoriumListS" :key="dict.id" :label="dict.name"
+              :value="dict.id" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="场次时间" prop="performDate">
+          <el-date-picker type="date" placeholder="选择场次时间" v-model="queryParams.performDate"
+            @change="changeTime($event, 'performDate')" value-format="yyyy-MM-dd"></el-date-picker>
+        </el-form-item>
+        <el-form-item label="场次" prop="performTimeId">
+          <el-select v-model="queryParams.performTimeId" placeholder="场次" clearable style="width: 100%"
+            @change="changeTime($event, 'performTimeId')">
+            <el-option v-for="dict in merchantPerformTimeListS" :key="dict.id"
+              :label="dict.timeSnapshot + '(' + dict.performTimeStart + '-' + dict.performTimeEnd + ')'"
+              :value="dict.id" />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button style="margin-left: 10px;" 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>
+
+    <div class="app-container-table-box">
+      <div class="movie-countdown">
+        <!-- 显示下一个场次倒计时 -->
+        <div v-if="nextSession" class="countdown">
+          <!-- <p>时间:{{ formatTime(nextSession.time) }}</p> -->
+          <p class="timer">
+            距离本场
+            {{ pTime }}
+            开始剩余:
+            <span v-if="days > 0">{{ days }}</span>
+            <span class="dot" v-if="days > 0">:</span>
+            <span v-if="hours > 0">{{ hours }}</span>
+            <span class="dot" v-if="hours > 0">:</span>
+            <span>{{ minutes }}</span>
+            <span class="dot">:</span>
+            <span>{{ seconds }}</span>
+          </p>
+        </div>
+
+      </div>
+
+      <div class="app-container-table-info">
+        <el-table ref="multipleTable" max-height="380px" class="section-table" v-loading="loading" :data="dataList"
+          :row-style="tableRowStyle" border style="width: 100%">
+          <el-table-column label="序号" align="center" type="index" width="60"></el-table-column>
+          <el-table-column label="订单号" align="center" prop="orderId" width="170" />
+          <el-table-column label="观影人姓名" align="center" prop="name" width="120" />
+          <el-table-column label="购票人手机号" align="center" prop="memberMobile" />
+          <el-table-column label="座位类型" align="center" prop="seatTypeName" />
+          <el-table-column label="购票渠道" align="center" prop="source">
+            <template slot-scope="scope">
+              <dict-tag :options="dict.type.order_form_type" :value="scope.row.source" />
+            </template>
+          </el-table-column>
+
+          <!-- <el-table-column label="剧目名称" align="center" prop="performName" />
+          <el-table-column label="票务名称" align="center" prop="goodsName" /> -->
+          <el-table-column label="日期" align="center" prop="performDate" />
+          <el-table-column label="场次" width="180" align="center" prop="timeSnapshot">
+            <template slot-scope="scope">
+              <span>{{ scope.row.timeSnapshot }}<br />({{ scope.row.performTimeStart + '-' +
+                scope.row.performTimeEnd
+              }})</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="订单状态" align="center" prop="orderStatus">
+            <template slot-scope="scope">
+              <dict-tag :options="dict.type.order_status_type" :value="scope.row.orderStatus" />
+            </template>
+          </el-table-column>
+          <el-table-column label="打印次数" align="center" prop="ticketPrintTotal" />
+          <!-- <el-table-column label="金额" align="center" prop="realPrice">
+            <template slot-scope="scope">
+              <span v-if="scope.row.status != 0">¥{{ scope.row.realPrice }}</span>
+            </template>
+          </el-table-column> -->
+
+
+        </el-table>
+      </div>
+      <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
+        @pagination="getList" />
+
+    </div>
+
+  </div>
+</template>
+
+<script>
+
+import { pageExpiryList, pagePerformTimeList } from '@/api/order/service';
+// import { pagePerformTimeList } from "@/api/schedulingMr/schedulingMr"
+import { getDetailById } from '@/api/order/service';
+import {
+  merchantTheatreAuditoriumList,
+} from '@/api/windowTicketSales/ticketingSales'
+import moment from "moment"
+export default {
+  name: "Notice",
+  dicts: ['order_form_type', 'order_status_type'],
+  // components: { detailsDia },
+  data() {
+    return {
+      qHeight: '0px',
+      resizeObserver: null,
+      // 遮罩层
+      loading: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 用户表格数据
+      dataList: [],
+      // 日期范围
+      dateRange: [],
+      statusOptions: [{
+        label: '待处理',
+        value: 1
+      }, {
+        label: '处理中',
+        value: 2
+      }, {
+        label: '处理完成',
+        value: 3
+      }],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        performTimeId: '',
+        performDate: null,
+        auditoriumId: null,
+        // goodsId: null,
+      },
+      rules: {
+        auditoriumId: [
+          { required: true, message: '请选择演出厅', trigger: ['blur', 'change'] }
+        ],
+        performDate: [
+          { required: true, message: '请选择时间', trigger: ['blur', 'change'] }
+        ],
+        // performTimeId: [
+        //   { required: true, message: '请选择场次', trigger: ['blur', 'change'] }
+        // ]
+      },
+      // pagePerformTimeList: [], // 场次列表
+      merchantTheatreAuditoriumListS: [], // 演出厅
+      merchantPerformTimeListS: [], // 场次
+      pTime: '',
+      days: 0,
+      hours: 0,
+      minutes: 0,
+      seconds: 0,
+      nextSession: null, // 下一场信息
+      timer: null
+
+      // multiPerformDate: false,
+      // fixed: 'left',
+
+    };
+  },
+  created() {
+    this.merchantTheatreAuditoriumListFun()
+    this.$set(this.queryParams, 'performDate', moment().format("yyyy-MM-DD"))
+    // this.pagePerformTimeListFun(this.queryParams.performDate)
+  },
+  activated() {
+    this.getList();
+  },
+  mounted() {
+    this.resizeObserver = new ResizeObserver(entries => {
+      for (let entry of entries) {
+        const { width, height } = entry.contentRect;
+        this.qHeight = height + 'px'
+      }
+    });
+    this.resizeObserver.observe(this.$refs.queryFormBox);
+    // this.getList();
+    this.initCountdown()
+  },
+  methods: {
+    tableRowStyle({ row, rowIndex }) {
+      // 例如:根据状态设置背景色
+      if (row.isHighlight === 1) {
+        return { backgroundColor: '#ffcf8b' }
+      }
+      return {} // 默认样式
+    },
+    // 初始化:找出下一个未开始的场次
+    initCountdown() {
+      const now = new Date().getTime()
+      // 找出第一个时间大于当前时间的场次
+      //this.nextSession = this.sessions
+      //  .map(s => ({ ...s, timestamp: new Date(s.time).getTime() }))
+      //  .find(s => s.timestamp > now) || null
+      if (this.queryParams.performTimeId) {
+        let timeInfo = this.merchantPerformTimeListS.find(ele => ele.id === this.queryParams.performTimeId);
+        console.log(timeInfo, 'timeInfo');
+        if (timeInfo) {
+          let startTimer = new Date(timeInfo.performStartTime).getTime();
+          if (startTimer > now) {
+            timeInfo.timestamp = startTimer
+            this.nextSession = timeInfo
+            this.pTime = '(' + timeInfo.performTimeStart + '-' + timeInfo.performTimeEnd + ')'
+          } else {
+            this.nextSession = null
+          }
+        }
+      } else {
+        this.nextSession = null
+      }
+
+      // 如果有下一场,开始倒计时
+      if (this.nextSession) {
+        this.startTimer()
+      }
+    },
+    // 开始倒计时
+    startTimer() {
+      // 立即更新一次
+      this.updateCountdown()
+
+      // 每秒更新
+      this.timer = setInterval(() => {
+        this.updateCountdown()
+      }, 1000)
+    },
+
+    // 更新倒计时
+    updateCountdown() {
+      const now = new Date().getTime()
+      const distance = this.nextSession.timestamp - now
+
+      if (distance <= 0) {
+        // 当前场次已开始,清除定时器,重新初始化找下一场
+        clearInterval(this.timer)
+        this.timer = null
+        this.initCountdown() // 重新查找下一个未开始的场次
+        return
+      }
+
+      // 更新显示时间
+      this.days = Math.floor(distance / (1000 * 60 * 60 * 24))
+      this.hours = String(Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60))).padStart(2, '0')
+      this.minutes = String(Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60))).padStart(2, '0')
+      this.seconds = String(Math.floor((distance % (1000 * 60)) / 1000)).padStart(2, '0')
+    },
+
+    // 格式化时间显示(如 2025-08-25 16:00)
+    formatTime(dateTimeStr) {
+      const date = new Date(dateTimeStr)
+      return date.toLocaleString('zh-CN', {
+        year: 'numeric',
+        month: '2-digit',
+        day: '2-digit',
+        hour: '2-digit',
+        minute: '2-digit'
+      })
+    },
+    // 查询订单列表
+    getList() {
+      this.loading = true;
+      pageExpiryList(this.queryParams).then(response => {
+        this.dataList = response.data.rows;
+        this.total = response.data.total;
+        this.loading = false;
+      }).catch(() => {
+        this.dataList = [];
+        this.total = 0;
+        this.loading = false;
+      })
+    },
+    // 查询订单列表
+    getRegistInfo(id) {
+      getDetailById(id).then(response => {
+        this.addForm = response.data;
+      }).catch(() => {
+
+      })
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.dateRange = [];
+      this.$set(this.queryParams, 'orderId', '');
+      this.$set(this.queryParams, 'memberMobile', '');
+      this.$set(this.queryParams, 'performDate', '');
+      this.$set(this.queryParams, 'performTimeId', '');
+      this.queryParams.pageNum = 1;
+      this.handleQuery();
+    },
+    /**  获取演出厅  */
+    async merchantTheatreAuditoriumListFun() {
+      try {
+        let res = await merchantTheatreAuditoriumList({
+          pageNum: 1,
+          pageSize: 999
+        })
+        if (res.code == 200) {
+          this.merchantTheatreAuditoriumListS = res.data.rows
+          if (this.merchantTheatreAuditoriumListS.length > 0) {
+            this.$set(this.queryParams, 'auditoriumId', this.merchantTheatreAuditoriumListS[0].id)
+            this.changeTime(this.queryParams.auditoriumId, 'auditoriumId')
+          }
+        }
+      } catch (error) {
+
+      }
+    },
+    /**  选择场次时间  */
+    changeTime(value, type) {
+      if (type == 'performTimeId') {
+        this.initCountdown()
+        // this.$set(this.queryParams, 'goodsId', '')
+        // this.stockType = null
+        // if (value) {
+        //   let flog = false
+        //   let list2 = []
+        //   this.merchantPerformTimeListS.forEach((item, index) => {
+        //     if (item.id == value) {
+        //       flog = true
+        //       list2 = item.goodsList
+        //       // this.stockType = item.stockType
+        //     }
+        //   })
+        // } else {
+        // }
+      }
+      this.changeTimeCheck(value, type)
+
+    },
+    /**  选择场次时间  */
+    async changeTimeCheck(value, type) {
+      if (this.queryParams && this.queryParams.performTimeId && type != 'performTimeId') {
+        this.$set(this.queryParams, 'performTimeId', '')
+        this.merchantPerformTimeListS = []
+      }
+      if (this.queryParams.auditoriumId && this.queryParams.performDate && type != 'performTimeId') {
+        //  获取场次
+        this.pagePerformTimeListFun(this.queryParams.performDate)
+        this.getList();
+      }
+    },
+    async pagePerformTimeListFun(value) {
+      try {
+        this.merchantPerformTimeListS = []
+        this.$set(this.queryParams, 'performTimeId', null)
+        if (!value) {
+          return
+        }
+        let { data, code } = await pagePerformTimeList({
+          performDate: value,
+          auditoriumId: this.queryParams.auditoriumId,
+          pageNum: 1,
+          pageSize: 999
+        })
+        // this.pagePerformTimeList = [].concat(data.rows)
+        this.merchantPerformTimeListS = [].concat(data.rows)
+        if (this.merchantPerformTimeListS.length > 0) {
+          this.queryParams.performTimeId = this.merchantPerformTimeListS[0].id;
+          this.initCountdown()
+        }
+      } catch (error) {
+
+      }
+    },
+    clearQuery(key) {
+      this.$set(this.queryParams, key, '')
+      if (key == 'performDate') {
+        this.$set(this.queryParams, 'performTimeId', '')
+      }
+    },
+
+  },
+  beforeDestroy() {
+    this.resizeObserver.unobserve(this.$refs.queryFormBox);
+    this.resizeObserver.disconnect();
+    if (this.timer) {
+      clearInterval(this.timer)
+    }
+  },
+};
+</script>
+<style scoped lang="scss">
+.app-container {
+  height: calc(100vh - 110px);
+  box-sizing: border-box;
+}
+
+// .section-table thead .el-table-column--selection .cell {
+//   display: none;
+// }
+
+
+.app-container-table-box {
+  height: calc(100% - var(--q-height));
+
+  .movie-countdown {
+    font-family: 'Microsoft YaHei', sans-serif;
+    // padding: 20px;
+    // max-width: 400px;
+    // margin: 20px auto;
+    // border: 1px solid #ddd;
+    // border-radius: 8px;
+    text-align: right;
+  }
+
+  .countdown {
+    color: #333;
+  }
+
+  .countdown .timer {
+    font-size: 16px;
+    margin: 0 0 15px 0;
+    // color: #e67e22;
+    color: #333;
+
+  }
+
+  .timer span {
+    display: inline-block;
+    min-width: 24px;
+    // margin: 0 3px;
+    text-align: center;
+    font-weight: bold;
+    color: #e67e22;
+  }
+
+  .timer .dot {
+    min-width: 6px;
+    margin: 0 3px;
+    color: #f35034;
+  }
+
+  .btn-warp {
+    width: 120px;
+    height: 40px;
+    margin: 0 20px;
+  }
+
+  .app-container-table-info {
+    //height: calc(100% - 100px);
+    height: auto;
+  }
+
+  ::v-deep .section-table thead .el-table-column--selection .cell {
+    display: none;
+  }
+
+  //.custom-header ::v-deep(.el-checkbox) {
+  //  display: none !important;
+  //}
+
+  /* 可选:如果你想让表头文字居中对齐 */
+  // .custom-header {
+  //   text-align: center;
+  //   width: 100%;
+  //   /* 如果需要,可以设置字体大小、颜色等 */
+  //   font-weight: normal;
+  //   color: #606266;
+  // }
+}
+
+
+.app-container-scheduling ::v-deep .el-select__tags {
+  flex-wrap: inherit !important;
+  overflow-x: auto !important;
+}
+
+.app-container-scheduling ::v-deep .el-form-item__content {
+  position: relative;
+}
+
+.app-container-scheduling ::v-deep .el-form-item__content .query_clear {
+  position: absolute;
+  top: -15px;
+  right: -10px;
+  display: none;
+  cursor: pointer;
+  z-index: 99;
+}
+
+.app-container-scheduling ::v-deep .el-form-item__content:hover .query_clear {
+  display: block;
+}
+</style>

+ 186 - 0
src/views/register/record.vue

@@ -0,0 +1,186 @@
+<template>
+  <div class="app-container app-container-scheduling" :style="{ '--q-height': qHeight }">
+    <div class="app-container-query" ref="queryFormBox">
+      <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.coustomPlatform" placeholder="请输入平台" clearable style="width: 240px;"
+            @keyup.enter.native="handleQuery" />
+        </el-form-item>
+        <el-form-item label="类型">
+          <el-input v-model="queryParams.typeName" placeholder="请输入类型" clearable style="width: 240px;"
+            @keyup.enter.native="handleQuery" />
+        </el-form-item>
+        <el-form-item label="诉求">
+          <el-input v-model="queryParams.requestContent" placeholder="请输入诉求" clearable style="width: 240px;"
+            @keyup.enter.native="handleQuery" />
+        </el-form-item>
+        <el-form-item>
+          <el-button style="margin-left: 10px;" 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>
+
+    <div class="app-container-table-box">
+      <el-row :gutter="10" class="mb8">
+        <el-button type="primary" size="mini" v-hasPermi="['record:record:add']" @click="openDetails(null, 'add')">新增</el-button>
+        <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+      </el-row>
+      <div class="app-container-table-info">
+        <el-table ref="tables" height="100%" 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="typeName" width="100" />
+          <el-table-column label="客户名称" align="center" prop="coustomName" width="100" />
+          <el-table-column label="电话" align="center" prop="coustomPhone" width="110" />
+          <el-table-column label="内容" align="center" prop="content" />
+          <el-table-column label="诉求" align="center" prop="requestContent" />
+          <el-table-column label="处理结果" align="center" prop="handlerResult" />
+          <el-table-column label="客诉平台" align="center" prop="coustomPlatform" width="80" />
+          <el-table-column label="涉及部门" align="center" prop="deptName" width="80" />
+          <el-table-column label="操作" align="center" width="120" class-name="small-padding fixed-width">
+            <template slot-scope="scope">
+              <el-button size="mini" type="text" v-hasPermi="['record:record:detail']" @click="openDetails(scope.row,'detail')">详情</el-button>
+              <el-button size="mini" type="text" v-hasPermi="['record:record:edit']" @click="openDetails(scope.row,'edit')">编辑</el-button>
+              <el-button size="mini" type="text" v-hasPermi="['record:record:delete']" @click="deleteRecord(scope.row)">删除</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+
+      <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
+        @pagination="getList" />
+    </div>
+
+    <!-- 详情 -->
+    <edit-box ref="editBox" @getList="getList"></edit-box>
+
+  </div>
+</template>
+
+<script>
+
+import { customRecordApi, delRecordById } from '@/api/order/service';
+import moment from "moment"
+import editBox from "./dialog/editBox.vue";
+export default {
+  name: "Record",
+  dicts: ['order_status_type', 'channel_type'],
+  components: { 
+    editBox,
+  },
+  data() {
+    return {
+      qHeight: '0px',
+      resizeObserver: null,
+      // 遮罩层
+      loading: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 用户表格数据
+      dataList: [],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        coustomPlatform: '',
+        requestContent: '',
+        typeName: '',
+      },
+      fixed: 'left',
+      isVisible: true,
+      subTitle: '',
+
+    };
+  },
+  created() {
+    this.getList();
+  },
+  activated() {
+    this.getList();
+  },
+  mounted() {
+    this.resizeObserver = new ResizeObserver(entries => {
+      for (let entry of entries) {
+        const { width, height } = entry.contentRect;
+        this.qHeight = height + 'px'
+      }
+      if (document.body.clientWidth < 765) {
+        this.fixed = false
+      } else {
+        this.fixed = 'left'
+      }
+    });
+    this.resizeObserver.observe(this.$refs.queryFormBox);
+  },
+  methods: {
+    /** 查询列表 */
+    getList() {
+      this.loading = true;
+      customRecordApi(this.queryParams)
+        .then(response => {
+          this.dataList = response.data.rows;
+          this.total = response.data.total;
+          this.loading = false;
+        }).catch(() => {
+          this.dataList = [];
+          this.total = 0;
+          this.loading = false;
+        })
+    },
+    // 添加、新增、详情 操作
+    openDetails(row, type) {
+      this.$refs["editBox"].openDialog(row, type);
+    },
+    // 删除 客诉记录
+    deleteRecord(row) {
+      this.$modal.confirm('是否确认删除该条客诉记录的数据?').then(function () {
+        return delRecordById(row.id);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => { });
+
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.$set(this.queryParams, 'coustomPlatform', '');
+      this.$set(this.queryParams, 'requestContent', '');
+      this.$set(this.queryParams, 'typeName', '');
+      this.queryParams.pageNum = 1;
+      this.handleQuery();
+    },
+
+  },
+  beforeDestroy() {
+    this.resizeObserver.unobserve(this.$refs.queryFormBox);
+    this.resizeObserver.disconnect();
+  },
+};
+</script>
+<style scoped lang="scss">
+.app-container {
+  height: calc(100vh - 110px);
+  box-sizing: border-box;
+}
+
+.app-container-table-box {
+  height: calc(100% - var(--q-height));
+
+  .app-container-table-info {
+    height: calc(100% - 100px);
+  }
+}
+
+.app-container-scheduling ::v-deep .el-select__tags {
+  flex-wrap: inherit !important;
+  overflow-x: auto !important;
+}
+</style>

+ 1 - 1
src/views/windowTicketSales/model/ticketInfo.vue

@@ -1046,7 +1046,7 @@ export default {
     },
     // 跳转 到 售票页面
     goTicketingPage() {
-      const obj = { path: "/window/ticket" };
+      const obj = { path: "/service/orderMr" };
       this.$tab.closeOpenPage(obj);
     },
 

+ 1 - 2
src/views/windowTicketSales/ticketSales.vue

@@ -257,7 +257,6 @@ import { pageList as getSeatType } from '@/api/seatTypeMr/seatTypeMr'
 import selectListMixin from "./mixins/selectList"
 import LockSeat from './model/lockSeat.vue'
 import changePerform from './model/changePerform.vue'
-import { tr } from 'voca'
 import { mapGetters } from 'vuex'
 export default {
     name: "TicketSales",
@@ -387,7 +386,7 @@ export default {
         },
         // 返回上一页
         goBack() {
-            const obj = { path: "/window/ticket" };
+            const obj = { path: "/service/orderMr" };
             this.$tab.closeOpenPage(obj);
         },
         /**  票务信息  */

+ 1 - 0
vue.config.js

@@ -42,6 +42,7 @@ module.exports = {
       // detail: https://cli.vuejs.org/config/#devserver-proxy
       [process.env.VUE_APP_BASE_API]: {
         target: `http://greatadmin.dev.dazesoft.cn/scenicstage-api`,
+        // target: `http://172.16.90.199:5116/scenicstage-api`,
         changeOrigin: true,
         pathRewrite: {
           ['^' + process.env.VUE_APP_BASE_API]: ''

Some files were not shown because too many files changed in this diff