MONSTER-ygh hai 1 ano
pai
achega
f174ae1393

+ 270 - 0
src/views/statisticalReport/seatInventory.vue

@@ -0,0 +1,270 @@
+<template>
+    <div class="app-container">
+      <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="80px">
+        <el-form-item label="票务管理:">
+          <el-select
+            v-model="queryParams.goodsId"
+            placeholder="票务管理"
+            clearable
+            @change="goodsChangeEven"
+            style="width: 100%;"
+          >
+            <el-option
+              v-for="dict in ticketList"
+              :key="dict.id"
+              :label="dict.goodsName"
+              :value="dict.goodsId"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="座位类型:">
+          <el-select
+            v-model="queryParams.seatTypeId"
+            placeholder="座位类型"
+            clearable
+            style="width: 100%;"
+          >
+            <el-option
+              v-for="dict in seatList"
+              :key="dict.seatTypeId"
+              :label="dict.seatTypeName"
+              :value="dict.seatTypeId"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="场次日期">
+          <el-date-picker
+            v-model="queryParams.time"
+            type="daterange"
+            value-format="yyyy-MM-dd"
+            range-separator="至"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+          <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+        </el-form-item>
+      </el-form>
+      <el-row :gutter="10" class="mb8"  style="margin-left: 0; margin-top: 10px">
+        <el-button
+          type="primary"
+          size="mini"
+          icon="el-icon-download"
+          :disabled="tableData.length === 0"
+          v-hasPermi="['statisticalReport:seatInventory:downloadExcel']"
+          @click="handleExport"
+          v-loading.fullscreen.lock="handleExportLoading"
+          element-loading-text="正在拼命生成数据中..."
+          element-loading-spinner="el-icon-loading"
+          element-loading-background="rgba(0, 0, 0, 0.5)"
+        >导出excel</el-button>
+        <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+      </el-row>
+  
+      <el-table ref="tables" v-loading="loading" :data="dataList" border>
+        <el-table-column label="序号" align="center" type="index" width="60"></el-table-column>
+        <el-table-column label="剧目名称" align="center" prop="performName" />
+        <el-table-column label="票务名称" align="center" prop="goodsName" />
+        <el-table-column label="座位类型" align="center" prop="seatTypeName" />
+        <el-table-column label="场次日期" align="center">
+          <template slot-scope="scope">
+            <span>{{ scope.row.performDate }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="场次" align="center">
+          <template slot-scope="scope">
+            <span>{{ scope.row.performTimeStart }} -- {{ scope.row.performTimeEnd }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="总库存" align="center">
+          <template slot-scope="scope">
+            <span>{{ scope.row.total }}张</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="已售数量" align="center">
+          <template slot-scope="scope">
+            <span>{{ scope.row.saleTotal }}张</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="已核销数量" align="center">
+          <template slot-scope="scope">
+            <span>{{ scope.row.usedTotal }}张</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="库存数量" align="center">
+          <template slot-scope="scope">
+            <span>{{ (scope.row.total - scope.row.saleTotal) >= 0 ? (scope.row.total - scope.row.saleTotal) : '' }}张</span>
+          </template>
+        </el-table-column>
+      </el-table>
+  
+      <pagination
+        v-show="total>0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+      />
+  
+    </div>
+  </template>
+  
+  <script>
+  
+  import { performTimeCount, downTimeCountListXls } from '@/api/statistics'
+  import { exportExcel } from '@/utils/exportexcel'
+  import { seatPricePageList } from '@/api/distribution/ticketMr'
+  export default {
+    name: "agreement",
+    dicts: ['agreement_type'],
+    data() {
+      return {
+        // 遮罩层
+        loading: true,
+        // 选中数组
+        ids: [],
+        // 非单个禁用
+        single: true,
+        // 非多个禁用
+        multiple: true,
+        // 显示搜索条件
+        showSearch: true,
+        // 总条数
+        total: 0,
+        // 用户表格数据
+        dataList: null,
+        // 弹出层标题
+        title: "",
+  
+        // 是否显示弹出层
+        open: false,
+        // 日期范围
+        dateRange: [],
+        // 查询参数
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+        },
+        visibleStatus: false,
+        newObj: {},
+        visibleType: '',
+        handleExportLoading: false,
+        tableData: {},
+        ticketList: [],
+        seatList: [],
+      };
+    },
+    created() {
+      this.getList();
+      this.ticketListApi();
+    },
+    methods: {
+      /** 查询列表 */
+      getList() {
+        this.loading = true;
+        if(this.queryParams.time){
+          this.queryParams.performStartDate = this.queryParams.time[0];
+          this.queryParams.performEndDate = this.queryParams.time[1];
+        }
+        performTimeCount(this.addDateRange(this.queryParams, this.dateRange))
+        .then(response => {
+            this.dataList = response.data.rows;
+            this.total = response.data.total;
+            this.loading = false;
+          }
+        );
+      },
+      /** 票务列表查询 */
+      ticketListApi() {
+        this.ticketList = []
+        seatPricePageList(this.addDateRange({pageNum: 1, pageSize: 100}))
+          .then(response => {
+            let ticketItemList = []
+            response.data.rows.forEach(item => {
+              if(ticketItemList.indexOf(item.goodsId) == -1){
+                this.ticketList.push(item);
+                ticketItemList.push(item.goodsId);
+              }
+            })
+          });
+      },
+      /** 座位类型列表 */
+      getSeatTypeList(obj) {
+        seatPricePageList(this.addDateRange({pageNum: 1, pageSize: 100, goodsId: obj.goodsId}))
+          .then(response => {
+            let ticketList = []
+            response.data.rows.forEach(item => {
+              if(ticketList.indexOf(item.seatTypeId) == -1){
+                this.seatList.push(item);
+                ticketList.push(item.seatTypeId);
+              }
+            })
+          });
+      },
+      // 取消按钮
+      cancel() {
+        this.open = false;
+      },
+      // 票务改变事件
+      goodsChangeEven() {
+        this.seatList = [];
+        this.$set(this.queryParams, 'seatTypeId', '');
+        let selectMap = {goodsId: this.queryParams.goodsId}
+        this.getSeatTypeList(selectMap);
+      },
+      /** 搜索按钮操作 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList();
+      },
+      /** 重置按钮操作 */
+      resetQuery() {
+        this.dateRange = [];
+        this.seatList = [];
+        this.$set(this.queryParams, 'time', '');
+        this.$set(this.queryParams, 'performStartDate', '');
+        this.$set(this.queryParams, 'performEndDate', '');
+        this.$set(this.queryParams, 'goodsId', '');
+        this.$set(this.queryParams, 'seatTypeId', '');
+        this.queryParams.pageNum = 1;
+        this.handleQuery();
+      },
+      /**
+       * 导出报表
+       * @date 2022-10-24
+       * @returns {any}
+       */
+      handleExport() {
+        this.$confirm('您确定要导出当前查询的数据吗?', '提示', {
+          confirmButtonText: '确定 ',
+          cancelButtonText: '取消 ',
+          type: 'warning'
+        })
+          .then(() => {
+            this.handleExportLoading = true;
+            // const { pageNum, pageSize} = this.params;
+            let postMap = {}
+            for (let key in this.queryParams) {
+              if(key != 'pageNum' && key != 'pageSize'){
+                postMap[key] = this.queryParams[key]
+              }
+            }
+            downTimeCountListXls(postMap)
+              .then((res) => {
+                exportExcel(res, '场次统计', '.xlsx');
+                this.handleExportLoading = false;
+              })
+              .catch(() => {
+                this.handleExportLoading = false;
+              });
+          })
+          .catch(() => {
+            this.$message.info('您已取消导出!');
+          });
+      },
+    }
+  };
+  </script>
+  

+ 270 - 0
src/views/statisticalReport/sessionInventory.vue

@@ -0,0 +1,270 @@
+<template>
+    <div class="app-container">
+      <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="80px">
+        <el-form-item label="票务管理:">
+          <el-select
+            v-model="queryParams.goodsId"
+            placeholder="票务管理"
+            clearable
+            @change="goodsChangeEven"
+            style="width: 100%;"
+          >
+            <el-option
+              v-for="dict in ticketList"
+              :key="dict.id"
+              :label="dict.goodsName"
+              :value="dict.goodsId"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="座位类型:">
+          <el-select
+            v-model="queryParams.seatTypeId"
+            placeholder="座位类型"
+            clearable
+            style="width: 100%;"
+          >
+            <el-option
+              v-for="dict in seatList"
+              :key="dict.seatTypeId"
+              :label="dict.seatTypeName"
+              :value="dict.seatTypeId"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="场次日期">
+          <el-date-picker
+            v-model="queryParams.time"
+            type="daterange"
+            value-format="yyyy-MM-dd"
+            range-separator="至"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+          <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+        </el-form-item>
+      </el-form>
+      <el-row :gutter="10" class="mb8"  style="margin-left: 0; margin-top: 10px">
+        <el-button
+          type="primary"
+          size="mini"
+          icon="el-icon-download"
+          :disabled="tableData.length === 0"
+          v-hasPermi="['statisticalReport:sessionInventory:downloadExcel']"
+          @click="handleExport"
+          v-loading.fullscreen.lock="handleExportLoading"
+          element-loading-text="正在拼命生成数据中..."
+          element-loading-spinner="el-icon-loading"
+          element-loading-background="rgba(0, 0, 0, 0.5)"
+        >导出excel</el-button>
+        <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+      </el-row>
+  
+      <el-table ref="tables" v-loading="loading" :data="dataList" border>
+        <el-table-column label="序号" align="center" type="index" width="60"></el-table-column>
+        <el-table-column label="剧目名称" align="center" prop="performName" />
+        <el-table-column label="票务名称" align="center" prop="goodsName" />
+        <el-table-column label="座位类型" align="center" prop="seatTypeName" />
+        <el-table-column label="场次日期" align="center">
+          <template slot-scope="scope">
+            <span>{{ scope.row.performDate }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="场次" align="center">
+          <template slot-scope="scope">
+            <span>{{ scope.row.performTimeStart }} -- {{ scope.row.performTimeEnd }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="总库存" align="center">
+          <template slot-scope="scope">
+            <span>{{ scope.row.total }}张</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="已售数量" align="center">
+          <template slot-scope="scope">
+            <span>{{ scope.row.saleTotal }}张</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="已核销数量" align="center">
+          <template slot-scope="scope">
+            <span>{{ scope.row.usedTotal }}张</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="库存数量" align="center">
+          <template slot-scope="scope">
+            <span>{{ (scope.row.total - scope.row.saleTotal) >= 0 ? (scope.row.total - scope.row.saleTotal) : '' }}张</span>
+          </template>
+        </el-table-column>
+      </el-table>
+  
+      <pagination
+        v-show="total>0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+      />
+  
+    </div>
+  </template>
+  
+  <script>
+  
+  import { performTimeCount, downTimeCountListXls } from '@/api/statistics'
+  import { exportExcel } from '@/utils/exportexcel'
+  import { seatPricePageList } from '@/api/distribution/ticketMr'
+  export default {
+    name: "agreement",
+    dicts: ['agreement_type'],
+    data() {
+      return {
+        // 遮罩层
+        loading: true,
+        // 选中数组
+        ids: [],
+        // 非单个禁用
+        single: true,
+        // 非多个禁用
+        multiple: true,
+        // 显示搜索条件
+        showSearch: true,
+        // 总条数
+        total: 0,
+        // 用户表格数据
+        dataList: null,
+        // 弹出层标题
+        title: "",
+  
+        // 是否显示弹出层
+        open: false,
+        // 日期范围
+        dateRange: [],
+        // 查询参数
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+        },
+        visibleStatus: false,
+        newObj: {},
+        visibleType: '',
+        handleExportLoading: false,
+        tableData: {},
+        ticketList: [],
+        seatList: [],
+      };
+    },
+    created() {
+      this.getList();
+      this.ticketListApi();
+    },
+    methods: {
+      /** 查询列表 */
+      getList() {
+        this.loading = true;
+        if(this.queryParams.time){
+          this.queryParams.performStartDate = this.queryParams.time[0];
+          this.queryParams.performEndDate = this.queryParams.time[1];
+        }
+        performTimeCount(this.addDateRange(this.queryParams, this.dateRange))
+        .then(response => {
+            this.dataList = response.data.rows;
+            this.total = response.data.total;
+            this.loading = false;
+          }
+        );
+      },
+      /** 票务列表查询 */
+      ticketListApi() {
+        this.ticketList = []
+        seatPricePageList(this.addDateRange({pageNum: 1, pageSize: 100}))
+          .then(response => {
+            let ticketItemList = []
+            response.data.rows.forEach(item => {
+              if(ticketItemList.indexOf(item.goodsId) == -1){
+                this.ticketList.push(item);
+                ticketItemList.push(item.goodsId);
+              }
+            })
+          });
+      },
+      /** 座位类型列表 */
+      getSeatTypeList(obj) {
+        seatPricePageList(this.addDateRange({pageNum: 1, pageSize: 100, goodsId: obj.goodsId}))
+          .then(response => {
+            let ticketList = []
+            response.data.rows.forEach(item => {
+              if(ticketList.indexOf(item.seatTypeId) == -1){
+                this.seatList.push(item);
+                ticketList.push(item.seatTypeId);
+              }
+            })
+          });
+      },
+      // 取消按钮
+      cancel() {
+        this.open = false;
+      },
+      // 票务改变事件
+      goodsChangeEven() {
+        this.seatList = [];
+        this.$set(this.queryParams, 'seatTypeId', '');
+        let selectMap = {goodsId: this.queryParams.goodsId}
+        this.getSeatTypeList(selectMap);
+      },
+      /** 搜索按钮操作 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList();
+      },
+      /** 重置按钮操作 */
+      resetQuery() {
+        this.dateRange = [];
+        this.seatList = [];
+        this.$set(this.queryParams, 'time', '');
+        this.$set(this.queryParams, 'performStartDate', '');
+        this.$set(this.queryParams, 'performEndDate', '');
+        this.$set(this.queryParams, 'goodsId', '');
+        this.$set(this.queryParams, 'seatTypeId', '');
+        this.queryParams.pageNum = 1;
+        this.handleQuery();
+      },
+      /**
+       * 导出报表
+       * @date 2022-10-24
+       * @returns {any}
+       */
+      handleExport() {
+        this.$confirm('您确定要导出当前查询的数据吗?', '提示', {
+          confirmButtonText: '确定 ',
+          cancelButtonText: '取消 ',
+          type: 'warning'
+        })
+          .then(() => {
+            this.handleExportLoading = true;
+            // const { pageNum, pageSize} = this.params;
+            let postMap = {}
+            for (let key in this.queryParams) {
+              if(key != 'pageNum' && key != 'pageSize'){
+                postMap[key] = this.queryParams[key]
+              }
+            }
+            downTimeCountListXls(postMap)
+              .then((res) => {
+                exportExcel(res, '场次统计', '.xlsx');
+                this.handleExportLoading = false;
+              })
+              .catch(() => {
+                this.handleExportLoading = false;
+              });
+          })
+          .catch(() => {
+            this.$message.info('您已取消导出!');
+          });
+      },
+    }
+  };
+  </script>
+  

+ 11 - 6
src/views/statistics/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="app-container">
-    <!-- <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="80px">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="80px">
       <el-form-item label="报表名称">
         <el-input
           v-model="queryParams.name"
@@ -14,10 +14,13 @@
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
-    </el-form> -->
-
+    </el-form>
     <div class="box-class clearfix">
-      <div class="item-class clearfix" @click="pageLink(item.url)" v-for="item in itemList" :key="item.id">
+      <div 
+      class="item-class clearfix" 
+      @click="pageLink(item.url)" 
+      v-hasPermi="[item.hasPermi]"
+      v-for="item in itemList" :key="item.id">
         <div class="span-img-class"></div>
         <div class="span-text-class">{{ item.name }}</div>
       </div>
@@ -47,7 +50,9 @@ export default {
       itemList: [
         // {id: 1, name: '总览统计', url: ''},
         // {id: 2, name: '渠道统计', url: ''},
-        {id: 3, name: '场次统计', url: 'statisticalReport/session'},
+        {id: 3, name: '场次统计', hasPermi: 'session:session:list', url: 'statisticalReport/session'},
+        {id: 4, name: '场次库存', hasPermi: 'statisticalReport:sessionInventory:list', url: 'statisticalReport/sessionInventory'},
+        {id: 5, name: '座位库存', hasPermi: 'statisticalReport:seatInventory:list', url: 'statisticalReport/seatInventory'},
       ]
     };
   },
@@ -87,7 +92,7 @@ export default {
 
 <style lang="scss" scoped>
    .box-class{
-     padding: 60px 20px;
+     padding: 20px 20px;
      .item-class:hover{
        box-shadow: 0 2px 4px rgba(93, 37, 37, 0.12), 0 0 6px rgba(0, 0, 0, .04);
      }