| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676 |
- <!--
- * @Description: 详情弹框
- * @Author: Sugar.
- * @Date: 2023-11-24 13:55:00
- * @LastEditors: gcz
- * @LastEditTime: 2025-03-20 15:30:52
- * @FilePath: \great_webui\src\views\order\orderMr\dialog\details.vue
- * @Copyright: Copyright (c) 2016~2023 by Sugar., All Rights Reserved.
- -->
- <template>
- <el-dialog :title="title" :visible.sync="open" width="96%" append-to-body :close-on-click-modal="false"
- @close="cancel">
- <div v-loading="loading" class="dialog dialog-bbb" v-if="form">
- <div v-loading="loading_form" element-loading-text="加载详情中...">
- <!-- 基础信息 -->
- <div class="title-class" style="margin-top: 0">基础信息</div>
- <el-row v-for="(item, index) in formList" :key="index">
- <el-col :span="12" v-for="(item1, index1) in item" :key="index1">
- <div class="grid-content bg-purple item-class">
- <span>{{ item1.lable }}</span>
- <span>{{ form[item1.key] }}</span>
- </div>
- </el-col>
- </el-row>
- <el-row>
- <el-form :model="form" ref="form" size="mini" :rules="rules" label-width="100px">
- <div style="display: flex;">
- <el-form-item label="场次日期:" prop="performDate">
- <el-date-picker v-model="form.performDate" type="date" @change="performDateEven"
- value-format="yyyy-MM-dd" placeholder="选择日期">
- </el-date-picker>
- </el-form-item>
- <el-form-item label="场次:" prop="performTimeId">
- <el-select v-model="form.performTimeId" laceholder="选择场次" clearable style="width: 100%;"
- @change="performTimeIdEven">
- <el-option v-for="dict in performTimeList" :key="dict.performTimeId" :label="dict.performInterval"
- :value="dict.performTimeId" />
- </el-select>
- </el-form-item>
- </div>
- <div style="display: flex;">
- <el-form-item label="票务名称:" prop="goodsId">
- <el-select v-model="form.goodsId" placeholder="票务名称" clearable @change="goodsChangeEven"
- style="width: 100%;">
- <el-option v-for="dict in ticketList" :key="dict.id" :label="dict.goodsName" :value="dict.id" />
- </el-select>
- </el-form-item>
- <el-form-item label="票档:" prop="seatTypeId">
- <el-select v-model="form.seatTypeId" placeholder="票档" clearable @change="seatChangeEven"
- style="width: 100%;">
- <el-option v-for="dict in seatList" :key="dict.seatTypeId" :label="dict.seatTypeName"
- :value="dict.seatTypeId" />
- </el-select>
- </el-form-item>
- </div>
- </el-form>
- </el-row>
- <el-row>
- <el-col :span="12">
- <div class="grid-content bg-purple item-class">销售价: <span>{{ form.price || '' }}/人</span></div>
- </el-col>
- <el-col :span="12">
- <div class="grid-content bg-purple item-class">应收金额: <span>{{ this.form.viewerList && (form.price || form.price === 0 ) ? form.price * this.form.viewerList.length : '' }}</span></div>
- </el-col>
- </el-row>
- <!-- 观影人员信息 -->
- <div class="title-class" style="display: flex;">
- 观影人员信息:
- <el-upload class="upload-demo" :action="uploadObj.url" :headers="uploadObj.headers" :auto-upload="false"
- :disabled="uploadLoading" :show-file-list="false" :on-change="beforeAvatarUpload">
- <el-button size="small" type="primary" :loading="uploadLoading">{{ form.viewerList &&
- form.viewerList.length == 0 ? '导入excel' : '重新导入excel' }}</el-button>
- <div slot="tip" class="el-upload__tip">
- 上传excel文件,导入模板表头序号、姓名、身份证号码
- <i @click="handleExport" style="color: #1890ff;cursor: pointer;">下载模板</i>
- </div>
- </el-upload>
- </div>
- <el-row>
- <el-col :span="24">
- <el-table ref="tables" :data="form.viewerList" border size="mini">
- <el-table-column label="序号" align="center" type="index" width="50"></el-table-column>
- <el-table-column label="姓名" align="center" prop="name" />
- <el-table-column label="身份证号码" align="center" prop="cardId" />
- </el-table>
- </el-col>
- </el-row>
- </div>
- <div class="dialog-bbb_2" v-loading="loading_seta" element-loading-text="加载座位图中...">
- <seatBox ref="seatBox" :seatTypeLimit="configStockNumObj" @selectSeat="selectSeat" height="100%"
- channelType="group" />
- </div>
- </div>
- <span slot="footer" class="dialog-footer">
- <el-button @click="cancel()" :loading="loading">取消</el-button>
- <el-button type="primary" @click="handleResetOpen()" :loading="loading">
- <span v-if="loading">提交中...</span>
- <span v-else>确认修改</span>
- </el-button>
- </span>
- </el-dialog>
- </template>
- <script>
- import {
- getSelectById,
- getDateTimeAllApi,
- listGoodsByTeamIdApi,
- teamOrderReSubmitApi
- } from '@/api/order/groupBuyingMr'
- import { downloadModel, uploadExcel } from "@/api/team/applicationMr";
- import { pageList as getSeatType } from '@/api/seatTypeMr/seatTypeMr'
- import seatBox from '@/components/seatBox/index.vue';
- import { countBySeatTyp } from '@/api/ticketMr/InventoryTemplate'
- import {
- querySeatListNew
- } from '@/api/windowTicketSales/ticketingSales'
- import { getToken } from "@/utils/auth";
- export default {
- name: "detailsDia",
- dicts: ['order_form_type', 'order_status_type', 'pay_way_type', 'personnel_type'],
- components: {
- seatBox
- },
- data() {
- return {
- title: "订单详情",
- model: "EDIT",
- open: false,
- loading: false,
- formList: [
- [
- { lable: '团队名称:', key: 'teamName' },
- { lable: '团队类型:', key: 'teamType' },
- ],
- [
- { lable: '预约场馆:', key: 'theatreName' },
- { lable: '预约演出厅:', key: 'auditoriumName' },
- ],
- [
- { lable: '预约剧目:', key: 'performName' },
- { lable: '报名时间:', key: 'applyTime' },
- ],
- [
- { lable: '客户负责人:', key: 'teamContact' },
- { lable: '销售员:', key: 'salerPerson' },
- ],
- [
- { lable: '联系电话:', key: 'teamMobile' },
- { lable: '带队负责人姓名:', key: 'linkName' },
- ],
- [
- { lable: '带队负责人联系电话:', key: 'linkPhone' },
- ],
- ],
- form: {
- id: undefined,
- },
- performerList: [],
- refund: false,
- dataList: [],
- merchantTheatreAuditoriumListS: [], // 演出厅
- merchantPerformTimeListS: [], // 场次
- querySeatListS: [], // 座位
- goodsPageListS: [], // 票务
- goodsPageListSAll: [], // 票务全部
- lockOrUnLockLoading: false,
- performId: '',// 剧目ID
- scaleNum: 30,
- justifyContent: false,
- loading_form: false,// 加载表单
- loading_seta: false, // 加载座位
- orderType: 'normal', // 订单类型 normal:没有新订单和原订单,new:有新订单,old:有原订单
- setList: [],
- seatTypeList: [],
- seatSelectList: [],
- configStockNumObj: {},
- countBySeatTypList: [],
- seatTypeListAll: [],
- seatLoading: false,
- seatLoadText: '获取座位中...',
- goodsList: [],
- ticketList: [],
- seatList: [],
- merchantList: [],
- theatreList: [],
- teamList: [],
- sessionList: [],
- performTimeList: [],
- teamIdLoading: false,
- rules: {
- performDate: [{ required: true, message: "请选择日期", trigger: ["change", "blur"] }],
- goodsId: [{ required: true, message: "请选择票务", trigger: ["change", "blur"] }],
- seatTypeId: [{ required: true, message: "请选择座位类型", trigger: ["change", "blur"] }],
- performTimeId: [{ required: true, message: "请选择预约场次", trigger: ["change", "blur"] }],
- },
- uploadLoading: false,
- uploadObj: {
- url: process.env.VUE_APP_UPLOAD_FILE_API + "/upload/single/minio",
- Headers: { Authorization: "Bearer " + getToken() },
- },
- };
- },
- created() {
- this.getSeatTypeList()
- },
- methods: {
- /**
- * 打开弹框
- * @date 2023-11-22
- * @param {any} obj
- * @returns {any}
- */
- async openDialog(title, obj, type) {
- try {
- this.orderType = type;
- this.open = true;
- this.form = {}
- this.querySeatListS = [];
- this.setList = [];
- this.seatSelectList = [];
- if (this.orderType == 'old') {
- this.title = "订单详情(已改签)"
- } else if (this.orderType == 'new') {
- id = row.newOrderId
- this.title = "改签订单详情"
- } else {
- this.title = "订单详情"
- }
- await this.getSelectByIdApi(obj);
- await this.countBySeatTypFun(this.form.auditoriumId)
- await this.getDateTimeAllFun()
- await this.getPerformTimeList()
- this.goodsChangeEven(this.form.goodsId, 'dfsd')
- await this.querySeatListFun()
- } catch (error) {
- console.error(error)
- this.open = false;
- }
- },
- /** 获取详情 */
- async getSelectByIdApi(row) {
- let id = row.id;
- if (this.orderType == 'old') {
- id = row.orgOrderId
- } else if (this.orderType == 'new') {
- id = row.newOrderId
- }
- try {
- this.loading_form = true// 加载表单
- let res = await getSelectById(id)
- this.seatSelectList = []//res.data.viewerList
- this.$set(this, "form", {
- ...res.data,
- "viewerList": res.data.viewersOrderList.map((item) => {
- return {
- name: item.name,
- cardId: item.idCard
- }
- }),
- })
- this.loading_form = false// 加载表单
- } catch (error) {
- console.error(error)
- this.loading_form = false// 加载表单
- }
- },
- async querySeatListFun() {
- try {
- this.loading_seta = true // 加载座位
- let res = await querySeatListNew({
- auditoriumId: this.form.auditoriumId,
- timeId: this.form.performTimeId,
- goodsId: this.form.goodsId,
- channelType: 'group'
- })
- let list1 = []
- res.data.forEach((item, index) => {
- list1.push({
- ...item,
- isSame: item.seatTypeId != this.form.seatTypeId
- })
- })
- this.setList = list1;
- let list = this.seatSelectList
- let list3 = []
- this.countBySeatTypList.forEach((item, index) => {
- list3.push(item.seatTypeId)
- })
- let list4 = []
- this.seatTypeList.forEach((item, index) => {
- if (list3.includes(item.id)) {
- list4.push({ ...item })
- }
- })
- this.$nextTick(() => {
- this.$refs.seatBox.querySeatListFun(true, this.setList, list, list4)
- })
- this.loading_seta = false// 加载表单
- } catch (error) {
- console.error(error)
- this.loading_seta = false// 加载表单
- }
- },
- /** 获取座位类型全部 说明 */
- getSeatTypeList() {
- getSeatType({
- pageNum: 1,
- pageSize: 999,
- })
- .then(response => {
- this.seatTypeList = response.data.rows;
- });
- },
- /** 获取剧目的座位类型 */
- async countBySeatTypFun(value) {
- try {
- if (!value) return
- let res = await countBySeatTyp({ auditoriumId: value })
- this.countBySeatTypList = res.data ? res.data : []
- let obj = {}
- this.countBySeatTypList.forEach((item, index) => {
- obj['seatNum_' + item.seatTypeId] = {
- stockTotal: item.stock,
- stockSelect: item.stock,
- stockYes: item.stock,
- stockNo: 0,
- isNoSelect: true,
- }
- if (item.seatTypeId == this.form.seatTypeId) {
- obj['seatNum_' + item.seatTypeId].stockYes = item.stock - this.form.viewerList.length
- obj['seatNum_' + item.seatTypeId].isNoSelect = false
- }
- })
- this.configStockNumObj = obj
- } catch (error) {
- console.error("error1====", error)
- }
- },
- /** 选择座位 */
- selectSeat(list) {
- let list1 = []
- list.forEach((item) => {
- list1.push({
- seatId: item.id,
- seatName: item.name
- })
- })
- this.seatSelectList = list1
- console.log("已选择的====", list)
- },
- // 选择场次时间
- performDateEven() {
- this.$set(this.form, 'performTimeId', '')
- this.$set(this.form, 'goodsId', '');
- this.$set(this.form, 'seatTypeId', '');
- this.$set(this.form, 'price', '')
- this.performTimeList = [] // 场次
- this.ticketList = [] // 票务
- this.seatList = [] // 座位类型
- this.getDateTimeAllFun(); // 获取场次
- },
- /**
- * 获取剧目演出厅某日期场次列表
- *
- */
- async getDateTimeAllFun() {
- try {
- if (!this.form.performDate) {
- this.$message.error("请选择日期!");
- return false
- }
- let res = await getDateTimeAllApi({
- performDate: this.form.performDate,
- performId: this.form.performId,
- auditoriumId: this.form.auditoriumId,
- })
- this.performTimeList = res.data.list;
- } catch (error) {
- console.error(error)
- }
- },
- /**
- * 查询团队剧目演出厅座位类型票务信息
- *
- */
- async getPerformTimeList() {
- try {
- if (!this.form.performTimeId) {
- this.$message.error("请选择场次!");
- return false
- }
- let res = await listGoodsByTeamIdApi({
- performTimeId: this.form.performTimeId,
- performId: this.form.performId,
- auditoriumId: this.form.auditoriumId,
- teamId: this.form.teamId
- })
- this.ticketList = res.data;
- } catch (error) {
- }
- },
- /** 选择场次 */
- performTimeIdEven(val) {
- this.$set(this.form, 'goodsId', '');
- this.$set(this.form, 'goodsName', '')
- this.$set(this.form, 'seatTypeId', '');
- this.$set(this.form, 'price', '')
- this.ticketList = [] // 票务
- this.seatList = [] // 座位类型
- this.getPerformTimeList() // 获取票务管理
- },
- // 票务改变事件
- goodsChangeEven(id, type) {
- console.log("sdfsdf", id, type)
- let list = []
- this.ticketList.forEach(item => {
- if (item.id == id) {
- this.$set(this.form, 'goodsName', item.goodsName)
- list = item.seatTypePriceList
- }
- })
- if (!type) {
- this.$set(this.form, 'price', '');
- this.$set(this.form, 'seatTypeId', '');
- }
- this.seatList = [];
- console.log("ffffffffff=====", list)
- //let selectMap = {goodsId: this.form.goodsId, performId: this.form.performId}
- //this.getSeatTypeList(selectMap); 获取走位
- this.seatList = [].concat(list)
- },
- // 座位类型改变事件
- seatChangeEven(val) {
- this.seatList.forEach(item => {
- if (item.seatTypeId == val) {
- this.$set(this.form, 'seatTypeName', item.seatTypeName);
- this.$set(this.form, 'price', item.saleAmount);
- }
- })
- let obj = {}
- this.countBySeatTypList.forEach((item, index) => {
- obj['seatNum_' + item.seatTypeId] = {
- stockTotal: item.stock,
- stockSelect: item.stock,
- stockYes: item.stock,
- stockNo: 0,
- isNoSelect: true,
- }
- if (item.seatTypeId == this.form.seatTypeId) {
- obj['seatNum_' + item.seatTypeId].stockYes = item.stock - this.form.viewerList.length
- obj['seatNum_' + item.seatTypeId].isNoSelect = false
- }
- })
- this.configStockNumObj = obj
- this.seatSelectList = []
- let list = JSON.parse(JSON.stringify(this.setList))
- let list1 = []
- list.forEach((item, index) => {
- list1.push({
- ...item,
- isSame: item.seatTypeId != this.form.seatTypeId
- })
- })
- this.setList = list1;
- let list3 = []
- this.countBySeatTypList.forEach((item, index) => {
- list3.push(item.seatTypeId)
- })
- let list4 = []
- this.seatTypeList.forEach((item, index) => {
- if (list3.includes(item.id)) {
- list4.push({ ...item })
- }
- })
- this.$refs.seatBox.querySeatListFun(true, this.setList, this.seatSelectList, list4)
- },
- /**
- * 关闭弹框
- * @date 2023-11-22
- * @returns {any}
- */
- cancel() {
- this.open = false;
- },
- /** 导出按钮操作 */
- async handleExport() {
- //this.downloadGet('member/marketTeamApply/downTeamApplyTemplate', {}, `观影人员上传模板_${new Date().getTime()}.xlsx`)
- try {
- let res = await downloadModel()
- let fileName = `观影人员上传模板_${new Date().getTime()}.xlsx`
- let blob = new Blob([res])
- let href = window.URL.createObjectURL(blob)
- // 创建下载按钮a标签进行自动点击下载,下载完后移除按钮a标签
- let downloadDom = document.createElement('a')
- downloadDom.href = href
- downloadDom.download = fileName //--不是必须 若需要【前端重命名文件夹】的话这句代码就需要
- document.body.appendChild(downloadDom)
- downloadDom.click()
- document.body.removeChild(downloadDom)
- window.URL.revokeObjectURL(href)
- } catch (error) {
- }
- },
- /**
- * 上传文件之前之前
- * @date 2023-11-22
- * @param {any} file
- * @returns {any}
- */
- beforeAvatarUpload(file) {
- this.uploadExcelApi(file.raw);
- },
- // 上传
- uploadExcelApi(file) {
- try {
- let formData = new FormData();
- formData.append("file", file);
- this.uploadLoading = true;
- uploadExcel(formData).then(response => {
- this.$message.success("上传成功!");
- this.$set(this.form, 'viewerList', response.data)
- this.seatChangeEven(this.form.seatTypeId)
- });
- } catch (e) {
- } finally {
- this.uploadLoading = false;
- }
- },
- /** 修改订单按钮操作 */
- handleResetOpen() {
- if (this.form.viewerList.length == 0) {
- this.$message.error("请上传观影人员!");
- return
- }
- if (this.form.viewerList.length != this.seatSelectList.length) {
- this.$message.error("请选择座位!");
- return
- }
- /** 关闭订单 */
- this.$confirm("修改成功后,原订单将会被取消,确认要修改吗?", '提示', {
- confirmButtonText: '确定',
- cancelButtonText: '取消',
- type: 'warning'
- }).then(() => {
- this.submitForm()
- }).catch(() => { });
- },
- /**
- * 驳回提交
- * @date 2023-11-22
- * @returns {any}
- */
- submitForm() {
- this.$refs["form"].validate(async (valid) => {
- if (valid) {
- try {
- if (this.form.viewerList.length == 0) {
- this.$message.error("请上传观影人员!");
- return
- }
- if (this.form.viewerList.length != this.seatSelectList.length) {
- this.$message.error("请选择座位!");
- return
- }
- this.loading = true;
- let postForm = {
- "orderId": this.form.id,
- "goodsId": this.form.goodsId,
- "goodsName": this.form.goodsName,
- "seatTypeId": this.form.seatTypeId,
- "seatTypeName": this.form.seatTypeName,
- "performDate": this.form.performDate,
- "performTimeId": this.form.performTimeId,
- "viewerList": this.form.viewerList,
- "seatList": this.seatSelectList
- }
- const { code } = await teamOrderReSubmitApi({ ...postForm });
- if (code === 200) {
- this.loading = false;
- this.$message.success("操作成功!");
- this.$emit("getList");
- this.cancel();
- }
- } catch (error) {
- this.loading = false;
- } finally {
- }
- }
- });
- },
- },
- };
- </script>
- <style lang="scss" scoped>
- .dialog {
- width: 100%;
- height: 70vh;
- }
- .dialog {
- .upload-btn {
- width: 100px;
- height: 100px;
- background-color: #fbfdff;
- border: dashed 1px #c0ccda;
- border-radius: 5px;
- i {
- font-size: 30px;
- margin-top: 20px;
- }
- &-text {
- margin-top: -10px;
- }
- }
- .avatar {
- cursor: pointer;
- }
- .title-class {
- font-size: 16px;
- font-weight: bold;
- color: black;
- margin-bottom: 20px;
- margin-top: 20px;
- }
- .item-class {
- margin-bottom: 20px;
- }
- }
- .dialog-bbb {
- width: 100%;
- display: flex;
- --widdd: 700px;
- >div:first-child {
- width: var(--widdd);
- flex-shrink: 0;
- overflow-y: auto;
- padding: 0 0 10px 0;
- margin-right: 10px;
- }
- .dialog-bbb_2 {
- width: calc(100% - var(--widdd));
- height: 100%;
- }
- }
- </style>
|