dct 5 ay önce
ebeveyn
işleme
d163ff99cd

+ 33 - 0
src/api/invoice.js

@@ -0,0 +1,33 @@
+import http from '@/utils/request'
+
+export const getInvoiceList = (params) => {
+  return http.post('/tenant/invoiceRecord', { data: params })
+}
+
+export const getInvoiceTickets = (params) => {
+  return http.post('/tenant/invoice/query', { data: params })
+}
+
+export const doInvoice = (params) => {
+  return http.post('/tenant/invoice/doInvoice', { data: params })
+}
+
+export const updateInvoiceInfo = (params) => {
+  return http.post('/tenant/invoiceRecord/update', { data: params })
+}
+
+export const getInvoiceSellerList = (params) => {
+  return http.post('/tenant/invoiceSeller', { data: params })
+}
+
+export const updateInvoiceSeller = (params) => {
+  return http.post('/tenant/invoiceSeller/update', { data: params })
+}
+
+export const getInvoiceChannelList = (params) => {
+  return http.post('/tenant/invoiceChannel', { data: params })
+}
+
+export const updateInvoiceChannel = (params) => {
+  return http.post('/tenant/invoiceChannel/update', { data: params })
+}

+ 6 - 2
src/api/order.js

@@ -1,7 +1,7 @@
 import http from '@/utils/request'
 // 获取订单列表
 export function getOrderList (params) {
-  return http.post('/tenant/order/getOrderList', { data: params })
+  return http.post('/tenant/order/list', { data: params })
 }
 // 取消订单
 export function cancelOrder (params) {
@@ -38,5 +38,9 @@ export function getOrderStatistics (params) {
 
 // 获取销售来源列表
 export function getOtaSourceList (params) {
-  return http.post('/admin/order/otaSourceNameList', { data: params })
+  return http.post('/tenant/otaSource/getOtaPublicSourceList', { data: params })
+}
+
+export function getOrderCancelStatistics (params) {
+  return http.post('/tenant/statistics/orderCancelStatistics', { data: params })
 }

+ 102 - 0
src/const.js

@@ -29,3 +29,105 @@ export const ticketStatus = {
   'CANCEL_RECV': {label: '待退票', color: 'warning'}, // 待退票
   'SCENIC_CANCEL_ACK': {label: '线下退票成功', color: 'primary'} // 线下退票成功
 }
+
+export const orderStatusDic = [
+  {
+    value: 'WAIT_PAY',
+    label: '待支付'
+  },
+  {
+    value: 'WAIT_USE',
+    label: '待使用'
+  },
+  {
+    value: 'PART_USE',
+    label: '部分使用'
+  },
+  {
+    value: 'COMPLETE',
+    label: '已完成'
+  },
+  {
+    value: 'CANCELED',
+    label: '已取消'
+  },
+  {
+    value: 'PART_CANCEL',
+    label: '部分取消'
+  },
+  {
+    value: 'CLOSED',
+    label: '已关闭'
+  }
+]
+
+export const orderCategories = [
+  {
+    id: 'ticket',
+    name: '景区门票'
+  },
+  {
+    id: 'batch',
+    name: '场次售票'
+  },
+  {
+    id: 'member',
+    name: '年卡次卡'
+  }
+]
+
+export const ticketStatusDic = [
+  {
+    value: 'WAIT_USE',
+    label: '待使用'
+  },
+  {
+    value: 'USED',
+    label: '已核销'
+  },
+  {
+    value: 'REFUNDING',
+    label: '退款中'
+  },
+  // {
+  //   value: 'OUTOFDATE',
+  //   label: '已过期'
+  // },
+  {
+    value: 'CANCELED',
+    label: '已取消'
+  },
+  {
+    value: 'CLOSED',
+    label: '已关闭'
+  }
+]
+
+export const papersType = {
+  'ID_CARD': '身份证',
+  'ERTONG': '儿童无证件',
+  'SHIBING': '士兵证',
+  'JUNGUAN': '军官证',
+  'HUZHAO': '护照',
+  'GANGAO': '港澳通行证',
+  'TAIBAO': '台湾通行证',
+  'TAIBAOZHENG': '台胞证',
+  'HUKOUBO': '户口薄',
+  'HUIXIANG': '回乡证',
+  'CHUSHENGZHENGMING': '出生证明',
+  'YONGJIUJULIU': '外国人永久居留身份证',
+  'OTHER': '其他'
+}
+
+export const IDENTIFY_TYPES = {
+  0: '身份证',
+  1: '护照',
+  2: '军官证',
+  3: '台胞证',
+  4: '港澳通行证',
+  5: '大陆居民往来台湾通行证',
+  6: '港澳居民来往内地通行证',
+  7: '外国人永久居留身份证',
+  8: '港澳台居民居住证',
+  9: '其他'
+}

+ 30 - 6
src/router/index.js

@@ -112,6 +112,24 @@ let routerMap = [
         name: 'priceList',
         component: () => import('@/views/goodsCenter/priceList'),
         meta: { title: '价格码管理', permissionName: 'product:pricecode' }
+      },
+      {
+        path: 'invoiceList',
+        name: 'invoiceList',
+        component: () => import('@/views/goodsCenter/invoiceList'),
+        meta: { title: '开票管理', permissionName: 'product:invoice' }
+      },
+      {
+        path: 'invoiceChannelList',
+        name: 'invoiceChannelList',
+        component: () => import('@/views/goodsCenter/invoiceChannelList'),
+        meta: { title: '发票渠道管理', permissionName: 'product:invoiceChannelList' }
+      },
+      {
+        path: 'invoiceSellerList',
+        name: 'invoiceSellerList',
+        component: () => import('@/views/goodsCenter/invoiceSellerList'),
+        meta: { title: '发票销售方管理', permissionName: 'product:invoiceSellerList' }
       }
     ]
   },
@@ -123,12 +141,12 @@ let routerMap = [
     redirect: 'noredirect',
     alwaysShow: true,
     children: [
-      {
-        path: 'refundAudit',
-        name: 'refundAudit',
-        component: () => import('@/views/queryReport/refundAudit'),
-        meta: { title: '退票审核', permissionName: 'stats:cancel_audit' }
-      },
+      // {
+      //   path: 'refundAudit',
+      //   name: 'refundAudit',
+      //   component: () => import('@/views/queryReport/refundAudit'),
+      //   meta: { title: '退票审核', permissionName: 'stats:cancel_audit' }
+      // },
       {
         path: 'otaPaymentAmountLog',
         name: 'otaPaymentAmountLog',
@@ -177,6 +195,12 @@ let routerMap = [
         component: () => import('@/views/queryReport/checkAndPrintQuery'),
         meta: { title: '核销查询', permissionName: 'stats:write_off_query' }
       },
+      {
+        path: 'cancelReport',
+        name: 'cancelReport',
+        component: () => import('@/views/queryReport/cancelReport'),
+        meta: { title: '取消统计', permissionName: 'stats:cancelReport' }
+      },
       {
         path: 'reportExport',
         name: 'reportExport',

+ 206 - 0
src/views/goodsCenter/invoice/Dialog.vue

@@ -0,0 +1,206 @@
+<template>
+  <el-form
+    inline
+    :model="form"
+    ref="form"
+    class="form-wrap"
+    label-width="150px"
+  >
+
+    <div class="dialog-info">
+      <el-form-item
+        label="可开票门票"
+        prop="ticketNos">
+        <el-select
+          v-model="form.ticketNos"
+          multiple
+          placeholder="请选择">
+          <el-option
+            v-for="item in tickets"
+            :key="item.id"
+            :label="item.name"
+            :value="item.id">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item
+        label="开票金额"
+        prop="price">
+        <el-input v-model="form.price"></el-input>
+      </el-form-item>
+      <el-form-item
+        label="订单下单时间"
+        prop="orderCreateTime">
+        <el-date-picker
+          v-model="form.orderCreateTime"
+          type="datetime"
+          placeholder="选择日期时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item
+        label="买方名称"
+        prop="invoiceSellerName">
+        <el-input v-model="form.invoiceSellerName"></el-input>
+      </el-form-item>
+      <el-form-item
+        label="买方税号"
+        prop="invoiceSellerTaxpayerNum">
+        <el-input v-model="form.invoiceSellerTaxpayerNum"></el-input>
+      </el-form-item>
+      <el-form-item
+        label="买方地址"
+        prop="invoiceSellerAddress">
+        <el-input v-model="form.invoiceSellerAddress"></el-input>
+      </el-form-item>
+      <el-form-item
+        label="买方联系电话"
+        prop="invoiceSellerPhone">
+        <el-input v-model="form.invoiceSellerPhone"></el-input>
+      </el-form-item>
+      <el-form-item
+        label="买方开户银行"
+        prop="invoiceSellerBank">
+        <el-input v-model="form.invoiceSellerBank"></el-input>
+      </el-form-item>
+      <el-form-item
+        label="买方银行账号"
+        prop="invoiceSellerBankAccount">
+        <el-input v-model="form.invoiceSellerAccount"></el-input>
+      </el-form-item>
+      <el-form-item
+        label="买方接收邮箱"
+        prop="invoiceBuyerReceiveEmail">
+        <el-input v-model="form.invoiceBuyerReceiveEmail"></el-input>
+      </el-form-item>
+      <el-form-item
+        label="买方接收号码"
+        prop="invoiceBuyerReceivePhone">
+        <el-input v-model="form.invoiceBuyerReceivePhone"></el-input>
+      </el-form-item>
+      <el-form-item
+        label="开票备注"
+        prop="remark">
+        <el-input v-model="form.remark"></el-input>
+      </el-form-item>
+    </div>
+
+    <div class="dialog-btn-wrap">
+      <el-button
+        @click="handleClose">
+        取消
+      </el-button>
+      <el-button
+        @click="submit"
+        type="primary">
+        保存
+      </el-button>
+    </div>
+  </el-form>
+</template>
+
+<script>
+import { doInvoice, getInvoiceTickets } from '@/api/ticketType'
+import moment from 'moment'
+
+export default {
+  props: {
+    currentItem: {
+      type: Object,
+      default: () => {}
+    },
+    dialogType: {
+      type: String,
+      default: ''
+    }
+  },
+  data () {
+    return {
+      visible: false,
+      tickets: [],
+      form: {
+        ticketNos: [],
+        price: '',
+        orderCreateTime: '',
+        invoiceSellerName: '',
+        invoiceSellerTaxpayerNum: '',
+        invoiceSellerAddress: '',
+        invoiceSellerPhone: '',
+        invoiceSellerBank: '',
+        invoiceSellerAccount: '',
+        invoiceBuyerReceiveEmail: '',
+        invoiceBuyerReceivePhone: '',
+        remark: ''
+      }
+    }
+  },
+  watch: {
+    visible (val) {
+      this.reset()
+      this.form = Object.assign({}, this.currentItem)
+      this.getInvoiceTickets()
+    }
+  },
+  methods: {
+    getInvoiceTickets () {
+      getInvoiceTickets().then(res => {
+        this.tickets = res.data
+      })
+    },
+    handleClose () {
+      this.reset()
+      this.$parent.handleClose()
+    },
+    reset () {
+      this.$refs.form.resetFields()
+    },
+    submit () {
+      this.$refs.form.validate(valid => {
+        if (valid) {
+          this.updateTicket()
+        } else {
+          console.log('error submit!!')
+          return false
+        }
+      })
+    },
+    updateTicket () {
+      if (this.form.orderCreateTime) {
+        this.form.orderCreateTime = moment(this.form.orderCreateTime).format('YYYY-MM-DD HH:mm:ss')
+      }
+      doInvoice(this.form).then(res => {
+        this.$message.success('保存成功')
+        this.reset()
+        this.handleClose()
+        this.$emit('updateList')
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.el-alert{
+   margin-bottom: 20px;
+   p{
+      margin: 0;margin: 0;
+   }
+}
+
+  .el-tag + .el-tag {
+    margin-left: 10px;
+  }
+  .button-new-tag {
+    margin-left: 10px;
+    height: 32px;
+    line-height: 30px;
+    padding-top: 0;
+    padding-bottom: 0;
+  }
+  .input-new-tag {
+     ::v-deep .el-input{
+      width: 90px;
+      margin-left: 10px;
+      vertical-align: bottom;
+    }
+  }
+</style>

+ 136 - 0
src/views/goodsCenter/invoiceChannel/Dialog.vue

@@ -0,0 +1,136 @@
+<template>
+  <el-form
+    inline
+    :model="form"
+    ref="form"
+    class="form-wrap"
+    label-width="150px"
+  >
+
+    <div class="dialog-info">
+      <el-form-item
+        verify
+        label="税率"
+        prop="taxNum">
+        <el-input v-model="form.taxNum"></el-input>
+      </el-form-item>
+      <el-form-item
+        verify
+        label="商品编码"
+        prop="goodsCode">
+        <el-input v-model="form.goodsCode"></el-input>
+      </el-form-item>
+      <el-form-item
+        verify
+        label="商品项目名称"
+        prop="goodsCodeName">
+        <el-input v-model="form.goodsCodeName"></el-input>
+      </el-form-item>
+    </div>
+
+    <div class="dialog-btn-wrap">
+      <el-button
+        @click="reset"
+        v-if="dialogType==='add'">
+        重置
+      </el-button>
+      <el-button
+        @click="handleClose"
+        v-if="dialogType==='edit'">
+        关闭
+      </el-button>
+      <el-button
+        @click="submit"
+        type="primary">
+        保存
+      </el-button>
+    </div>
+  </el-form>
+</template>
+
+<script>
+import { updateInvoiceChannel } from '@/api/ticketType'
+
+export default {
+  props: {
+    currentItem: {
+      type: Object,
+      default: () => {}
+    },
+    dialogType: {
+      type: String,
+      default: ''
+    }
+  },
+  data () {
+    return {
+      visible: false,
+      form: {
+        id: '',
+        taxNum: '',
+        goodsCode: '',
+        goodsCodeName: ''
+      }
+    }
+  },
+  watch: {
+    visible (val) {
+      this.reset()
+      this.form = Object.assign({}, this.currentItem)
+    }
+  },
+  methods: {
+    handleClose () {
+      this.$parent.handleClose()
+    },
+    reset () {
+      this.$refs.form.resetFields()
+    },
+    submit () {
+      this.$refs.form.validate(valid => {
+        if (valid) {
+          this.updateTicket()
+        } else {
+          console.log('error submit!!')
+          return false
+        }
+      })
+    },
+    updateTicket () {
+      updateInvoiceChannel(this.form).then(res => {
+        this.$message.success('保存成功')
+        this.reset()
+        this.handleClose()
+        this.$emit('updateList')
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.el-alert{
+   margin-bottom: 20px;
+   p{
+      margin: 0;margin: 0;
+   }
+}
+
+  .el-tag + .el-tag {
+    margin-left: 10px;
+  }
+  .button-new-tag {
+    margin-left: 10px;
+    height: 32px;
+    line-height: 30px;
+    padding-top: 0;
+    padding-bottom: 0;
+  }
+  .input-new-tag {
+     ::v-deep .el-input{
+      width: 90px;
+      margin-left: 10px;
+      vertical-align: bottom;
+    }
+  }
+</style>

+ 133 - 0
src/views/goodsCenter/invoiceChannelList.vue

@@ -0,0 +1,133 @@
+<template>
+  <div class="form-wrap">
+    <div class="tableBox">
+      <div class="block-title">查询信息</div>
+      <el-table
+        stripe
+        :data="tableData"
+        v-loading="loading">
+        <el-table-column
+          label="渠道名称"
+          prop="channelName"></el-table-column>
+        <el-table-column
+          label="税率"
+          prop="taxNum">
+        </el-table-column>
+        <el-table-column
+          prop="goodsCode"
+          label="商品编码">
+        </el-table-column>
+        <el-table-column
+          prop="goodsCodeName"
+          label="商品项目名称">
+        </el-table-column>
+        <el-table-column
+          v-if="canEdit"
+          width="120"
+          label="操作">
+          <template slot-scope="scope">
+            <el-button
+              type="text"
+              @click="showDialog('edit', scope.row)">
+              <i class="el-icon-edit"></i>
+              编辑
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <!-- <el-pagination
+        background
+        :current-page.sync="form.pageNum"
+        @current-change="getList"
+        layout="total, prev, pager, next"
+        :total="total">
+      </el-pagination> -->
+    </div>
+
+    <ElDialog
+      :title="'编辑'"
+      width="800px"
+      v-model="dialogVisible">
+      <EditDialog
+        :current-item="currentItem"
+        @updateList="getList"></EditDialog>
+    </ElDialog>
+  </div>
+</template>
+
+<script>
+import { getInvoiceChannelList } from '@/api/invoice'
+import ElDialog from '@/components/Dialog'
+import EditDialog from './invoiceChannel/Dialog'
+
+export default {
+  components: {
+    ElDialog,
+    EditDialog
+  },
+  data () {
+    return {
+      projectName: localStorage.getItem('otaProject'),
+      performList: [],
+      dialogType: 'add',
+      dialogVisible: false,
+      form: {
+        pageNum: 1,
+        pageSize: -1,
+        isSale: '',
+        otaSourceId: '',
+        ticketTypeId: '',
+        salePrice: '',
+        otaProductId: ''
+      },
+      loading: false,
+      multipleSelection: [], // 批量删除多选数组
+      total: 0,
+      tableData: [],
+      currentItem: {},
+      ticketTypeList: [], // 票种列表
+      otaList: []
+    }
+  },
+  created () {
+    this.getList()
+  },
+  filters: {
+    formatXCProductName (time) {
+      if (!time) return ''
+      const map = {
+        '1': '一张一人需要证件',
+        '2': '一张一人不需要证件',
+        '3': '一单一人需要证件',
+        '4': '一单一人不需要证件'
+      }
+      return map[time] || ''
+    }
+  },
+  computed: {
+    canEdit () {
+      return true
+      // return this.$store.state.user.permissionList.includes('product:pricecode_edit')
+    },
+    queryClear () {
+      return this.$store.state.user.permissionList.includes('stats:clearwx_query')
+    }
+  },
+  methods: {
+    // 获取列表
+    getList () {
+      this.loading = true
+      getInvoiceChannelList(this.form).then(res => {
+        this.tableData = res.data || []
+        this.loading = false
+      })
+    },
+    // 打开编辑对话框
+    showDialog (type, item) {
+      this.dialogType = type
+      this.currentItem = item || {}
+      this.dialogVisible = true
+    }
+  }
+}
+</script>

+ 390 - 0
src/views/goodsCenter/invoiceList.vue

@@ -0,0 +1,390 @@
+<template>
+  <div class="form-wrap">
+    <div class="searchBox">
+      <el-form
+        ref="form"
+        :model="form"
+        :inline="true"
+        label-width="150px">
+        <el-form-item
+          label="起始时间"
+          prop="createTimeBegin">
+          <el-date-picker
+            v-model="form.createTimeBegin"
+            type="datetime"
+            placeholder="选择日期时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item
+          label="截止时间"
+          prop="createTimeEnd">
+          <el-date-picker
+            v-model="form.createTimeEnd"
+            type="datetime"
+            placeholder="选择日期时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item
+          label="发票渠道"
+          prop="channelName">
+          <el-select
+            v-model="form.channelName"
+            filterable>
+            <el-option
+              v-for="item in channelList"
+              :key="item.id"
+              :value="item.invoiceSellerName"
+              :label="item.invoiceSellerName"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item
+          label="发票状态"
+          prop="status">
+          <el-select
+            v-model="form.status">
+            <el-option
+              value=""
+              label="全部"></el-option>
+            <el-option
+              :value="0"
+              label="未开票"></el-option>
+            <el-option
+              :value="1"
+              label="已开票"></el-option>
+            <el-option
+              :value="2"
+              label="开票失败"></el-option>
+            <el-option
+              :value="3"
+              label="开票中"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item
+          label="开票人"
+          prop="userId">
+          <el-input v-model="form.userId"></el-input>
+        </el-form-item>
+        <el-form-item
+          label="买方名称"
+          prop="invoiceBuyerName">
+          <el-input v-model="form.invoiceBuyerName"></el-input>
+        </el-form-item>
+        <el-form-item
+          label="买方税号"
+          prop="invoiceBuyerTaxNumber">
+          <el-input v-model="form.invoiceBuyerTaxNumber"></el-input>
+        </el-form-item>
+        <el-form-item
+          label="买方接收邮箱"
+          prop="invoiceBuyerReceiveEmail">
+          <el-input v-model="form.invoiceBuyerReceiveEmail"></el-input>
+        </el-form-item>
+        <el-form-item
+          label="买方接收号码"
+          prop="invoiceBuyerReceivePhone">
+          <el-input v-model="form.invoiceBuyerReceivePhone"></el-input>
+        </el-form-item>
+      </el-form>
+      <div class="btn-wrap">
+        <el-button @click="reset">重置</el-button>
+        <el-button
+          type="primary"
+          @click="getList">搜索</el-button>
+        <el-button
+          type="primary"
+          plain
+          v-if="canEdit"
+          @click="showAddDialog">开票</el-button>
+      </div>
+    </div>
+    <div class="tableBox">
+      <div class="block-title">查询信息</div>
+      <el-table
+        stripe
+        :data="tableData"
+        v-loading="loading">
+        <el-table-column
+          label="发票渠道"
+          prop="channelName"></el-table-column>
+        <el-table-column
+          label="开票人"
+          prop="userId">
+        </el-table-column>
+        <el-table-column
+          prop="orderCreateTime"
+          label="订单下单时间">
+        </el-table-column>
+        <el-table-column
+          prop="price"
+          label="开票金额">
+        </el-table-column>
+        <el-table-column
+          prop="invoiceSellerName"
+          label="开票卖方">
+        </el-table-column>
+        <el-table-column
+          prop="invoiceBuyerName"
+          label="买方名称">
+        </el-table-column>
+        <el-table-column
+          prop="invoiceBuyerTaxNum"
+          label="买方税号">
+        </el-table-column>
+        <el-table-column
+          prop="invoiceBuyerAddress"
+          label="买方地址">
+        </el-table-column>
+        <el-table-column
+          prop="invoiceBuyerPhone"
+          label="买方联系方式">
+        </el-table-column>
+        <el-table-column
+          prop="invoiceBuyerBank"
+          label="买方开户银行">
+        </el-table-column>
+        <el-table-column
+          prop="invoiceBuyerAccount"
+          label="买方开户行账号">
+        </el-table-column>
+        <el-table-column
+          prop="invoiceBuyerReceiveEmail"
+          label="买方接收邮箱">
+        </el-table-column>
+        <el-table-column
+          prop="invoiceBuyerReceivePhone"
+          label="买方接收号码">
+        </el-table-column>
+        <el-table-column
+          prop="submitTime"
+          label="开票提交时间">
+        </el-table-column>
+        <el-table-column
+          prop="completeTime"
+          label="开票完成时间">
+        </el-table-column>
+        <el-table-column
+          prop="downloadUrl"
+          label="开票下载地址">
+          <template slot-scope="scope">
+            <a
+              v-if="scope.row.downloadUrl"
+              :href="scope.row.downloadUrl"
+              target="_blank">下载</a>
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="qrcodeUrl"
+          label="扫码开票二维码">
+          <template slot-scope="scope">
+            <img
+              v-if="scope.row.qrcodeUrl"
+              :src="scope.row.qrcodeUrl"
+              alt="二维码"
+              style="width:40px;height:40px;" >
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="fpdm"
+          label="发票代码">
+        </el-table-column>
+        <el-table-column
+          prop="fphm"
+          label="发票号码">
+        </el-table-column>
+        <el-table-column
+          prop="status"
+          label="开票状态">
+          <template slot-scope="scope">
+            <span v-if="scope.row.status === 0">未开票</span>
+            <span v-else-if="scope.row.status === 1">已开票</span>
+            <span v-else-if="scope.row.status === 2">开票失败</span>
+            <span v-else-if="scope.row.status === 3">开票中</span>
+            <span v-else>未知</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="remark"
+          label="开票备注">
+        </el-table-column>
+        <el-table-column
+          prop="errInfo"
+          label="失败原因">
+        </el-table-column>
+        <el-table-column
+          v-if="canEdit"
+          width="120"
+          label="操作">
+          <template slot-scope="scope">
+            <el-button
+              type="text"
+              @click="showDialog('edit', scope.row)">
+              <i class="el-icon-edit"></i>
+              编辑
+            </el-button>
+            <!-- <el-button
+              type="text"
+              @click="deleteItem(scope.row)">
+              <i class="el-icon-delete"></i>
+              删除
+            </el-button> -->
+            <!-- <el-button
+              v-if="scope.row.otaSourceCode==='KS'"
+              type="text"
+              @click="$refs.KSNewDialogRef.show(scope.row)"
+            >
+              同步商品
+            </el-button>
+            <el-button
+              v-if="scope.row.otaSourceCode==='KS' && scope.row.ksProductId"
+              type="text"
+              @click="$refs.KSUpdateDialogRef.show(scope.row)"
+            >
+              同步商品价格库存
+            </el-button> -->
+          </template>
+        </el-table-column>
+      </el-table>
+      <el-pagination
+        background
+        :current-page.sync="form.pageNum"
+        @current-change="getList"
+        layout="total, prev, pager, next"
+        :total="total">
+      </el-pagination>
+    </div>
+
+    <ElDialog
+      :title="'编辑'"
+      width="500px"
+      v-model="dialogVisible">
+      <el-form
+        class="form-wrap"
+        label-width="150px">
+        <el-form-item label="发票ID">
+          <el-input
+            v-model="currentItem.id"
+            disabled></el-input>
+        </el-form-item>
+        <el-form-item label="开票备注">
+          <el-input
+            v-model="currentItem.remark"
+            type="area"></el-input>
+        </el-form-item>
+      </el-form>
+    </ElDialog>
+
+    <ElDialog
+      :title="'开票'"
+      width="800px"
+      v-model="addDialogVisible">
+      <AddDialog ></AddDialog>
+    </ElDialog>
+
+  </div>
+</template>
+
+<script>
+import { getInvoiceSellerList, getInvoiceList } from '@/api/invoice'
+import ElDialog from '@/components/Dialog'
+import AddDialog from './invoice/Dialog'
+
+export default {
+  components: {
+    ElDialog,
+    AddDialog
+  },
+  data () {
+    return {
+      projectName: localStorage.getItem('otaProject'),
+      performList: [],
+      dialogType: 'add',
+      dialogVisible: false,
+      addDialogVisible: false,
+      form: {
+        pageNum: 1,
+        pageSize: 10,
+        createTimeBegin: '',
+        createTimeEnd: '',
+        status: '',
+        channelName: '',
+        userId: '',
+        otaProductId: '',
+        invoiceBuyerName: '',
+        invoiceBuyerTaxNumber: '',
+        invoiceBuyerReceiveEmail: '',
+        invoiceBuyerReceivePhone: ''
+      },
+      loading: false,
+      multipleSelection: [], // 批量删除多选数组
+      total: 0,
+      tableData: [],
+      currentItem: {},
+      channelList: [],
+      otaList: []
+    }
+  },
+  created () {
+    this.getChannelList()
+    this.getList()
+    // this.fetchBatchConfigList()
+    // getPerformList(this.projectName).then((res) => {
+    //   this.performList = res.extraInfo
+    // })
+  },
+  filters: {
+    formatXCProductName (time) {
+      if (!time) return ''
+      const map = {
+        '1': '一张一人需要证件',
+        '2': '一张一人不需要证件',
+        '3': '一单一人需要证件',
+        '4': '一单一人不需要证件'
+      }
+      return map[time] || ''
+    }
+  },
+  computed: {
+    canEdit () {
+      return true
+      // return this.$store.state.user.permissionList.includes('product:pricecode_edit')
+    },
+    queryClear () {
+      return this.$store.state.user.permissionList.includes('stats:clearwx_query')
+    }
+  },
+  methods: {
+    handleSelectionChange (val) {
+      this.multipleSelection = val
+    },
+    getChannelList () {
+      return getInvoiceSellerList({
+        pageNum: 1,
+        pageSize: -1
+      }).then(res => {
+        this.ticketTypeList = res.data.records
+      })
+    },
+    // 获取列表
+    getList () {
+      this.loading = true
+      getInvoiceList(this.form).then(res => {
+        this.total = res.data.total
+        this.tableData = res.data.records
+        this.loading = false
+      })
+    },
+    // 打开编辑对话框
+    showDialog (type, item) {
+      this.dialogType = type
+      this.currentItem = item || {}
+      this.dialogVisible = true
+    },
+    showAddDialog () {
+      this.addDialogVisible = true
+    },
+    reset () {
+      this.$refs.form.resetFields()
+    }
+  }
+}
+</script>

+ 156 - 0
src/views/goodsCenter/invoiceSeller/Dialog.vue

@@ -0,0 +1,156 @@
+<template>
+  <el-form
+    inline
+    :model="form"
+    ref="form"
+    class="form-wrap"
+    label-width="150px"
+  >
+
+    <div class="dialog-info">
+      <el-form-item
+        verify
+        label="销售方名称"
+        prop="invoiceSellerName">
+        <el-input v-model="form.invoiceSellerName"></el-input>
+      </el-form-item>
+      <el-form-item
+        verify
+        label="纳税人识别号"
+        prop="invoiceSellerTaxpayerNum">
+        <el-input v-model="form.invoiceSellerTaxpayerNum"></el-input>
+      </el-form-item>
+      <el-form-item
+        verify
+        label="销售方地址"
+        prop="invoiceSellerAddress">
+        <el-input v-model="form.invoiceSellerAddress"></el-input>
+      </el-form-item>
+      <el-form-item
+        verify
+        label="销售方联系电话"
+        prop="invoiceSellerPhone">
+        <el-input v-model="form.invoiceSellerPhone"></el-input>
+      </el-form-item>
+      <el-form-item
+        verify
+        label="销售方开户银行"
+        prop="invoiceSellerBank">
+        <el-input v-model="form.invoiceSellerBank"></el-input>
+      </el-form-item>
+      <el-form-item
+        verify
+        label="销售方银行账号"
+        prop="invoiceSellerBankAccount">
+        <el-input v-model="form.invoiceSellerAccount"></el-input>
+      </el-form-item>
+    </div>
+
+    <div class="dialog-btn-wrap">
+      <el-button
+        @click="reset"
+        v-if="dialogType==='add'">
+        重置
+      </el-button>
+      <el-button
+        @click="handleClose"
+        v-if="dialogType==='edit'">
+        关闭
+      </el-button>
+      <el-button
+        @click="submit"
+        type="primary">
+        保存
+      </el-button>
+    </div>
+  </el-form>
+</template>
+
+<script>
+import { updateInvoiceSeller } from '@/api/ticketType'
+
+export default {
+  props: {
+    currentItem: {
+      type: Object,
+      default: () => {}
+    },
+    dialogType: {
+      type: String,
+      default: ''
+    }
+  },
+  data () {
+    return {
+      visible: false,
+      form: {
+        invoiceSellerName: '',
+        invoiceSellerTaxpayerNum: '',
+        invoiceSellerAddress: '',
+        invoiceSellerPhone: '',
+        invoiceSellerBank: '',
+        invoiceSellerAccount: ''
+      }
+    }
+  },
+  watch: {
+    visible (val) {
+      this.reset()
+      this.form = Object.assign({}, this.currentItem)
+    }
+  },
+  methods: {
+    handleClose () {
+      this.$parent.handleClose()
+    },
+    reset () {
+      this.$refs.form.resetFields()
+    },
+    submit () {
+      this.$refs.form.validate(valid => {
+        if (valid) {
+          this.updateTicket()
+        } else {
+          console.log('error submit!!')
+          return false
+        }
+      })
+    },
+    updateTicket () {
+      updateInvoiceSeller(this.form).then(res => {
+        this.$message.success('保存成功')
+        this.reset()
+        this.handleClose()
+        this.$emit('updateList')
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.el-alert{
+   margin-bottom: 20px;
+   p{
+      margin: 0;margin: 0;
+   }
+}
+
+  .el-tag + .el-tag {
+    margin-left: 10px;
+  }
+  .button-new-tag {
+    margin-left: 10px;
+    height: 32px;
+    line-height: 30px;
+    padding-top: 0;
+    padding-bottom: 0;
+  }
+  .input-new-tag {
+     ::v-deep .el-input{
+      width: 90px;
+      margin-left: 10px;
+      vertical-align: bottom;
+    }
+  }
+</style>

+ 141 - 0
src/views/goodsCenter/invoiceSellerList.vue

@@ -0,0 +1,141 @@
+<template>
+  <div class="form-wrap">
+    <div class="tableBox">
+      <div class="block-title">查询信息</div>
+      <el-table
+        stripe
+        :data="tableData"
+        v-loading="loading">
+        <el-table-column
+          label="销售方名称"
+          prop="invoiceSellerName"></el-table-column>
+        <el-table-column
+          label="纳税人识别号"
+          prop="invoiceSellerTaxpayerNum">
+        </el-table-column>
+        <el-table-column
+          prop="invoiceSellerAddress"
+          label="销售方地址">
+        </el-table-column>
+        <el-table-column
+          prop="invoiceSellerPhone"
+          label="销售方联系电话">
+        </el-table-column>
+        <el-table-column
+          prop="invoiceSellerBank"
+          label="销售方开户银行">
+        </el-table-column>
+        <el-table-column
+          prop="invoiceSellerAccount"
+          label="销售方银行账号">
+        </el-table-column>
+        <el-table-column
+          v-if="canEdit"
+          width="120"
+          label="操作">
+          <template slot-scope="scope">
+            <el-button
+              type="text"
+              @click="showDialog('edit', scope.row)">
+              <i class="el-icon-edit"></i>
+              编辑
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <!-- <el-pagination
+        background
+        :current-page.sync="form.pageNum"
+        @current-change="getList"
+        layout="total, prev, pager, next"
+        :total="total">
+      </el-pagination> -->
+    </div>
+
+    <ElDialog
+      :title="'编辑'"
+      width="800px"
+      v-model="dialogVisible">
+      <EditDialog
+        :current-item="currentItem"
+        @updateList="getList"></EditDialog>
+    </ElDialog>
+  </div>
+</template>
+
+<script>
+import { getInvoiceSellerList } from '@/api/invoice'
+import ElDialog from '@/components/Dialog'
+import EditDialog from './invoiceSeller/Dialog'
+
+export default {
+  components: {
+    ElDialog,
+    EditDialog
+  },
+  data () {
+    return {
+      projectName: localStorage.getItem('otaProject'),
+      performList: [],
+      dialogType: 'add',
+      dialogVisible: false,
+      form: {
+        pageNum: 1,
+        pageSize: -1,
+        isSale: '',
+        otaSourceId: '',
+        ticketTypeId: '',
+        salePrice: '',
+        otaProductId: ''
+      },
+      loading: false,
+      multipleSelection: [], // 批量删除多选数组
+      total: 0,
+      tableData: [],
+      currentItem: {},
+      ticketTypeList: [], // 票种列表
+      otaList: []
+    }
+  },
+  created () {
+    this.getList()
+  },
+  filters: {
+    formatXCProductName (time) {
+      if (!time) return ''
+      const map = {
+        '1': '一张一人需要证件',
+        '2': '一张一人不需要证件',
+        '3': '一单一人需要证件',
+        '4': '一单一人不需要证件'
+      }
+      return map[time] || ''
+    }
+  },
+  computed: {
+    canEdit () {
+      return true
+      // return this.$store.state.user.permissionList.includes('product:pricecode_edit')
+    },
+    queryClear () {
+      return this.$store.state.user.permissionList.includes('stats:clearwx_query')
+    }
+  },
+  methods: {
+    // 获取列表
+    getList () {
+      this.loading = true
+      getInvoiceSellerList(this.form).then(res => {
+        this.tableData = res.data || []
+        this.loading = false
+      })
+    },
+    // 打开编辑对话框
+    showDialog (type, item) {
+      this.dialogType = type
+      this.currentItem = item || {}
+      this.dialogVisible = true
+    }
+  }
+}
+</script>

+ 302 - 0
src/views/queryReport/cancelReport.vue

@@ -0,0 +1,302 @@
+<template>
+  <div class="form-wrap">
+    <div class="searchBox">
+      <el-form
+        ref="form"
+        :model="form"
+        :inline="true"
+        label-width="150px">
+        <el-form-item
+          label="起始时间"
+          prop="timeBegin">
+          <el-date-picker
+            v-model="form.timeBegin"
+            type="datetime"
+            placeholder="选择日期时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item
+          label="截止时间"
+          prop="timeEnd">
+          <el-date-picker
+            v-model="form.timeEnd"
+            type="datetime"
+            placeholder="选择日期时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item
+          label="票种"
+          prop="ticketTypeIdList">
+          <el-select
+            filterable
+            v-model="form.ticketTypeIdList"
+            multiple
+            clearable
+            placeholder="请选择">
+            <el-option
+              v-for="item in ticketTypeList"
+              :key="item.id"
+              :label="item.name"
+              :value="item.ticketTypeId">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item
+          label="销售来源"
+          prop="otaSourceNameList">
+          <el-select
+            filterable
+            multiple
+            v-model="form.otaSourceNameList"
+            placeholder="请选择">
+            <el-option
+              v-for="item in otaSourceList"
+              :key="item.otaSourceCode"
+              :label="item.otaSourceName"
+              :value="item.otaSourceName">
+            </el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div class="btn-wrap">
+        <el-button
+          @click="reset">重置</el-button>
+        <el-button
+          type="primary"
+          @click="getCancelOrderList($event,true)">搜索</el-button>
+        <el-button
+          type="primary"
+          @click="handleExport">导出</el-button>
+      </div>
+    </div>
+
+    <div class="tableBox">
+      <div class="block-title">
+        查询信息
+      </div>
+      <el-table
+        :data="tableData"
+        v-loading="loading">
+        <el-table-column
+          prop="otaSourceName"
+          label="订单渠道">
+        </el-table-column>
+        <el-table-column
+          prop="ticketTypeName"
+          label="票种">
+        </el-table-column>
+        <el-table-column
+          prop="unitPrice"
+          label="单价">
+        </el-table-column>
+        <el-table-column
+          prop="cancelCount"
+          label="检票数量">
+        </el-table-column>
+        <el-table-column
+          prop="cancelNum"
+          label="退票张数">
+        </el-table-column>
+        <el-table-column
+          prop="cancelPrice"
+          label="退票金额">
+        </el-table-column>
+        <!-- <el-table-column
+          width="260"
+          fixed="right"
+          label="操作">
+          <template slot-scope="scope">
+            <el-button
+              type="text"
+              @click="showOrderInfo(scope.row)">订单详情</el-button>
+            <el-button
+              type="text"
+              @click="$refs.ticketInfo.show(scope.row.tickets)">门票详情</el-button>
+            <el-button
+              type="text"
+              @click="showGuestInfo(scope.row)">游客信息</el-button>
+            <el-button
+              type="text"
+              v-if="checkRefundVisible(scope.row)&&canCancel"
+              @click="showOrderInfo(scope.row,'cancel')">退订单</el-button>
+          </template>
+        </el-table-column> -->
+      </el-table>
+      <el-pagination
+        background
+        :current-page.sync="form.pageNum"
+        @current-change="getCancelOrderList"
+        layout="total, prev, pager, next"
+        :total="total">
+      </el-pagination>
+    </div>
+
+    <ElDialog
+      :title="type==='cancel'?'退单':'订单详情'"
+      width="760px"
+      v-model="orderDialogVisible"
+    >
+      <OrderDialog
+        :current-item="currentItem"
+        :can-cancel="canCancel"
+        @updateList="getCancelOrderList"
+        :type="type"></OrderDialog>
+    </ElDialog>
+    <ElDialog
+      title="游客信息"
+      width="760px"
+      v-model="guestDialogVisible">
+      <GuestDialog
+        :current-item="currentItem"></GuestDialog>
+    </ElDialog>
+
+    <TicketInfo ref="ticketInfo"></TicketInfo>
+  </div>
+</template>
+<script>
+import { getOrderCancelStatistics, getOtaSourceList } from '@/api/order'
+import { getTicketTypeList } from '@/api/ticketType'
+import ElDialog from '@/components/Dialog'
+import OrderDialog from './orderList/OrderDialog'
+import GuestDialog from './orderList/GuestDialog'
+import TicketInfo from './orderList/TicketInfo'
+import { orderStatus } from '@/const'
+import moment from 'moment'
+
+export default {
+  name: 'salesReport',
+  components: {
+    ElDialog,
+    OrderDialog,
+    GuestDialog,
+    TicketInfo
+  },
+  data () {
+    return {
+      ticketTypeList: [],
+      otaSourceList: [],
+      projectName: localStorage.getItem('otaProject'),
+      totalObj: {},
+      type: '', // 操作状态 cancel退订单
+      form: {
+        timeBegin: moment().startOf('day'),
+        timeEnd: moment().endOf('day'),
+        ticketTypeIdList: [], // 票种名称
+        otaSourceNameList: [], // 订单渠道
+        export: false,
+        pageNum: 1,
+        pageSize: 10
+      },
+      orderStatusDic: orderStatus,
+      loading: false,
+      tableData: [],
+      total: 0,
+      currentItem: {},
+      orderDialogVisible: false,
+      guestDialogVisible: false
+    }
+  },
+  created () {
+    this.getTicketTypeList()
+    this.getOtaSourceList()
+    this.getCancelOrderList()
+  },
+  computed: {
+    canCancel () {
+      return this.$store.state.user.permissionList.includes('orders:cancel')
+    },
+    queryClear () {
+      return this.$store.state.user.permissionList.includes('stats:clearwx_query')
+    },
+    otaList () {
+      const list = JSON.parse(localStorage.getItem('otaList'))
+      return this.projectName === 'YINXIANGMAZU' && !this.queryClear ? list.filter(item => item.otaSourceCode !== 'CLEARWX') : list
+    }
+  },
+  methods: {
+    checkRefundVisible (item) {
+      if (item.status !== 'CANCELED') return true
+      if (item.status === 'CANCELED') {
+        if (item.tickets.some(i => i.status !== 'CANCELED')) {
+          return true
+        } else {
+          return false
+        }
+      }
+      return false
+    },
+    reset () {
+      this.$refs.form.resetFields()
+    },
+    getTicketTypeList () {
+      getTicketTypeList({
+        pageNum: 1,
+        pageSize: -1
+      }).then(res => {
+        this.ticketTypeList = res.data.records || []
+      })
+    },
+    getOtaSourceList () {
+      getOtaSourceList({
+        pageNum: 1,
+        pageSize: -1
+      }).then(res => {
+        this.otaSourceList = res.data || []
+      })
+    },
+    getCancelOrderList (e, goFirst) {
+      if (goFirst) { this.form.pageNum = 1 }
+
+      if (!this.form.timeBegin || !this.form.timeEnd) {
+        this.$message.error('请选择起始时间和截止时间')
+        return
+      }
+
+      this.form.timeBegin = moment(this.form.timeBegin).format('YYYY-MM-DD HH:mm:ss')
+      this.form.timeEnd = moment(this.form.timeEnd).format('YYYY-MM-DD HH:mm:ss')
+
+      if (!this.form.ticketTypeIdList) {
+        this.form.ticketTypeIdList = []
+      }
+
+      if (!this.form.otaSourceNameList) {
+        this.form.otaSourceNameList = []
+      }
+      this.loading = true
+      getOrderCancelStatistics(this.form).then(res => {
+        this.tableData = res.data
+        this.loading = false
+      })
+    },
+    showOrderInfo (item, type) {
+      if ((item.otaSourceCode === 'CLEARWX' || item.otaSourceCode === 'CLEARWXDEV') && type === 'cancel') return this.$message.info('自营平台订单请到自营后台办理退票')
+      this.currentItem = item
+      this.type = type
+      this.orderDialogVisible = true
+    },
+    showGuestInfo (item) {
+      this.currentItem = item
+      this.guestDialogVisible = true
+    },
+    handleExport () {
+      this.form.export = true
+      getOrderCancelStatistics(this.form).then(res => {
+        this.$notify({
+          title: '提示',
+          message: '导出成功',
+          type: 'success'
+        })
+      }, () => {
+        this.$notify.error({
+          title: '提示',
+          message: '导出失败'
+        })
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 8 - 19
src/views/queryReport/checkAndPrintReport.vue

@@ -90,35 +90,23 @@
         :row-class-name="totalRowClassName">
         <el-table-column
           prop="otaSourceName"
-          label="分销商">
+          label="订单渠道">
         </el-table-column>
         <el-table-column
           prop="ticketTypeName"
-          label="商品名">
+          label="票种">
         </el-table-column>
         <el-table-column
-          prop="price"
+          prop="unitPrice"
           label="单价">
         </el-table-column>
         <el-table-column
-          prop="print_price"
-          label="打印价">
+          prop="checkCount"
+          label="检票次数">
         </el-table-column>
         <el-table-column
-          prop="saleNum"
-          label="总售票数">
-        </el-table-column>
-        <el-table-column
-          prop="count"
-          label="已核销数量">
-        </el-table-column>
-        <el-table-column
-          prop="salePrice"
-          label="已核销金额">
-        </el-table-column>
-        <el-table-column
-          prop="sum_print_price"
-          label="打印价汇总">
+          prop="checkPrice"
+          label="检票金额">
         </el-table-column>
       </el-table>
     </div>
@@ -202,6 +190,7 @@ export default {
           message: '导出失败'
         })
       })
+      this.form.export = false
     },
     getData () {
       this.loading = true

+ 236 - 140
src/views/queryReport/orderList.vue

@@ -7,77 +7,56 @@
         :inline="true"
         label-width="150px">
         <el-form-item
-          label="起始时间"
-          prop="startDate">
+          label="下单起始时间"
+          prop="createTimeBegin">
           <el-date-picker
-            v-model="form.startDate"
+            v-model="form.createTimeBegin"
             type="datetime"
             placeholder="选择日期时间">
           </el-date-picker>
         </el-form-item>
         <el-form-item
-          label="截止时间"
-          prop="endDate">
+          label="下单截止时间"
+          prop="createTimeEnd">
           <el-date-picker
-            v-model="form.endDate"
+            v-model="form.createTimeEnd"
             type="datetime"
             placeholder="选择日期时间">
           </el-date-picker>
         </el-form-item>
         <el-form-item
           label="游玩开始时间"
-          prop="keyWords10">
+          prop="playDateBegin">
           <el-date-picker
-            v-model="form.keyWords10"
-            type="datetime"
+            v-model="form.playDateBegin"
+            type="date"
             placeholder="选择日期时间">
           </el-date-picker>
         </el-form-item>
         <el-form-item
           label="游玩结束时间"
-          prop="keyWords10">
+          prop="playDateEnd">
           <el-date-picker
-            v-model="form.keyWords11"
-            type="datetime"
+            v-model="form.playDateEnd"
+            type="date"
             placeholder="选择日期时间">
           </el-date-picker>
         </el-form-item>
         <el-form-item
-          label="退票起始时间"
-          prop="keyWords12">
-          <el-date-picker
-            v-model="form.keyWords12"
-            type="datetime"
-            placeholder="选择日期时间">
-          </el-date-picker>
-        </el-form-item>
-        <el-form-item
-          label="退票截至时间"
-          prop="keyWords13">
-          <el-date-picker
-            v-model="form.keyWords13"
-            type="datetime"
-            placeholder="选择日期时间">
-          </el-date-picker>
+          label="订单号"
+          prop="orderNo">
+          <el-input v-model="form.orderNo"></el-input>
         </el-form-item>
-
         <el-form-item
-          label="线下订单号"
-          prop="keyWords6">
-          <el-input v-model="form.keyWords6"></el-input>
+          label="合作方订单号"
+          prop="partnerOrderNo">
+          <el-input v-model="form.partnerOrderNo"></el-input>
         </el-form-item>
         <el-form-item
           label="票号"
-          prop="keyWords14">
-          <el-input v-model="form.keyWords14"></el-input>
-        </el-form-item>
-
-        <el-form-item
-          label="分销平台订单号"
-          prop="keyWords1">
-          <el-input v-model="form.keyWords1"></el-input>
+          prop="ticketNo">
+          <el-input v-model="form.ticketNo"></el-input>
         </el-form-item>
-
         <el-form-item
           label="第三方分销商订单号"
           prop="keyWords7">
@@ -88,42 +67,19 @@
           prop="keyWords9">
           <el-select
             v-model="form.keyWords9"
+            multiple
+            clearable
             placeholder="请选择"
             filterable>
             <el-option
-              v-if="projectName!=='YINXIANGMAZU'||queryClear"
-              label="全部"
-              value="">
-            </el-option>
-            <el-option
-              v-for="item in otaList"
+              v-for="item in otaSourceList"
               :key="item.id"
               :label="item.otaSourceName"
               :value="item.otaSourceName">
             </el-option>
           </el-select>
         </el-form-item>
-        <el-form-item
-          label="分销商编码"
-          prop="keyWords15">
-          <el-select
-            v-model="form.keyWords15"
-            placeholder="请选择"
-            filterable>
-            <el-option
-              v-if="projectName!=='YINXIANGMAZU'||queryClear"
-              label="全部"
-              value="">
-            </el-option>
-            <el-option
-              v-for="item in otaList"
-              :key="item.id"
-              :label="`${item.otaSourceCode}(${item.otaSourceName})`"
-              :value="item.otaSourceCode">
-            </el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item
+        <!-- <el-form-item
           label="票种"
           prop="keyWords8">
           <el-select
@@ -141,12 +97,12 @@
               :value="item.ticketTypeId">
             </el-option>
           </el-select>
-        </el-form-item>
+        </el-form-item> -->
         <el-form-item
           label="订单状态"
-          prop="keyWords5">
+          prop="orderStatus">
           <el-select
-            v-model="form.keyWords5"
+            v-model="form.orderStatus"
             clearable
             placeholder="请选择">
             <el-option
@@ -161,19 +117,37 @@
           </el-select>
         </el-form-item>
         <el-form-item
-          label="姓名"
-          prop="keyWords2">
-          <el-input v-model="form.keyWords2"></el-input>
+          label="游客名称"
+          prop="visitorName">
+          <el-input v-model="form.visitorName"></el-input>
+        </el-form-item>
+        <el-form-item
+          label="游客电话"
+          prop="visitorPhone">
+          <el-input v-model="form.visitorPhone"></el-input>
         </el-form-item>
         <el-form-item
-          label="手机号码"
-          prop="keyWords3">
-          <el-input v-model="form.keyWords3"></el-input>
+          label="游客证件号"
+          prop="visitorIdentify">
+          <el-input v-model="form.visitorIdentify"></el-input>
         </el-form-item>
         <el-form-item
-          label="身份证"
-          prop="keyWords4">
-          <el-input v-model="form.keyWords4"></el-input>
+          label="门票状态"
+          prop="ticketStatus">
+          <el-select
+            v-model="form.ticketStatus"
+            clearable
+            placeholder="请选择">
+            <el-option
+              value=""
+              label="全部"></el-option>
+            <el-option
+              v-for="(value, key) in ticketStatusDic"
+              :key="key"
+              :label="value.label"
+              :value="key">
+            </el-option>
+          </el-select>
         </el-form-item>
       </el-form>
       <div class="btn-wrap">
@@ -192,70 +166,137 @@
       <el-table
         :data="tableData"
         v-loading="loading">
+        <el-table-column type="expand">
+          <template
+            slot-scope="scope"
+            v-if="scope.row.ticketList && scope.row.ticketList.length > 0">
+            <el-table :data="scope.row.ticketList">
+              <el-table-column
+                width="260"
+                prop="ticketInfo"
+                label="票信息">
+                <template slot-scope="scope">
+                  <div class=""><span>票种:</span>{{ scope.row.ticketTypeName }}</div>
+                  <div class=""><span>票号:</span>{{ scope.row.ticketNo }}</div>
+                  <div class=""><span>线上票号:</span>{{ scope.row.otaTicketNo }}</div>
+                  <div class=""><span>票号二维码图片地址:</span>{{ scope.row.qrcodeUrl }}</div>
+                </template>
+              </el-table-column>
+              <el-table-column
+                prop="playDateBegin"
+                label="游玩时间">
+                <template slot-scope="scope">
+                  {{ scope.row.playDateBegin || scope.row.playDateEnd ? `${scope.row.playDateBegin || ''} - ${scope.row.playDateEnd || ''}` : "无限制" }}
+                </template>
+              </el-table-column>
+              <el-table-column
+                prop="buyTime"
+                label="付款时间">
+              </el-table-column>
+              <el-table-column
+                width="210"
+                prop="guestInfo"
+                label="游客信息">
+                <template slot-scope="scope">
+                  <div class=""><span>姓名:</span>{{ scope.row.guestName }}</div>
+                  <div class=""><span>手机号:</span>{{ scope.row.guestPhone }}</div>
+                  <div class=""><span>证件类型:</span>{{ papersType[scope.row.guestIdentifyType] }}</div>
+                  <div class=""><span>证件号码:</span>{{ scope.row.guestIdentify }}</div>
+                </template>
+              </el-table-column>
+              <el-table-column
+                width="260"
+                prop="ticketCheckInfo"
+                label="检票信息">
+                <template slot-scope="scope">
+                  <div class=""><span>检票人数:</span>{{ scope.row.checkNum }}</div>
+                  <div class=""><span>首次检票时间:</span>{{ scope.row.firstCheckTime }}</div>
+                  <div class=""><span>最近一次检票时间:</span>{{ scope.row.checkTime }}</div>
+                  <div class=""><span>核销通知:</span>{{ scope.row.isCheckSend ? '成功' : '失败' }}</div>
+                </template>
+              </el-table-column>
+              <el-table-column
+                width="260"
+                prop="ticketRefundInfo"
+                label="退票信息">
+                <template slot-scope="scope">
+                  <div class=""><span>退款操作人:</span>{{ scope.row.cancelAdminName || '' }}</div>
+                  <div class=""><span>退款金额:</span>{{ scope.row.cancelPrice || '' }}</div>
+                  <div class=""><span>退款申请时间:</span>{{ scope.row.cancelSubmitTime || '' }}</div>
+                  <div class=""><span>退款完成时间:</span>{{ scope.row.cancelCompleteTime || '' }}</div>
+                </template>
+              </el-table-column>
+            </el-table>
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="otaSourceName"
+          label="订单来源渠道">
+        </el-table-column>
         <el-table-column
-          prop="order_no"
-          label="线下订单号">
+          prop="orderNo"
+          label="订单号">
         </el-table-column>
         <el-table-column
-          prop="ota_order_no"
-          label="分销平台订单号">
+          prop="partnerOrderNo"
+          label="合作方订单号">
         </el-table-column>
         <el-table-column
-          prop="ota_3rd_order_no"
-          label="第三方分销商订单号">
+          prop="buyerName"
+          label="购买方名称">
         </el-table-column>
         <el-table-column
-          width="120"
-          prop="buyer_name"
-          label="预订人">
+          prop="buyerPhone"
+          label="购买方电话">
         </el-table-column>
         <el-table-column
-          prop="tickets[0].ticketTypeName"
-          label="票种">
+          prop="buyerIdentify"
+          label="购买方证件号">
         </el-table-column>
         <el-table-column
-          width="100"
-          prop="tickets[0].pricecode_id"
-          label="价格码">
+          prop="payStatus"
+          label="支付状态">
         </el-table-column>
         <el-table-column
-          prop="otaSourceName"
-          label="分销商">
+          prop="payTime"
+          label="支付时间">
         </el-table-column>
         <el-table-column
-          width="50"
-          prop="tickets.length"
-          label="数量">
+          prop="closeTime"
+          label="关闭时间">
         </el-table-column>
         <el-table-column
-          width="50"
-          label="总价">
+          prop="otaCreateStatus"
+          label="创建状态">
           <template slot-scope="scope">
-            {{ scope.row.price }}
+            {{ scope.row.otaCreateStatus === 1 ? '创建成功' : '初始化' }}
           </template>
         </el-table-column>
         <el-table-column
-          width="160"
-          prop="createTime"
-          label="创建时间">
+          prop="isSelfOrder"
+          label="是否自营">
           <template slot-scope="scope">
-            <span>{{ scope.row.createTime | formatTime }}</span>
+            {{ scope.row.isSelfOrder === 1 ? '是' : '否' }}
           </template>
         </el-table-column>
         <el-table-column
+          prop="otaCreateMsg"
+          show-overflow-tooltip
+          label="订单创建信息">
+        </el-table-column>
+        <!-- <el-table-column
           label="状态">
           <template slot-scope="scope">
             <el-tag :type="orderStatusDic[scope.row.status] && orderStatusDic[scope.row.status].color || ''">
               {{ orderStatusDic[scope.row.status] && orderStatusDic[scope.row.status].label || scope.row.status }}
             </el-tag>
           </template>
-        </el-table-column>
+        </el-table-column> -->
         <el-table-column
-          width="260"
           fixed="right"
           label="操作">
           <template slot-scope="scope">
-            <el-button
+            <!-- <el-button
               type="text"
               @click="showOrderInfo(scope.row)">订单详情</el-button>
             <el-button
@@ -263,7 +304,7 @@
               @click="$refs.ticketInfo.show(scope.row.tickets)">门票详情</el-button>
             <el-button
               type="text"
-              @click="showGuestInfo(scope.row)">游客信息</el-button>
+              @click="showGuestInfo(scope.row)">游客信息</el-button> -->
             <el-button
               type="text"
               v-if="checkRefundVisible(scope.row)&&canCancel"
@@ -303,13 +344,13 @@
   </div>
 </template>
 <script>
-import { getOrderList, exportOrderList } from '@/api/order'
+import { getOrderList, getOtaSourceList, cancelOrder } from '@/api/order'
 import { getTicketTypeList } from '@/api/ticketType'
 import ElDialog from '@/components/Dialog'
 import OrderDialog from './orderList/OrderDialog'
 import GuestDialog from './orderList/GuestDialog'
 import TicketInfo from './orderList/TicketInfo'
-import { orderStatus } from '@/const'
+import { orderStatus, ticketStatusDic, IDENTIFY_TYPES } from '@/const'
 import moment from 'moment'
 
 export default {
@@ -322,32 +363,30 @@ export default {
   },
   data () {
     return {
+      papersType: IDENTIFY_TYPES,
       ticketTypeList: [],
+      otaSourceList: [],
       projectName: localStorage.getItem('otaProject'),
       totalObj: {},
       type: '', // 操作状态 cancel退订单
       form: {
-        startDate: '',
-        endDate: '',
-        keyWords1: '', // ota订单号
-        keyWords2: '', // 预订姓名
-        keyWords3: '', // 预订人手机
-        keyWords4: '', // 预订人身份证
-        keyWords5: '', // 状态
-        keyWords6: '', // 线下订单号
-        keyWords7: '', // 第三方订单号
-        keyWords8: '', // 票种名称
-        keyWords9: '', // 分销商名称
-        keyWords10: moment().startOf('day'), // 游玩开始日期
-        keyWords11: moment().endOf('day'), // 游玩结束日期
-        keyWords12: '', // 退票开始时间
-        keyWords13: '', // 退票截至时间
-        keyWords14: '', // 票号
-        keyWords15: '', // 分销商编码
+        createTimeBegin: '',
+        createTimeEnd: '',
+        partnerOrderNo: '', // ota订单号
+        visitorName: '', // 预订姓名
+        visitorPhone: '', // 预订人手机
+        visitorIdentify: '', // 预订人身份证
+        orderStatus: '', // 状态
+        orderNo: '', // 线下订单号
+        ticketStatus: '', // 票状态
+        playDateBegin: '', // 游玩开始日期
+        playDateEnd: '', // 游玩结束日期
+        ticketNo: '', // 票号
         pageNum: 1,
         pageSize: 10
       },
       orderStatusDic: orderStatus,
+      ticketStatusDic,
       loading: false,
       tableData: [],
       total: 0,
@@ -358,11 +397,8 @@ export default {
   },
   created () {
     this.getTicketTypeList()
+    this.getOtaSourceList()
     this.getOrderList()
-    if (this.projectName === 'YINXIANGMAZU' && !this.queryClear) {
-      this.form.keyWords9 = this.otaList[0].otaSourceName
-      this.form.keyWords15 = this.otaList[0].otaSourceCode
-    }
   },
   computed: {
     canCancel () {
@@ -392,20 +428,56 @@ export default {
       this.$refs.form.resetFields()
     },
     getTicketTypeList () {
-      return getTicketTypeList({
+      getTicketTypeList({
+        pageNum: 1,
+        pageSize: -1
+      }).then(res => {
+        this.ticketTypeList = res.data.records || []
+      })
+    },
+    getOtaSourceList () {
+      getOtaSourceList({
         pageNum: 1,
-        pageSize: 999
+        pageSize: -1
       }).then(res => {
-        this.ticketTypeList = res.list
+        this.otaSourceList = res.data || []
       })
     },
     getOrderList (e, goFirst) {
       this.loading = true
       if (goFirst) { this.form.pageNum = 1 }
+
+      if (this.form.createTimeBegin && this.form.createTimeEnd && this.form.createTimeBegin > this.form.createTimeEnd) {
+        this.$message.error('下单起始时间不能大于下单截止时间')
+        this.loading = false
+        return
+      }
+
+      if (this.form.playDateBegin && this.form.playDateEnd && this.form.playDateBegin > this.form.playDateEnd) {
+        this.$message.error('游玩开始时间不能大于游玩结束时间')
+        this.loading = false
+        return
+      }
+
+      if (this.form.createTimeBegin) {
+        this.form.createTimeBegin = moment(this.form.createTimeBegin).format('YYYY-MM-DD HH:mm:ss')
+      }
+
+      if (this.form.createTimeEnd) {
+        this.form.createTimeEnd = moment(this.form.createTimeEnd).format('YYYY-MM-DD HH:mm:ss')
+      }
+
+      if (this.form.playDateBegin) {
+        this.form.playDateBegin = moment(this.form.playDateBegin).format('YYYY-MM-DD')
+      }
+
+      if (this.form.playDateEnd) {
+        this.form.playDateEnd = moment(this.form.playDateEnd).format('YYYY-MM-DD')
+      }
+
       getOrderList(this.form).then(res => {
-        this.total = res.total
-        this.tableData = res.list
-        this.tableData.pop()
+        this.total = res.data.total || 0
+        this.tableData = res.data.records || []
         console.log('this.tableData', this.tableData)
         this.loading = false
       })
@@ -416,12 +488,35 @@ export default {
       this.type = type
       this.orderDialogVisible = true
     },
+    cancelTicket (item) {
+      this.$confirm('确定退票?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        this.loading = true
+        let ticketList = item.ticketList.map(i => {
+          return {
+            ticketId: i.id
+          }
+        })
+
+        cancelOrder({
+          ticketCancelRequestList: ticketList
+        }).then(res => {
+          this.loading = false
+          this.$message.success('退票成功')
+          this.getOrderList('', true)
+        })
+      })
+    },
     showGuestInfo (item) {
       this.currentItem = item
       this.guestDialogVisible = true
     },
     handleExport () {
-      exportOrderList(this.form).then(res => {
+      this.form.export = true
+      getOrderList(this.form).then(res => {
         this.$notify({
           title: '提示',
           message: '导出成功',
@@ -433,6 +528,7 @@ export default {
           message: '导出失败'
         })
       })
+      this.form.export = false
     }
   }
 }

+ 1 - 1
src/views/queryReport/orderList/TicketInfo.vue

@@ -14,7 +14,7 @@
       </el-table-column>
 
       <el-table-column
-        prop="qrcode"
+        prop="ticketNo"
         label="票号">
       </el-table-column>
 

+ 7 - 7
src/views/queryReport/salesReport.vue

@@ -51,9 +51,9 @@
             placeholder="请选择">
             <el-option
               v-for="item in otaSourceList"
-              :key="item.id"
-              :label="item.name"
-              :value="item.ticketTypeId">
+              :key="item.otaSourceCode"
+              :label="item.otaSourceName"
+              :value="item.otaSourceName">
             </el-option>
           </el-select>
         </el-form-item>
@@ -79,7 +79,7 @@
         v-loading="loading">
         <el-table-column
           prop="otaSourceName"
-          label="分销渠道">
+          label="订单渠道">
         </el-table-column>
         <el-table-column
           prop="ticketTypeName"
@@ -176,7 +176,7 @@ import { orderStatus } from '@/const'
 import moment from 'moment'
 
 export default {
-  name: 'orderList',
+  name: 'salesReport',
   components: {
     ElDialog,
     OrderDialog,
@@ -194,7 +194,7 @@ export default {
         timeBegin: moment().startOf('day'),
         timeEnd: moment().endOf('day'),
         ticketTypeIdList: [], // 票种名称
-        otaSourceNameList: [], // 分销渠道
+        otaSourceNameList: [], // 订单渠道
         export: false,
         pageNum: 1,
         pageSize: 10
@@ -210,7 +210,7 @@ export default {
   },
   created () {
     this.getTicketTypeList()
-    // this.getOtaSourceList()
+    this.getOtaSourceList()
     this.getOrderStatistics()
   },
   computed: {