feat 支付记录各种数据完整性调整

This commit is contained in:
bootx
2024-01-28 22:52:39 +08:00
parent 0cae109787
commit d7836922ce
23 changed files with 156 additions and 87 deletions

View File

@@ -99,8 +99,8 @@
function remove(record) {
del(record.id).then(() => {
createMessage.success('删除成功')
queryPage()
})
queryPage()
}
defineExpose({
init,

View File

@@ -135,8 +135,8 @@
function remove(record) {
del(record.id).then(() => {
createMessage.success('删除成功')
queryPage()
})
queryPage()
}
//发送

View File

@@ -120,8 +120,8 @@
function remove(record) {
del(record.id).then(() => {
notification.success({ message: '删除成功' })
queryPage()
})
queryPage()
}
</script>

View File

@@ -112,8 +112,8 @@
function remove(record) {
del(record.id).then(() => {
createMessage.success('删除成功')
queryPage()
})
queryPage()
}
defineExpose({
init,

View File

@@ -131,8 +131,8 @@
function remove(record) {
del(record.id).then(() => {
createMessage.success('删除成功')
queryPage()
})
queryPage()
}
</script>

View File

@@ -126,8 +126,8 @@
function remove(record) {
del(record.id).then(() => {
notification.success({ message: '删除成功' })
queryPage()
})
queryPage()
}
</script>

View File

@@ -130,8 +130,8 @@
function remove(record) {
del(record.id).then(() => {
createMessage.success('删除成功')
queryPage()
})
queryPage()
}
</script>

View File

@@ -152,8 +152,8 @@
function remove(record) {
del(record.id).then(() => {
notification.success({ message: '删除成功' })
queryPage()
})
queryPage()
}
// 批量删除
function removeDataScopeBatch() {

View File

@@ -147,8 +147,8 @@
function remove(record) {
del(record.id).then(() => {
createMessage.success('删除成功')
queryPage()
})
queryPage()
}
</script>

View File

@@ -68,8 +68,8 @@
loading.value = true
dictDropDown('WeChatMediaType').then((res) => {
mediaTypes = res
queryPage()
})
queryPage()
}
function queryPage() {

View File

@@ -104,8 +104,8 @@
function remove(record) {
del(record.id).then(() => {
createMessage.success('删除成功')
queryPage()
})
queryPage()
}
// 同步
function syncInfo() {

View File

@@ -8,9 +8,9 @@
<vxe-table
row-id="id"
ref="xTable"
:sort-config="{ remote: true, trigger: 'cell' }"
:data="pagination.records"
:loading="loading"
:sort-config="{ remote: true, trigger: 'cell' }"
@sort-change="sortChange"
>
<vxe-column type="seq" title="序号" width="60" />

View File

@@ -25,7 +25,7 @@
{{ form.gatewayOrderNo }}
</a-descriptions-item>
<a-descriptions-item label="交易类型">
<a-tag>{{ dictConvert('PayReconcileTrade', form.type) }}</a-tag>
<a-tag>{{ dictConvert('PayReconcileTrade', form.repairType) }}</a-tag>
</a-descriptions-item>
<a-descriptions-item label="创建时间">
{{ form.createTime }}

View File

@@ -9,9 +9,9 @@
<vxe-column field="paymentId" title="本地订单ID" />
<vxe-column field="refundId" title="本地退款ID" />
<vxe-column field="gatewayOrderNo" title="网关订单号" />
<vxe-column field="type" title="交易类型">
<vxe-column field="repairType" title="交易类型">
<template #default="{ row }">
<a-tag>{{ dictConvert('PayReconcileTrade', row.type) }}</a-tag>
<a-tag>{{ dictConvert('PayReconcileTrade', row.repairType) }}</a-tag>
</template>
</vxe-column>
<vxe-column field="createTime" title="创建时间" />

View File

@@ -11,7 +11,14 @@
</a-space>
</template>
</vxe-toolbar>
<vxe-table row-id="id" ref="xTable" :data="pagination.records" :loading="loading">
<vxe-table
row-id="id"
ref="xTable"
:data="pagination.records"
:loading="loading"
:sort-config="{ remote: true, trigger: 'cell' }"
@sort-change="sortChange"
>
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="date" title="对账日期" />
<vxe-column field="batchNo" title="批次号" />
@@ -63,14 +70,14 @@
import { LabeledValue } from 'ant-design-vue/lib/select'
import { computed, onMounted } from 'vue'
import { DATE, LIST, QueryField, STRING } from '/@/components/Bootx/Query/Query'
import { VxeTableInstance, VxeToolbarInstance } from 'vxe-table'
import { VxeTable, VxeTableInstance, VxeToolbarInstance } from 'vxe-table'
import { downAndSave, page } from './ReconcileOrder.api'
import ReconcileOrderInfo from './ReconcileOrderInfo.vue'
import ReconcileDetailList from './ReconcileDetailList.vue'
import ReconcileOrderCreate from '/@/views/payment/order/reconcile/ReconcileOrderCreate.vue'
// 使用hooks
const { handleTableChange, pageQueryResHandel, resetQueryParams, pagination, pages, model, loading } = useTablePage(queryPage)
const { handleTableChange, pageQueryResHandel, resetQueryParams, sortChange, sortParam, pagination, pages, model, loading } = useTablePage(queryPage)
const { notification, createMessage, createConfirm } = useMessage()
const { dictConvert, dictDropDown } = useDict()
@@ -121,6 +128,7 @@
page({
...model.queryParam,
...pages,
...sortParam,
}).then(({ data }) => {
pageQueryResHandel(data)
})

View File

@@ -1,7 +1,14 @@
<template>
<div>
<div class="m-3 p-3 pt-5 bg-white">
<b-query :query-params="model.queryParam" :fields="fields" @query="queryPage" @reset="resetQueryParams" />
<b-query
:query-params="model.queryParam"
:fields="fields"
@query="queryPage"
@reset="resetQueryParams"
:sort-config="{ remote: true, trigger: 'cell' }"
@sort-change="sortChange"
/>
</div>
<div class="m-3 p-3 bg-white">
<vxe-toolbar ref="xToolbar" custom :refresh="{ queryMethod: queryPage }" />
@@ -62,7 +69,7 @@
import { page } from './RefundOrder.api'
import useTablePage from '/@/hooks/bootx/useTablePage'
import RefundOrderInfo from './RefundOrderInfo.vue'
import { VxeTableInstance, VxeToolbarInstance } from 'vxe-table'
import { VxeTable, VxeTableInstance, VxeToolbarInstance } from 'vxe-table'
import BQuery from '/@/components/Bootx/Query/BQuery.vue'
import { useMessage } from '/@/hooks/web/useMessage'
import { LIST, QueryField, STRING } from '/@/components/Bootx/Query/Query'

View File

@@ -33,7 +33,7 @@ export interface PayCallbackRecord extends BaseEntity {
// 支付通道
payChannel?: string
// 回调类型
type?: string
callbackType?: string
// 通知消息
notifyInfo?: string
// 回调处理状态

View File

@@ -10,11 +10,17 @@
>
<a-spin :spinning="confirmLoading">
<a-descriptions bordered title="" :column="{ md: 1, sm: 1, xs: 1 }">
<a-descriptions-item label="支付记录id">
{{ form.paymentId }}
<a-descriptions-item label="本地订单ID">
{{ form.orderId }}
</a-descriptions-item>
<a-descriptions-item label="支付网关订单号">
{{ form.gatewayOrderNo }}
</a-descriptions-item>
<a-descriptions-item label="支付通道">
{{ dictConvert('PayChannel', form.payChannel) }}
<a-tag>{{ dictConvert('PayChannel', form.payChannel) }}</a-tag>
</a-descriptions-item>
<a-descriptions-item label="支付通道">
<a-tag>{{ dictConvert('PayCallbackType', form.callbackType) }}</a-tag>
</a-descriptions-item>
<a-descriptions-item label="通知消息">
<json-preview :data="JSON.parse(form.notifyInfo || '{}')" />
@@ -26,7 +32,7 @@
{{ form.msg }}
</a-descriptions-item>
<a-descriptions-item label="通知时间">
{{ form.notifyTime }}
{{ form.createTime }}
</a-descriptions-item>
</a-descriptions>
</a-spin>
@@ -62,13 +68,7 @@
// 表单
const formRef = $ref<FormInstance>()
let form = $ref<PayCallbackRecord>({
id: null,
paymentId: '',
notifyInfo: '',
msg: '',
notifyTime: '',
})
let form = $ref<PayCallbackRecord>({})
// 入口
function init(id) {
visible.value = true

View File

@@ -5,27 +5,39 @@
</div>
<div class="m-3 p-3 bg-white">
<vxe-toolbar ref="xToolbar" custom :refresh="{ queryMethod: queryPage }" />
<vxe-table row-id="id" ref="xTable" :data="pagination.records" :loading="loading">
<vxe-table
row-id="id"
ref="xTable"
:data="pagination.records"
:loading="loading"
:sort-config="{ remote: true, trigger: 'cell' }"
@sort-change="sortChange"
>
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="paymentId" title="原支付号" width="170" sortable>
<vxe-column field="orderId" title="本地订单ID" width="170">
<template #default="{ row }">
<a @click="showPayment(row.paymentId)">
{{ row.paymentId }}
<a @click="showOrder(row)">
{{ row.orderId }}
</a>
</template>
</vxe-column>
<vxe-column field="payChannel" title="支付通道">
<template #default="{ row }">
{{ dictConvert('PayChannel', row.payChannel) }}
<a-tag>{{ dictConvert('PayChannel', row.payChannel) }}</a-tag>
</template>
</vxe-column>
<vxe-column field="callbackType" title="回调类型">
<template #default="{ row }">
<a-tag>{{ dictConvert('PayCallbackType', row.callbackType) }}</a-tag>
</template>
</vxe-column>
<vxe-column field="status" title="处理状态">
<template #default="{ row }">
{{ dictConvert('PayCallbackStatus', row.status) }}
<a-tag>{{ dictConvert('PayCallbackStatus', row.status) }}</a-tag>
</template>
</vxe-column>
<vxe-column field="msg" title="提示信息" />
<vxe-column field="notifyTime" title="通知时间" />
<vxe-column field="createTime" title="通知时间" sortable />
<vxe-column fixed="right" width="60" :showOverflow="false" title="操作">
<template #default="{ row }">
<span>
@@ -44,6 +56,7 @@
/>
<pay-callback-record-info ref="payCallbackRecordInfo" />
<pay-order-info ref="payOrderInfo" />
<refund-order-info ref="refundOrderInfo" />
</div>
</div>
</template>
@@ -51,19 +64,21 @@
<script lang="ts" setup>
import { computed, onMounted } from 'vue'
import { $ref } from 'vue/macros'
import { page } from './PayCallbackRecord.api'
import { page, PayCallbackRecord } from './PayCallbackRecord.api'
import useTablePage from '/@/hooks/bootx/useTablePage'
import { VxeTableInstance, VxeToolbarInstance } from 'vxe-table'
import { VxeTable, VxeTableInstance, VxeToolbarInstance } from 'vxe-table'
import BQuery from '/@/components/Bootx/Query/BQuery.vue'
import { useMessage } from '/@/hooks/web/useMessage'
import { LIST, QueryField, STRING } from '/@/components/Bootx/Query/Query'
import { useDict } from '/@/hooks/bootx/useDict'
import PayCallbackRecordInfo from './PayCallbackRecordInfo.vue'
import { LabeledValue } from 'ant-design-vue/lib/select'
import PayOrderInfo from "/@/views/payment/order/pay/PayOrderInfo.vue";
import PayOrderInfo from '/@/views/payment/order/pay/PayOrderInfo.vue'
import RefundOrderInfo from '/@/views/payment/order/refund/RefundOrderInfo.vue'
// 使用hooks
const { handleTableChange, pageQueryResHandel, resetQueryParams, pagination, pages, model, loading } = useTablePage(queryPage)
const { handleTableChange, pageQueryResHandel, resetQueryParams, pagination, sortChange, sortParam, pages, model, loading } =
useTablePage(queryPage)
const { notification, createMessage, createConfirm } = useMessage()
const { dictConvert, dictDropDown } = useDict()
@@ -95,6 +110,7 @@
const xToolbar = $ref<VxeToolbarInstance>()
const payCallbackRecordInfo = $ref<any>()
const payOrderInfo = $ref<any>()
const refundOrderInfo = $ref<any>()
onMounted(() => {
initData()
@@ -121,6 +137,7 @@
page({
...model.queryParam,
...pages,
...sortParam,
}).then(({ data }) => {
pageQueryResHandel(data)
})
@@ -134,11 +151,14 @@
}
/**
* 查看支付单信息
* @param paymentId
* 查看订单单信息
*/
function showPayment(paymentId) {
payOrderInfo.init(paymentId)
function showOrder(record: PayCallbackRecord) {
if (record.callbackType === 'pay') {
payOrderInfo.init(record.orderId)
} else {
refundOrderInfo.init(record.orderId)
}
}
</script>

View File

@@ -5,7 +5,14 @@
</div>
<div class="m-3 p-3 bg-white">
<vxe-toolbar ref="xToolbar" custom :refresh="{ queryMethod: queryPage }" />
<vxe-table row-id="id" ref="xTable" :data="pagination.records" :loading="loading">
<vxe-table
row-id="id"
ref="xTable"
:data="pagination.records"
:loading="loading"
:sort-config="{ remote: true, trigger: 'cell' }"
@sort-change="sortChange"
>
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="paymentId" title="原支付号" width="170" sortable>
<template #default="{ row }">
@@ -56,17 +63,17 @@
import { $ref } from 'vue/macros'
import { page } from './PayCloseRecord.api'
import useTablePage from '/@/hooks/bootx/useTablePage'
import { VxeTableInstance, VxeToolbarInstance } from 'vxe-table'
import { VxeTable, VxeTableInstance, VxeToolbarInstance } from 'vxe-table'
import BQuery from '/@/components/Bootx/Query/BQuery.vue'
import { useMessage } from '/@/hooks/web/useMessage'
import { LIST, QueryField, STRING } from '/@/components/Bootx/Query/Query'
import { useDict } from '/@/hooks/bootx/useDict'
import { LabeledValue } from 'ant-design-vue/lib/select'
import PayCloseRecordInfo from './PayCloseRecordInfo.vue'
import PayOrderInfo from "/@/views/payment/order/pay/PayOrderInfo.vue";
import PayOrderInfo from '/@/views/payment/order/pay/PayOrderInfo.vue'
// 使用hooks
const { handleTableChange, pageQueryResHandel, resetQueryParams, pagination, pages, model, loading } = useTablePage(queryPage)
const { handleTableChange, pageQueryResHandel, resetQueryParams, pagination, sortChange, sortParam, pages, model, loading } = useTablePage(queryPage)
const { notification, createMessage, createConfirm } = useMessage()
const { dictConvert, dictDropDown } = useDict()
@@ -126,6 +133,7 @@
page({
...model.queryParam,
...pages,
...sortParam
}).then(({ data }) => {
pageQueryResHandel(data)
})

View File

@@ -26,14 +26,18 @@ export function get(paymentId) {
* 支付回调记录
*/
export interface PayRepairRecord extends BaseEntity {
// 支付
paymentId?: string
// 业务号
businessNo?: string
// 支付回调记录id
repairId?: string
// 本地订单ID
orderId?: string
// 本地业务号
orderNo?: string
// 类型 支付修复/退款修复
repairType?: string
// 修复来源
repairSource?: string
// 修复类型
repairType?: string
repairWay?: string
// 修复的异步支付通道
asyncChannel?: string
// 修复前状态

View File

@@ -10,17 +10,26 @@
>
<a-spin :spinning="confirmLoading">
<a-descriptions bordered title="" :column="{ md: 1, sm: 1, xs: 1 }">
<a-descriptions-item label="支付记录id">
{{ form.paymentId }}
<a-descriptions-item label="主键ID">
{{ form.id }}
</a-descriptions-item>
<a-descriptions-item label="业务号">
{{ form.businessNo }}
<a-descriptions-item label="修复号">
{{ form.repairId }}
</a-descriptions-item>
<a-descriptions-item label="本地订单ID">
{{ form.orderId }}
</a-descriptions-item>
<a-descriptions-item label="本地业务号">
{{ form.orderNo }}
</a-descriptions-item>
<a-descriptions-item label="支付">
{{ dictConvert('PayRepairSource', form.repairSource) }}
</a-descriptions-item>
<a-descriptions-item label="修复来源">
{{ dictConvert('PayRepairSource', form.repairSource) }}
</a-descriptions-item>
<a-descriptions-item label="修复来源">
{{ dictConvert('PayRepairType', form.repairType) }}
<a-descriptions-item label="修复方式">
{{ dictConvert('PayRepairType', form.repairWay) }}
</a-descriptions-item>
<a-descriptions-item label="修复通道">
{{ dictConvert('AsyncPayChannel', form.asyncChannel) }}

View File

@@ -5,16 +5,24 @@
</div>
<div class="m-3 p-3 bg-white">
<vxe-toolbar ref="xToolbar" custom :refresh="{ queryMethod: queryPage }" />
<vxe-table row-id="id" ref="xTable" :data="pagination.records" :loading="loading">
<vxe-table
row-id="id"
ref="xTable"
:data="pagination.records"
:loading="loading"
:sort-config="{ remote: true, trigger: 'cell' }"
@sort-change="sortChange"
>
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="paymentId" title="原支付号" width="170" sortable>
<vxe-column field="repairId" title="修复号" width="170" />
<vxe-column field="orderId" title="被修复订单ID" width="170">
<template #default="{ row }">
<a @click="showPayment(row.paymentId)">
{{ row.paymentId }}
<a @click="showOrder(row)">
{{ row.orderId }}
</a>
</template>
</vxe-column>
<vxe-column field="businessNo" title="业务号" />
<vxe-column field="orderNo" title="本地业务号" />
<vxe-column field="repairSource" title="修复来源">
<template #default="{ row }">
<a-tag>{{ dictConvert('PayRepairSource', row.repairSource) }}</a-tag>
@@ -25,19 +33,9 @@
<a-tag>{{ dictConvert('PayRepairType', row.repairType) }}</a-tag>
</template>
</vxe-column>
<vxe-column field="asyncChannel" title="修复通道">
<vxe-column field="repairType" title="修复方式">
<template #default="{ row }">
<a-tag>{{ dictConvert('AsyncPayChannel', row.asyncChannel) }}</a-tag>
</template>
</vxe-column>
<vxe-column field="beforeStatus" title="修复前类型">
<template #default="{ row }">
<a-tag>{{ dictConvert('PayStatus', row.beforeStatus) }}</a-tag>
</template>
</vxe-column>
<vxe-column field="afterStatus" title="修复后类型">
<template #default="{ row }">
<a-tag>{{ dictConvert('PayStatus', row.afterStatus) }}</a-tag>
<a-tag>{{ dictConvert('PayRepairWay', row.repairType) || dictConvert('RefundRepairWay', row.repairType) }}</a-tag>
</template>
</vxe-column>
<vxe-column field="createTime" title="修复时间" />
@@ -60,30 +58,33 @@
</div>
<pay-repair-record-info ref="payRepairRecordInfo" />
<pay-order-info ref="payOrderInfo" />
<refund-order-info ref="refundOrderInfo" />
</div>
</template>
<script lang="ts" setup>
import { computed, onMounted } from 'vue'
import { $ref } from 'vue/macros'
import { page } from './PayRepairRecord.api'
import { page, PayRepairRecord } from './PayRepairRecord.api'
import useTablePage from '/@/hooks/bootx/useTablePage'
import { VxeTableInstance, VxeToolbarInstance } from 'vxe-table'
import { VxeTable, VxeTableInstance, VxeToolbarInstance } from 'vxe-table'
import BQuery from '/@/components/Bootx/Query/BQuery.vue'
import { useMessage } from '/@/hooks/web/useMessage'
import { LIST, QueryField, STRING } from '/@/components/Bootx/Query/Query'
import { useDict } from '/@/hooks/bootx/useDict'
import { LabeledValue } from 'ant-design-vue/lib/select'
import PayRepairRecordInfo from './PayRepairRecordInfo.vue'
import PayOrderInfo from "/@/views/payment/order/pay/PayOrderInfo.vue";
import PayOrderInfo from '/@/views/payment/order/pay/PayOrderInfo.vue'
import RefundOrderInfo from '/@/views/payment/order/refund/RefundOrderInfo.vue'
// 使用hooks
const { handleTableChange, pageQueryResHandel, resetQueryParams, pagination, pages, model, loading } = useTablePage(queryPage)
const { handleTableChange, pageQueryResHandel, resetQueryParams, pagination, sortChange, sortParam, pages, model, loading } = useTablePage(queryPage)
const { notification, createMessage, createConfirm } = useMessage()
const { dictConvert, dictDropDown } = useDict()
let repairSourceList = $ref<LabeledValue[]>([])
let repairTypeList = $ref<LabeledValue[]>([])
let repairWayList = $ref<LabeledValue[]>([])
let asyncChannelList = $ref<LabeledValue[]>([])
// 查询条件
@@ -105,6 +106,13 @@
placeholder: '请选择修复类型',
selectList: repairTypeList,
},
{
field: 'repairWay',
type: LIST,
name: '修复方式',
placeholder: '请选择修复方式',
selectList: repairWayList,
},
{
field: 'asyncChannel',
type: LIST,
@@ -119,6 +127,7 @@
const xToolbar = $ref<VxeToolbarInstance>()
const payRepairRecordInfo = $ref<any>()
const payOrderInfo = $ref<any>()
const refundOrderInfo = $ref<any>()
onMounted(() => {
init()
@@ -136,6 +145,7 @@
repairSourceList = await dictDropDown('PayRepairSource')
repairTypeList = await dictDropDown('PayRepairType')
asyncChannelList = await dictDropDown('AsyncPayChannel')
repairWayList = (await dictDropDown('PayRepairWay')).concat(await dictDropDown('RefundRepairWay'))
}
/**
@@ -159,11 +169,14 @@
}
/**
* 查看支付单信息
* @param paymentId
* 查看订单单信息
*/
function showPayment(paymentId) {
payOrderInfo.init(paymentId)
function showOrder(record: PayRepairRecord) {
if (record.repairType === 'pay') {
payOrderInfo.init(record.orderId)
} else {
refundOrderInfo.init(record.orderId)
}
}
</script>