2 Commit-ok 76b6e22b21 ... 51c890900f

Szerző SHA1 Üzenet Dátum
  LaveyD 51c890900f Merge branch 'master' of http://git.whgxhx.com:53000/HHPW/clearticket_ota 3 napja
  LaveyD a12cf5b15b update 3 napja

+ 4 - 0
src/api/order.js

@@ -44,3 +44,7 @@ export function getOtaSourceList (params) {
 export function getOrderCancelStatistics (params) {
   return http.post('/tenant/statistics/orderCancelStatistics', { data: params })
 }
+
+export function getInventoryList (params) {
+  return http.post('/tenant/invoiceRecord', { data: params })
+}

+ 6 - 0
src/router/index.js

@@ -201,6 +201,12 @@ let routerMap = [
         component: () => import('@/views/queryReport/cancelReport'),
         meta: { title: '退票统计', permissionName: 'stat-center:cancel-stat' }
       },
+      {
+        path: 'invoiceList',
+        name: 'invoiceList',
+        component: () => import('@/views/queryReport/invoiceList'),
+        meta: { title: '开票记录', permissionName: 'stat-center:invoice-list' }
+      },
       {
         path: 'reportExport',
         name: 'reportExport',

+ 87 - 22
src/views/queryReport/cancelReport.vue

@@ -57,6 +57,24 @@
             </el-option>
           </el-select>
         </el-form-item>
+        <el-form-item
+          label="分组筛选"
+          style="width:100%">
+          <el-checkbox-group
+            v-model="selectKeys"
+            :min="0"
+            :max="4">
+            <draggable :list="groupKeys">
+              <el-checkbox
+                :key="item.value"
+                :label="item.value"
+                v-for="(item) in groupKeys"
+              >
+                {{ item.label }}
+              </el-checkbox>
+            </draggable>
+          </el-checkbox-group>
+        </el-form-item>
       </el-form>
       <div class="btn-wrap">
         <el-button
@@ -78,7 +96,14 @@
         :data="tableData"
         stripe
         row-class-name="is-center"
-        v-loading="loading">
+        v-loading="loading"
+        :span-method="objectSpanMethod">
+        <el-table-column
+          v-for="(item) in finalGroup"
+          :key="item.value"
+          :prop="item.prop || item.value"
+          :label="item.label">
+        </el-table-column>
         <el-table-column
           prop="otaSourceName"
           label="订单渠道">
@@ -103,26 +128,6 @@
           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
@@ -165,6 +170,10 @@ import TicketInfo from './orderList/TicketInfo'
 import { orderStatus } from '@/const'
 import moment from 'moment'
 
+const groupKeys = [
+  { value: 'orderDateDay', label: '日期' }
+]
+
 export default {
   name: 'salesReport',
   components: {
@@ -175,6 +184,7 @@ export default {
   },
   data () {
     return {
+      groupKeys,
       ticketTypeList: [],
       otaSourceList: [],
       projectName: localStorage.getItem('otaProject'),
@@ -189,13 +199,26 @@ export default {
         pageNum: 1,
         pageSize: 10
       },
+      selectKeys: [],
+      finalGroup: [],
+      tableIndex: 1,
+      OrderIndexArr: [],
       orderStatusDic: orderStatus,
       loading: false,
       tableData: [],
       total: 0,
       currentItem: {},
       orderDialogVisible: false,
-      guestDialogVisible: false
+      guestDialogVisible: false,
+      invoiceDialogVisible: false,
+      invoiceLoading: false,
+      invoiceTableData: [],
+      invoiceTotal: 0,
+      invoiceQuery: {
+        pageNum: 1,
+        pageSize: 10
+      },
+      currentInvoiceRow: {}
     }
   },
   created () {
@@ -213,9 +236,15 @@ export default {
     otaList () {
       const list = JSON.parse(localStorage.getItem('otaList'))
       return this.projectName === 'YINXIANGMAZU' && !this.queryClear ? list.filter(item => item.otaSourceCode !== 'CLEARWX') : list
+    },
+    permissionList () {
+      return this.$store.state.user.menuList || []
     }
   },
   methods: {
+    hasPermission (key) {
+      return !!this.permissionList.some(item => item.code === key)
+    },
     checkRefundVisible (item) {
       if (item.status !== 'CANCELED') return true
       if (item.status === 'CANCELED') {
@@ -264,12 +293,44 @@ export default {
       if (!this.form.otaSourceNameList) {
         this.form.otaSourceNameList = []
       }
+
+      this.finalGroup = this.groupKeys.filter(i => {
+        return this.selectKeys.includes(i.value)
+      })
+
+      this.form.groupByList = this.finalGroup.map(i => i.value)
+
       this.loading = true
       getOrderCancelStatistics(this.form).then(res => {
         this.tableData = res.data
         this.loading = false
       })
     },
+    objectSpanMethod ({ row, column, rowIndex, columnIndex }) {
+      if (columnIndex < this.finalGroup.length) {
+        if (!(this.OrderIndexArr[columnIndex] && this.OrderIndexArr[columnIndex].length)) return
+
+        for (let i = 0; i < this.OrderIndexArr[columnIndex].length; i++) {
+          let element = this.OrderIndexArr[columnIndex][i]
+          for (let j = 0; j < element.length; j++) {
+            let item = element[j]
+            if (rowIndex === item) {
+              if (j === 0) {
+                return {
+                  rowspan: element.length,
+                  colspan: 1
+                }
+              } else if (j !== 0) {
+                return {
+                  rowspan: 0,
+                  colspan: 0
+                }
+              }
+            }
+          }
+        }
+      }
+    },
     showOrderInfo (item, type) {
       if ((item.otaSourceCode === 'CLEARWX' || item.otaSourceCode === 'CLEARWXDEV') && type === 'cancel') return this.$message.info('自营平台订单请到自营后台办理退票')
       this.currentItem = item
@@ -280,6 +341,10 @@ export default {
       this.currentItem = item
       this.guestDialogVisible = true
     },
+    formatInvoiceDetails (details) {
+      if (!details || !details.length) return ''
+      return details.map(item => item.ticketNo).filter(Boolean).join('、')
+    },
     reportExport () {
       this.$confirm(`是否要导出明细数据`, '确认提示', {
         confirmButtonText: '是',

+ 323 - 0
src/views/queryReport/invoiceList.vue

@@ -0,0 +1,323 @@
+<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-input
+            v-model="form.channelName"
+            placeholder="请输入">
+          </el-input>
+        </el-form-item>
+        <el-form-item
+          label="开票人"
+          prop="userId">
+          <el-input
+            v-model="form.userId"
+            placeholder="请输入">
+          </el-input>
+        </el-form-item>
+        <el-form-item
+          label="买方名称"
+          prop="invoiceBuyerName">
+          <el-input
+            v-model="form.invoiceBuyerName"
+            placeholder="请输入">
+          </el-input>
+        </el-form-item>
+        <el-form-item
+          label="买方税号"
+          prop="invoiceBuyerTaxNum">
+          <el-input
+            v-model="form.invoiceBuyerTaxNum"
+            placeholder="请输入">
+          </el-input>
+        </el-form-item>
+        <el-form-item
+          label="买方接收邮箱"
+          prop="invoiceBuyerReceiveEmail">
+          <el-input
+            v-model="form.invoiceBuyerReceiveEmail"
+            placeholder="请输入">
+          </el-input>
+        </el-form-item>
+        <el-form-item
+          label="买方接收号码"
+          prop="invoiceBuyerReceivePhone">
+          <el-input
+            v-model="form.invoiceBuyerReceivePhone"
+            placeholder="请输入">
+          </el-input>
+        </el-form-item>
+        <el-form-item
+          label="状态"
+          prop="status">
+          <el-select
+            clearable
+            v-model="form.status"
+            placeholder="请选择">
+            <el-option
+              label="已开票"
+              value="SUCCESS"></el-option>
+            <el-option
+              label="开票失败"
+              value="FAILED"></el-option>
+            <el-option
+              label="开票中"
+              value="INVOICING"></el-option>
+            <el-option
+              label="发票红冲中"
+              value="RED_INVOICING"></el-option>
+            <el-option
+              label="发票已红冲"
+              value="RED_SUCCESS"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item
+          label="票号"
+          prop="ticketNo">
+          <el-input
+            v-model="form.ticketNo"
+            placeholder="请输入">
+          </el-input>
+        </el-form-item>
+        <el-form-item
+          label="开票备注"
+          prop="remark">
+          <el-input
+            v-model="form.remark"
+            placeholder="请输入">
+          </el-input>
+        </el-form-item>
+      </el-form>
+      <div class="btn-wrap">
+        <el-button
+          @click="reset">重置</el-button>
+        <el-button
+          type="primary"
+          @click="getInvoiceList($event,true)">搜索</el-button>
+        <el-button
+          type="primary"
+          @click="reportExport">导出</el-button>
+      </div>
+    </div>
+
+    <div class="tableBox">
+      <!-- <div class="block-title">
+        查询信息
+      </div> -->
+      <el-table
+        :data="invoiceTableData"
+        stripe
+        row-class-name="is-center"
+        v-loading="invoiceLoading">
+        <el-table-column
+          prop="createTime"
+          label="创建时间"
+          width="160">
+        </el-table-column>
+        <el-table-column
+          prop="channelName"
+          label="渠道">
+        </el-table-column>
+        <el-table-column
+          prop="orderNo"
+          label="订单号"
+          width="180">
+        </el-table-column>
+        <el-table-column
+          prop="price"
+          label="金额">
+        </el-table-column>
+        <el-table-column
+          prop="invoiceSellerName"
+          label="销方名称"
+          width="140">
+        </el-table-column>
+        <el-table-column
+          prop="invoiceBuyerName"
+          label="购方名称"
+          width="140">
+        </el-table-column>
+        <el-table-column
+          prop="invoiceBuyerTaxNum"
+          label="购方税号"
+          width="160">
+        </el-table-column>
+        <el-table-column
+          prop="submitTime"
+          label="提交时间"
+          width="160">
+        </el-table-column>
+        <el-table-column
+          prop="completeTime"
+          label="完成时间"
+          width="160">
+        </el-table-column>
+        <el-table-column
+          prop="status"
+          label="状态">
+        </el-table-column>
+        <el-table-column
+          prop="remark"
+          label="备注"
+          width="160">
+        </el-table-column>
+        <el-table-column
+          prop="errInfo"
+          label="错误信息"
+          width="200">
+        </el-table-column>
+        <el-table-column
+          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
+          label="票号">
+          <template slot-scope="scope">
+            <span>{{ formatInvoiceDetails(scope.row.details) }}</span>
+          </template>
+        </el-table-column>
+      </el-table>
+      <el-pagination
+        background
+        :current-page.sync="form.pageNum"
+        @current-change="getInvoiceList"
+        layout="total, prev, pager, next"
+        :total="invoiceTotal">
+      </el-pagination>
+    </div>
+
+  </div>
+</template>
+<script>
+import { getInventoryList } from '@/api/order'
+import moment from 'moment'
+
+export default {
+  name: 'salesReport',
+  data () {
+    return {
+      form: {
+        createTimeBegin: moment().startOf('day'),
+        createTimeEnd: moment().endOf('day'),
+        channelName: '',
+        userId: '',
+        invoiceBuyerName: '',
+        invoiceBuyerTaxNum: '',
+        invoiceBuyerReceiveEmail: '',
+        invoiceBuyerReceivePhone: '',
+        status: '',
+        ticketNo: '',
+        remark: '',
+        export: false,
+        pageNum: 1,
+        pageSize: 10
+      },
+      invoiceLoading: false,
+      invoiceTableData: [],
+      invoiceTotal: 0
+    }
+  },
+  created () {
+    this.getInvoiceList()
+  },
+  methods: {
+    reset () {
+      this.$refs.form.resetFields()
+    },
+    getInvoiceList (e, goFirst) {
+      if (goFirst) { this.form.pageNum = 1 }
+
+      if (!this.form.createTimeBegin || !this.form.createTimeEnd) {
+        this.$message.error('请选择起始时间和截止时间')
+        return
+      }
+
+      this.form.createTimeBegin = moment(this.form.createTimeBegin).format('YYYY-MM-DD HH:mm:ss')
+      this.form.createTimeEnd = moment(this.form.createTimeEnd).format('YYYY-MM-DD HH:mm:ss')
+
+      this.invoiceLoading = true
+      getInventoryList(this.form).then(res => {
+        const data = res.data || {}
+        this.invoiceTableData = data.records || []
+        this.invoiceTotal = data.total || 0
+        this.invoiceLoading = false
+      }).catch(() => {
+        this.invoiceLoading = false
+      })
+    },
+    formatInvoiceDetails (details) {
+      if (!details || !details.length) return ''
+      return details.map(item => item.ticketNo).filter(Boolean).join('、')
+    },
+    reportExport () {
+      this.$confirm(`是否要导出明细数据`, '确认提示', {
+        confirmButtonText: '是',
+        cancelButtonText: '否',
+        type: 'warning'
+      }).then(() => {
+        this.handelExport({
+          ...this.form,
+          export: true,
+          exportDetail: true
+        })
+      }).catch(() => {
+        this.handelExport({
+          ...this.form,
+          export: true,
+          exportDetail: false
+        })
+      })
+    },
+    handelExport (params) {
+      getInventoryList(params).then(res => {
+        this.$confirm('导出成功,是否去下载页', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.$router.push('/queryReport/reportExport')
+        }).catch(() => {})
+      }, () => {
+        this.$notify.error({
+          title: '提示',
+          message: '导出失败'
+        })
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>