优化同意订单页面和推送订单到playx的功能

This commit is contained in:
2026-04-03 10:39:40 +08:00
parent 941f0f4a8c
commit 5ab85d1d53
14 changed files with 91 additions and 130 deletions

View File

@@ -23,6 +23,7 @@ export default {
'grant_status ACCEPTED': 'ACCEPTED',
'grant_status FAILED_RETRYABLE': 'FAILED_RETRYABLE',
'grant_status FAILED_FINAL': 'FAILED_FINAL',
'grant_status ---': '---',
fail_reason: 'fail_reason',
reject_reason: 'reject_reason',
shipping_company: 'shipping_company',

View File

@@ -23,6 +23,7 @@ export default {
'grant_status ACCEPTED': 'ACCEPTED',
'grant_status FAILED_RETRYABLE': 'FAILED_RETRYABLE',
'grant_status FAILED_FINAL': 'FAILED_FINAL',
'grant_status ---': '---',
fail_reason: 'fail_reason',
reject_reason: 'reject_reason',
shipping_company: 'shipping_company',

View File

@@ -17,12 +17,13 @@ export default {
multiplier: '流水倍数',
external_transaction_id: '订单号',
playx_transaction_id: 'PlayX流水号',
grant_status: '发放子状态',
grant_status: '推送playx状态',
'grant_status NOT_SENT': '未发送',
'grant_status SENT_PENDING': '已发送排队',
'grant_status ACCEPTED': '已接收(accepted)',
'grant_status FAILED_RETRYABLE': '失败可重试',
'grant_status FAILED_FINAL': '失败最终',
'grant_status ---': '---',
fail_reason: '失败原因',
reject_reason: '驳回原因',
shipping_company: '物流公司',

View File

@@ -1,6 +1,6 @@
export default {
title: 'PlayX 对接中心',
desc: '集中管理积分商城与 PlayX 的订单、推送、领取与资产数据。建议优先处理“发放子状态=失败可重试”的订单。',
desc: '集中管理积分商城与 PlayX 的订单、推送、领取与资产数据。建议优先处理“推送playx状态=失败可重试”的订单。',
orders: '统一订单',
dailyPush: '每日推送',
claimLog: '领取记录',

View File

@@ -17,12 +17,13 @@ export default {
multiplier: '流水倍数',
external_transaction_id: '订单号',
playx_transaction_id: 'PlayX流水号',
grant_status: '发放子状态',
grant_status: '推送playx状态',
'grant_status NOT_SENT': '未发送',
'grant_status SENT_PENDING': '已发送排队',
'grant_status ACCEPTED': '已接收(accepted)',
'grant_status FAILED_RETRYABLE': '失败可重试',
'grant_status FAILED_FINAL': '失败最终',
'grant_status ---': '---',
fail_reason: '失败原因',
reject_reason: '驳回原因',
shipping_company: '物流公司',

View File

@@ -125,6 +125,15 @@ const baTable = new baTableClass(
label: t('mall.order.grant_status'),
prop: 'grant_status',
align: 'center',
minWidth: 100,
custom: {
NOT_SENT: 'info',
SENT_PENDING: 'primary',
ACCEPTED: 'primary',
FAILED_RETRYABLE: 'error',
FAILED_FINAL: 'error',
'---': 'info',
},
operator: 'eq',
sortable: false,
render: 'tag',
@@ -134,6 +143,7 @@ const baTable = new baTableClass(
ACCEPTED: t('mall.order.grant_status ACCEPTED'),
FAILED_RETRYABLE: t('mall.order.grant_status FAILED_RETRYABLE'),
FAILED_FINAL: t('mall.order.grant_status FAILED_FINAL'),
'---': t('mall.order.grant_status ---'),
},
},
{
@@ -237,8 +247,7 @@ const baTable = new baTableClass(
text: '手动重试',
type: 'warning',
icon: '',
display: (row: TableRow) =>
(row.type === 'BONUS' || row.type === 'WITHDRAW') && row.grant_status === 'FAILED_RETRYABLE' && row.status === 'PENDING',
display: (row: TableRow) => row.type === 'BONUS' && row.grant_status === 'FAILED_RETRYABLE' && row.status === 'PENDING',
popconfirm: {
title: '确认将该订单加入重试队列?',
confirmButtonText: '确认',

View File

@@ -57,7 +57,7 @@
</template>
<template v-else-if="usePagedActions">
<template v-if="action === 'approveShip'">
<template v-if="action === 'approveShip' && isPhysical">
<FormItem
:label="t('mall.order.shipping_company')"
type="string"
@@ -75,6 +75,7 @@
</template>
<template v-else-if="action === 'reject'">
<FormItem
v-if="isPhysical"
:label="t('mall.order.reject_reason')"
type="textarea"
v-model="baTable.form.items!.reject_reason"
@@ -83,6 +84,9 @@
@keyup.enter.stop=""
:placeholder="t('Please input field', { field: t('mall.order.reject_reason') })"
/>
<el-alert v-else type="info" :closable="false" show-icon>
确认后将驳回该订单并退回积分红利/提现订单无需填写驳回原因
</el-alert>
</template>
</template>
@@ -97,29 +101,31 @@
:input-attr="{ content: { PENDING: t('mall.order.status PENDING'), COMPLETED: t('mall.order.status COMPLETED'), SHIPPED: t('mall.order.status SHIPPED'), REJECTED: t('mall.order.status REJECTED') } }"
:placeholder="t('Please select field', { field: t('mall.order.status') })"
/>
<FormItem
:label="t('mall.order.shipping_company')"
type="string"
v-model="baTable.form.items!.shipping_company"
prop="shipping_company"
:placeholder="t('Please input field', { field: t('mall.order.shipping_company') })"
/>
<FormItem
:label="t('mall.order.shipping_no')"
type="string"
v-model="baTable.form.items!.shipping_no"
prop="shipping_no"
:placeholder="t('Please input field', { field: t('mall.order.shipping_no') })"
/>
<FormItem
:label="t('mall.order.reject_reason')"
type="textarea"
v-model="baTable.form.items!.reject_reason"
prop="reject_reason"
:input-attr="{ rows: 3 }"
@keyup.enter.stop=""
:placeholder="t('Please input field', { field: t('mall.order.reject_reason') })"
/>
<template v-if="isPhysical">
<FormItem
:label="t('mall.order.shipping_company')"
type="string"
v-model="baTable.form.items!.shipping_company"
prop="shipping_company"
:placeholder="t('Please input field', { field: t('mall.order.shipping_company') })"
/>
<FormItem
:label="t('mall.order.shipping_no')"
type="string"
v-model="baTable.form.items!.shipping_no"
prop="shipping_no"
:placeholder="t('Please input field', { field: t('mall.order.shipping_no') })"
/>
<FormItem
:label="t('mall.order.reject_reason')"
type="textarea"
v-model="baTable.form.items!.reject_reason"
prop="reject_reason"
:input-attr="{ rows: 3 }"
@keyup.enter.stop=""
:placeholder="t('Please input field', { field: t('mall.order.reject_reason') })"
/>
</template>
</template>
</el-form>
</div>
@@ -159,7 +165,7 @@
</template>
<script setup lang="ts">
import { computed, inject, reactive, ref, useTemplateRef, watch } from 'vue'
import { computed, inject, ref, useTemplateRef, watch } from 'vue'
import { useI18n } from 'vue-i18n'
import { useConfig } from '/@/stores/config'
import baTableClass from '/@/utils/baTable'
@@ -261,7 +267,10 @@ const submitShip = async () => {
const submitReject = async () => {
const id = baTable.form.items?.id
const rejectReason = (baTable.form.items?.reject_reason || '').toString().trim()
if (!id || rejectReason === '') {
if (!id) {
return
}
if (isPhysical.value && rejectReason === '') {
ElMessage.error('请填写驳回原因')
return
}
@@ -279,10 +288,15 @@ const submitReject = async () => {
}
}
const rules: Partial<Record<string, FormItemRule[]>> = reactive({
shipping_company: [buildValidatorData({ name: 'required', title: t('mall.order.shipping_company') })],
shipping_no: [buildValidatorData({ name: 'required', title: t('mall.order.shipping_no') })],
reject_reason: [buildValidatorData({ name: 'required', title: t('mall.order.reject_reason') })],
const rules = computed<Partial<Record<string, FormItemRule[]>>>(() => {
if (!isPhysical.value) {
return {}
}
return {
shipping_company: [buildValidatorData({ name: 'required', title: t('mall.order.shipping_company') })],
shipping_no: [buildValidatorData({ name: 'required', title: t('mall.order.shipping_no') })],
reject_reason: [buildValidatorData({ name: 'required', title: t('mall.order.reject_reason') })],
}
})
</script>

View File

@@ -83,6 +83,7 @@ const baTable = new baTableClass(
ACCEPTED: t('mall.playxOrder.grant_status ACCEPTED'),
FAILED_RETRYABLE: t('mall.playxOrder.grant_status FAILED_RETRYABLE'),
FAILED_FINAL: t('mall.playxOrder.grant_status FAILED_FINAL'),
'---': t('mall.playxOrder.grant_status ---'),
},
},
{
@@ -115,8 +116,7 @@ const baTable = new baTableClass(
text: '手动重试',
type: 'warning',
icon: '',
display: (row: TableRow) =>
(row.type === 'BONUS' || row.type === 'WITHDRAW') && row.grant_status === 'FAILED_RETRYABLE' && row.status === 'PENDING',
display: (row: TableRow) => row.type === 'BONUS' && row.grant_status === 'FAILED_RETRYABLE' && row.status === 'PENDING',
popconfirm: {
title: '确认将该订单加入重试队列?',
confirmButtonText: '确认',