Skip to content
Toggle navigation
Projects
Groups
Snippets
Help
Toggle navigation
This project
Loading...
Sign in
李宁
/
Activity
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit 8e7e552c
authored
Nov 26, 2025
by
李宁
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
开发完成提交
1 parent
7ac0e431
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
236 additions
and
223 deletions
channelBusiManage/src/assets/js/api/interface/order/index.js
channelBusiManage/src/components/OrderDetail.vue
channelBusiManage/src/components/OrderMonitoring.vue
channelBusiManage/src/assets/js/api/interface/order/index.js
View file @
8e7e552
...
@@ -35,7 +35,7 @@ export function audioOrderList(data) {
...
@@ -35,7 +35,7 @@ export function audioOrderList(data) {
}
}
/**
/**
* 订单金额批量修改
* 订单金额批量修改
:表格上传
* @returns {AxiosPromise}
* @returns {AxiosPromise}
*/
*/
export
function
updateOrderListMoney
(
data
)
{
export
function
updateOrderListMoney
(
data
)
{
...
...
channelBusiManage/src/components/OrderDetail.vue
View file @
8e7e552
...
@@ -129,7 +129,7 @@
...
@@ -129,7 +129,7 @@
<span
class=
"text-neutral-900"
>
{{ log.functionName }}
</span>
<span
class=
"text-neutral-900"
>
{{ log.functionName }}
</span>
<el-tag
size=
"small"
type=
"info"
>
{{ log.operatorName }}
</el-tag>
<el-tag
size=
"small"
type=
"info"
>
{{ log.operatorName }}
</el-tag>
</div>
</div>
<p
class=
"text-sm text-neutral-600 mb-1"
>
{{ log.detail.memo }}
</p>
<p
class=
"text-sm text-neutral-600 mb-1"
>
{{ log.detail.memo
|| log.detail.auditMemo
}}
</p>
<p
class=
"text-xs text-neutral-500"
>
{{ $utils.detailTime(log.createTime) }}
</p>
<p
class=
"text-xs text-neutral-500"
>
{{ $utils.detailTime(log.createTime) }}
</p>
</div>
</div>
</div>
</div>
...
@@ -401,7 +401,6 @@ onMounted(()=>{
...
@@ -401,7 +401,6 @@ onMounted(()=>{
const
logData
=
ref
([])
const
logData
=
ref
([])
const
queryLog
=
async
()
=>
{
const
queryLog
=
async
()
=>
{
try
{
try
{
try
{
const
response
=
await
$api
.
queryOrderLog
({
const
response
=
await
$api
.
queryOrderLog
({
id
:
props
.
order
.
id
id
:
props
.
order
.
id
})
})
...
@@ -418,9 +417,6 @@ const queryLog = async ()=>{
...
@@ -418,9 +417,6 @@ const queryLog = async ()=>{
}
catch
(
error
)
{
}
catch
(
error
)
{
}
}
}
catch
(
error
)
{
}
}
}
// 对话框状态
// 对话框状态
...
@@ -571,57 +567,61 @@ const handleSubmitReview = () => {
...
@@ -571,57 +567,61 @@ const handleSubmitReview = () => {
}
}
// 审核通过
// 审核通过
const
handleApprove
=
()
=>
{
const
handleApprove
=
async
()
=>
{
const
currentTime
=
new
Date
().
toLocaleString
(
'zh-CN'
)
try
{
const
newLog
=
{
const
response
=
await
$api
.
audioOrderList
({
id
:
`LOG
${
Date
.
now
()}
`
,
list
:[{
time
:
currentTime
,
id
:
props
.
order
.
id
,
operator
:
'主管理员'
,
auditStatus
:
'1'
action
:
'审核通过'
,
}]
details
:
`主管审核通过,金额:¥
${
props
.
order
.
realMoney
?.
toFixed
(
2
)}
`
}
emit('update', {
auditStatus: '1',
paymentTime: currentTime,
operationLogs: [...(props.order.operationLogs || []), newLog]
})
})
if
(
response
.
c
===
0
)
{
ElMessage
.
success
(
'审核通过!'
)
ElMessage
.
success
(
'审核通过!'
)
setTimeout
(()
=>
{
setTimeout
(()
=>
{
emit
(
'back'
)
emit
(
'back'
)
},
1000
)
},
1000
)
}
else
{
ElMessage
.
error
(
response
.
m
)
}
}
catch
(
error
)
{
}
}
}
// 审核驳回
// 审核驳回
const handleReject = () => {
const
handleReject
=
async
()
=>
{
if
(
!
rejectReason
.
value
.
trim
())
{
if
(
!
rejectReason
.
value
.
trim
())
{
ElMessage
.
error
(
'请填写驳回原因'
)
ElMessage
.
error
(
'请填写驳回原因'
)
return
return
}
}
const newLog = {
try
{
id: `
LOG$
{
Date
.
now
()}
`,
const
response
=
await
$api
.
audioOrderList
({
time: new Date().toLocaleString('zh-CN'),
list
:[{
operator: '主管理员',
id
:
props
.
order
.
id
,
action: '审核驳回',
details: `
驳回原因:
$
{
rejectReason
.
value
}
`
}
emit('update', {
auditStatus
:
'2'
,
auditStatus
:
'2'
,
rejectReason: rejectReason.value,
auditMemo
:
rejectReason
.
value
operationLogs: [...(props.order.operationLogs || []), newLog
]
}
]
})
})
if
(
response
.
c
===
0
)
{
ElMessage
.
success
(
'已驳回订单'
)
ElMessage
.
success
(
'已驳回订单'
)
isRejectDialogOpen
.
value
=
false
isRejectDialogOpen
.
value
=
false
setTimeout
(()
=>
{
rejectReason
.
value
=
''
rejectReason
.
value
=
''
},
0
)
setTimeout
(()
=>
{
setTimeout
(()
=>
{
emit
(
'back'
)
emit
(
'back'
)
},
1000
)
},
1000
)
}
else
{
ElMessage
.
error
(
response
.
m
)
}
}
catch
(
error
)
{
}
}
}
// 关闭订单
// 关闭订单
...
...
channelBusiManage/src/components/OrderMonitoring.vue
View file @
8e7e552
...
@@ -116,7 +116,7 @@
...
@@ -116,7 +116,7 @@
<
el
-
table
-
column
type
=
"selection"
width
=
"50"
:
selectable
=
"isRowSelectable"
/>
<
el
-
table
-
column
type
=
"selection"
width
=
"50"
:
selectable
=
"isRowSelectable"
/>
<!--
订单
ID
-->
<!--
订单
ID
-->
<
el
-
table
-
column
prop
=
"id"
label
=
"订单ID"
width
=
"
14
0"
show
-
overflow
-
tooltip
>
<
el
-
table
-
column
prop
=
"id"
label
=
"订单ID"
width
=
"
20
0"
show
-
overflow
-
tooltip
>
<
template
#
default
=
"
{
row
}
">
<
template
#
default
=
"
{
row
}
">
<span class="
font
-
mono
text
-
[
14
px
]
"
>
{{
row
.
id
}}
<
/span
>
<span class="
font
-
mono
text
-
[
14
px
]
"
>
{{
row
.
id
}}
<
/span
>
<
/template
>
<
/template
>
...
@@ -276,7 +276,7 @@
...
@@ -276,7 +276,7 @@
<
/div
>
<
/div
>
<
div
class
=
"flex items-center"
>
<
div
class
=
"flex items-center"
>
<
label
class
=
"text-sm text-neutral-500 shrink-0"
>
实际酬金
<
/label
>
<
label
class
=
"text-sm text-neutral-500 shrink-0"
>
实际酬金
<
/label
>
<
p
class
=
"text-sm font-mono text-green-600"
style
=
"margin-left: 16px;"
>
¥
{{
reviewingOrder
.
pre
Money
?.
toFixed
(
2
)
||
'--'
}}
<
/p
>
<
p
class
=
"text-sm font-mono text-green-600"
style
=
"margin-left: 16px;"
>
¥
{{
reviewingOrder
.
real
Money
?.
toFixed
(
2
)
||
'--'
}}
<
/p
>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
...
@@ -288,7 +288,7 @@
...
@@ -288,7 +288,7 @@
<
/div
>
<
/div
>
<
div
class
=
"flex items-center"
>
<
div
class
=
"flex items-center"
>
<
label
class
=
"text-sm text-neutral-500 shrink-0"
>
客户号码
<
/label
>
<
label
class
=
"text-sm text-neutral-500 shrink-0"
>
客户号码
<
/label
>
<
p
class
=
"text-sm text-neutral-900 font-mono"
style
=
"margin-left: 16px;"
>
{{
reviewingOrder
.
c
rmUs
erPhone
}}
<
/p
>
<
p
class
=
"text-sm text-neutral-900 font-mono"
style
=
"margin-left: 16px;"
>
{{
reviewingOrder
.
c
ustom
erPhone
}}
<
/p
>
<
/div
>
<
/div
>
<
div
class
=
"flex items-center"
>
<
div
class
=
"flex items-center"
>
<
label
class
=
"text-sm text-neutral-500 shrink-0"
>
预计酬金
<
/label
>
<
label
class
=
"text-sm text-neutral-500 shrink-0"
>
预计酬金
<
/label
>
...
@@ -335,10 +335,10 @@
...
@@ -335,10 +335,10 @@
<
div
class
=
"flex-1"
>
<
div
class
=
"flex-1"
>
<
p
class
=
"text-sm font-medium text-neutral-900"
>
订单
ID
:
{{
order
.
id
}}
<
/p
>
<
p
class
=
"text-sm font-medium text-neutral-900"
>
订单
ID
:
{{
order
.
id
}}
<
/p
>
<
p
class
=
"text-xs text-neutral-600 mt-1"
>
<
p
class
=
"text-xs text-neutral-600 mt-1"
>
业务类型:
{{
order
.
business
Name
}}
|
业务类型:
{{
order
.
job
Name
}}
|
预计酬金:¥
{{
order
.
estimatedReward
.
toFixed
(
2
)
}}
预计酬金:¥
{{
order
.
preMoney
?.
toFixed
(
2
)
||
'--'
}}
<
span
v
-
if
=
"order.
actualReward
"
>
<
span
v
-
if
=
"order.
realMoney
"
>
|
实际酬金:¥
{{
order
.
actualReward
.
toFixed
(
2
)
}}
|
实际酬金:¥
{{
order
.
realMoney
.
toFixed
(
2
)
}}
<
/span
>
<
/span
>
<
/p
>
<
/p
>
<
/div
>
<
/div
>
...
@@ -451,25 +451,24 @@
...
@@ -451,25 +451,24 @@
<
/div
>
<
/div
>
<
el
-
table
:
data
=
"batchPreviewRows"
height
=
"260"
border
stripe
>
<
el
-
table
:
data
=
"batchPreviewRows"
height
=
"260"
border
stripe
>
<
el
-
table
-
column
prop
=
"
orderI
d"
label
=
"订单ID"
min
-
width
=
"160"
/>
<
el
-
table
-
column
prop
=
"
i
d"
label
=
"订单ID"
min
-
width
=
"160"
/>
<
el
-
table
-
column
prop
=
"currentReward"
label
=
"当前酬金"
width
=
"100"
align
=
"right"
>
<
el
-
table
-
column
prop
=
"currentReward"
label
=
"当前酬金"
width
=
"100"
align
=
"right"
>
<
template
#
default
=
"
{
row
}
">
<
template
#
default
=
"
{
row
}
">
<span class="
font
-
mono
"
>
¥
{{
Number
(
row
.
currentReward
).
toFixed
(
2
)
}}
<
/span
>
<span class="
font
-
mono
"
>
¥
{{
'--'
}}
<
/span
>
<
/template
>
<
/template
>
<
/el-table-column
>
<
/el-table-column
>
<
el
-
table
-
column
prop
=
"
newReward
"
label
=
"新酬金"
width
=
"100"
align
=
"right"
>
<
el
-
table
-
column
prop
=
"
realMoney
"
label
=
"新酬金"
width
=
"100"
align
=
"right"
>
<
template
#
default
=
"
{
row
}
">
<
template
#
default
=
"
{
row
}
">
<span class="
font
-
mono
"
>
¥
{{
Number
(
row
.
newReward
).
toFixed
(
2
)
}}
<
/span
>
<span class="
font
-
mono
"
>
¥
{{
Number
(
row
.
realMoney
).
toFixed
(
2
)
}}
<
/span
>
<
/template
>
<
/template
>
<
/el-table-column
>
<
/el-table-column
>
<
el
-
table
-
column
prop
=
"remark"
label
=
"备注"
min
-
width
=
"140"
show
-
overflow
-
tooltip
/>
<
el
-
table
-
column
prop
=
"status"
label
=
"校验"
width
=
"80"
>
<
el
-
table
-
column
prop
=
"status"
label
=
"校验"
width
=
"80"
>
<
template
#
default
=
"
{
row
}
">
<
template
#
default
=
"
{
row
}
">
<el-tag v-if="
row
.
status
===
'OK'
" type="
success
" size="
small
">有效</el-tag>
<el-tag v-if="
!
row
.
memo
" type="
success
" size="
small
">有效</el-tag>
<el-tag v-else type="
danger
" size="
small
">无效</el-tag>
<el-tag v-else type="
danger
" size="
small
">无效</el-tag>
</template>
</template>
</el-table-column>
</el-table-column>
<el-table-column prop="
error
" label="
错误信息
" min-width="
180
" show-overflow-tooltip />
<el-table-column prop="
memo
" label="
错误信息
" min-width="
180
" show-overflow-tooltip />
</el-table>
</el-table>
</div>
</div>
</div>
</div>
...
@@ -837,12 +836,14 @@ const getReviewStatusName = (status: ReviewStatus) => {
...
@@ -837,12 +836,14 @@ const getReviewStatusName = (status: ReviewStatus) => {
// 判断行是否可选择(只有待审核的订单才能被选择)
// 判断行是否可选择(只有待审核的订单才能被选择)
const
isRowSelectable
=
(
row
:
any
)
=>
{
const
isRowSelectable
=
(
row
:
any
)
=>
{
return
row
.
auditStatus
===
1
return
row
.
auditStatus
===
0
}
}
// 事件处理
// 事件处理
const
handleSearch
=
()
=>
{
const
handleSearch
=
()
=>
{
currentPage
.
value
=
1
currentPage
.
value
=
1
// 清空选中状态,防止按钮禁用问题
selectedOrderIds
.
value
=
[]
queryOrder
()
queryOrder
()
}
}
...
@@ -862,8 +863,43 @@ const handleSelectionChange = (selection: any[]) => {
...
@@ -862,8 +863,43 @@ const handleSelectionChange = (selection: any[]) => {
selectedOrderIds
.
value
=
selection
.
map
(
item
=>
item
.
id
)
selectedOrderIds
.
value
=
selection
.
map
(
item
=>
item
.
id
)
}
}
const
handleExport
=
()
=>
{
const
handleExport
=
async
()
=>
{
ElMessage
.
success
(
'导出功能开发中'
)
let
start
=
''
let
end
=
''
if
(
dateRange
.
value
){
start
=
new
Date
(
dateRange
.
value
[
0
]).
getTime
()
+
''
end
=
(
new
Date
(
dateRange
.
value
[
1
]).
getTime
()
+
24
*
60
*
60
*
1000
-
1
)
+
''
}
const
res
=
await
$api
.
exportOrderList
({
customerPhone
:
customerPhone
.
value
,
chinaPersonPhone
:
chinaPersonPhone
.
value
,
startTime
:
start
,
endTime
:
end
,
status
:
businessStatusFilter
.
value
,
auditStatus
:
reviewStatusFilter
.
value
,
jobId
:
businessNameFilter
.
value
,
page
:
currentPage
.
value
,
pageSize
:
pageSize
.
value
}
)
if
(
res
.
type
==
'blob'
)
{
let
fileJson
=
{
content
:
res
.
value
,
fileType
:
'xlsx'
,
fileName
:
'登记订单数据'
}
$utils
.
exportExcel
(
fileJson
)
}
else
{
let
errorText
try
{
errorText
=
res
.
value
.
msg
}
catch
(
e
)
{
errorText
=
'网络异常,请稍后重试'
}
ElMessage
.
error
(
errorText
)
}
}
}
const
handleBatchReview
=
()
=>
{
const
handleBatchReview
=
()
=>
{
...
@@ -871,9 +907,10 @@ const handleBatchReview = () => {
...
@@ -871,9 +907,10 @@ const handleBatchReview = () => {
ElMessage
.
error
(
'请选择要审核的订单'
)
ElMessage
.
error
(
'请选择要审核的订单'
)
return
return
}
}
// 确保只对待审核的订单进行批量审核
// 确保只对待审核的订单进行批量审核
const
pendingOrders
=
o
rders
.
value
.
filter
(
order
=>
const
pendingOrders
=
paginatedO
rders
.
value
.
filter
(
order
=>
selectedOrderIds
.
value
.
includes
(
order
.
id
)
&&
order
.
reviewStatus
===
'待审核'
selectedOrderIds
.
value
.
includes
(
order
.
id
)
&&
order
.
auditStatus
===
0
)
)
if
(
pendingOrders
.
length
===
0
)
{
if
(
pendingOrders
.
length
===
0
)
{
ElMessage
.
error
(
'所选订单中没有待审核的订单'
)
ElMessage
.
error
(
'所选订单中没有待审核的订单'
)
...
@@ -899,36 +936,37 @@ const handleViewDetail = (order: any) => {
...
@@ -899,36 +936,37 @@ const handleViewDetail = (order: any) => {
}
}
const
handleApprove
=
(
order
:
any
)
=>
{
const
handleApprove
=
(
order
:
any
)
=>
{
//
reviewingOrder.value = order
reviewingOrder
.
value
=
order
isReviewDialogOpen
.
value
=
true
isReviewDialogOpen
.
value
=
true
}
}
const
handleConfirmApprove
=
()
=>
{
const
handleConfirmApprove
=
async
()
=>
{
if
(
reviewingOrder
.
value
)
{
if
(
reviewingOrder
.
value
)
{
const
currentTime
=
new
Date
().
toLocaleString
(
'zh-CN'
)
const
order
=
paginatedOrders
.
value
.
find
(
o
=>
o
.
id
===
reviewingOrder
.
value
.
id
)
const
order
=
orders
.
value
.
find
(
o
=>
o
.
id
===
reviewingOrder
.
value
.
id
)
if
(
order
)
{
if
(
order
)
{
// 更新订单状态
try
{
order
.
reviewStatus
=
'审核通过'
const
response
=
await
$api
.
audioOrderList
({
order
.
paymentTime
=
currentTime
list
:[{
id
:
order
.
id
,
// 添加操作日志
auditStatus
:
'1'
if
(
!
order
.
operationLogs
)
{
}
]
order
.
operationLogs
=
[]
}
order
.
operationLogs
.
push
({
id
:
`LOG${order.id
}
_${Date.now()
}
`
,
time
:
currentTime
,
operator
:
'主管理员'
,
action
:
'审核通过'
,
details
:
`主管审核通过,金额:¥${order.actualReward?.toFixed(2) || order.estimatedReward.toFixed(2)
}
`
}
)
}
)
emit
(
'orders-update'
,
orders
.
value
)
if
(
response
.
c
===
0
)
{
}
ElMessage
.
success
(
`订单 ${reviewingOrder.value.id
}
审核通过`
)
ElMessage
.
success
(
`订单 ${reviewingOrder.value.id
}
审核通过`
)
isReviewDialogOpen
.
value
=
false
isReviewDialogOpen
.
value
=
false
setTimeout
(()
=>
{
reviewingOrder
.
value
=
null
reviewingOrder
.
value
=
null
}
,
0
)
queryOrder
()
}
else
{
ElMessage
.
error
(
response
.
m
)
}
}
catch
(
error
)
{
}
}
}
}
}
}
...
@@ -937,121 +975,111 @@ const handleReject = () => {
...
@@ -937,121 +975,111 @@ const handleReject = () => {
isRejectDialogOpen
.
value
=
true
isRejectDialogOpen
.
value
=
true
}
}
const
handleConfirmReject
=
()
=>
{
const
handleConfirmReject
=
async
()
=>
{
if
(
!
rejectReason
.
value
.
trim
())
{
if
(
!
rejectReason
.
value
.
trim
())
{
ElMessage
.
error
(
'请填写驳回原因'
)
ElMessage
.
error
(
'请填写驳回原因'
)
return
return
}
}
if
(
reviewingOrder
.
value
)
{
if
(
reviewingOrder
.
value
)
{
const
currentTime
=
new
Date
().
toLocaleString
(
'zh-CN'
)
const
order
=
paginatedOrders
.
value
.
find
(
o
=>
o
.
id
===
reviewingOrder
.
value
.
id
)
const
order
=
orders
.
value
.
find
(
o
=>
o
.
id
===
reviewingOrder
.
value
.
id
)
if
(
order
)
{
if
(
order
)
{
// 更新订单状态
try
{
order
.
reviewStatus
=
'审核驳回'
const
response
=
await
$api
.
audioOrderList
({
order
.
rejectReason
=
rejectReason
.
value
list
:[{
id
:
order
.
id
,
// 添加操作日志
auditStatus
:
'2'
,
if
(
!
order
.
operationLogs
)
{
auditMemo
:
rejectReason
.
value
order
.
operationLogs
=
[]
}
]
}
order
.
operationLogs
.
push
({
id
:
`LOG${order.id
}
_${Date.now()
}
`
,
time
:
currentTime
,
operator
:
'主管理员'
,
action
:
'审核驳回'
,
details
:
`驳回原因:${rejectReason.value
}
`
}
)
}
)
emit
(
'orders-update'
,
orders
.
value
)
if
(
response
.
c
===
0
)
{
}
ElMessage
.
success
(
`订单 ${reviewingOrder.value.id
}
已驳回`
)
ElMessage
.
success
(
`订单 ${reviewingOrder.value.id
}
已驳回`
)
isReviewDialogOpen
.
value
=
false
isReviewDialogOpen
.
value
=
false
isRejectDialogOpen
.
value
=
false
isRejectDialogOpen
.
value
=
false
setTimeout
(()
=>
{
reviewingOrder
.
value
=
null
reviewingOrder
.
value
=
null
rejectReason
.
value
=
''
rejectReason
.
value
=
''
}
,
0
)
queryOrder
()
}
else
{
ElMessage
.
error
(
response
.
m
)
}
}
catch
(
error
)
{
}
}
}
}
}
}
const
handleConfirmBatchReject
=
()
=>
{
const
handleConfirmBatchReject
=
async
()
=>
{
if
(
batchReviewOrders
.
value
.
length
===
0
)
{
if
(
batchReviewOrders
.
value
.
length
===
0
)
{
ElMessage
.
error
(
'没有待审核的订单'
)
ElMessage
.
error
(
'没有待审核的订单'
)
return
return
}
}
const
currentTime
=
new
Date
().
toLocaleString
(
'zh-CN'
)
let
list
=
[]
let
rejectCount
=
0
batchReviewOrders
.
value
.
forEach
(
order
=>
{
batchReviewOrders
.
value
.
forEach
(
order
=>
{
const
orderInList
=
orders
.
value
.
find
(
o
=>
o
.
id
===
order
.
id
)
list
.
push
({
if
(
orderInList
&&
orderInList
.
reviewStatus
===
'待审核'
)
{
id
:
order
.
id
,
orderInList
.
reviewStatus
=
'审核驳回'
auditStatus
:
'2'
,
orderInList
.
rejectReason
=
'批量审核驳回'
auditMemo
:
batchRejectReason
.
value
}
)
if
(
!
orderInList
.
operationLogs
)
{
orderInList
.
operationLogs
=
[]
}
orderInList
.
operationLogs
.
push
({
id
:
`LOG${orderInList.id
}
_${Date.now()
}
_${Math.random()
}
`
,
time
:
currentTime
,
operator
:
'主管理员'
,
action
:
'审核驳回'
,
details
:
'批量审核驳回:未通过主管复核'
}
)
}
)
rejectCount
++
const
response
=
await
$api
.
audioOrderList
({
}
list
:
list
}
)
}
)
if
(
response
.
c
===
0
)
{
ElMessage
.
success
(
`成功批量驳回 ${batchReviewOrders.value.length
}
个订单`
)
isBatchReviewDialogOpen
.
value
=
false
showBatchRejectReason
.
value
=
false
setTimeout
(()
=>
{
selectedOrderIds
.
value
=
[]
selectedOrderIds
.
value
=
[]
batchReviewOrders
.
value
=
[]
batchReviewOrders
.
value
=
[]
isBatchReviewDialogOpen
.
value
=
false
batchRejectReason
.
value
=
''
batchRejectReason
.
value
=
''
showBatchRejectReason
.
value
=
false
}
,
0
);
emit
(
'orders-update'
,
orders
.
value
)
queryOrder
()
ElMessage
.
success
(
`成功批量驳回 ${rejectCount
}
个订单`
)
}
else
{
ElMessage
.
error
(
response
.
m
)
}
}
}
const
handleConfirmBatchApprove
=
()
=>
{
const
handleConfirmBatchApprove
=
async
()
=>
{
if
(
batchReviewOrders
.
value
.
length
===
0
)
{
if
(
batchReviewOrders
.
value
.
length
===
0
)
{
ElMessage
.
error
(
'没有待审核的订单'
)
ElMessage
.
error
(
'没有待审核的订单'
)
return
return
}
}
const
currentTime
=
new
Date
().
toLocaleString
(
'zh-CN'
)
let
list
=
[]
let
successCount
=
0
batchReviewOrders
.
value
.
forEach
(
order
=>
{
batchReviewOrders
.
value
.
forEach
(
order
=>
{
const
orderInList
=
orders
.
value
.
find
(
o
=>
o
.
id
===
order
.
id
)
list
.
push
({
if
(
orderInList
&&
orderInList
.
reviewStatus
===
'待审核'
)
{
id
:
order
.
id
,
// 更新订单状态
auditStatus
:
'1'
orderInList
.
reviewStatus
=
'审核通过'
}
)
orderInList
.
paymentTime
=
currentTime
// 添加操作日志
if
(
!
orderInList
.
operationLogs
)
{
orderInList
.
operationLogs
=
[]
}
orderInList
.
operationLogs
.
push
({
id
:
`LOG${orderInList.id
}
_${Date.now()
}
_${Math.random()
}
`
,
time
:
currentTime
,
operator
:
'主管理员'
,
action
:
'审核通过'
,
details
:
`主管批量审核通过,金额:¥${orderInList.actualReward?.toFixed(2) || orderInList.estimatedReward.toFixed(2)
}
`
}
)
}
)
successCount
++
const
response
=
await
$api
.
audioOrderList
({
}
list
:
list
}
)
}
)
// 清空选择
if
(
response
.
c
===
0
)
{
ElMessage
.
success
(
`成功批量审核通过 ${batchReviewOrders.value.length
}
个订单`
)
isBatchReviewDialogOpen
.
value
=
false
setTimeout
(()
=>
{
selectedOrderIds
.
value
=
[]
selectedOrderIds
.
value
=
[]
batchReviewOrders
.
value
=
[]
batchReviewOrders
.
value
=
[]
isBatchReviewDialogOpen
.
value
=
false
}
,
0
);
emit
(
'orders-update'
,
orders
.
value
)
queryOrder
()
ElMessage
.
success
(
`成功批量审核通过 ${successCount
}
个订单`
)
}
else
{
ElMessage
.
error
(
response
.
m
)
}
}
}
const
handlePageSizeChange
=
()
=>
{
const
handlePageSizeChange
=
()
=>
{
...
@@ -1068,19 +1096,21 @@ const handleCurrentChange = (page: number) => {
...
@@ -1068,19 +1096,21 @@ const handleCurrentChange = (page: number) => {
// 批量修改:模板下载
// 批量修改:模板下载
const
downloadBatchTemplate
=
()
=>
{
const
downloadBatchTemplate
=
()
=>
{
const
header
=
[
'订单ID'
,
'当前酬金'
,
'新酬金'
,
'备注'
]
try
{
const
sample
=
[
// 创建下载链接
[
'ORD20251107XXX'
,
'50.00'
,
'55.00'
,
'调整酬金'
],
const
link
=
document
.
createElement
(
'a'
)
[
'ORD20251107YYY'
,
'30.00'
,
'35.00'
,
'补贴'
]
// 使用相对路径,确保本地和线上都能正常访问
]
link
.
href
=
'./static/file/order_tem.xlsx'
const
lines
=
[
header
,
...
sample
].
map
(
cols
=>
cols
.
join
(
','
)).
join
(
'\n'
)
link
.
download
=
'批量修改酬金模板.xlsx'
const
blob
=
new
Blob
([
lines
],
{
type
:
'text/csv;charset=utf-8;'
}
)
document
.
body
.
appendChild
(
link
)
const
url
=
URL
.
createObjectURL
(
blob
)
link
.
click
()
const
a
=
document
.
createElement
(
'a'
)
document
.
body
.
removeChild
(
link
)
a
.
href
=
url
a
.
download
=
'批量修改模板.csv'
ElMessage
.
success
(
'模板下载成功'
)
a
.
click
()
}
catch
(
error
)
{
URL
.
revokeObjectURL
(
url
)
console
.
error
(
'下载模板失败:'
,
error
)
ElMessage
.
error
(
'模板下载失败,请稍后重试'
)
}
}
}
// 批量修改:重置状态
// 批量修改:重置状态
...
@@ -1114,71 +1144,18 @@ const parseCsv = (text: string): string[][] => {
...
@@ -1114,71 +1144,18 @@ const parseCsv = (text: string): string[][] => {
}
}
// 校验并映射为预览行
// 校验并映射为预览行
const
buildPreviewRows
=
(
rows
:
string
[][])
=>
{
const
buildPreviewRows
=
(
list
:
any
[])
=>
{
const
header
=
rows
[
0
]
||
[]
const
body
=
rows
.
slice
(
1
)
const
getIndex
=
(
name
:
string
)
=>
header
.
findIndex
(
h
=>
h
.
replace
(
/
\s
/g
,
''
)
===
name
)
const
idxOrderId
=
getIndex
(
'订单ID'
)
const
idxCurrent
=
getIndex
(
'当前酬金'
)
const
idxNew
=
getIndex
(
'新酬金'
)
const
idxRemark
=
getIndex
(
'备注'
)
const
preview
:
any
[]
=
[]
const
preview
:
any
[]
=
[]
const
valid
:
any
[]
=
[]
const
valid
:
any
[]
=
[]
const
invalid
:
any
[]
=
[]
const
invalid
:
any
[]
=
[]
if
(
idxOrderId
===
-
1
||
idxNew
===
-
1
)
{
list
.
forEach
(
item
=>
{
ElMessage
.
error
(
'模板列缺失,请使用系统模板:需要包含 订单ID、新酬金'
)
preview
.
push
(
item
)
return
{
preview
,
valid
,
invalid
}
}
const
maxCount
=
100
if
(
body
.
length
>
maxCount
)
{
ElMessage
.
warning
(
`仅解析前 ${maxCount
}
条记录,其余将忽略`
)
}
const
limitRows
=
body
.
slice
(
0
,
maxCount
)
limitRows
.
forEach
((
cols
,
i
)
=>
{
const
orderId
=
cols
[
idxOrderId
]
||
''
const
newRewardStr
=
cols
[
idxNew
]
||
''
const
remark
=
idxRemark
>=
0
?
(
cols
[
idxRemark
]
||
''
)
:
''
const
order
=
orders
.
value
.
find
(
o
=>
o
.
id
===
orderId
)
const
currentReward
=
order
?.
actualReward
??
order
?.
estimatedReward
let
status
=
'OK'
let
error
=
''
if
(
!
orderId
)
{
status
=
'ERROR'
error
=
'订单ID为空'
}
else
if
(
!
order
)
{
status
=
'ERROR'
error
=
'订单不存在'
}
const
newReward
=
Number
(
newRewardStr
)
if
(
item
.
memo
){
if
(
Number
.
isNaN
(
newReward
))
{
invalid
.
push
(
item
)
status
=
'ERROR'
}
else
{
error
=
error
?
`${error
}
; 新酬金非数字`
:
'新酬金非数字'
valid
.
push
(
item
)
}
else
if
(
newReward
<
0
||
newReward
>
1000
)
{
status
=
'ERROR'
error
=
error
?
`${error
}
; 新酬金需在0~1000之间`
:
'新酬金需在0~1000之间'
}
const
row
=
{
orderId
,
currentReward
:
currentReward
??
''
,
newReward
:
Number
.
isNaN
(
newReward
)
?
''
:
newReward
,
remark
,
status
,
error
}
preview
.
push
(
row
)
if
(
status
===
'OK'
)
{
valid
.
push
(
row
)
}
else
{
invalid
.
push
(
row
)
}
}
}
)
}
)
...
@@ -1186,16 +1163,34 @@ const buildPreviewRows = (rows: string[][]) => {
...
@@ -1186,16 +1163,34 @@ const buildPreviewRows = (rows: string[][]) => {
}
}
// 上传变更
// 上传变更
const
handleBatchFileChange
=
(
file
:
any
)
=>
{
const
handleBatchFileChange
=
async
(
file
:
any
)
=>
{
if
(
!
file
?.
raw
)
return
if
(
!
file
?.
raw
)
return
const
raw
:
File
=
file
.
raw
const
raw
:
File
=
file
.
raw
// 验证文件大小(2MB)
const
maxSize
=
2
*
1024
*
1024
if
(
raw
.
size
>
maxSize
)
{
ElMessage
.
error
(
'文件大小超过2MB限制,请压缩后重新上传'
)
return
}
// 验证文件格式
const
fileName
=
raw
.
name
.
toLowerCase
()
if
(
!
fileName
.
endsWith
(
'.csv'
)
&&
!
fileName
.
endsWith
(
'.xlsx'
))
{
ElMessage
.
error
(
'目前仅支持 csv和xlsx 格式的文件'
)
return
}
batchFileName
.
value
=
raw
.
name
batchFileName
.
value
=
raw
.
name
const
reader
=
new
FileReader
()
try
{
reader
.
onload
=
()
=>
{
const
fd
=
new
FormData
()
const
text
=
String
(
reader
.
result
||
''
)
fd
.
append
(
'file'
,
raw
)
const
rows
=
parseCsv
(
text
)
const
{
preview
,
valid
,
invalid
}
=
buildPreviewRows
(
rows
)
const
response
=
await
$api
.
updateOrderListMoney
(
fd
)
if
(
response
.
c
===
0
){
const
{
preview
,
valid
,
invalid
}
=
buildPreviewRows
(
response
.
d
.
list
)
batchPreviewRows
.
value
=
preview
batchPreviewRows
.
value
=
preview
batchValidRows
.
value
=
valid
batchValidRows
.
value
=
valid
batchInvalidRows
.
value
=
invalid
batchInvalidRows
.
value
=
invalid
...
@@ -1203,19 +1198,37 @@ const handleBatchFileChange = (file: any) => {
...
@@ -1203,19 +1198,37 @@ const handleBatchFileChange = (file: any) => {
if
(
valid
.
length
===
0
)
{
if
(
valid
.
length
===
0
)
{
ElMessage
.
warning
(
'未检测到有效记录,请检查文件内容'
)
ElMessage
.
warning
(
'未检测到有效记录,请检查文件内容'
)
}
}
}
else
{
ElMessage
.
error
(
response
.
m
)
}
}
reader
.
onerror
=
()
=>
{
}
catch
(
error
)
{
ElMessage
.
error
(
'读取文件失败,请重试'
)
ElMessage
.
error
(
'读取文件失败,请重试'
)
}
}
reader
.
readAsText
(
raw
,
'utf-8'
)
}
}
const
closeBatchDialog
=
()
=>
{
const
closeBatchDialog
=
()
=>
{
isBatchModifyDialogOpen
.
value
=
false
isBatchModifyDialogOpen
.
value
=
false
}
}
const
openVerifyDialog
=
()
=>
{
const
openVerifyDialog
=
async
()
=>
{
isVerifyDialogOpen
.
value
=
true
const
response
=
await
$api
.
updateOrderMoney
({
list
:
batchPreviewRows
.
value
}
)
if
(
response
.
c
===
0
){
ElMessage
.
success
(
`成功修改 ${batchPreviewRows.value.length
}
个订单`
)
isVerifyDialogOpen
.
value
=
false
isBatchModifyDialogOpen
.
value
=
false
setTimeout
(()
=>
{
resetBatchState
()
}
,
0
)
queryOrder
()
}
else
{
ElMessage
.
error
(
response
.
m
)
}
}
}
// 执行变更(演示校验码:123456)
// 执行变更(演示校验码:123456)
...
...
Write
Preview
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