提交 16cccc19 authored 作者: lihuihui's avatar lihuihui

Merge branch 'master' of https://gitlab.ezijing.com/webapp/finance-admin

# 请输入一个提交信息以解释此合并的必要性,尤其是将一个更新后的上游分支 # 合并到主题分支。 # # 以 '#' 开始的行将被忽略,而空的提交说明将终止提交。
...@@ -35,3 +35,7 @@ export function getTableColumns(params) { ...@@ -35,3 +35,7 @@ export function getTableColumns(params) {
export function updateTableColumns(data) { export function updateTableColumns(data) {
return httpRequest.post('/api/finance/v1/payments/update-title', data) return httpRequest.post('/api/finance/v1/payments/update-title', data)
} }
export function getRoles(params) {
return httpRequest.get('/api/finance/user/get-info', { params })
}
...@@ -210,7 +210,7 @@ export default { ...@@ -210,7 +210,7 @@ export default {
}, },
// 当前列表项 // 当前列表项
currentColumns() { currentColumns() {
if (this.hasColumnsOptions && this.customColumns.length) { if (this.hasColumnsOptions) {
return this.columns.map(column => { return this.columns.map(column => {
const found = this.customColumns.find(item => item.prop === column.prop) const found = this.customColumns.find(item => item.prop === column.prop)
return { ...column, visible: found ? found.visible : true } return { ...column, visible: found ? found.visible : true }
...@@ -235,7 +235,7 @@ export default { ...@@ -235,7 +235,7 @@ export default {
let params = this.params let params = this.params
// 翻页参数设置 // 翻页参数设置
if (this.hasPagination) { if (this.hasPagination) {
params.page = (this.page.currentPage).toString() params.page = this.page.currentPage.toString()
params['per-page'] = this.page.size.toString() params['per-page'] = this.page.size.toString()
} }
// 接口请求之前 // 接口请求之前
......
...@@ -42,7 +42,7 @@ export default { ...@@ -42,7 +42,7 @@ export default {
{ {
name: '项目列表', name: '项目列表',
path: '/project', path: '/project',
icon: 'el-icon-box' icon: 'el-icon-folder'
} }
] ]
} }
......
...@@ -59,23 +59,20 @@ export default { ...@@ -59,23 +59,20 @@ export default {
{ label: '线下', value: '2' } { label: '线下', value: '2' }
], ],
placeholder: '渠道类型' placeholder: '渠道类型'
} },
],
moreFilters: [
{ {
label: '合同编码',
type: 'input', type: 'input',
prop: 'contract_code', prop: 'contract_code',
placeholder: '合同编码' placeholder: '合同编码'
}, },
{ {
label: '合同状态',
type: 'select', type: 'select',
prop: 'contract_status', prop: 'contract_status',
options: [ options: [
{ label: '未上传', value: '1' }, { label: '未上传', value: '1' },
{ label: '已上传', value: '2' } { label: '已上传', value: '2' }
] ],
placeholder: '合同状态'
} }
], ],
columns: [ columns: [
......
...@@ -49,7 +49,15 @@ export function payConfirm(data) { ...@@ -49,7 +49,15 @@ export function payConfirm(data) {
headers: { 'Content-Type': 'multipart/form-data' } headers: { 'Content-Type': 'multipart/form-data' }
}) })
} }
// 获取oss signature // 确认足额支付
export function getSignature() { export function confirmPayDetail(data) {
return httpRequest.get('/api/usercenter/aliyun/get-signature') return httpRequest.post('/api/finance/v1/payments/undo-confirm', data)
}
// 取消足额支付
export function cancelPayDetail(data) {
return httpRequest.post('/api/finance/v1/payments/undo-confirm', data)
}
// 取消单条缴费到账
export function payCancel(data) {
return httpRequest.post('/api/finance/v1/payments/undo-details-confirm', data)
} }
<!-- 支付详情-渠道信息 --> <!-- 支付详情-渠道信息 -->
<template> <template>
<table border="1" width="1200px" cellspacing="0"> <table border="1" width="1500px" cellspacing="0" class="table">
<tr> <tr>
<th>不含税销售金额</th> <th>不含税销售金额</th>
<td>{{dealList.sales_amount_excluding_tax}}</td> <td>{{ dealList.sales_amount_excluding_tax }}</td>
<th>渠道代理费提基数</th> <th>渠道代理费提基数</th>
<td>{{dealList.channel_agent_fee_base}}</td> <td>{{ dealList.channel_agent_fee_base }}</td>
<th>服务费规则</th> <th>服务费规则</th>
<td>{{dealList.service_fee_rules}}</td> <td>{{ dealList.service_fee_rules }}</td>
</tr> </tr>
<tr> <tr>
<th>服务费比例</th> <th>服务费比例</th>
<td>{{dealList.service_charge_ratio}}</td> <td>{{ dealList.service_charge_ratio }}</td>
<th>代理服务费</th> <th>代理服务费</th>
<td>{{dealList.agency_service_fee}}</td> <td>{{ dealList.agency_service_fee }}</td>
<th>代理服务费(不含税金额)</th> <th>代理服务费(不含税金额)</th>
<td>{{dealList.agency_service_fee_excluding_tax}}</td> <td>{{ dealList.agency_service_fee_excluding_tax }}</td>
</tr> </tr>
<tr> <tr>
<th>户名</th> <th>户名</th>
<td>{{dealList.channel_account_name}}</td> <td>{{ dealList.channel_account_name }}</td>
<th>账号</th> <th>账号</th>
<td>{{dealList.channel_account}}</td> <td>{{ dealList.channel_account }}</td>
<th>开户行</th> <th>开户行</th>
<td>{{dealList.channel_bank_of_deposit}}</td> <td>{{ dealList.channel_bank_of_deposit }}</td>
</tr> </tr>
<tr> <tr>
<th>渠道税率</th> <th>渠道税率</th>
<td colspan="5">{{dealList.channel_tax_rate}}</td> <td colspan="5">{{ dealList.channel_tax_rate }}</td>
</tr> </tr>
</table> </table>
</template> </template>
...@@ -38,10 +38,24 @@ export default { ...@@ -38,10 +38,24 @@ export default {
dealList: { dealList: {
type: Object, type: Object,
default: () => {} default: () => {}
} }
} }
} }
</script> </script>
<style></style> <style scoped>
.table {
border: 1px solid #000;
}
th {
width: 120px;
text-align: center;
font-size: 20px;
color: rgb(10, 1, 1);
font-weight: normal;
}
td {
width: 120px;
text-align: center;
}
</style>
<!-- 支付详情-收款信息 --> <!-- 支付详情-收款信息 -->
<template> <template>
<table border="1" width="1200px" cellspacing="0"> <table border="1" width="1500px" cellspacing="0" class="table">
<tr> <tr>
<th>应缴金额</th> <th>应缴金额</th>
<td>{{dealList.bill_total}}</td> <td>{{ dealList.bill_total }}</td>
<th>实缴金额</th> <th>实缴金额</th>
<td>{{dealList.amount_need_to_pay}}</td> <td>{{ dealList.amount_need_to_pay }}</td>
<th>待缴金额</th> <th>待缴金额</th>
<td>{{dealList.amount_waiting_for_pay}}</td> <td>{{ dealList.amount_waiting_for_pay }}</td>
</tr> </tr>
<tr> <tr>
<th>手续费</th> <th>手续费</th>
<td>{{dealList.service_charge}}</td> <td>{{ dealList.service_charge }}</td>
<th>到账金额</th> <th>到账金额</th>
<td>{{dealList.amount_received}}</td> <td>{{ dealList.amount_received }}</td>
<th>待确认金额</th> <th>待确认金额</th>
<td>{{dealList.amount_waiting_for_confirm}}</td> <td>{{ dealList.amount_waiting_for_confirm }}</td>
</tr> </tr>
<tr> <tr>
<th>首次缴费时间</th> <th>首次缴费时间</th>
<td>{{dealList.first_payment_time}}</td> <td colspan="2">{{ dealList.first_payment_time }}</td>
<th>末次缴费时间</th> <th>末次缴费时间</th>
<td colspan="3">{{dealList.final_payment_time}}</td> <td colspan="2">{{ dealList.final_payment_time }}</td>
</tr> </tr>
</table> </table>
</template> </template>
...@@ -37,6 +37,19 @@ export default { ...@@ -37,6 +37,19 @@ export default {
} }
</script> </script>
<style> <style scoped>
.table {
border: 1px solid #000;
}
th {
width: 120px;
text-align: center;
font-size: 20px;
color: rgb(10, 1, 1);
font-weight: normal;
}
td {
width: 120px;
text-align: center;
}
</style> </style>
<!-- 支付详情-已确认列表 --> <!-- 支付详情-已确认列表 -->
<template> <template>
<app-card> <app-card>
<app-list v-bind="tableOptions" ref="list" > <app-list v-bind="tableOptions" ref="list">
<template v-slot:table-x = "{ row }"> <template v-slot:table-x="{ row }">
<router-link :to="{ name: 'paydetail', params: { id: row.id } }"> <router-link :to="{ name: 'paydetail', params: { id: row.id } }">
<el-button>查看</el-button> <el-button>查看</el-button>
</router-link> </router-link>
<el-button @click="cancelReceive(row)">取消到账</el-button> <el-button @click="cancelReceive(row)" style="margin-top: 5px">取消到账</el-button>
</template> </template>
</app-list> </app-list>
</app-card> </app-card>
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
// 组件 // 组件
import AppList from '@/components/base/AppList.vue' import AppList from '@/components/base/AppList.vue'
import AppCard from '@/components/base/AppCard.vue' import AppCard from '@/components/base/AppCard.vue'
import { payDetail, payConfirm } from '../api' import { payDetail, payCancel } from '../api'
const payStatusMap = { 20: '支付待确认', 30: '部分到账', 70: '足额支付待确认', 80: '足额支付' } const payStatusMap = { 20: '支付待确认', 30: '部分到账', 70: '足额支付待确认', 80: '足额支付' }
// 接口 // 接口
export default { export default {
...@@ -27,8 +27,7 @@ export default { ...@@ -27,8 +27,7 @@ export default {
}, },
components: { AppCard, AppList }, components: { AppCard, AppList },
data() { data() {
return { return {}
}
}, },
computed: { computed: {
// 列表配置 // 列表配置
...@@ -41,15 +40,15 @@ export default { ...@@ -41,15 +40,15 @@ export default {
}, },
columns: [ columns: [
{ label: '#', type: 'index', minWidth: '50px', fixed: 'left' }, { label: '#', type: 'index', minWidth: '50px', fixed: 'left' },
{ label: '支付凭证', prop: 'id', minWidth: 100 }, { label: '支付凭证', prop: 'payment_voucher_filename', minWidth: 100 },
{ label: '支付人姓名', prop: 'name', align: 'center', minWidth: 100 }, { label: '支付人姓名', prop: 'name', align: 'center', minWidth: 120 },
{ label: '支付金额', prop: 'amount', align: 'center', minWidth: 100 }, { label: '支付金额', prop: 'amount', align: 'center', minWidth: 100 },
{ label: '支付时间', prop: 'payment_time', align: 'center', minWidth: 100 }, { label: '支付时间', prop: 'payment_time', align: 'center', minWidth: 100 },
{ label: '支付方式', prop: 'payment_method', align: 'center', minWidth: 100 }, { label: '支付方式', prop: 'payment_method', align: 'center', minWidth: 100 },
{ label: '其他支付方式', prop: 'payment_method_others', align: 'center', minWidth: 100 }, { label: '其他支付方式', prop: 'payment_method_others', align: 'center', minWidth: 150 },
{ label: '交易流水号', prop: 'txn_id', align: 'center', minWidth: 100 }, { label: '交易流水号', prop: 'txn_id', align: 'center', minWidth: 150 },
// eslint-disable-next-line object-curly-newline {
{ label: '支付状态', label: '支付状态',
prop: 'payment_status', prop: 'payment_status',
align: 'center', align: 'center',
minWidth: 100, minWidth: 100,
...@@ -67,7 +66,7 @@ export default { ...@@ -67,7 +66,7 @@ export default {
// 取消到账 // 取消到账
cancelReceive() { cancelReceive() {
const params = { id: this.id } const params = { id: this.id }
payConfirm(params).then(res => { payCancel(params).then(res => {
if (res.code === 0) { if (res.code === 0) {
this.$parent.fetchTicketDetail() this.$parent.fetchTicketDetail()
} }
......
<!-- 支付详情-订单信息 --> <!-- 支付详情-订单信息 -->
<template> <template>
<div> <div>
<table border="1" width="1200px" cellspacing="0"> <table border="1" width="1500px" cellspacing="0" class="table">
<tr> <tr>
<th>订单用户名称</th> <th>订单用户名称</th>
<td>{{dealList.name}}</td> <td>{{ dealList.name }}</td>
<td>订单编号</td> <td>订单编号</td>
<td>{{dealList.id}}</td> <td>{{ dealList.id }}</td>
<td>支付状态</td> <td>支付状态</td>
<td>{{dealList.payment_status}}</td> <td>{{ dealList.payment_status }}</td>
</tr> </tr>
<tr> <tr>
<th>备注</th> <th>备注</th>
<td colspan="5">{{dealList.comment}}</td> <td colspan="5">{{ dealList.comment }}</td>
</tr> </tr>
</table> </table>
</div> </div>
...@@ -24,12 +24,25 @@ export default { ...@@ -24,12 +24,25 @@ export default {
dealList: { dealList: {
type: Object, type: Object,
default: () => {} default: () => {}
} }
}, },
mounted() { mounted() {}
}
} }
</script> </script>
<style></style> <style scoped>
.table {
border: 1px solid #000;
}
th {
width: 120px;
text-align: center;
font-size: 20px;
color: rgb(10, 1, 1);
font-weight: normal;
}
td {
width: 120px;
text-align: center;
}
</style>
<!-- 支付详情-学员信息 --> <!-- 支付详情-学员信息 -->
<template> <template>
<div> <div>
<table border="1" width="1200px" cellspacing="0"> <table border="1" width="1500px" cellspacing="0" class="table">
<tr> <tr>
<th>学员姓名</th> <th>学员姓名</th>
<td>{{dealList.name}}</td> <td>{{ dealList.name }}</td>
<th>报名项目</th> <th>报名项目</th>
<td>{{dealList.project_name}}</td> <td>{{ dealList.project_name }}</td>
<td>所属班次</td> <td>所属班次</td>
<td>{{dealList.bill_customer_class}}</td> <td>{{ dealList.bill_customer_class }}</td>
</tr> </tr>
<tr> <tr>
<th>开学时间</th> <th>开学时间</th>
<td>{{dealList.bill_customer_class_start_time}}</td> <td>{{ dealList.bill_customer_class_start_time }}</td>
<th>学制期限</th> <th>学制期限</th>
<td>{{dealList.bill_customer_class_length_of_schooling}}</td> <td>{{ dealList.bill_customer_class_length_of_schooling }}</td>
<th>跟进人</th> <th>跟进人</th>
<td>{{dealList.sales_rep_user_id_name}}</td> <td>{{ dealList.sales_rep_user_id_name }}</td>
</tr> </tr>
</table> </table>
</div> </div>
...@@ -28,10 +28,24 @@ export default { ...@@ -28,10 +28,24 @@ export default {
dealList: { dealList: {
type: Object, type: Object,
default: () => {} default: () => {}
} }
} }
} }
</script> </script>
<style></style> <style scoped>
.table {
border: 1px solid #000;
}
th {
width: 120px;
text-align: center;
font-size: 20px;
color: rgb(10, 1, 1);
font-weight: normal;
}
td {
width: 120px;
text-align: center;
}
</style>
<!-- 支付详情-发票表格 --> <!-- 支付详情-发票表格 -->
<template> <template>
<div class="ticketInfo"> <div class="ticketInfo">
<table border="1" width="1200px" cellspacing="0" class="table" v-for="(item, index) in invioceList" :key="index" > <table border="1" width="1500px" cellspacing="0" class="table" v-for="(item, index) in invioceList" :key="index">
<tr> <tr>
<th colspan="10">发票{{ item.id }}</th> <th colspan="10">发票{{ item.id }}</th>
</tr> </tr>
...@@ -20,9 +19,9 @@ ...@@ -20,9 +19,9 @@
</tr> </tr>
<tr v-show="item.invoice_status === 6"> <tr v-show="item.invoice_status === 6">
<th>原发票号码</th> <th>原发票号码</th>
<td>{{item.old_invoice_haoma}}</td> <td>{{ item.old_invoice_haoma }}</td>
<th>原发票代码</th> <th>原发票代码</th>
<td>{{item.old_invoice_daima}}</td> <td>{{ item.old_invoice_daima }}</td>
</tr> </tr>
<tr> <tr>
<th>含税金额</th> <th>含税金额</th>
...@@ -50,13 +49,13 @@ ...@@ -50,13 +49,13 @@
</tr> </tr>
<tr> <tr>
<th>地址</th> <th>地址</th>
<td>{{item.taxpayer_address}}</td> <td>{{ item.taxpayer_address }}</td>
<th>电话</th> <th>电话</th>
<td>{{item.taxpayer_mobile}}</td> <td>{{ item.taxpayer_mobile }}</td>
<th>开户行</th> <th>开户行</th>
<td>{{item.taxpayer_bank_name}}</td> <td>{{ item.taxpayer_bank_name }}</td>
<th>银行账号</th> <th>银行账号</th>
<td>{{item.taxpayer_bank_account}}</td> <td>{{ item.taxpayer_bank_account }}</td>
</tr> </tr>
<tr> <tr>
<th>邮寄地址</th> <th>邮寄地址</th>
...@@ -102,8 +101,20 @@ export default { ...@@ -102,8 +101,20 @@ export default {
} }
</script> </script>
<style> <style scoped>
.table { .table {
border: 1px solid #000;
margin-bottom: 40px; margin-bottom: 40px;
} }
th {
width: 120px;
text-align: center;
font-size: 20px;
color: rgb(10, 1, 1);
font-weight: normal;
}
td {
width: 120px;
text-align: center;
}
</style> </style>
...@@ -2,52 +2,52 @@ ...@@ -2,52 +2,52 @@
<template> <template>
<div> <div>
<h3>支付信息</h3> <h3>支付信息</h3>
<table border="1" width="720px" cellspacing="0" class="table"> <table border="1" width="860px" cellspacing="0" class="table">
<tr> <tr>
<th>客户姓名</th> <th>客户姓名</th>
<td>{{detailList.name}}</td> <td>{{ detailList.name }}</td>
<th>客户编号</th> <th>客户编号</th>
<td>{{detailList.customer_id}}</td> <td>{{ detailList.customer_id }}</td>
<th>订单编号</th> <th>订单编号</th>
<td>{{detailList.id}}</td> <td>{{ detailList.id }}</td>
</tr> </tr>
<tr> <tr>
<th>支付状态</th> <th>支付状态</th>
<td>{{detailList.payment_status}}</td> <td>{{ detailList.payment_status }}</td>
<th>报名项目</th> <th>报名项目</th>
<td>{{detailList.project_id}}</td> <td>{{ detailList.project_id }}</td>
<th>应缴金额</th> <th>应缴金额</th>
<td>{{detailList.bill_total}}</td> <td>{{ detailList.bill_total }}</td>
</tr> </tr>
<tr> <tr>
<th>实缴金额</th> <th>实缴金额</th>
<td>{{detailList.amount_need_to_pay}}</td> <td>{{ detailList.amount_need_to_pay }}</td>
<th>交易流水号</th> <th>交易流水号</th>
<td>{{detailList.txn_id_list}}</td> <td>{{ detailList.txn_id_list }}</td>
<th>缴费时间</th> <th>缴费时间</th>
<td>{{detailList.final_payment_time}}</td> <td>{{ detailList.final_payment_time }}</td>
</tr> </tr>
</table> </table>
<el-form label-width="120px" ref="ruleForm" :model="form" :rules="rules"> <el-form label-width="120px" ref="ruleForm" :model="form" :rules="rules">
<div class="type" style="border: 1px solid #ccc; margin-bottom: 10px"> <div class="type" style="border: 1px solid #ccc; margin-bottom: 10px">
<el-form-item label="开票类型" prop="toticket_type"> <el-form-item label="开票类型" prop="invoice_color_type">
<el-radio-group v-model="form.toticket_type"> <el-radio-group v-model="form.invoice_color_type">
<el-radio :label="1">红字发票</el-radio> <el-radio :label="1">红字发票</el-radio>
<el-radio :label="2" checked>蓝字发票</el-radio> <el-radio :label="2" checked>蓝字发票</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</div> </div>
<div class="type" style="border: 1px solid #ccc; margin-bottom: 10px"> <div class="type" style="border: 1px solid #ccc; margin-bottom: 10px">
<el-form-item label="抬头类型" prop="people_type"> <el-form-item label="抬头类型" prop="taxpayer_type">
<!-- change事件 --> <!-- change事件 -->
<el-radio-group v-model="form.people_type"> <el-radio-group v-model="form.taxpayer_type">
<el-radio :label="1">企业</el-radio> <el-radio :label="1">企业</el-radio>
<el-radio :label="2">非营利单位</el-radio> <el-radio :label="2">非营利单位</el-radio>
<el-radio :label="3">个人</el-radio> <el-radio :label="3">个人</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</div> </div>
<div class="type" style="border: 1px solid #ccc; margin-bottom: 10px"> <div class="type" style="border: 1px solid #ccc; margin-bottom: 10px; padding-right: 50px">
<el-form-item label="发票信息" label-width="100px" class="title"> <el-form-item label="发票信息" label-width="100px" class="title">
<!-- <el-button type="text" style="float: right">历史开票信息</el-button> --> <!-- <el-button type="text" style="float: right">历史开票信息</el-button> -->
</el-form-item> </el-form-item>
...@@ -69,7 +69,7 @@ ...@@ -69,7 +69,7 @@
</el-form-item> </el-form-item>
<!-- 企业纸质显示 --> <!-- 企业纸质显示 -->
<div v-show="form.people_type === 1 && form.invioce_type === 3"> <div v-show="form.people_type === 1 && form.invioce_type === 3">
<el-form-item label="地址" prop="taxpayer_address" > <el-form-item label="地址" prop="taxpayer_address">
<el-input v-model="form.taxpayer_address"></el-input> <el-input v-model="form.taxpayer_address"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="电话" prop="taxpayer_mobile"> <el-form-item label="电话" prop="taxpayer_mobile">
...@@ -82,8 +82,8 @@ ...@@ -82,8 +82,8 @@
<el-input v-model="form.taxpayer_bank_account"></el-input> <el-input v-model="form.taxpayer_bank_account"></el-input>
</el-form-item> </el-form-item>
</div> </div>
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="taxpayer_remark">
<el-input v-model="form.remark"></el-input> <el-input v-model="form.taxpayer_remark"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="收票信息"> <el-form-item label="收票信息">
<span>请填写邮箱地址,方便接收电子发票</span> <span>请填写邮箱地址,方便接收电子发票</span>
...@@ -95,11 +95,11 @@ ...@@ -95,11 +95,11 @@
<el-form-item label="收件人名称" prop="recipient_name"> <el-form-item label="收件人名称" prop="recipient_name">
<el-input v-model="form.recipient_name"></el-input> <el-input v-model="form.recipient_name"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="收件人手机号" prop="recipient_phone"> <el-form-item label="收件人手机号" prop="recipient_mobile">
<el-input v-model="form.recipient_phone"></el-input> <el-input v-model="form.recipient_mobile"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="票据跟进人" prop="follow"> <el-form-item label="票据跟进人" prop="sales_rep_user_id_name">
<el-input v-model="form.follow"></el-input> <el-input v-model="form.sales_rep_user_id_name"></el-input>
</el-form-item> </el-form-item>
</div> </div>
<el-form-item> <el-form-item>
...@@ -146,54 +146,18 @@ export default { ...@@ -146,54 +146,18 @@ export default {
toticket_type: [{ required: true, message: '请选择开票类型', trigger: 'change' }], toticket_type: [{ required: true, message: '请选择开票类型', trigger: 'change' }],
people_type: [{ required: true, message: '请选择抬头类型', trigger: 'change' }], people_type: [{ required: true, message: '请选择抬头类型', trigger: 'change' }],
invioce_type: [{ required: true, message: '请选择发票类型', trigger: 'change' }], invioce_type: [{ required: true, message: '请选择发票类型', trigger: 'change' }],
taxpayer_name: [ taxpayer_name: [{ required: true, message: '请输入纳税人名称', trigger: 'blur' }],
{ required: true, message: '请输入纳税人名称', trigger: 'blur' }, taxpayer_identifier: [{ required: true, message: '请输入纳税人识别号', trigger: 'blur' }],
{ min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' } address: [{ required: true, message: '请输入地址', trigger: 'blur' }],
], taxpayer_address: [{ required: true, message: '请输入地址', trigger: 'blur' }],
taxpayer_identifier: [ taxpayer_mobile: [{ required: true, message: '请输入电话', trigger: 'blur' }],
{ required: true, message: '请输入纳税人识别号', trigger: 'blur' }, taxpayer_bank_name: [{ required: true, message: '请输入开户行', trigger: 'blur' }],
{ min: 3, max: 30, message: '长度在 3 到 30 个字符', trigger: 'blur' } taxpayer_bank_account: [{ required: true, message: '请输入银行账号', trigger: 'blur' }],
], account: [{ required: true, message: '请输入活动名称', trigger: 'blur' }],
address: [ mail_address: [{ required: true, message: '请输入邮箱地址', trigger: 'blur' }],
{ required: true, message: '请输入地址', trigger: 'blur' }, recipient_name: [{ required: true, message: '请输入收件人名称', trigger: 'blur' }],
{ min: 3, max: 30, message: '长度在 3 到 30 个字符', trigger: 'blur' } recipient_phone: [{ required: true, message: '请输入收件人手机号', trigger: 'blur' }],
], follow: [{ required: true, message: '请输入跟进人', trigger: 'blur' }]
taxpayer_address: [
{ required: true, message: '请输入地址', trigger: 'blur' },
{ min: 5, max: 30, message: '长度在 5 到 30 个字符', trigger: 'blur' }
],
taxpayer_mobile: [
{ required: true, message: '请输入电话', trigger: 'blur' },
{ min: 11, max: 11, message: '长度在 11 个字符', trigger: 'blur' }
],
taxpayer_bank_name: [
{ required: true, message: '请输入开户行', trigger: 'blur' },
{ min: 4, max: 10, message: '长度在 4 到 10 个字符', trigger: 'blur' }
],
taxpayer_bank_account: [
{ required: true, message: '请输入银行账号', trigger: 'blur' },
{ min: 19, max: 19, message: '长度在 19个字符', trigger: 'blur' }
],
account: [
{ required: true, message: '请输入活动名称', trigger: 'blur' },
{ min: 19, max: 19, message: '长度在 19 个字符', trigger: 'blur' }
],
mail_address: [
{ required: true, message: '请输入邮箱地址', trigger: 'blur' },
{ min: 5, max: 16, message: '长度在 5 到 16 个字符', trigger: 'blur' }
],
recipient_name: [
{ required: true, message: '请输入收件人名称', trigger: 'blur' },
{ min: 3, max: 8, message: '长度在 3 到 8 个字符', trigger: 'blur' }
],
recipient_phone: [
{ required: true, message: '请输入收件人手机号', trigger: 'blur' },
{ min: 11, max: 11, message: '长度 11 个字符', trigger: 'blur' }
],
follow: [
{ required: true, message: '请输入跟进人', trigger: 'blur' },
{ min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' }
]
} }
} }
}, },
...@@ -217,12 +181,32 @@ export default { ...@@ -217,12 +181,32 @@ export default {
} }
}) })
} }
},
watch: {
'form.people_type': function (oldVal, val) {
if (val !== oldVal) {
this.form.invioce_type = ''
}
}
} }
} }
</script> </script>
<style> <style scoped>
.table { .table {
border: 1px solid #000;
margin-bottom: 20px; margin-bottom: 20px;
} }
th {
width: 50px;
text-align: center;
font-size: 16px;
color: rgb(10, 1, 1);
font-weight: normal;
}
td {
width: 120px;
text-align: center;
color: rgb(10, 1, 1);
}
</style> </style>
<!-- 待确认列表 --> <!-- 待确认列表 -->
<template> <template>
<app-card> <app-card>
<app-list v-bind="tableOptions" ref="list" > <app-list v-bind="tableOptions" ref="list">
<template v-slot:table-x="{ row }"> <template v-slot:table-x="{ row }">
<router-link :to="{ name: 'deal', params: { id: row.id } }"> <router-link :to="{ name: 'deal', params: { id: row.id } }">
<el-button>处理</el-button> <el-button>处理</el-button>
...@@ -37,12 +36,12 @@ export default { ...@@ -37,12 +36,12 @@ export default {
columns: [ columns: [
{ label: '#', type: 'index', minWidth: '50px', fixed: 'left' }, { label: '#', type: 'index', minWidth: '50px', fixed: 'left' },
{ label: '支付凭证', prop: 'id', minWidth: 100 }, { label: '支付凭证', prop: 'id', minWidth: 100 },
{ label: '支付人姓名', prop: 'name', align: 'center', minWidth: 100 }, { label: '支付人姓名', prop: 'name', align: 'center', minWidth: 150 },
{ label: '支付金额', prop: 'amount', align: 'center', minWidth: 100 }, { label: '支付金额', prop: 'amount', align: 'center', minWidth: 100 },
{ label: '支付时间', prop: 'payment_time', align: 'center', minWidth: 100 }, { label: '支付时间', prop: 'payment_time', align: 'center', minWidth: 100 },
{ label: '支付方式', prop: 'payment_method', align: 'center', minWidth: 100 }, { label: '支付方式', prop: 'payment_method', align: 'center', minWidth: 100 },
{ label: '其他支付方式', prop: 'payment_method_others', align: 'center', minWidth: 100 }, { label: '其他支付方式', prop: 'payment_method_others', align: 'center', minWidth: 150 },
{ label: '交易流水号', prop: 'txn_id', align: 'center', minWidth: 100 }, { label: '交易流水号', prop: 'txn_id', align: 'center', minWidth: 150 },
{ label: '支付状态', prop: 'payment_status', align: 'center', minWidth: 100 }, { label: '支付状态', prop: 'payment_status', align: 'center', minWidth: 100 },
{ label: '创建日期', prop: 'created_time', align: 'center', minWidth: 100 }, { label: '创建日期', prop: 'created_time', align: 'center', minWidth: 100 },
{ slots: 'table-x', align: 'center', minWidth: 100 } { slots: 'table-x', align: 'center', minWidth: 100 }
......
...@@ -17,15 +17,17 @@ const routes = [ ...@@ -17,15 +17,17 @@ const routes = [
}, },
{ {
name: 'deal', name: 'deal',
path: 'deal', path: 'payment/:id/deal',
component: () => import('./views/Deal.vue'), component: () => import('./views/Deal.vue'),
meta: { title: '支付详情' } meta: { title: '支付详情' },
props: true
}, },
{ {
name: 'paydetail', name: 'paydetail',
path: 'paydetail', path: 'payment/:id/view',
component: () => import('./views/PayDetail.vue'), component: () => import('./views/PayDetail.vue'),
meta: { title: '支付详情' } meta: { title: '支付详情' },
props: true
} }
] ]
} }
......
<template> <template>
<div> <div>
<app-card title="支付明细信息" v-if="false"> <app-card title="支付明细信息" v-if="id">
<table border="1" width="1200px" cellspacing="0"> <table border="1" width="1200px" cellspacing="0">
<tr> <tr>
<th>支付人姓名</th> <th>支付人姓名</th>
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
</tr> </tr>
<tr> <tr>
<th>备注</th> <th>备注</th>
<td colspan="7">{{ confirmDetail.taxpayer_remark }}</td> <td colspan="7">{{ confirmDetail.comment }}</td>
</tr> </tr>
<tr> <tr>
<th>创建时间</th> <th>创建时间</th>
...@@ -47,47 +47,44 @@ ...@@ -47,47 +47,44 @@
</table> </table>
</app-card> </app-card>
<app-card> <app-card>
<el-form ref="formRef" :model="form" :rules="formRules"> <el-form ref="formRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="支付状态" label-width="80px" prop="payment_status"> <el-form-item label="支付状态" prop="payment_status">
<el-select v-model="form.payment_status"> <el-select v-model="form.payment_status">
<el-option label="已支付" :value="1"></el-option> <el-option label="已支付" :value="1"></el-option>
<el-option label="未支付" :value="2"></el-option> <el-option label="未支付" :value="2"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="手续费" label-width="80px" prop="service_charge"> <el-form-item label="手续费" label-width="80px" prop="service_charge">
<el-input size="mini" v-model="form.service_charge"></el-input> <el-input v-model="form.service_charge"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="到账时间" label-width="80px" prop="receiving_time"> <el-form-item label="到账时间" prop="receiving_time">
<el-date-picker <el-date-picker
v-model="form.receiving_time" v-model="form.receiving_time"
type="datetimerange" type="datetime"
range-separator="至" range-separator="至"
start-placeholder="开始日期时间" start-placeholder="开始日期时间"
end-placeholder="结束日期时间" end-placeholder="结束日期时间"
value-format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss"
size="small" size="small"
style="width: 360px"
></el-date-picker> ></el-date-picker>
</el-form-item> </el-form-item>
<el-form-item label="备注" label-width="80px" prop="taxpayer_remark"> <el-form-item label="备注" prop="comment">
<el-input size="mini" v-model="form.remark"> </el-input> <el-input type="textarea" v-model="form.comment"> </el-input>
</el-form-item> </el-form-item>
<el-form-item label="到账凭证" label-width="80px" prop="receiving_voucher_filename"> <el-form-item label="到账凭证" prop="receiving_voucher_filename">
<el-upload <el-upload
class="upload-demo" list-type="picture-card"
drag
action="" action=""
multiple multiple
show-file-list :auto-upload="false"
:before-upload="beforeUpload" :on-change="handleChange"
:on-remove="handleChange"
accept="image/*" accept="image/*"
> >
<img :src="form.receiving_voucher_filename" alt="" />
<!-- <div class="el-upload__text">拖到此处,或<em>点击上传</em></div> -->
</el-upload> </el-upload>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" style="margin-left: 200px" @click="dealPay">提交</el-button> <el-button type="primary" @click="dealPay">提交</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</app-card> </app-card>
...@@ -97,103 +94,63 @@ ...@@ -97,103 +94,63 @@
<script> <script>
import AppCard from '@/components/base/AppCard.vue' import AppCard from '@/components/base/AppCard.vue'
import { payConfirm, payDetail } from '../api' import { payConfirm, payDetail } from '../api'
// import { splitStrLast } from '@/utils/util'
export default { export default {
props: { id: { type: String } },
components: { AppCard }, components: { AppCard },
data() { data() {
return { return {
confirmDetail: {}, confirmDetail: {},
uploadData: {},
id: '',
form: { form: {
service_charge: '', service_charge: '',
payment_status: '', payment_status: '',
receiving_time: '', receiving_time: '',
taxpayer_remark: '', comment: '',
receiving_voucher_filename: [] receiving_voucher_filename: []
}, },
rules: { rules: {
payment_status: [{ required: true, message: '请选择支付状态', trigger: 'change' }], payment_status: [{ required: true, message: '请选择支付状态', trigger: 'change' }],
service_charge: [ service_charge: [{ required: true, message: '请输入手续费', trigger: 'blur' }],
{ required: true, message: '请输入手续费', trigger: 'blur' }, receiving_time: [{ required: true, message: '请选择到账时间', trigger: 'blur' }],
{ min: 3, max: 10, message: '长度在 3 到 10 个字符', trigger: 'blur' } comment: [{ required: true, message: '请输入备注', trigger: 'blur' }],
],
taxpayer_remark: [
{ required: true, message: '请输入备注', trigger: 'blur' },
{ min: 3, max: 10, message: '长度在 3 到 10 个字符', trigger: 'blur' }
],
receiving_voucher_filename: [{ required: true, message: '请上传到账凭证', trigger: 'change' }] receiving_voucher_filename: [{ required: true, message: '请上传到账凭证', trigger: 'change' }]
},
importDisabled: false
}
},
computed: {
// 列表配置
tableOptions() {
return {
filters: [
{
type: 'select',
prop: 'project',
options: this.payState,
labelKey: 'project_name',
valueKey: 'project_id',
placeholder: '支付状态'
},
{
type: 'input',
prop: 'spu_name',
placeholder: '手续费'
},
{ prop: 'date', slots: 'filter-date' },
{
type: 'input',
prop: 'spu_name',
placeholder: '备注'
}
]
} }
} }
}, },
mounted() { mounted() {
this.id = this.$route.params.id this.id && this.getPayDetail()
// this.getPayDetail()
}, },
methods: { methods: {
beforeUpload(file, target) { handleChange(file, fileList) {
console.log(file) this.form.receiving_voucher_filename = fileList
this.form.receiving_voucher_filename.pust(file)
},
handleSuccess(res, file, target) {
this.fileLoading = ''
const _file = file.raw
this.form.receiving_voucher_filename = _file.src
}, },
// 获取支付信息 // 获取支付信息
getPayDetail() { getPayDetail() {
const params = { id: this.id } payDetail({ id: this.id }).then(res => {
payDetail(params).then(res => {
if (res.code === 0) { if (res.code === 0) {
this.project = res.data.list[0] const [first = {}] = res.data.list
this.confirmDetail = res.data.list[0].confirmed_details[0] this.project = first
this.confirmDetail = first.confirmed_details[0]
} }
}) })
}, },
// 确认支付 // 确认支付
dealPay() { dealPay() {
this.$refs.formRef.validate(valid => { this.$refs.formRef.validate().then(() => {
if (valid) {
const params = Object.assign({ id: this.id }, this.form) const params = Object.assign({ id: this.id }, this.form)
console.log(params) // 图片上传
payConfirm(this.form).then(res => { this.form.receiving_voucher_filename.forEach((file, index) => {
if (res.code === 0) { params[`receiving_voucher_filename[${index}]`] = file.raw
})
delete params.receiving_voucher_filename
payConfirm(params)
.then(res => {
this.$message.success('支付已经到账') this.$message.success('支付已经到账')
history.go(-1) history.go(-1)
} else {
this.$message.error('提交失败')
}
}) })
} .catch(error => {
this.$message.error(error.message)
})
}) })
} }
} }
......
<template> <template>
<div> <div>
<el-button @click="fetchTicketDetail" type="danger">财务确认足额支付</el-button> <template v-if="dealList.payment_status === '70'">
<el-button @click="fetchTicketDetail" type="primary">刷新状态及金额</el-button> <el-button
@click="fetchConfirmTicketDetail('FINANCE')"
type="danger"
v-if="isFINANCE && dealList.finance_confirm_status === 0"
>财务确认足额支付</el-button
>
<el-button
@click="fetchConfirmTicketDetail('BUSINESS')"
type="danger"
v-if="isBUSINESS && dealList.bussiness_confirm_status === 0"
>业务确认足额支付</el-button
>
</template>
<template v-if="dealList.payment_status === '80'">
<el-button
@click="fetchCancelTicketDetail('FINANCE')"
type="danger"
v-if="isFINANCE && dealList.finance_confirm_status === 1"
>财务取消足额支付</el-button
>
<el-button
@click="fetchCancelTicketDetail('BUSINESS')"
type="danger"
v-if="isBUSINESS && dealList.bussiness_confirm_status === 1"
>业务取消足额支付</el-button
>
</template>
<app-card title="订单信息"> <app-card title="订单信息">
<Order :dealList= "dealList" /> <Order :dealList="dealList" />
</app-card> </app-card>
<app-card title="学员信息"> <app-card title="学员信息">
<Student :dealList= "dealList" /> <Student :dealList="dealList" />
</app-card> </app-card>
<app-card title="收款信息"> <app-card title="收款信息">
<Collection :dealList= "dealList" /> <Collection :dealList="dealList" />
</app-card> </app-card>
<app-card title="发票信息"> <app-card title="发票信息">
<Ticket :dealList= "dealList" /> <Ticket :dealList="dealList" />
</app-card> </app-card>
<app-card title="渠道信息"> <app-card title="渠道信息">
<Channel :dealList= "dealList" /> <Channel :dealList="dealList" />
</app-card> </app-card>
<app-card title="支付待确认记录"> <app-card title="支付待确认记录">
<Toconfirm :dealList= "dealList" :id="this.id" /> <Toconfirm :dealList="dealList" :id="this.id" />
</app-card> </app-card>
<app-card title="支付确认记录"> <app-card title="支付确认记录">
<Confirmed :dealList= "dealList" :id="this.id"/> <Confirmed :dealList="dealList" :id="this.id" />
</app-card> </app-card>
</div> </div>
</template> </template>
...@@ -36,7 +62,7 @@ import Ticket from '../components/Ticket.vue' ...@@ -36,7 +62,7 @@ import Ticket from '../components/Ticket.vue'
import Channel from '../components/Channel.vue' import Channel from '../components/Channel.vue'
import Toconfirm from '../components/Toconfirm.vue' import Toconfirm from '../components/Toconfirm.vue'
import Confirmed from '../components/Confirmed.vue' import Confirmed from '../components/Confirmed.vue'
import { payDetail } from '../api' import { payDetail, confirmPayDetail, cancelPayDetail } from '../api'
export default { export default {
components: { AppCard, Order, Student, Collection, Ticket, Channel, Toconfirm, Confirmed }, components: { AppCard, Order, Student, Collection, Ticket, Channel, Toconfirm, Confirmed },
data() { data() {
...@@ -45,19 +71,64 @@ export default { ...@@ -45,19 +71,64 @@ export default {
dealList: {} dealList: {}
} }
}, },
created() { computed: {
roles() {
return this.$store.state.roles
},
isFINANCE() {
return (
this.roles.includes('finance_manager') ||
this.roles.includes('finance_director') ||
this.roles.includes('developer')
)
},
isBUSINESS() {
return (
this.roles.includes('admissions_director') ||
this.roles.includes('dean_of_admissions') ||
this.roles.includes('developer')
)
}
},
beforeMount() {
this.id = this.$route.params.id // 详情列表 this.id = this.$route.params.id // 详情列表
// 获取发票详情信息 // 获取发票详情信息
this.fetchTicketDetail() this.fetchTicketDetail()
this.$store.dispatch('getRoles')
}, },
methods: { methods: {
fetchTicketDetail() { fetchTicketDetail() {
const params = { id: this.id } const params = { id: this.id }
payDetail(params).then((res) => { payDetail(params).then(res => {
if (res.code === 0) { if (res.code === 0) {
this.dealList = res.data.list[0] this.dealList = res.data.list[0]
} }
}) })
},
// 确认
fetchConfirmTicketDetail(val) {
console.log(val)
const params = {
confirm_type: val,
id: this.id
}
confirmPayDetail(params).then(res => {
if (res.code === 0) {
this.fetchTicketDetail()
}
})
},
// 取消
fetchCancelTicketDetail(val) {
const params = {
confirm_type: val,
id: this.id
}
cancelPayDetail(params).then(res => {
if (res.code === 0) {
this.fetchTicketDetail()
}
})
} }
} }
} }
......
<template> <template>
<app-card> <app-card>
<app-list v-bind="tableOptions" ref="list" @selection-change="handleSelectionChange"> <app-list v-bind="tableOptions" ref="list" @selection-change="handleSelectionChange">
<!-- 申请状态 -->
<template v-slot:status-select="{ params }">
<el-select v-model="params.status" placeholder="申请状态" filterable remote>
<el-option v-for="(item, index) in conditionList.payment_status" :value="item.key" :key="index" :label="item.value">
<el-checkbox>{{ item.value }}</el-checkbox>
</el-option>
</el-select>
</template>
<!-- 费用类型 -->
<template v-slot:expense-select="{ params }">
<el-select v-model="params.expense" placeholder="费用类型" filterable remote>
<el-option v-for="(item, index) in conditionList.type" :key="index" :label="item.value" :value="item.key">
<el-checkbox>{{ item.value }}</el-checkbox>
</el-option>
</el-select>
</template>
<!-- 发票状态 -->
<template v-slot:invoice-select="{ params }">
<el-select v-model="params.invoice" placeholder="发票状态" filterable remote>
<el-option v-for="(item, index) in conditionList.invoice_status" :key="index" :label="item.value" :value="item.key">
<el-checkbox>{{ item.value }}</el-checkbox>
</el-option>
</el-select>
</template>
<!-- 允许开具发票 --> <!-- 允许开具发票 -->
<template v-slot:ticket_type="{ params }"> <template v-slot:ticket_type="{ params }">
<el-radio-group v-model="params.can_add_invoice"> <el-radio-group v-model="params.can_add_invoice">
<el-radio :label="1">开启</el-radio> <el-radio label="1">开启</el-radio>
<el-radio :label="2">关闭</el-radio> <el-radio label="2">关闭</el-radio>
</el-radio-group> </el-radio-group>
</template> </template>
<!-- 首次缴费时间 --> <!-- 首次缴费时间 -->
...@@ -60,18 +36,21 @@ ...@@ -60,18 +36,21 @@
> >
</el-date-picker> </el-date-picker>
</template> </template>
<template #header-aside>
</template>
<!-- 状态 --> <!-- 状态 -->
<template v-slot:status="{ row }"> <template v-slot:status="{ row }">
<el-switch v-model="row.can_add_invoice" active-value="1" inactive-value="0" @change="handleStatus(row)"></el-switch> <el-switch
v-model="row.can_add_invoice"
active-value="1"
inactive-value="0"
@change="handleStatus(row)"
></el-switch>
</template> </template>
<!-- 操作 --> <!-- 操作 -->
<template v-slot:table-x="{ row }"> <template v-slot:table-x="{ row }">
<router-link target="_blank" :to="{ name: 'paymentView', params: { id: row.id } }"> <router-link target="_blank" :to="{ name: 'paymentView', params: { id: row.id } }">
<el-button>查看</el-button> <el-button>查看</el-button>
</router-link> </router-link>
<el-dropdown split-button type="primary" size="small"> <el-dropdown split-button type="primary" size="small" style="margin-left: 10px; margin-right: 10px">
发票 发票
<el-dropdown-menu slot="dropdown"> <el-dropdown-menu slot="dropdown">
<el-dropdown-item @click.native="createPop(row)">开具发票</el-dropdown-item> <el-dropdown-item @click.native="createPop(row)">开具发票</el-dropdown-item>
...@@ -82,8 +61,8 @@ ...@@ -82,8 +61,8 @@
<el-button @click="backTicket(row)">退费</el-button> <el-button @click="backTicket(row)">退费</el-button>
</template> </template>
<template #footer> <template #footer>
<span>已选择{{multipleSelection.length}}</span> <span>已选择{{ multipleSelection.length }}</span>
<el-button @click="exportSelect" style="margin-left:40px">导出</el-button> <el-button @click="exportSelect" style="margin-left: 40px">导出</el-button>
</template> </template>
</app-list> </app-list>
<!-- 开具发票 --> <!-- 开具发票 -->
...@@ -91,18 +70,7 @@ ...@@ -91,18 +70,7 @@
<TicketForm :id="id" @close="ticketVisible = false" @createTicket="handleCreateTicket" /> <TicketForm :id="id" @close="ticketVisible = false" @createTicket="handleCreateTicket" />
</el-dialog> </el-dialog>
<!-- 开票二维码 --> <!-- 开票二维码 -->
<ShareQrcode :visible.sync="codeVisible" :value="shareUrl"/> <ShareQrcode :visible.sync="codeVisible" :value="shareUrl" />
<!-- 作废弹框 -->
<el-dialog
title="提示"
:visible.sync="disabledTicketVisible"
width="30%">
<span>确定要作废此发票吗?作废后不可恢复</span>
<span slot="footer" class="dialog-footer">
<el-button @click="disabledTicketVisible = false">取 消</el-button>
<el-button type="primary" @click="confirmDisabledTicket">确 定</el-button>
</span>
</el-dialog>
</app-card> </app-card>
</template> </template>
<script> <script>
...@@ -115,15 +83,14 @@ import ShareQrcode from '../components/ShareQrcode.vue' ...@@ -115,15 +83,14 @@ import ShareQrcode from '../components/ShareQrcode.vue'
import { getCondition, getPayList, allowCreate, createNewTicket, drawBack, cancelTicket } from '../api' import { getCondition, getPayList, allowCreate, createNewTicket, drawBack, cancelTicket } from '../api'
import XLSX from 'xlsx' import XLSX from 'xlsx'
import { funDownload } from '@/utils/util' import { funDownload } from '@/utils/util'
const statusMap = { 1: '不可开具', 2: '未开具', 3: '开具中', 4: '已开具', 5: '开票失效', 6: '已作废' }
export default { export default {
components: { AppCard, AppList, TicketForm, ShareQrcode }, components: { AppCard, AppList, TicketForm, ShareQrcode },
data() { data() {
return { return {
id: '', id: '',
shareUrl: '', shareUrl: '',
conditionList: { // 筛选条件列表 conditionList: {
// 筛选条件列表
project_id: [], // 项目 project_id: [], // 项目
channel_id: [], // 渠道 channel_id: [], // 渠道
type: [], // 费用类型 type: [], // 费用类型
...@@ -167,7 +134,8 @@ export default { ...@@ -167,7 +134,8 @@ export default {
pege: '', pege: '',
per_page: '' per_page: ''
}, },
beforeRequest: this.beforeRequest beforeRequest: this.beforeRequest,
callback: this.callback
}, },
filters: [ filters: [
// 项目 // 项目
...@@ -200,18 +168,36 @@ export default { ...@@ -200,18 +168,36 @@ export default {
}, },
// 申请状态 // 申请状态
{ {
prop: 'status', type: 'select',
slots: 'status-select' prop: 'payment_status',
options: this.conditionList.payment_status,
labelKey: 'value',
valueKey: 'key',
multiple: true,
collapseTags: true,
placeholder: '申请状态'
}, },
// 费用类型 // 费用类型
{ {
prop: 'expense', type: 'select',
slots: 'expense-select' options: this.conditionList.type,
prop: 'type',
labelKey: 'value',
valKey: 'key',
multiple: true,
collapseTags: true,
placeholder: '费用类型'
}, },
// 发票状态 // 发票状态
{ {
prop: 'invoice', type: 'select',
slots: 'invoice-select' prop: 'invoice_status',
options: this.conditionList.invoice_status,
labelKey: 'value',
valueKey: 'key',
placeholder: '发票状态',
filterable: true,
remote: true
} }
], ],
moreFilters: [ moreFilters: [
...@@ -237,8 +223,8 @@ export default { ...@@ -237,8 +223,8 @@ export default {
}, },
{ {
label: '允许开具发票', label: '允许开具发票',
prop: 'ticket_type', prop: 'can_add_invoice',
slots: 'ticket_type' slots: 'can_add_invoice'
}, },
{ {
label: '首次缴费时间', label: '首次缴费时间',
...@@ -254,54 +240,56 @@ export default { ...@@ -254,54 +240,56 @@ export default {
columnsOptions: { key: 'payments' }, columnsOptions: { key: 'payments' },
columns: [ columns: [
{ type: 'selection', minWidth: '50px', fixed: 'left' }, { type: 'selection', minWidth: '50px', fixed: 'left' },
{ label: '客户名称', prop: 'name', minWidth: 80 }, { label: '客户名称', prop: 'name', minWidth: 100 },
{ label: '项目', prop: 'project_id', align: 'center', minWidth: 80 }, { label: '项目', prop: 'project', align: 'center', minWidth: 100 },
{ label: '支付状态', prop: 'type', align: 'center', minWidth: 80 }, { label: '支付状态', prop: 'paymentStatuView', align: 'center', minWidth: 100 },
{ label: '首次缴费时间', prop: 'first_payment_time', align: 'center', minWidth: 200 }, { label: '首次缴费时间', prop: 'first_payment_time', align: 'center', minWidth: 200 },
{ label: '末次缴费时间', prop: 'final_payment_time', align: 'center', minWidth: 200 }, { label: '末次缴费时间', prop: 'final_payment_time', align: 'center', minWidth: 200 },
{ label: '应缴金额', prop: 'bill_total', align: 'center', minWidth: 80 }, { label: '应缴金额', prop: 'bill_total', align: 'center', minWidth: 100 },
{ label: '实缴金额', prop: 'amount_need_to_pay', align: 'center', minWidth: 80 }, { label: '实缴金额', prop: 'amount_need_to_pay', align: 'center', minWidth: 100 },
{ label: '手续费', prop: 'service_charge', align: 'center', minWidth: 80 }, { label: '手续费', prop: 'service_charge', align: 'center', minWidth: 100 },
{ label: '到账金额', prop: 'amount_received', align: 'center', minWidth: 80 }, { label: '到账金额', prop: 'amount_received', align: 'center', minWidth: 100 },
{ label: '代缴金额', prop: 'amount_waiting_for_pay', align: 'center', minWidth: 80 }, { label: '代缴金额', prop: 'amount_waiting_for_pay', align: 'center', minWidth: 100 },
{ label: '跟进人', prop: 'sales_rep_user_id_name', align: 'center', minWidth: 80 }, { label: '跟进人', prop: 'sales_rep_user_id_name', align: 'center', minWidth: 100 },
{ label: '渠道', prop: 'channel_id', align: 'center', minWidth: 80 }, { label: '渠道', prop: 'channelView', align: 'center', minWidth: 100 },
{ label: '交易流水号', prop: 'txn_id_list', align: 'center', minWidth: 300 }, { label: '交易流水号', prop: 'txn_id_list', align: 'center', minWidth: 300 },
{ label: '服务费规则', prop: 'service_fee_rules', align: 'center', minWidth: 120 }, { label: '服务费规则', prop: 'service_fee_rules', align: 'center', minWidth: 120 },
{ label: '服务费比例', prop: 'service_charge_ratio', align: 'center', minWidth: 120 }, { label: '服务费比例', prop: 'service_charge_ratio', align: 'center', minWidth: 120 },
{ label: '不含税销售金额', prop: 'sales_amount_excluding_tax', align: 'center', minWidth: 120 }, { label: '不含税销售金额', prop: 'sales_amount_excluding_tax', align: 'center', minWidth: 150 },
{ label: '渠道代理提基数', prop: 'channel_agent_fee_base', align: 'center', minWidth: 120 }, { label: '渠道代理提基数', prop: 'channel_agent_fee_base', align: 'center', minWidth: 150 },
{ label: '代理服务费', prop: 'agency_service_fee', align: 'center', minWidth: 120 }, { label: '代理服务费', prop: 'agency_service_fee', align: 'center', minWidth: 120 },
{ label: '代理服务费(不含税金额)', prop: 'agency_service_fee_excluding_tax', align: 'center', minWidth: 300 }, {
{ label: '渠道税率', prop: 'channel_tax_rate', align: 'center', minWidth: 80 }, label: '代理服务费(不含税金额)',
{ label: '户名', prop: 'channel_account_name', align: 'center', minWidth: 80 }, prop: 'agency_service_fee_excluding_tax',
{ label: '账号', prop: 'channel_account', align: 'center', minWidth: 80 }, align: 'center',
{ label: '开户行', prop: 'channel_bank_of_deposit', align: 'center', minWidth: 80 }, minWidth: 300
{ label: '所属班次', prop: 'bill_customer_class', align: 'center', minWidth: 80 }, },
{ label: '渠道税率', prop: 'channel_tax_rate', align: 'center', minWidth: 100 },
{ label: '户名', prop: 'channel_account_name', align: 'center', minWidth: 100 },
{ label: '账号', prop: 'channel_account', align: 'center', minWidth: 100 },
{ label: '开户行', prop: 'channel_bank_of_deposit', align: 'center', minWidth: 100 },
{ label: '所属班次', prop: 'bill_customer_class', align: 'center', minWidth: 100 },
{ label: '开学时间', prop: 'bill_customer_class_start_time', align: 'center', minWidth: 200 }, { label: '开学时间', prop: 'bill_customer_class_start_time', align: 'center', minWidth: 200 },
{ label: '学制期限', prop: 'bill_customer_class_length_of_schooling', align: 'center', minWidth: 80 }, { label: '学制期限', prop: 'bill_customer_class_length_of_schooling', align: 'center', minWidth: 100 },
{ label: '客户编号', prop: 'customer_id', align: 'center', minWidth: 300 }, { label: '客户编号', prop: 'customer_id', align: 'center', minWidth: 300 },
// eslint-disable-next-line object-curly-newline {
{ label: '退费状态', label: '退费状态',
prop: 'refund_time', prop: 'refund_time',
align: 'center', align: 'center',
minWidth: 80, minWidth: 100,
computed({ row }) { computed({ row }) {
return row.refund_time === null ? '未退费' : '已退费' return row.refund_time === null ? '未退费' : '已退费'
} }
}, },
// eslint-disable-next-line object-curly-newline {
{ label: '发票状态', label: '发票状态',
prop: 'invoice_status', prop: 'invoiceStatusView',
align: 'center', align: 'center',
minWidth: 80, minWidth: 100
computed({ row }) {
return statusMap[row.invoice_status]
}
}, },
{ label: '发票申请日期', prop: 'invoice_application_time', align: 'center', minWidth: 200 }, { label: '发票申请日期', prop: 'invoice_application_time', align: 'center', minWidth: 200 },
{ label: '允许开具发票', prop: 'can_add_invoice', slots: 'status', align: 'center', minWidth: 200 }, { label: '允许开具发票', prop: 'can_add_invoice', slots: 'status', align: 'center', minWidth: 200 },
{ label: '操作', slots: 'table-x', align: 'center', minWidth: 300 } { label: '操作', slots: 'table-x', align: 'center', minWidth: 300, fixed: 'right' }
] ]
} }
} }
...@@ -310,6 +298,16 @@ export default { ...@@ -310,6 +298,16 @@ export default {
this.fetchCondition() // 获取过滤条件 this.fetchCondition() // 获取过滤条件
}, },
methods: { methods: {
callback(data) {
// eslint-disable-next-line array-callback-return
data.forEach(item => {
item.project = this.findName(this.conditionList.project_id, item.project_id, 'project_id', 'name')
item.paymentStatuView = this.findName(this.conditionList.payment_status, item.payment_status, 'key', 'value')
item.channelView = this.findName(this.conditionList.channel_id, item.channel_id, 'channel_id', 'title')
item.invoiceStatusView = this.findName(this.conditionList.invoice_status, item.invoice_status, 'key', 'value')
})
return data
},
// 开具发票 // 开具发票
createPop(row) { createPop(row) {
this.id = row.id this.id = row.id
...@@ -317,8 +315,21 @@ export default { ...@@ -317,8 +315,21 @@ export default {
}, },
// 作废发票 // 作废发票
disabledTicket(row) { disabledTicket(row) {
this.id = row.id this.$confirm('确定要作废此发票吗?作废后不可恢复', '提示', {
this.disabledTicketVisible = true confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.fetchDisabled(row)
})
},
// 作废发票
fetchDisabled(row) {
cancelTicket(row.id).then(res => {
if (res.code === 0) {
this.$refs.list.refetch()
}
})
}, },
qrCode(row) { qrCode(row) {
this.shareUrl = `${import.meta.env.VITE_SHARE_URL}/h5/payment/invoice?id=${row.id}` this.shareUrl = `${import.meta.env.VITE_SHARE_URL}/h5/payment/invoice?id=${row.id}`
...@@ -326,7 +337,7 @@ export default { ...@@ -326,7 +337,7 @@ export default {
}, },
// 获取过滤条件 // 获取过滤条件
fetchCondition() { fetchCondition() {
getCondition().then((res) => { getCondition().then(res => {
if (res.code === 0) { if (res.code === 0) {
this.conditionList = res.data this.conditionList = res.data
} }
...@@ -337,21 +348,22 @@ export default { ...@@ -337,21 +348,22 @@ export default {
this.multipleSelection = val this.multipleSelection = val
}, },
// 开具发票 // 开具发票
handleCreateTicket() { handleCreateTicket(val) {
createNewTicket().then(res => { createNewTicket(val).then(res => {
if (res.code === 0) { if (res.code === 0) {
this.$message.success('开票成功') this.$message.success('开票成功')
this.ticketVisible = false this.ticketVisible = false
this.getPayList() // 刷新订单列表 this.$refs.list.refetch() // 刷新订单列表
} }
}) })
}, },
// 是否允许开具发票 // 是否允许开具发票
handleStatus(row) { handleStatus(row) {
const params = { id: row.id, status: row.can_add_invoice } const params = { id: row.id, can_add_invoice: row.can_add_invoice }
allowCreate(params).then(res => { allowCreate(params).then(res => {
if (res.code === 0) { if (res.code === 0) {
this.$message.success('更新状态成功') this.$message.success('更新状态成功')
this.$refs.list.refetch() // 刷新订单列表
} else { } else {
this.$message.error('更新状态失败') this.$message.error('更新状态失败')
} }
...@@ -359,23 +371,24 @@ export default { ...@@ -359,23 +371,24 @@ export default {
}, },
// 确认作废 // 确认作废
confirmDisabledTicket() { confirmDisabledTicket() {
// const params = { id: row.id }
cancelTicket().then(res => { cancelTicket().then(res => {
if (res.code === 0) { if (res.code === 0) {
this.disabledTicketVisible = false this.disabledTicketVisible = false
this.$message.success('发票已作废') this.$message.success('发票已作废')
this.getPayList() // 更新订单列表 this.$refs.list.refetch() // 刷新订单列表
} else { } else {
this.$message.error('该发票无作废失败') this.$message.error('该发票无作废失败')
} }
}) })
}, },
// 退费 // 退费
backTicket(row) { backTicket(row) {
// 改变退费状态 // 改变退费状态
drawBack(row.id).then(res => { const params = { id: row.id }
drawBack(params).then(res => {
if (res.code === 0) { if (res.code === 0) {
this.getPayList() // 刷新订单列表 this.$refs.list.refetch() // 刷新订单列表
this.$message.success('退费成功') this.$message.success('退费成功')
} else { } else {
this.$message.error('退费失败') this.$message.error('退费失败')
...@@ -396,21 +409,45 @@ export default { ...@@ -396,21 +409,45 @@ export default {
propList.forEach(key => { propList.forEach(key => {
let val = item[key] let val = item[key]
if (key === 'can_add_invoice') val = val === '1' ? '允许' : '不允许' if (key === 'can_add_invoice') val = val === '1' ? '允许' : '不允许'
if (key === 'refund_time') val = val === null ? '' : '已退费'
rowValArr.push(val) rowValArr.push(val)
}) })
excelList.push(rowValArr) excelList.push(rowValArr)
}) })
const ws = XLSX.utils.aoa_to_sheet(excelList) const ws = XLSX.utils.aoa_to_sheet(excelList)
ws['!cols'] = [ ws['!cols'] = [
{ wpx: 120 },
{ wpx: 120 },
{ wpx: 160 },
{ wpx: 180 },
{ wpx: 120 },
{ wpx: 80 },
{ wpx: 200 }, { wpx: 200 },
{ wpx: 120 }, { wpx: 200 },
{ wpx: 120 } { wpx: 200 },
{ wpx: 200 },
{ wpx: 200 },
{ wpx: 200 },
{ wpx: 200 },
{ wpx: 200 },
{ wpx: 200 },
{ wpx: 200 },
{ wpx: 200 },
{ wpx: 200 },
{ wpx: 200 },
{ wpx: 200 },
{ wpx: 200 },
{ wpx: 200 },
{ wpx: 200 },
{ wpx: 200 },
{ wpx: 200 },
{ wpx: 200 },
{ wpx: 200 },
{ wpx: 200 },
{ wpx: 200 },
{ wpx: 200 },
{ wpx: 200 },
{ wpx: 200 },
{ wpx: 200 },
{ wpx: 200 },
{ wpx: 200 },
{ wpx: 200 },
{ wpx: 200 },
{ wpx: 200 }
] ]
const wb = XLSX.utils.book_new() const wb = XLSX.utils.book_new()
wb.SheetNames.push('Worksheet') wb.SheetNames.push('Worksheet')
...@@ -419,6 +456,12 @@ export default { ...@@ -419,6 +456,12 @@ export default {
const wbout = XLSX.write(wb, wopts) const wbout = XLSX.write(wb, wopts)
const url = URL.createObjectURL(new window.Blob([wbout], { type: 'application/octet-stream' })) const url = URL.createObjectURL(new window.Blob([wbout], { type: 'application/octet-stream' }))
funDownload(url, `订单列表_${Date.now()}.xlsx`) funDownload(url, `订单列表_${Date.now()}.xlsx`)
},
findName(option, item, findKey, reName) {
const found = option.find(findItem => {
return parseInt(findItem[findKey]) === parseInt(item)
})
return found ? found[reName] : item
} }
} }
} }
......
import Vue from 'vue' import Vue from 'vue'
import Vuex from 'vuex' import Vuex from 'vuex'
import { getUser, logout } from '@/api/base' import { getUser, logout, getRoles } from '@/api/base'
Vue.use(Vuex) Vue.use(Vuex)
export default new Vuex.Store({ export default new Vuex.Store({
state: { state: {
user: {} user: {},
roles: []
}, },
mutations: { mutations: {
setUser(state, user) { setUser(state, user) {
state.user = user state.user = user
},
setRoles(state, roles) {
state.roles = roles
} }
}, },
actions: { actions: {
...@@ -43,6 +47,15 @@ export default new Vuex.Store({ ...@@ -43,6 +47,15 @@ export default new Vuex.Store({
return false return false
}) })
return isLogin return isLogin
},
// 获取角色
getRoles({ commit }) {
return getRoles().then(response => {
const { roles = [] } = response.data
commit('setRoles', roles)
console.log(roles)
return response
})
} }
} }
}) })
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论