Skip to content
Toggle navigation
Toggle navigation
This project
Loading...
Sign in
杨炀
/
ztx_wx_gzt
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Issue Boards
Files
Commits
Network
Compare
Branches
Tags
4ecc383f
authored
2026-06-03 13:22:30 +0800
by
lttnew
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
bug修复
1 parent
2a11a442
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
316 additions
and
167 deletions
App.vue
common/api.js
common/utils.js
login/loginC.vue
myCenter/examPointApply.vue
pages/index/daoGuanPerson.vue
pages/index/home.vue
pages/index/perfect.vue
pages/invoice/apply.vue
pages/invoice/applyFeisui.vue
personal/addVip_per.vue
personal/home.vue
personal/memberInfo.vue
personalVip/addVip.vue
personalVip/payment.vue
App.vue
View file @
4ecc383
...
...
@@ -17,24 +17,23 @@
let
userName
=
uni
.
getStorageSync
(
'userName'
)
if
(
userName
)
{
try
{
await
getInfo
(
this
)
this
.
globalData
.
isLogin
=
true
}
catch
(
e
)
{
this
.
globalData
.
isLogin
=
false
uni
.
removeStorageSync
(
'token'
)
uni
.
removeStorageSync
(
'userName'
)
uni
.
reLaunch
({
url
:
'/login/login'
})
return
}
try
{
await
getInfo
(
this
)
this
.
globalData
.
isLogin
=
true
}
catch
(
e
)
{
this
.
globalData
.
isLogin
=
false
uni
.
removeStorageSync
(
'token'
)
uni
.
removeStorageSync
(
'userName'
)
uni
.
reLaunch
({
url
:
'/login/login'
})
return
}
// 道馆用户跳转到道馆首页
const
deptType
=
this
.
globalData
.
deptType
const
userType
=
this
.
globalData
.
userType
// 道馆判断:deptType=6 或者 userType='4'
if
(
deptType
==
6
||
deptType
==
'6'
||
userType
==
'4'
)
{
if
(
deptType
==
6
||
deptType
==
'6'
||
userType
==
'4'
||
deptType
==
null
)
{
uni
.
reLaunch
({
url
:
'/pages/index/daoGuanPerson'
})
...
...
common/api.js
View file @
4ecc383
...
...
@@ -141,13 +141,14 @@ export function deptTreeSelect(params) {
}
// 注册选择协会树
export
function
certifiedDeptTreeRegister
(
params
)
{
return
request
({
url
:
'/system/user/certifiedDeptTreeWithNoDaoguan2'
,
method
:
'get'
,
params
})
}
export
function
certifiedDeptTreeRegister
(
params
,
options
=
{})
{
return
request
({
...
options
,
url
:
'/system/user/certifiedDeptTreeWithNoDaoguan2'
,
method
:
'get'
,
params
})
}
const
setIdToString
=
(
list
)
=>
{
for
(
var
l
of
list
)
{
...
...
@@ -208,13 +209,14 @@ export function reader(query) {
})
}
export
function
regionsList
(
params
)
{
return
request
({
url
:
'/common/region/regionsList'
,
method
:
'get'
,
params
})
}
export
function
regionsList
(
params
,
options
=
{})
{
return
request
({
...
options
,
url
:
'/common/region/regionsList'
,
method
:
'get'
,
params
})
}
// 添加会员自动录入 上传图片
export
function
carUrl
(
data
,
type
)
{
...
...
@@ -477,12 +479,13 @@ export function getFeeBillDetail(payId) {
}
// 获取自己团队成员信息
export
function
getMyOwnMemberInfo
()
{
return
request
({
url
:
'/member/info/getMyOwnMemberInfo'
,
method
:
'get'
})
}
export
function
getMyOwnMemberInfo
(
options
=
{})
{
return
request
({
...
options
,
url
:
'/member/info/getMyOwnMemberInfo'
,
method
:
'get'
})
}
// 会员调入
export
function
getMobilizelist
(
params
)
{
...
...
@@ -1530,13 +1533,14 @@ export function checkPersonByPersonId(perId) {
}
// 获取单位会员优惠政策
export
function
canUseDiscount
(
params
)
{
return
request
({
url
:
`/system/certifiedNew/canUseDiscount`
,
method
:
'get'
,
params
})
}
export
function
canUseDiscount
(
params
,
options
=
{})
{
return
request
({
...
options
,
url
:
`/system/certifiedNew/canUseDiscount`
,
method
:
'get'
,
params
})
}
// 获取单位会员一年缴费价格
export
function
getMyMemberCertUnitFee
(
params
)
{
...
...
@@ -1626,13 +1630,14 @@ export function pcallBack2(orderId) {
}
// 优惠政策回显
export
function
getZtxDiscountPolicy
(
params
)
{
return
request
({
url
:
'/system/config/getZtxDiscountPolicy'
,
method
:
'get'
,
params
})
}
export
function
getZtxDiscountPolicy
(
params
,
options
=
{})
{
return
request
({
...
options
,
url
:
'/system/config/getZtxDiscountPolicy'
,
method
:
'get'
,
params
})
}
// 考官列表
export
function
listApi
(
params
)
{
...
...
@@ -1684,12 +1689,13 @@ export function commitExamPointApply(params) {
})
}
export
function
getMyStatus
()
{
return
request
({
url
:
`/member/examPointApply/getMyStatus`
,
method
:
'get'
,
})
}
export
function
getMyStatus
(
options
=
{})
{
return
request
({
...
options
,
url
:
`/member/examPointApply/getMyStatus`
,
method
:
'get'
,
})
}
// 个人会员缴费支付
export
function
goPay
(
params
)
{
...
...
@@ -1782,12 +1788,13 @@ export function createMemberPayRange(data) {
}
// 获取最近认证记录 单位会员
export
function
getMyRecent
()
{
return
request
({
url
:
'/system/certifiedNew/getMyRecent'
,
method
:
'get'
})
}
export
function
getMyRecent
(
options
=
{})
{
return
request
({
...
options
,
url
:
'/system/certifiedNew/getMyRecent'
,
method
:
'get'
})
}
// 获取最近认证记录 考点
...
...
common/utils.js
View file @
4ecc383
...
...
@@ -44,7 +44,7 @@ export function isDaoGuanRole() {
const
app
=
getApp
()
const
deptType
=
app
.
globalData
?.
deptType
const
userType
=
app
.
globalData
?.
userType
return
deptType
==
6
||
deptType
==
'6'
||
userType
==
'4'
return
deptType
==
null
||
deptType
==
6
||
deptType
==
'6'
||
userType
==
'4'
}
export
function
reLaunchHomeByRole
()
{
...
...
login/loginC.vue
View file @
4ecc383
...
...
@@ -190,7 +190,7 @@ function goHomeAfterLogin() {
const
deptType
=
app
.
globalData
.
deptType
const
userType
=
app
.
globalData
.
userType
uni
.
reLaunch
({
url
:
(
deptType
==
6
||
deptType
==
'6'
||
userType
==
'4'
)
?
'/pages/index/daoGuanPerson'
:
'/pages/index/home'
url
:
(
deptType
==
6
||
deptType
==
'6'
||
userType
==
'4'
||
deptType
==
null
)
?
'/pages/index/daoGuanPerson'
:
'/pages/index/home'
})
}
...
...
@@ -235,12 +235,12 @@ function login() {
pcLogin
(
form
.
value
).
then
(()
=>
{
app
.
globalData
.
isLogin
=
true
goHomeAfterLogin
()
}).
catch
((
err
)
=>
{
console
.
error
(
'登录失败:'
,
err
)
refreshCodeWhenNotServerError
(
err
)
uni
.
showToast
({
title
:
'登录失败'
,
icon
:
'none'
})
}).
finally
(()
=>
{
loading
.
value
=
false
}).
catch
((
err
)
=>
{
console
.
error
(
'登录失败:'
,
err
)
refreshCodeWhenNotServerError
(
err
)
uni
.
showToast
({
title
:
'登录失败'
,
icon
:
'none'
})
}).
finally
(()
=>
{
loading
.
value
=
false
})
}
else
if
(
isActive
.
value
==
1
)
{
if
(
!
form2
.
value
.
telNo
)
{
...
...
@@ -258,16 +258,16 @@ function login() {
}
if
(
loading
.
value
)
return
;
loading
.
value
=
true
loginByPhone
(
form2
.
value
.
telNo
,
form2
.
value
.
code
)
.
then
(()
=>
{
app
.
globalData
.
isLogin
=
true
goHomeAfterLogin
()
}).
catch
((
err
)
=>
{
console
.
error
(
'短信登录失败:'
,
err
)
refreshCodeWhenNotServerError
(
err
)
}).
finally
(()
=>
{
loading
.
value
=
false
})
loginByPhone
(
form2
.
value
.
telNo
,
form2
.
value
.
code
)
.
then
(()
=>
{
app
.
globalData
.
isLogin
=
true
goHomeAfterLogin
()
}).
catch
((
err
)
=>
{
console
.
error
(
'短信登录失败:'
,
err
)
refreshCodeWhenNotServerError
(
err
)
}).
finally
(()
=>
{
loading
.
value
=
false
})
}
}
...
...
@@ -288,29 +288,29 @@ function confirmRegister() {
uni
.
navigateTo
({
url
:
'/login/register'
})
}
function
getCode
()
{
uni
.
hideLoading
()
getCodeImg
().
then
((
res
)
=>
{
codeUrl
.
value
=
'data:image/gif;base64,'
+
res
.
data
.
img
form
.
value
.
uuid
=
res
.
data
.
uuid
form2
.
value
.
uuid
=
res
.
data
.
uuid
})
}
function
isServer500
(
err
)
{
const
message
=
String
(
err
?.
message
||
err
?.
errMsg
||
''
)
return
err
?.
statusCode
===
500
||
err
?.
code
===
500
||
err
?.
data
?.
code
===
500
||
message
.
includes
(
'HTTP 500'
)
}
function
refreshCodeWhenNotServerError
(
err
)
{
if
(
isServer500
(
err
))
return
getCode
()
}
function
getCaptchaSms
()
{
function
getCode
()
{
uni
.
hideLoading
()
getCodeImg
().
then
((
res
)
=>
{
codeUrl
.
value
=
'data:image/gif;base64,'
+
res
.
data
.
img
form
.
value
.
uuid
=
res
.
data
.
uuid
form2
.
value
.
uuid
=
res
.
data
.
uuid
})
}
function
isServer500
(
err
)
{
const
message
=
String
(
err
?.
message
||
err
?.
errMsg
||
''
)
return
err
?.
statusCode
===
500
||
err
?.
code
===
500
||
err
?.
data
?.
code
===
500
||
message
.
includes
(
'HTTP 500'
)
}
function
refreshCodeWhenNotServerError
(
err
)
{
if
(
isServer500
(
err
))
return
getCode
()
}
function
getCaptchaSms
()
{
if
(
!
form2
.
value
.
telNo
)
{
uni
.
showToast
({
title
:
'手机号不能为空'
,
icon
:
'none'
})
return
...
...
myCenter/examPointApply.vue
View file @
4ecc383
...
...
@@ -48,7 +48,7 @@
<view
class=
"info"
>
<text
class=
"name"
>
{{
item
.
perName
}}
{{
item
.
perCode
}}
</text>
<text
class=
"idc"
>
证件号码:
{{
item
.
perIdcCode
}}
</text>
<text
class=
"reg"
>
注册地:
{{
JSON
.
parse
(
item
.
roleInfo
).
unit
||
''
}}
</text>
<text
class=
"reg"
>
注册地:
{{
item
.
pmName
}}
</text>
</view>
<button
class=
"del-btn"
@
click=
"handleDel(item)"
>
删除
</button>
...
...
@@ -186,6 +186,9 @@ function handleDel(row) {
function
onSelfSelectChange
(
e
)
{
form
.
value
.
selfSelect
=
e
.
detail
.
value
showExamine
.
value
=
e
.
detail
.
value
==
'1'
list
.
value
=
[]
searchResult
.
value
=
null
searchNoData
.
value
=
false
// if (e.detail.value == '0') {
// modalAction = 'assign'
// modalConfig.value = {
...
...
pages/index/daoGuanPerson.vue
View file @
4ecc383
...
...
@@ -128,6 +128,7 @@ const unpaidPopup = ref(null)
const
payForm
=
ref
({})
const
customModalRef
=
ref
(
null
)
const
modalConfig
=
ref
({})
const
navigatingPerfect
=
ref
(
false
)
const
showDirectlyForAuthPay
=
ref
(
false
)
const
directUnderFlagForAuthPay
=
ref
(
0
)
const
associateIdForAuthPay
=
ref
(
0
)
...
...
@@ -175,14 +176,35 @@ onLoad((option) => {
onShow
(()
=>
{
if
(
app
.
globalData
.
isLogin
)
{
if
(
quickGoPerfectByCachedStatus
())
return
init
()
}
else
{
app
.
firstLoadCallback
=
()
=>
{
if
(
quickGoPerfectByCachedStatus
())
return
init
()
}
}
})
function
quickGoPerfectByCachedStatus
()
{
if
(
!
hasCachedAuthStatus
())
return
false
if
(
navigatingPerfect
.
value
)
return
true
const
authStatus
=
String
(
app
.
globalData
.
authenticationStatus
)
const
memberInfoData
=
app
.
globalData
.
memberInfo
||
{}
const
shouldGoPerfect
=
authStatus
===
'0'
||
authStatus
===
'3'
||
(
authStatus
===
'1'
&&
!
memberInfoData
.
memCode
)
if
(
!
shouldGoPerfect
)
return
false
goPerfectFromDaoGuan
()
return
true
}
function
hasCachedAuthStatus
()
{
return
app
.
globalData
.
authenticationStatus
!==
undefined
&&
app
.
globalData
.
authenticationStatus
!==
null
&&
String
(
app
.
globalData
.
authenticationStatus
)
!==
'undefined'
}
function
init
()
{
checkImgExist
()
// handelGetMyRecent()
...
...
@@ -203,9 +225,9 @@ function init() {
checkDialogs
()
})
api
.
getRemindCount
().
then
(
res
=>
{
numData
.
value
=
res
.
data
||
{}
})
//
api.getRemindCount().then(res => {
//
numData.value = res.data || {}
//
})
api
.
getBlack
().
then
(
res
=>
{
isBlack
.
value
=
res
.
data
...
...
@@ -239,13 +261,13 @@ function handleAccountStatus() {
const
activeStatus
=
memberInfoData
.
activeStatus
if
(
!
app
.
globalData
.
authenticationStatus
||
authStatus
===
'undefined'
||
authStatus
===
'0'
||
authStatus
===
'3'
)
{
uni
.
navigateTo
({
url
:
'/pages/index/perfect'
}
)
goPerfectFromDaoGuan
(
)
return
}
if
(
authStatus
===
'1'
)
{
if
(
!
memberInfoData
.
memCode
)
{
uni
.
navigateTo
({
url
:
'/pages/index/perfect'
}
)
goPerfectFromDaoGuan
(
)
}
return
}
...
...
@@ -292,6 +314,19 @@ function showMemberStatusDialog(content, shouldGoAuth) {
})
}
function
goPerfectFromDaoGuan
()
{
if
(
navigatingPerfect
.
value
)
return
navigatingPerfect
.
value
=
true
uni
.
redirectTo
({
url
:
'/pages/index/perfect'
,
complete
:
()
=>
{
setTimeout
(()
=>
{
navigatingPerfect
.
value
=
false
},
300
)
}
})
}
function
goPath
(
path
)
{
if
(
isBlack
.
value
==
'1'
)
{
uni
.
showModal
({
...
...
@@ -428,6 +463,7 @@ async function checkExamPointDialog() {
const
examData
=
res
?.
data
const
status
=
examData
?.
auditStatus
const
canShowByExamStatus
=
examData
==
null
||
status
==
0
||
status
==
3
console
.
log
(
'打印'
,
canShowByExamStatus
,
app
.
globalData
.
memberInfo
?.
activeStatus
,
app
.
globalData
.
authenticationStatus
,
app
.
globalData
.
deptType
,
app
.
globalData
.
userInfo
.
hintFlag
,
app
.
globalData
.
memberInfo
?.
isPoints
)
if
(
canShowByExamStatus
&&
app
.
globalData
.
memberInfo
?.
activeStatus
==
1
&&
app
.
globalData
.
authenticationStatus
==
2
&&
...
...
pages/index/home.vue
View file @
4ecc383
...
...
@@ -341,10 +341,10 @@
<image
:src=
"config.baseUrl_api+'/fs/static/icon/17.png'"
/>
审核记录
</view>
<view
@
click=
"goPath('/level/ztx/costSettlement')"
>
<
!--
<
view
@
click=
"goPath('/level/ztx/costSettlement')"
>
<image
:src=
"config.baseUrl_api+'/fs/static/icon/10.png'"
/>
费用结算
</view>
</view>
-->
</view>
<!--
<view
class=
"ttt"
>
段位管理
</view>
...
...
pages/index/perfect.vue
View file @
4ecc383
...
...
@@ -483,7 +483,7 @@ const payForm = ref({})
// 获取最近认证记录,判断是否有未支付订单
function
handelGetMyRecent
()
{
return
new
Promise
(
async
(
resolve
,
reject
)
=>
{
const
res
=
await
api
.
getMyRecent
()
??
{}
const
res
=
await
api
.
getMyRecent
(
{
showLoading
:
false
}
)
??
{}
payForm
.
value
=
res
.
data
?.
comOrder
??
{}
// payStatus: '0' 未支付, '1' 已支付, '2' 已取消
if
(
payForm
.
value
.
content
)
payForm
.
value
.
content
=
JSON
.
parse
(
payForm
.
value
.
content
)
...
...
@@ -540,7 +540,7 @@ async function handelCancelOrder() {
// 获取审核详情
function
getMyCertStageFN
()
{
auditLoading
.
value
=
true
api
.
getMyRecent
().
then
(
res
=>
{
api
.
getMyRecent
(
{
showLoading
:
false
}
).
then
(
res
=>
{
auditLoading
.
value
=
false
if
(
res
.
data
&&
res
.
data
.
auditLogs
)
{
try
{
...
...
@@ -638,12 +638,12 @@ function init() {
// 获取详情
function
getDetail
()
{
api
.
getMyOwnMemberInfo
().
then
(
res
=>
{
api
.
getMyOwnMemberInfo
(
{
showLoading
:
false
}
).
then
(
res
=>
{
// if (res.data.memberInfo) {
// Object.assign(form.value, res.data.memberInfo)
// }
form
.
value
=
{...
res
.
data
.
dept
,
...
res
.
data
.
memberInfo
}
form
.
value
.
deptType
=
res
.
data
.
memberInfo
.
deptType
||
res
.
data
.
dept
.
deptType
form
.
value
.
deptType
=
res
.
data
.
memberInfo
?.
deptType
||
res
.
data
.
dept
?
.
deptType
if
(
form
.
value
.
type
)
{
form
.
value
.
type
=
String
(
form
.
value
.
type
)
}
...
...
@@ -753,7 +753,7 @@ function formatRegionTree(node) {
// 获取地区列表
function
getRegionsList
()
{
api
.
regionsList
().
then
(
res
=>
{
api
.
regionsList
(
null
,
{
showLoading
:
false
}
).
then
(
res
=>
{
options
.
value
=
res
.
data
// 转换为级联选择器格式
regionOptions
.
value
=
res
.
data
...
...
@@ -763,13 +763,12 @@ function getRegionsList() {
// 获取协会树
function
getTree
()
{
console
.
log
(
'获取协会树'
)
api
.
certifiedDeptTreeRegister
({
selfDeptId
:
-
1
,
// 修复:传数字类型,避免后端类型转换错误
webSiteShow
:
1
,
showDisabled
:
1
,
isBlack
:
0
}).
then
(
res
=>
{
}
,
{
showLoading
:
false
}
).
then
(
res
=>
{
assoList
.
value
=
res
.
data
.
map
(
item
=>
formatTree
(
item
))
// 树加载完成后,如果有parentId,设置完整路径名称
if
(
form
.
value
.
parentId
)
{
...
...
@@ -826,16 +825,13 @@ function changCase(e) {
// 取最后一级的value(纯ID)
const
lastNode
=
valueArr
[
valueArr
.
length
-
1
];
form
.
value
.
parentId
=
lastNode
?.
value
||
''
;
console
.
log
(
'最终提交的parentId:'
,
form
.
value
.
parentId
);
assoFullName
.
value
=
getAssoFullName
(
valueArr
)
console
.
log
(
'协会完整路径:'
,
assoFullName
.
value
);
}
// 地址选择(核心修复:从对象中提取纯value,对齐PC端格式)
// 地址选择(还原成你之前能用的版本:纯ID数组赋值)
function
changeAddress
(
e
)
{
const
selectedValue
=
e
.
detail
?.
value
??
e
;
console
.
log
(
"选择的地址:"
,
selectedValue
);
// 直接赋值纯ID,不要再取 .value
form
.
value
.
provinceId
=
selectedValue
[
0
].
value
||
''
;
...
...
@@ -845,7 +841,6 @@ function changeAddress(e) {
// 同步更新选择器显示
coordinates1
.
value
=
selectedValue
;
console
.
log
(
'最终地址ID:'
,
form
.
value
.
provinceId
,
form
.
value
.
cityId
,
form
.
value
.
regionId
);
}
// 获取会员认证费用
...
...
@@ -857,21 +852,21 @@ function getMyMemberCertUnitFeeApi() {
// 检查是否可用优惠政策
function
canUseDiscountApi
()
{
api
.
canUseDiscount
().
then
(
res
=>
{
api
.
canUseDiscount
(
null
,
{
showLoading
:
false
}
).
then
(
res
=>
{
preferentialPolicy
.
value
=
res
.
data
})
}
// 获取优惠政策详情
function
getZtxDiscountPolicyApi
()
{
api
.
getZtxDiscountPolicy
().
then
(
res
=>
{
api
.
getZtxDiscountPolicy
(
null
,
{
showLoading
:
false
}
).
then
(
res
=>
{
preferentialData
.
value
=
res
.
data
})
}
// 获取考点申请状态
function
getMyStatusAPI
()
{
api
.
getMyStatus
().
then
(
res
=>
{
api
.
getMyStatus
(
{
showLoading
:
false
}
).
then
(
res
=>
{
if
(
res
.
data
&&
res
.
data
.
auditStatus
)
{
auditStatus
.
value
=
res
.
data
.
auditStatus
}
else
{
...
...
@@ -913,7 +908,7 @@ function submitStep1() {
setTimeout
(()
=>
{
activeStep
.
value
=
2
getDetail
()
},
1
500
)
},
500
)
}
else
{
uni
.
showToast
({
title
:
res
.
msg
||
'操作失败'
,
duration
:
2000
,
icon
:
'none'
})
}
...
...
@@ -1058,7 +1053,6 @@ function submitCertification() {
companyName
:
form
.
value
.
companyName
,
legalIdcCode
:
form
.
value
.
legalIdcCode
}
console
.
log
(
666
,
params
)
// return
uni
.
showLoading
({
title
:
'提交中...'
})
api
.
editMyMemberCertifiedInfo
(
params
).
then
(
res
=>
{
...
...
@@ -1068,12 +1062,11 @@ function submitCertification() {
// 跳转缴费页面
setTimeout
(()
=>
{
const
assoName
=
assoFullName
.
value
console
.
log
(
888
,
assoName
)
// 跳转到缴费页面
uni
.
navigateTo
({
url
:
`/myCenter/goPay?payName=
${
encodeURIComponent
(
form
.
value
.
name
||
''
)}
&assoName=
${
encodeURIComponent
(
assoName
)}
`
})
},
1
500
)
},
500
)
}
else
{
uni
.
showToast
({
title
:
res
.
msg
||
'提交失败'
,
duration
:
2000
,
icon
:
'none'
})
}
...
...
@@ -1357,7 +1350,6 @@ function handleLogout() {
// 监听步骤变化,加载审核详情
watch
(
activeStep
,
(
newVal
)
=>
{
console
.
log
(
'activeStep changed:'
,
newVal
)
if
(
newVal
===
3
)
{
getMyCertStageFN
()
}
...
...
pages/invoice/apply.vue
View file @
4ecc383
...
...
@@ -78,9 +78,9 @@
v-model=
"form.name"
class=
"input"
:disabled=
"!showPersonalType && form.type === '1'"
:placeholder=
"
form.type === '1' ? '请输入公司全称' : '请输入发票抬头'
"
:placeholder=
"
invoiceTitlePlaceholder
"
/>
<text
class=
"hint"
>
请确保发票抬头与公司营业执照或个人身份证上的名称一致。
</text>
<text
class=
"hint"
>
{{
invoiceTitleHint
}}
</text>
</view>
<!-- 纳税人识别号(企业才显示) -->
...
...
@@ -93,7 +93,7 @@
maxlength=
"20"
placeholder=
"请输入纳税人识别号"
/>
<text
class=
"hint"
>
企业税务登记证上的号码,
一般为15~20位
</text>
<text
class=
"hint"
>
企业税务登记证上的号码,
由 15~20 位数字、大写字母组成
</text>
</view>
<!-- 接收方式 -->
...
...
@@ -134,7 +134,7 @@
</
template
>
<
script
setup
>
import
{
ref
,
reactive
}
from
'vue'
;
import
{
ref
,
reactive
,
computed
}
from
'vue'
;
import
{
onLoad
}
from
'@dcloudio/uni-app'
;
import
{
outputInvoiceNo
}
from
'@/common/api.js'
;
import
customModal
from
'@/components/custom-modal.vue'
;
...
...
@@ -159,6 +159,16 @@ const form = reactive({
id
:
''
// 订单ID
});
const
invoiceTitlePlaceholder
=
computed
(()
=>
{
return
form
.
type
===
'1'
?
'请输入公司全称'
:
'请输入个人姓名'
;
});
const
invoiceTitleHint
=
computed
(()
=>
{
return
form
.
type
===
'1'
?
'请确保发票抬头与营业执照上的单位名称一致'
:
'请确保发票抬头与个人身份证上的姓名一致'
;
});
// 切换开票类型
function
changeInvoiceType
(
val
)
{
form
.
type
=
val
...
...
pages/invoice/applyFeisui.vue
View file @
4ecc383
...
...
@@ -26,7 +26,7 @@
v-if=
"!personalInvoiceMode"
:class=
"
{ active: form.type === '0' }"
class="type-option"
@click="
form.type = '0'
"
@click="
changeInvoiceType('0')
"
>
<view
class=
"type-icon enterprise"
>
<text
class=
"icon-text"
>
企
</text>
...
...
@@ -39,7 +39,7 @@
v-if=
"showIndividualType"
:class=
"
{ active: form.type === '1' }"
class="type-option"
@click="
form.type = '1'
"
@click="
changeInvoiceType('1')
"
>
<view
class=
"type-icon"
>
<text
class=
"icon-text"
>
个
</text>
...
...
@@ -59,9 +59,9 @@
v-model=
"form.name"
class=
"input"
:disabled=
"!showIndividualType || personalInvoiceMode"
:placeholder=
"
form.type === '0' ? '请输入公司全称' : '请输入发票抬头'
"
:placeholder=
"
invoiceTitlePlaceholder
"
/>
<text
class=
"hint"
>
请确保发票抬头与公司营业执照或个人身份证上的名称一致
</text>
<text
class=
"hint"
>
{{
invoiceTitleHint
}}
</text>
</view>
<!-- 纳税人识别号(企业才显示) -->
...
...
@@ -74,7 +74,7 @@
placeholder=
"请输入纳税人识别号"
:disabled=
"!showIndividualType"
/>
<text
class=
"hint"
>
企业税务登记证上的号码,
一般为15~20位
</text>
<text
class=
"hint"
>
企业税务登记证上的号码,
由 15~20 位数字、大写字母组成
</text>
</view>
<!-- 开票金额(只读) -->
...
...
@@ -94,7 +94,7 @@
</
template
>
<
script
setup
>
import
{
ref
,
reactive
}
from
'vue'
;
import
{
ref
,
reactive
,
computed
}
from
'vue'
;
import
{
onLoad
}
from
'@dcloudio/uni-app'
;
import
{
outputInvoiceNoFeisui
}
from
'@/common/api.js'
;
import
customModal
from
'@/components/custom-modal.vue'
;
...
...
@@ -114,6 +114,24 @@ const form = reactive({
amount
:
0
// 金额
});
const
invoiceTitlePlaceholder
=
computed
(()
=>
{
return
form
.
type
===
'0'
?
'请输入公司全称'
:
'请输入个人姓名'
;
});
const
invoiceTitleHint
=
computed
(()
=>
{
return
form
.
type
===
'0'
?
'请确保发票抬头与营业执照上的单位名称一致'
:
'请确保发票抬头与个人身份证上的姓名一致'
;
});
function
changeInvoiceType
(
type
)
{
if
(
form
.
type
===
type
)
return
;
form
.
type
=
type
;
if
(
type
===
'1'
)
{
form
.
taxno
=
''
;
}
}
// 页面加载
onLoad
((
options
)
=>
{
if
(
options
.
id
||
options
.
orderId
)
{
...
...
personal/addVip_per.vue
View file @
4ecc383
...
...
@@ -202,6 +202,9 @@ const showValidityModal = ref(false)
const
validityDateText
=
ref
(
''
)
onLoad
(
async
(
option
)
=>
{
if
(
option
.
idcType
!==
undefined
)
{
baseFormData
.
value
.
idcType
=
String
(
option
.
idcType
)
}
if
(
option
.
name
&&
option
.
idcCode
)
{
baseFormData
.
value
.
name
=
decodeURIComponent
(
option
.
name
)
baseFormData
.
value
.
idcCode
=
decodeURIComponent
(
option
.
idcCode
)
...
...
personal/home.vue
View file @
4ecc383
...
...
@@ -57,10 +57,10 @@
<!-- 卡片右下角按钮 -->
<view
class=
"card-btns"
>
<view
class=
"card-btn"
@
click=
"goToPay"
>
<view
v-if=
" perInfo.idcTypeStr != '外国护照'"
class=
"card-btn"
@
click=
"goToPay"
>
<text>
认证缴费
</text>
</view>
<view
class=
"card-btn"
@
click=
"downCert"
>
<view
v-if=
" perInfo.idcTypeStr != '外国护照'"
class=
"card-btn"
@
click=
"downCert"
>
<text>
电子会员证
</text>
</view>
</view>
...
...
@@ -163,6 +163,14 @@
</view>
</view>
<view
class=
"form-item"
>
<view
class=
"form-label"
>
证件类型
</view>
<view
class=
"form-input"
>
<picker
:value=
"idcTypeIndex"
:range=
"idcTypeList"
range-key=
"text"
@
change=
"onIdcTypeChange"
>
<view
class=
"picker-value"
>
{{
idcTypeList
[
idcTypeIndex
]?.
text
||
'请选择证件类型'
}}
</view>
</picker>
</view>
</view>
<view
class=
"form-item"
>
<view
class=
"form-label"
>
证件号
</view>
<view
class=
"form-input"
>
<input
v-model=
"bindForm.idcCode"
placeholder=
"请输入证件号"
...
...
@@ -227,8 +235,33 @@ const isBound = computed(() => {
return
perName
!==
undefined
&&
perName
!==
null
&&
perName
!==
''
})
const
boundIdcType
=
computed
(()
=>
{
return
String
(
perInfo
.
value
?.
idcType
??
perInfo
.
value
?.
perIdcType
??
bindForm
.
value
.
idcType
??
'0'
)
})
const
isPassportBound
=
computed
(()
=>
isBound
.
value
&&
boundIdcType
.
value
===
'1'
)
const
bindPopup
=
ref
(
null
)
const
idcTypeList
=
ref
([{
value
:
'0'
,
text
:
"身份证"
},
{
value
:
'1'
,
text
:
"来往大陆(内地)通行证 "
},
{
value
:
'3'
,
text
:
"护照"
},
{
value
:
'5'
,
text
:
"香港身份证"
}
])
const
idcTypeIndex
=
ref
(
0
)
const
bindForm
=
ref
({
idcType
:
'0'
,
name
:
''
,
idcCode
:
''
})
...
...
@@ -290,9 +323,11 @@ const checkAndOpenBindPopup = () => {
const
openBindPopup
=
()
=>
{
if
(
bindPopup
.
value
)
{
bindForm
.
value
=
{
idcType
:
'0'
,
name
:
''
,
idcCode
:
''
}
idcTypeIndex
.
value
=
0
bindPopup
.
value
.
open
()
}
else
{
nextTick
(()
=>
{
...
...
@@ -306,6 +341,11 @@ const closeBindPopup = () => {
bindPopup
.
value
?.
close
()
}
const
onIdcTypeChange
=
(
e
)
=>
{
idcTypeIndex
.
value
=
Number
(
e
.
detail
.
value
)
bindForm
.
value
.
idcType
=
idcTypeList
.
value
[
idcTypeIndex
.
value
]?.
value
||
'0'
}
// 处理绑定/切换操作
const
handleBindAction
=
async
()
=>
{
// if (isBound.value) {
...
...
@@ -361,6 +401,7 @@ const confirmBind = async () => {
})
const
[
err
,
res
]
=
await
to
(
bindUser
({
idcType
:
bindForm
.
value
.
idcType
,
name
:
bindForm
.
value
.
name
,
idcCode
:
bindForm
.
value
.
idcCode
}))
...
...
@@ -406,14 +447,17 @@ const confirmBind = async () => {
}
const
handelGo
=
()
=>
{
if
(
bindForm
.
value
.
idcType
===
'1'
)
return
uni
.
showModal
({
title
:
"提示"
,
content
:
"当前账号非中国跆拳道协会有效会员。请先完成认证缴费,即可正常登录使用。"
,
success
:
function
(
res
)
{
if
(
res
.
confirm
)
{
// closeBindPopup()
const
name
=
encodeURIComponent
(
bindForm
.
value
.
name
||
''
)
const
idcCode
=
encodeURIComponent
(
bindForm
.
value
.
idcCode
||
''
)
uni
.
navigateTo
({
url
:
`/personal/addVip_per?name=
${
bindForm
.
value
.
name
}
&idcCode=
${
bindForm
.
value
.
idcCod
e
}
`
url
:
`/personal/addVip_per?name=
${
name
}
&idcCode=
${
idcCode
}
&idcType=
${
bindForm
.
value
.
idcTyp
e
}
`
});
}
else
if
(
res
.
cancel
)
{
// closeBindPopup()
...
...
@@ -484,11 +528,13 @@ const goToOrder = () => {
// 导航到缴费
const
goToPay
=
()
=>
{
if
(
isPassportBound
.
value
)
return
const
perId
=
userInfo
.
value
.
perId
??
''
const
name
=
perInfo
.
value
?.
perName
?
encodeURIComponent
(
perInfo
.
value
.
perName
)
:
''
const
idcCode
=
perInfo
.
value
?.
perIdcCode
?
encodeURIComponent
(
perInfo
.
value
.
perIdcCode
)
:
''
const
idcType
=
boundIdcType
.
value
uni
.
navigateTo
({
url
:
`/personal/addVip_per?perId=
${
perId
}
&name=
${
name
}
&idcCode=
${
idcCode
}
`
url
:
`/personal/addVip_per?perId=
${
perId
}
&name=
${
name
}
&idcCode=
${
idcCode
}
&idcType=
${
idcType
}
`
});
};
...
...
@@ -862,6 +908,11 @@ const confirmLogout = async () => {
width
:
100%
;
}
.picker-value
{
font-size
:
28
rpx
;
color
:
#333
;
}
.placeholder-class
{
color
:
#999
;
}
...
...
personal/memberInfo.vue
View file @
4ecc383
...
...
@@ -101,17 +101,17 @@
// 获取证件类型
const
getCertType
=
(
type
)
=>
{
switch
(
type
)
{
// case '0':
case
'0'
:
case
'1'
:
return
'身份证'
;
case
'
2
'
:
return
'
护照
'
;
case
'
1
'
:
return
'
来往大陆(内地)通行证
'
;
case
'3'
:
return
'
军官证
'
;
return
'
护照
'
;
case
'4'
:
return
'港澳通行证'
;
case
'5'
:
return
'
台湾通行
证'
;
return
'
“香港身份
证'
;
default
:
return
'--'
;
}
...
...
personalVip/addVip.vue
View file @
4ecc383
...
...
@@ -70,8 +70,8 @@
<uni-forms-item
label=
"头像"
required
>
<uni-file-picker
v-model=
"photoArr"
@
delete=
"delPhoto"
return-type=
"object"
limit=
"1"
@
select=
"upPhoto"
:del-ico=
"false"
:image-styles=
"imageStylesTx"
></uni-file-picker>
<image
mode=
"aspectFill"
v-if=
"baseFormData.photo2"
style=
"height:200rpx;width:200rpx;"
:src=
"config.baseUrl_api + baseFormData.photo2"
/>
<
!--
<
image
mode=
"aspectFill"
v-if=
"baseFormData.photo2"
style=
"height:200rpx;width:200rpx;"
:src=
"config.baseUrl_api + baseFormData.photo2"
/>
-->
</uni-forms-item>
</view>
</uni-forms>
...
...
@@ -278,6 +278,13 @@
if
(
!
file
)
{
return
}
const
imgUrl
=
getPickerFilePath
(
e
)
if
(
!
imgUrl
)
{
openCustomModal
({
content
:
'未获取到图片地址,请重新选择图片'
})
return
}
uni
.
showLoading
({
title
:
'加载中'
});
...
...
@@ -285,7 +292,7 @@
// console.log(e)
// const formData = new FormData()
// formData.append('pic', e.tempFiles[0].file)
api
.
carUrl
(
e
.
tempFilePaths
[
0
]
,
baseFormData
.
value
.
idcType
).
then
(
res
=>
{
api
.
carUrl
(
imgUrl
,
baseFormData
.
value
.
idcType
).
then
(
res
=>
{
console
.
log
(
res
)
if
(
res
.
data
)
{
baseFormData
.
value
.
sex
=
res
.
data
.
sex
...
...
@@ -313,37 +320,59 @@
}
function
upPhoto
(
e
)
{
const
tempFilePaths
=
e
.
tempFilePaths
;
const
imgUrl
=
tempFilePaths
[
0
]
const
imgUrl
=
getPickerFilePath
(
e
)
if
(
!
imgUrl
)
{
openCustomModal
({
content
:
'未获取到图片地址,请重新选择图片'
})
return
}
const
uploadPhoto
=
(
path
)
=>
{
uni
.
showLoading
({
title
:
'加载中'
});
api
.
uploadImgCorpPhoto
(
path
).
then
(
data
=>
{
console
.
log
(
data
)
baseFormData
.
value
.
photo
=
data
.
data
.
fang
;
baseFormData
.
value
.
photo2
=
data
.
data
.
yuan
;
photoArr
.
value
=
{
url
:
config
.
baseUrl_api
+
baseFormData
.
value
.
photo
,
name
:
'头像'
,
extname
:
'jpg'
}
}).
catch
(()
=>
{
photoArr
.
value
=
{}
baseFormData
.
value
.
photo
=
''
baseFormData
.
value
.
photo2
=
''
openCustomModal
({
content
:
'头像上传失败,请重新上传'
})
});
}
if
(
typeof
wx
===
'undefined'
||
typeof
wx
.
cropImage
!==
'function'
)
{
uploadPhoto
(
imgUrl
)
return
}
wx
.
cropImage
({
src
:
imgUrl
,
cropScale
:
'4:5'
,
success
:
function
(
resp
)
{
uni
.
showLoading
({
title
:
'加载中'
});
api
.
uploadImgCorpPhoto
(
resp
.
tempFilePath
).
then
(
data
=>
{
console
.
log
(
data
)
baseFormData
.
value
.
photo
=
data
.
data
.
fang
;
baseFormData
.
value
.
photo2
=
data
.
data
.
yuan
;
photoArr
.
value
=
{
url
:
config
.
baseUrl_api
+
baseFormData
.
value
.
photo
,
name
:
'头像'
,
extname
:
'jpg'
}
});
uploadPhoto
(
resp
.
tempFilePath
||
imgUrl
)
},
fail
:
function
(
err
)
{
photoArr
.
value
=
{}
console
.
warn
(
'cropImage failed, upload original image:'
,
err
)
uploadPhoto
(
imgUrl
)
}
})
}
function
getPickerFilePath
(
e
)
{
const
file
=
e
?.
tempFiles
?.[
0
]
||
{}
return
e
?.
tempFilePaths
?.[
0
]
||
file
.
tempFilePath
||
file
.
path
||
file
.
url
||
''
}
function
delimgFont
(
n
)
{
photoArr
.
value
=
{}
...
...
@@ -528,6 +557,7 @@
const
time
=
new
Date
().
valueOf
()
+
''
baseFormData
.
value
.
t
=
time
+
Math
.
floor
(
Math
.
random
()
*
10
)
baseFormData
.
value
.
signT
=
aes2
.
AESEncrypt
(
baseFormData
.
value
.
idcType
+
time
)
console
.
log
(
666
,
baseFormData
.
value
)
api
.
addPersonToMyDept
(
baseFormData
.
value
).
then
(
Response
=>
{
if
(
Response
.
data
==
0
)
{
let
msg
=
'该成员,实名认证未通过,注册失败!'
...
...
personalVip/payment.vue
View file @
4ecc383
...
...
@@ -313,7 +313,7 @@ async function commitFN(row) {
const
res
=
await
api
.
getNewCountByRangeId
(
row
.
rangId
)
const
countData
=
res
?.
data
||
{}
if
(
Number
(
countData
.
all
||
0
)
<=
0
)
{
uni
.
showToast
({
title
:
'
请添加缴费学员
'
,
icon
:
'none'
})
uni
.
showToast
({
title
:
'
此缴费单尚未关联学员,请先添加缴费学员。
'
,
icon
:
'none'
})
return
}
uni
.
navigateTo
({
...
...
Write
Preview
Styling with
Markdown
is supported
Attach a file
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to post a comment