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