| | |
| | | <template> |
| | | <div class="main_app"> |
| | | <Breadcrumb /> |
| | | <QueryForm v-model="querys" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clearQueryForm"> |
| | | <template #btns> |
| | | <el-button v-if="meta.indexOf('MealsUseDetailExport') > -1" type="primary" |
| | | @click="comboRecordExport">导出</el-button> |
| | | </template> |
| | | <template #indate> |
| | | <el-date-picker v-model="querys.indate" type="datetimerange" range-separator="至" start-placeholder="开始日期" |
| | | end-placeholder="结束日期" format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss" class="w400" |
| | | :picker-options="pickerOptions" /> |
| | | </template> |
| | | <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clearQueryForm"> |
| | | </QueryForm> |
| | | <div class="table_btns"> |
| | | <el-button v-preventReClick plain type="primary" @click="handleEx">导出</el-button> |
| | | <el-button v-preventReClick plain type="danger" @click="openModal('zuofei')">作废</el-button> |
| | | <el-button v-preventReClick plain @click="openModal('tiaozheng')">套餐调整</el-button> |
| | | <el-button plain type="primary" @click="handleEx">导出</el-button> |
| | | <el-button plain type="danger" @click="openModal('zuofei')">作废</el-button> |
| | | <el-button plain @click="openModal('tiaozheng')">套餐调整</el-button> |
| | | </div> |
| | | <el-table v-loading="loading" :data="list" stripe border @selection-change="handleSelectionChange"> |
| | | <el-table-column fixed="left" align="center" type="selection" :selectable="handleDisable" width="55" /> |
| | | <el-table-column align="center" label="套餐票号" width="300" show-overflow-tooltip> |
| | | <el-table-column align="center" label="套餐票号" min-width="160" show-overflow-tooltip> |
| | | <template v-slot="scope"> |
| | | <span class="primaryColor pointer" @click="comboDetail(scope.row)">{{ |
| | | scope.row.id |
| | | scope.row.code |
| | | }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column align="center" label="套餐类型" width="120"> |
| | | <el-table-column align="center" label="套餐类型" min-width="80"> |
| | | <template v-slot="scope"> |
| | | <span v-if="scope.row.mealsType === '0'">门票次卡</span> |
| | | <span v-if="scope.row.mealsType === '1'">门票期限卡</span> |
| | | <span v-if="scope.row.mealsType === '2'">预定次卡</span> |
| | | <span v-if="scope.row.mealsType === '3'">课程预约次卡</span> |
| | | <span v-if="scope.row.mealsType === '4'">课程期限卡</span> |
| | | <span v-if="scope.row.type == '0'">期限卡</span> |
| | | <span v-if="scope.row.type == '1'">次卡</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column align="center" label="套餐名称" show-overflow-tooltip width="160" prop="mealsName" /> |
| | | <el-table-column align="center" label="用户信息" min-width="240" prop="memberInfo" show-overflow-tooltip /> |
| | | <el-table-column align="center" label="使用次数" width="80" prop="useCount"> |
| | | <el-table-column align="center" label="套餐名称" show-overflow-tooltip min-width="100" prop="name" /> |
| | | <el-table-column align="center" label="用户信息" min-width="100" prop="openid" show-overflow-tooltip /> |
| | | <el-table-column align="center" label="使用次数" min-width="80" prop="useTimes"> |
| | | </el-table-column> |
| | | <el-table-column align="center" label="有效日期" min-width="200" prop="remainCount"> |
| | | <template v-slot="scope"> |
| | | <span v-if="scope.row.mealsType === '1'">-</span> |
| | | <span v-else>{{ scope.row.useCount }}</span> |
| | | <span>{{ scope.row.useStartDate }}至{{ scope.row.useEndDate }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column align="center" label="有效日期" width="80" prop="remainCount"> |
| | | <el-table-column align="center" label="套餐状态" min-width="80"> |
| | | <template v-slot="scope"> |
| | | <span v-if="scope.row.mealsType === '1'">-</span> |
| | | <span v-else>{{ scope.row.remainCount }}</span> |
| | | <span v-if="scope.row.status == '0'" class="text_success">正常</span> |
| | | <span v-if="scope.row.status == '1'" class="text_warning">作废</span> |
| | | <span v-if="scope.row.status == '2'" class="text-danger">待支付</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column fixed="right" align="center" label="套餐状态" width="80"> |
| | | <template v-slot="scope"> |
| | | <span v-if="scope.row.status === '0'" class="text_success">正常</span> |
| | | <span v-if="scope.row.status === '1'" class="text_warning">冻结</span> |
| | | <span v-if="scope.row.status === '2'" class="text-danger">作废</span> |
| | | <span v-if="scope.row.status === '3'" class="text-danger">失效</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column align="center" label="有效日期" width="120" prop="validTime" /> |
| | | <el-table-column align="center" label="操作" fixed="right" width="150"> |
| | | <el-table-column align="center" label="操作" fixed="right" min-width="150"> |
| | | <template v-slot="scope"> |
| | | <template> |
| | | <el-button v-if=" |
| | | meta.indexOf('MealsMemberPartRefund') > -1 && |
| | | (scope.row.status == '0' || scope.row.status == '1') |
| | | " type="text" @click="rowClickRefund(scope.row)">退款</el-button> |
| | | <el-button v-if="scope.row.status == '0'" type="text" |
| | | @click="getServiceChargePriceBtn('2', scope.row.id)">冻结</el-button> |
| | | <el-button v-if="scope.row.status == '0'" type="text" @click="openCan(scope.row)">作废</el-button> |
| | | <span v-else>-</span> |
| | | </template> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | <el-dialog title="套餐调整" :visible.sync="isShowAdjust" width="500px"> |
| | | <div class="adjust_modal"> |
| | | <div style="margin-top: -30px; margin-bottom: 10px;"> |
| | | <el-radio v-model="adjustData.aa" label="1">已选当前2条数据</el-radio> |
| | | <el-radio v-model="adjustData.flag" label="0">已选{{ selList.length }}条数据</el-radio> |
| | | </div> |
| | | <div style="margin-bottom: 16px;"> |
| | | <el-radio v-model="adjustData.aa" label="1">已选现有筛选条件下全部的11条数据</el-radio> |
| | | <el-radio v-model="adjustData.flag" label="1">选现有筛选条件下全部的{{ pagination.total }}条数据</el-radio> |
| | | </div> |
| | | <div class="df_ac mb5"> |
| | | <span class="key">有效期增加:</span> |
| | | <el-input v-model="adjustData.addTime" oninput="value=value.replace(/[^\d]/g,'')" class="flex1 mr10" /> |
| | | <el-input v-model="adjustData.addNum" oninput="value=value.replace(/[^\d]/g,'')" class="flex1 mr10" /> |
| | | <span>天</span> |
| | | </div> |
| | | <div class="df_ac mb20"> |
| | |
| | | </div> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button @click="isShowAdjust = false">取消</el-button> |
| | | <el-button v-preventReClick type="primary" :loading="subLoading" @click="handleModelEnter">确定</el-button> |
| | | <el-button type="primary" :loading="subLoading" @click="handleModelEnter">确定</el-button> |
| | | </span> |
| | | </el-dialog> |
| | | <el-dialog title="套餐作废" :visible.sync="isShowCan" width="500px"> |
| | | <div class="adjust_modal" style="margin-top: -30px;"> |
| | | <div class="red" style="font-size: 16px;">确定作废选中套餐吗?作废后,套餐不可使用</div> |
| | | <div class="df_ac mt10"> |
| | | <el-input type="textarea" v-model="remarkCan" placeholder="请按要求输入备注说明,非必填" /> |
| | | </div> |
| | | </div> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button @click="isShowCan = false">取消</el-button> |
| | | <el-button type="primary" :loading="subLoading" @click="handleCan">确定</el-button> |
| | | </span> |
| | | </el-dialog> |
| | | |
| | | <Refund v-if="isShowRefund" ref="RefundRef" @close="isShowRefund = false" @success="refundSuccess" /> |
| | | <Detail v-if="isShowDetail" ref="detailRef" /> |
| | | <orderDialog ref="child" @orderSuccess="getList()" /> |
| | | <Detail ref="DetailRef" /> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { pickerOptions } from './components/config' |
| | | import BasePageTemp from '@/components/base/BasePageTemp' |
| | | import Breadcrumb from '@/layouts/Breadcrumb' |
| | | // import Detail from '../comboDetail' |
| | | // import Refund from './refund.vue' |
| | | import Detail from './components/SaleDetail.vue' |
| | | import { Message } from 'element-ui' |
| | | import { |
| | | comboSalePage, |
| | | comboSaleEx, |
| | | comboSaleCancel, |
| | | comboSaleAdjust, |
| | | } from '@/api/business/combo.js' |
| | | export default { |
| | | name: 'SalesRecord', |
| | | extends: BasePageTemp, |
| | | components: { Breadcrumb }, |
| | | components: { Breadcrumb, Detail }, |
| | | data() { |
| | | return { |
| | | exportLoading: false, |
| | |
| | | isShowRefund: false, |
| | | queryFormConfig: { |
| | | formItems: [{ |
| | | filed: 'id', |
| | | filed: 'code', |
| | | type: 'input', |
| | | label: '套餐票号', |
| | | placeholder: '请输入套餐号', |
| | | clearable: true |
| | | }, { |
| | | filed: 'mealsName', |
| | | filed: 'name', |
| | | type: 'input', |
| | | label: '套餐名称', |
| | | placeholder: '请输入套餐名称', |
| | | clearable: true |
| | | }, { |
| | | filed: 'memberSearchValue', |
| | | filed: 'openid', |
| | | type: 'input', |
| | | label: '用户信息', |
| | | clearable: true |
| | |
| | | clearable: true, |
| | | options: [ |
| | | { value: '0', label: '正常' }, |
| | | { value: '1', label: '冻结' }, |
| | | { value: '2', label: '作废' }, |
| | | { value: '3', label: '失效' }] |
| | | { value: '1', label: '作废' }, |
| | | // { value: '2', label: '待支付' } |
| | | ] |
| | | }], |
| | | online: true |
| | | }, |
| | | pickerOptions, |
| | | querys: { |
| | | id: '', |
| | | mealsName: '', |
| | |
| | | |
| | | saleRecordList: [], |
| | | saleRecordTotal: 0, |
| | | selectSalesList: [], |
| | | selList: [], |
| | | saleRecordLoading: false, |
| | | subLoading: false, |
| | | |
| | | isShowModal: false, |
| | | isShowCan: false, |
| | | ModalTitle: '', |
| | | ModalText: '', |
| | | ModelRemark: '', |
| | | remarkCan: '', |
| | | // ⬇️adjust调整相关 |
| | | isShowAdjust: false, |
| | | isShowCan: false, |
| | | canList: [], |
| | | adjustData: { |
| | | flag: 0, |
| | | addNum: '', |
| | | addTime: '' |
| | | }, |
| | |
| | | }, |
| | | created() { |
| | | // this.meta = this.$route.meta.buttons || [] |
| | | // this.getList(1) |
| | | this.getList(1) |
| | | }, |
| | | methods: { |
| | | rowClickRefund(row) { |
| | |
| | | this.isShowRefund = false |
| | | this.getList() |
| | | }, |
| | | getServiceChargePriceBtn(type, mealsMemberId) { |
| | | this.serviceChargeId = mealsMemberId |
| | | getServiceChargePrice({ |
| | | param: { |
| | | type, |
| | | mealsMemberId |
| | | } |
| | | }).then((res) => { |
| | | if (res.errorCode === '000000') { |
| | | this.serviceChargePrice = res.record.price |
| | | this.openModal('dongjie') |
| | | } |
| | | handleEx() { |
| | | const { pagination, filters } = this |
| | | this.$dialog.exportConfirm('确认导出吗?') |
| | | .then(() => { |
| | | this.loading = true |
| | | comboSaleEx({ |
| | | page: 1, |
| | | capacity: 1000000, |
| | | model: filters |
| | | }) |
| | | .then(response => { |
| | | this.download(response) |
| | | }) |
| | | .catch(e => { |
| | | this.$tip.apiFailed(e) |
| | | }) |
| | | .finally(() => { |
| | | this.loading = false |
| | | }) |
| | | }) |
| | | .catch(() => { }) |
| | | }, |
| | | handleEx() { |
| | | const { querys } = this |
| | | this.exportLoading = true |
| | | recordExport({ |
| | | param: { |
| | | ...querys |
| | | } |
| | | }).then((res) => { |
| | | this.exportLoading = false |
| | | if (res.errorCode === '000000') { |
| | | const a = document.createElement('a') // 创建一个a标签元素 |
| | | a.style.display = 'none' // 设置元素不可见 |
| | | a.href = res.record.showUrl // 设置下载地址 |
| | | document.body.appendChild(a) // 加入 |
| | | a.click() // 触发点击,下载 |
| | | document.body.removeChild(a) // |
| | | this.$message.success('导出成功') |
| | | } |
| | | }) |
| | | .catch(() => { |
| | | this.exportLoading = false |
| | | }) |
| | | openCan(row) { |
| | | this.isShowCan = true |
| | | this.canList = [row] |
| | | }, |
| | | handleDisable(row, index) { |
| | | if (row.status === '2') { |
| | | return false |
| | | } else { |
| | | handleDisable(row) { |
| | | // return row.status == 0 |
| | | return true |
| | | } |
| | | }, |
| | | // 查询表格数据 |
| | | getList(page) { |
| | | const { querys, pagination } = this |
| | | if (page) { |
| | | pagination.page = page |
| | | this.pagination.page = Number(page) |
| | | } |
| | | if (querys.indate && querys.indate.length > 0) { |
| | | querys.startTime = querys.indate[0] |
| | | querys.endTime = querys.indate[1] |
| | | } else { |
| | | querys.startTime = null |
| | | querys.endTime = null |
| | | } |
| | | pagination.firstQueryTime = parseTime(new Date()) |
| | | this.saleRecordLoading = true |
| | | comboSalesRecordPost({ |
| | | pagination, param: { |
| | | ...querys, |
| | | venueId: sessionStorage.getItem('venueId') |
| | | } |
| | | const { pagination, filters } = this |
| | | this.loading = true |
| | | if (page) { pagination.page = page } |
| | | comboSalePage({ |
| | | model: { |
| | | ...filters |
| | | }, |
| | | capacity: pagination.pageSize, |
| | | page: pagination.page, |
| | | }).then(res => { |
| | | this.saleRecordLoading = false |
| | | if (res.errorCode === '000000') { |
| | | this.saleRecordLoading = false |
| | | this.saleRecordTotal = res.totalCount |
| | | this.saleRecordList = res.recordList |
| | | if (res.totalCount && res.recordList.length === 0 && pagination.page > 1) { |
| | | this.getList(Math.ceil(res.totalCount / pagination.rows)) |
| | | } |
| | | } |
| | | }).catch(() => { |
| | | this.saleRecordLoading = false |
| | | this.loading = false |
| | | this.list = res.records || [] |
| | | this.pagination.total = res.total || 0 |
| | | }, () => { |
| | | this.loading = false |
| | | }) |
| | | }, |
| | | clearQueryForm() { |
| | | // eslint-disable-next-line no-unused-vars |
| | | this.querys = {} |
| | | this.filters = {} |
| | | this.getList(1) |
| | | }, |
| | | // 打开modal 冻结 解冻 作废 |
| | | openModal(type) { |
| | | const { selectSalesList } = this |
| | | const { selList } = this |
| | | this.ModelRemark = '' |
| | | this.adjustData.addNum = '' |
| | | this.adjustData.addTime = '' |
| | | switch (type) { |
| | | case 'dongjie': |
| | | this.ModalTitle = '套餐冻结' |
| | | this.ModalText = '确定冻结选中套餐吗?冻结后,套餐将无法使用' |
| | | break |
| | | case 'jiedong': |
| | | this.ModalTitle = '套餐解冻' |
| | | this.ModalText = '确定解冻选中套餐吗?解冻后,套餐可立即生效使用' |
| | | break |
| | | case 'zuofei': |
| | | this.ModalTitle = '套餐作废' |
| | | this.ModalText = '确定作废选中套餐吗?作废后,套餐不可使用' |
| | |
| | | default: |
| | | break |
| | | } |
| | | if (selectSalesList.length === 0 && type !== 'dongjie') { |
| | | return this.$message.warning(`请先选择要${this.ModalTitle.slice(2)}的套餐`) |
| | | if (selList.length === 0 && type == 'zuofei') { |
| | | return Message.warning(`请先选择要${this.ModalTitle.slice(2)}的套餐`) |
| | | } |
| | | if (this.ModalTitle === '套餐调整') { |
| | | this.isShowAdjust = true |
| | | this.adjustData = { |
| | | flag: '0' |
| | | } |
| | | } else { |
| | | this.isShowModal = true |
| | | this.isShowCan = true |
| | | } |
| | | }, |
| | | // 确定 冻结 解冻 作废 |
| | | handleModelEnter() { |
| | | // if (!this.ModelRemark) { |
| | | // this.$message.warning('操作备注必填') |
| | | // return |
| | | // } |
| | | switch (this.ModalTitle) { |
| | | case '套餐冻结': |
| | | this.Freeze() |
| | | break |
| | | case '套餐解冻': |
| | | this.Unfreeze() |
| | | break |
| | | case '套餐作废': |
| | | this.cancellation() |
| | | break |
| | |
| | | break |
| | | } |
| | | }, |
| | | // 冻结 |
| | | Freeze() { |
| | | const that = this |
| | | const data = { |
| | | type: '1', |
| | | handleRemake: this.ModelRemark, |
| | | isCreateOrder: '1', |
| | | id: this.serviceChargeId |
| | | } |
| | | this.subLoading = true |
| | | handleComboSalesPost({ param: { ...data } }).then(res => { |
| | | this.subLoading = false |
| | | this.isShowModal = false |
| | | if (res.errorCode === '000000') { |
| | | const obj = res.record |
| | | if (obj && obj.price) { |
| | | obj.goodsInfos = obj.serviceChargeOrderInfo |
| | | obj.allPrice = obj.price |
| | | this.$refs.child.continuePay(obj, 'handlingFees') |
| | | } else { |
| | | this.$message.success('冻结成功') |
| | | this.getList() |
| | | } |
| | | // |
| | | } else if (res.errorCode === '200001') { |
| | | this.$confirm('存在未处理订单, 是否跳转?', '提示', { |
| | | confirmButtonText: '确定', |
| | | cancelButtonText: '取消', |
| | | type: 'warning', |
| | | callback: () => { }, |
| | | beforeClose: (action, ctx, close) => { |
| | | if (action !== 'confirm') { |
| | | close() |
| | | return |
| | | } |
| | | ctx.confirmButtonLoading = true |
| | | that.$router.push({ name: 'HandlingFees' }) |
| | | } |
| | | }).finally(() => { |
| | | this.subLoading = false |
| | | this.isShowModal = false |
| | | }) |
| | | } |
| | | }) |
| | | }, |
| | | // 解冻 |
| | | async Unfreeze() { |
| | | const data = { |
| | | type: '2', |
| | | handleRemake: this.ModelRemark, |
| | | id: this.selectSalesList.map(i => i.id).join(',') |
| | | } |
| | | this.subLoading = true |
| | | const res = await handleComboSalesPost({ param: { ...data } }).catch(() => { |
| | | this.subLoading = false |
| | | this.isShowModal = false |
| | | }) |
| | | this.subLoading = false |
| | | this.isShowModal = false |
| | | if (res && res.errorCode === '000000') { |
| | | this.$message.success('解冻成功') |
| | | this.getList() |
| | | } |
| | | }, |
| | | // 调整 |
| | | async handleAdjust() { |
| | | if (!this.adjustData.addNum && !this.adjustData.addTime) { |
| | | return this.$message.warning('请输入要调整的有效期天数或者余量次数') |
| | | return Message.warning('请输入要调整的有效期天数或者余量次数') |
| | | } |
| | | const data = { |
| | | type: '3', |
| | | handleRemake: this.ModelRemark, |
| | | addNum: this.adjustData.addNum || 0, |
| | | addTime: this.adjustData.addTime || 0, |
| | | id: this.selectSalesList.map(i => i.id).join(',') |
| | | info: this.ModelRemark, |
| | | addDays: this.adjustData.addNum || 0, |
| | | choseIdList: this.adjustData.flag == 0 ? this.selList.map(i => i.id) : [], |
| | | ...this.filters |
| | | } |
| | | |
| | | this.subLoading = true |
| | | const res = await handleComboSalesPost({ param: { ...data } }).catch(() => { |
| | | const res = await comboSaleAdjust({ ...data }).catch(() => { |
| | | this.subLoading = false |
| | | this.isShowModal = false |
| | | this.isShowCan = false |
| | | }) |
| | | this.subLoading = false |
| | | this.isShowModal = false |
| | | if (res && res.errorCode === '000000') { |
| | | this.$message.success('套餐调整成功') |
| | | this.isShowCan = false |
| | | if (res) { |
| | | Message.success('套餐调整成功') |
| | | this.getList() |
| | | this.isShowAdjust = false |
| | | } |
| | |
| | | // 作废 |
| | | async cancellation() { |
| | | const data = { |
| | | type: '4', |
| | | handleRemake: this.ModelRemark, |
| | | id: this.selectSalesList.map(i => i.id).join(',') |
| | | handleRemake: this.remarkCan, |
| | | choseIdList: this.selList.map(i => i.id) |
| | | } |
| | | this.subLoading = true |
| | | const res = await handleComboSalesPost({ param: { ...data } }).catch(() => { |
| | | const res = await comboSaleCancel({ ...data }).catch(() => { |
| | | this.subLoading = false |
| | | this.isShowModal = false |
| | | this.isShowCan = false |
| | | }) |
| | | this.subLoading = false |
| | | this.isShowModal = false |
| | | if (res && res.errorCode === '000000') { |
| | | this.$message.success('作废成功') |
| | | this.isShowCan = false |
| | | if (res) { |
| | | Message.success('作废成功') |
| | | this.getList() |
| | | } |
| | | }, |
| | | async handleCan() { |
| | | const data = { |
| | | handleRemake: this.remarkCan, |
| | | choseIdList: this.canList.map(i => i.id) |
| | | } |
| | | this.subLoading = true |
| | | const res = await comboSaleCancel({ ...data }).catch(() => { |
| | | this.subLoading = false |
| | | this.isShowCan = false |
| | | }) |
| | | this.subLoading = false |
| | | this.isShowCan = false |
| | | if (res) { |
| | | Message.success('作废成功') |
| | | this.getList() |
| | | } |
| | | }, |
| | | handleSelectionChange(val) { |
| | | this.selectSalesList = val |
| | | this.selList = val |
| | | }, |
| | | comboDetail(item) { |
| | | this.isShowDetail = true |
| | | this.$nextTick(() => { |
| | | this.$refs.detailRef.isShowModal = true |
| | | this.$refs.detailRef.comboDetail(item) |
| | | this.$refs.DetailRef.isShowModal = true |
| | | this.$refs.DetailRef.getDetail(item) |
| | | }) |
| | | |
| | | // this.$router.push({ |
| | | // name: 'comboDetail', |
| | | // query: item |
| | | // }) |
| | | }, |
| | | pageSizeChange(val) { |
| | | this.pagination.rows = val |
| | |
| | | text-align: right; |
| | | } |
| | | } |
| | | .el-dialog__body{ |
| | | |
| | | } |
| | | .el-dialog__body {} |
| | | |
| | | .text_warning { |
| | | color: #e89e42; |
| | | } |