Merge remote-tracking branch 'aliyun/dev' into dev

# Conflicts:
#	src/views/payment/record/callback/PayCallbackRecordList.vue
This commit is contained in:
bootx
2024-05-04 23:06:48 +08:00
29 changed files with 161 additions and 1287 deletions

View File

@@ -1,7 +1,7 @@
/**
* 支付状态
*/
export enum PayStatus {
export enum payStatus {
/** 支付中 */
PROGRESS = 'progress',

View File

@@ -0,0 +1,4 @@
/**
* 对账结果枚举
*/
export enum ReconcileResult {}

View File

@@ -1,43 +0,0 @@
import { defHttp } from '/@/utils/http/axios'
import { Result, PageResult } from '/#/axios'
import { BaseEntity } from '/#/web'
/**
* 分页
*/
export function page(params) {
return defHttp.get<Result<PageResult<AlipayRecord>>>({
url: '/alipay/record/page',
params,
})
}
/**
* 获取详情
*/
export function get(id) {
return defHttp.get<Result<AlipayRecord>>({
url: '/alipay/record/findById',
params: { id },
})
}
/**
* 记录
*/
export interface AlipayRecord extends BaseEntity {
// 标题
title?: string
// 业务类型
type?: string
// 金额
amount?: string
// 交易订单号
orderId?: string
// 交易订单号
gatewayOrderNo?: string
// 终端ip
ip?: string
// 网关时间
gatewayTime?: string
}

View File

@@ -1,90 +0,0 @@
<template>
<basic-modal
title="查看"
v-bind="$attrs"
:loading="confirmLoading"
:width="modalWidth"
:visible="visible"
:mask-closable="showable"
@cancel="handleCancel"
>
<a-spin :spinning="confirmLoading">
<a-descriptions bordered title="" :column="{ md: 1, sm: 1, xs: 1 }">
<a-descriptions-item label="标题">
{{ alipayRecord.title }}
</a-descriptions-item>
<a-descriptions-item label="金额(分)">
{{ alipayRecord.amount }}
</a-descriptions-item>
<a-descriptions-item label="本地订单号">
{{ alipayRecord.orderId }}
</a-descriptions-item>
<a-descriptions-item label="网关订单号">
{{ alipayRecord.gatewayOrderNo }}
</a-descriptions-item>
<a-descriptions-item label="业务类型">
<a-tag>{{ dictConvert('AlipayRecordType', alipayRecord.type) }}</a-tag>
</a-descriptions-item>
<a-descriptions-item label="网关时间">
{{ alipayRecord.gatewayTime }}
</a-descriptions-item>
<a-descriptions-item label="记录时间">
{{ alipayRecord.createTime }}
</a-descriptions-item>
</a-descriptions>
</a-spin>
<template #footer>
<a-button key="cancel" @click="handleCancel">取消</a-button>
</template>
</basic-modal>
</template>
<script setup lang="ts">
import { get, AlipayRecord } from './AlipayRecord.api'
import { $ref } from 'vue/macros'
import { BasicModal } from '/@/components/Modal'
import useFormEdit from '/@/hooks/bootx/useFormEdit'
import { useDict } from '/@/hooks/bootx/useDict'
const {
initFormEditType,
handleCancel,
search,
labelCol,
wrapperCol,
modalWidth,
title,
confirmLoading,
visible,
editable,
showable,
formEditType,
} = useFormEdit()
const { dictConvert } = useDict()
let loading = $ref(false)
let alipayRecord = $ref<AlipayRecord>({})
/**
* 入口
*/
function init(record: AlipayRecord) {
visible.value = true
alipayRecord = record
initData(record.id as string)
}
/**
* 初始化数据
*/
async function initData(alipayId) {
loading = true
const { data } = await get(alipayId)
loading = false
alipayRecord = data
}
defineExpose({ init })
</script>
<style scoped lang="less"></style>

View File

@@ -1,123 +0,0 @@
<template>
<div>
<div class="m-3 p-3 pt-5 bg-white">
<b-query :query-params="model.queryParam" :fields="fields" :default-item-count="3" @query="queryPage" @reset="resetQueryParams" />
</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"
:sort-config="{ remote: true, trigger: 'cell' }"
@sort-change="sortChange"
>
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="title" title="标题" />
<vxe-column field="type" title="类型">
<template #default="{ row }">
<a-tag>{{ dictConvert('AlipayRecordType', row.type) }}</a-tag>
</template>
</vxe-column>
<vxe-column field="amount" title="金额" />
<vxe-column field="orderId" title="本地订单ID" width="170" />
<vxe-column field="gatewayOrderNo" title="网关订单号" width="170" />
<vxe-column field="gatewayTime" title="网关时间" sortable />
<vxe-column fixed="right" width="50" :showOverflow="false" title="操作">
<template #default="{ row }">
<a-link @click="show(row)">查看</a-link>
</template>
</vxe-column>
</vxe-table>
<vxe-pager
size="medium"
:loading="loading"
:current-page="pagination.current"
:page-size="pagination.size"
:total="pagination.total"
@page-change="handleTableChange"
/>
<alipay-record-info ref="alipayRecordInfo" />
</div>
</div>
</template>
<script setup lang="ts">
import { computed, onMounted } from 'vue'
import { $ref } from 'vue/macros'
import { page } from './AlipayRecord.api'
import useTablePage from '/@/hooks/bootx/useTablePage'
import { VxeTable, VxeTableInstance, VxeToolbarInstance } from 'vxe-table'
import { useMessage } from '/@/hooks/web/useMessage'
import { useDict } from '/@/hooks/bootx/useDict'
import AlipayRecordInfo from './AlipayRecordInfo.vue'
import ALink from '/@/components/Link/Link.vue'
import BQuery from '/@/components/Bootx/Query/BQuery.vue'
import { LIST, QueryField, STRING } from '/@/components/Bootx/Query/Query'
import { LabeledValue } from 'ant-design-vue/lib/select'
// 使用hooks
const { handleTableChange, pageQueryResHandel, resetQueryParams, pagination, sortChange, sortParam, pages, model, loading } =
useTablePage(queryPage)
const { notification, createMessage, createConfirm } = useMessage()
const { dictConvert, dictDropDown } = useDict()
const alipayRecordInfo = $ref<any>()
const xTable = $ref<VxeTableInstance>()
const xToolbar = $ref<VxeToolbarInstance>()
let recordTypeList = $ref<LabeledValue[]>([])
const fields = computed(() => {
return [
{ field: 'title', type: STRING, name: '标题', placeholder: '请输入标题' },
{ field: 'orderId', type: STRING, name: '本地订单ID', placeholder: '请输入完整本地订单ID' },
{ field: 'type', type: LIST, name: '记录类型', placeholder: '请选择记录类型', selectList: recordTypeList },
{ field: 'gatewayOrderNo', type: STRING, name: '网关订单号', placeholder: '请输入完整网关订单号' },
] as QueryField[]
})
onMounted(() => {
vxeBind()
initData()
queryPage()
})
/**
* 绑定
*/
function vxeBind() {
xTable?.connect(xToolbar as VxeToolbarInstance)
}
/**
* 初始化数据
*/
async function initData() {
recordTypeList = await dictDropDown('AlipayRecordType')
}
/**
* 查看
*/
function show(record) {
alipayRecordInfo.init(record)
}
/**
* 分页查询
*/
function queryPage() {
loading.value = true
page({
...model.queryParam,
...pages,
...sortParam,
}).then(({ data }) => {
pageQueryResHandel(data)
})
return Promise.resolve()
}
</script>
<style scoped lang="less"></style>

View File

@@ -1,43 +0,0 @@
import { defHttp } from '/@/utils/http/axios'
import { Result, PageResult } from '/#/axios'
import { BaseEntity } from '/#/web'
/**
* 分页
*/
export function page(params) {
return defHttp.get<Result<PageResult<UnionPayRecord>>>({
url: '/union/pay/record/page',
params,
})
}
/**
* 获取详情
*/
export function get(id) {
return defHttp.get<Result<UnionPayRecord>>({
url: '/union/pay/record/findById',
params: { id },
})
}
/**
* 记录
*/
export interface UnionPayRecord extends BaseEntity {
// 标题
title?: string
// 业务类型
type?: string
// 金额
amount?: string
// 交易订单号
orderId?: string
// 交易订单号
gatewayOrderNo?: string
// 终端ip
ip?: string
// 网关时间
gatewayTime?: string
}

View File

@@ -1,90 +0,0 @@
<template>
<basic-modal
title="查看"
v-bind="$attrs"
:loading="confirmLoading"
:width="modalWidth"
:visible="visible"
:mask-closable="showable"
@cancel="handleCancel"
>
<a-spin :spinning="confirmLoading">
<a-descriptions bordered title="" :column="{ md: 1, sm: 1, xs: 1 }">
<a-descriptions-item label="标题">
{{ unionPayRecord.title }}
</a-descriptions-item>
<a-descriptions-item label="金额(分)">
{{ unionPayRecord.amount }}
</a-descriptions-item>
<a-descriptions-item label="本地订单号">
{{ unionPayRecord.orderId }}
</a-descriptions-item>
<a-descriptions-item label="网关订单号">
{{ unionPayRecord.gatewayOrderNo }}
</a-descriptions-item>
<a-descriptions-item label="业务类型">
<a-tag>{{ dictConvert('UnionPayRecordType', unionPayRecord.type) }}</a-tag>
</a-descriptions-item>
<a-descriptions-item label="网关时间">
{{ unionPayRecord.gatewayTime }}
</a-descriptions-item>
<a-descriptions-item label="记录时间">
{{ unionPayRecord.createTime }}
</a-descriptions-item>
</a-descriptions>
</a-spin>
<template #footer>
<a-button key="cancel" @click="handleCancel">取消</a-button>
</template>
</basic-modal>
</template>
<script setup lang="ts">
import { get, UnionPayRecord } from './UnionPayRecord.api'
import { $ref } from 'vue/macros'
import { BasicModal } from '/@/components/Modal'
import useFormEdit from '/@/hooks/bootx/useFormEdit'
import { useDict } from '/@/hooks/bootx/useDict'
const {
initFormEditType,
handleCancel,
search,
labelCol,
wrapperCol,
modalWidth,
title,
confirmLoading,
visible,
editable,
showable,
formEditType,
} = useFormEdit()
const { dictConvert } = useDict()
let loading = $ref(false)
let unionPayRecord = $ref<UnionPayRecord>({})
/**
* 入口
*/
function init(record: UnionPayRecord) {
visible.value = true
unionPayRecord = record
initData(record.id as string)
}
/**
* 初始化数据
*/
async function initData(alipayId) {
loading = true
const { data } = await get(alipayId)
loading = false
unionPayRecord = data
}
defineExpose({ init })
</script>
<style scoped lang="less"></style>

View File

@@ -1,121 +0,0 @@
<template>
<div>
<div class="m-3 p-3 pt-5 bg-white">
<b-query :query-params="model.queryParam" :fields="fields" :default-item-count="3" @query="queryPage" @reset="resetQueryParams" />
</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"
:sort-config="{ remote: true, trigger: 'cell' }"
@sort-change="sortChange"
>
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="title" title="标题" />
<vxe-column field="type" title="类型">
<template #default="{ row }">
<a-tag>{{ dictConvert('UnionPayRecordType', row.type) }}</a-tag>
</template>
</vxe-column>
<vxe-column field="amount" title="金额" />
<vxe-column field="orderId" title="本地订单ID" width="170" />
<vxe-column field="gatewayOrderNo" title="网关订单号" width="170" />
<vxe-column field="gatewayTime" title="网关时间" sortable />
<vxe-column fixed="right" width="50" :showOverflow="false" title="操作">
<template #default="{ row }">
<a-link @click="show(row)">查看</a-link>
</template>
</vxe-column>
</vxe-table>
<vxe-pager
size="medium"
:loading="loading"
:current-page="pagination.current"
:page-size="pagination.size"
:total="pagination.total"
@page-change="handleTableChange"
/>
<union-pay-record-info ref="unionPayRecordInfo" />
</div>
</div>
</template>
<script setup lang="ts">
import { onMounted } from 'vue'
import { $ref } from 'vue/macros'
import { page } from './UnionPayRecord.api'
import useTablePage from '/@/hooks/bootx/useTablePage'
import { VxeTable, VxeTableInstance, VxeToolbarInstance } from 'vxe-table'
import { useMessage } from '/@/hooks/web/useMessage'
import { useDict } from '/@/hooks/bootx/useDict'
import ALink from '/@/components/Link/Link.vue'
import BQuery from '/@/components/Bootx/Query/BQuery.vue'
import { LIST, STRING } from '/@/components/Bootx/Query/Query'
import UnionPayRecordInfo from './UnionPayRecordInfo.vue'
import { LabeledValue } from 'ant-design-vue/lib/select'
// 使用hooks
const { handleTableChange, pageQueryResHandel, resetQueryParams, pagination, sortChange, sortParam, pages, model, loading } =
useTablePage(queryPage)
const { notification, createMessage, createConfirm } = useMessage()
const { dictConvert, dictDropDown } = useDict()
let unionPayRecordInfo = $ref<any>()
const xTable = $ref<VxeTableInstance>()
const xToolbar = $ref<VxeToolbarInstance>()
let recordTypeList = $ref<LabeledValue[]>([])
const fields = [
{ field: 'title', type: STRING, name: '标题', placeholder: '请输入标题' },
{ field: 'orderId', type: STRING, name: '本地订单ID', placeholder: '请输入完整本地订单ID' },
{ field: 'type', type: LIST, name: '记录类型', placeholder: '请选择记录类型', selectList: recordTypeList },
{ field: 'gatewayOrderNo', type: STRING, name: '网关订单号', placeholder: '请输入完整网关订单号' },
]
onMounted(() => {
vxeBind()
initData()
queryPage()
})
/**
* 绑定
*/
function vxeBind() {
xTable?.connect(xToolbar as VxeToolbarInstance)
}
/**
* 初始化数据
*/
async function initData() {
recordTypeList = await dictDropDown('UnionPayRecordType')
}
/**
* 查看
*/
function show(record) {
unionPayRecordInfo.init(record)
}
/**
* 分页查询
*/
function queryPage() {
loading.value = true
page({
...model.queryParam,
...pages,
...sortParam,
}).then(({ data }) => {
pageQueryResHandel(data)
})
return Promise.resolve()
}
</script>
<style scoped lang="less"></style>

View File

@@ -1,45 +0,0 @@
import { defHttp } from '/@/utils/http/axios'
import { Result, PageResult } from '/#/axios'
import { BaseEntity } from '/#/web'
/**
* 分页
*/
export function page(params) {
return defHttp.get<Result<PageResult<WalletRecord>>>({
url: '/wallet/record/page',
params,
})
}
/**
* 获取详情
*/
export function get(id) {
return defHttp.get<Result<WalletRecord>>({
url: '/wallet/record/findById',
params: { id },
})
}
/**
* 钱包记录
*/
export interface WalletRecord extends BaseEntity {
// 钱包id
walletId?: string
// 标题
title?: string
// 业务类型
type?: string
// 金额
amount?: string
// 变动之前的金额
oldAmount?: string
// 变动之后的金额
newAmount?: string
// 交易订单号
orderId?: string
// 终端ip
ip?: string
}

View File

@@ -1,90 +0,0 @@
<template>
<basic-modal
title="查看"
v-bind="$attrs"
:loading="confirmLoading"
:width="modalWidth"
:visible="visible"
:mask-closable="showable"
@cancel="handleCancel"
>
<a-spin :spinning="confirmLoading">
<a-descriptions bordered title="" :column="{ md: 1, sm: 1, xs: 1 }">
<a-descriptions-item label="标题">
{{ walletRecord.title }}
</a-descriptions-item>
<a-descriptions-item label="金额(分)">
{{ walletRecord.amount }}
</a-descriptions-item>
<a-descriptions-item label="变动前金额(分)">
{{ walletRecord.oldAmount }}
</a-descriptions-item>
<a-descriptions-item label="变动后金额(分)">
{{ walletRecord.newAmount }}
</a-descriptions-item>
<a-descriptions-item label="交易订单号">
{{ walletRecord.orderId }}
</a-descriptions-item>
<a-descriptions-item label="业务类型">
<a-tag>{{ dictConvert('WalletRecordType', walletRecord.type) }}</a-tag>
</a-descriptions-item>
<a-descriptions-item label="记录时间">
{{ walletRecord.createTime }}
</a-descriptions-item>
</a-descriptions>
</a-spin>
<template #footer>
<a-button key="cancel" @click="handleCancel">取消</a-button>
</template>
</basic-modal>
</template>
<script setup lang="ts">
import { get, WalletRecord } from './WalletRecord.api'
import { $ref } from 'vue/macros'
import { BasicModal } from '/@/components/Modal'
import useFormEdit from '/@/hooks/bootx/useFormEdit'
import { useDict } from '/@/hooks/bootx/useDict'
const {
initFormEditType,
handleCancel,
search,
labelCol,
wrapperCol,
modalWidth,
title,
confirmLoading,
visible,
editable,
showable,
formEditType,
} = useFormEdit()
const { dictConvert } = useDict()
let loading = $ref(false)
let walletRecord = $ref<WalletRecord>({})
/**
* 入口
*/
function init(record: WalletRecord) {
visible.value = true
walletRecord = record
initData(record.id as string)
}
/**
* 初始化数据
*/
async function initData(walletId) {
loading = true
const { data } = await get(walletId)
loading = false
walletRecord = data
}
defineExpose({ init })
</script>
<style scoped lang="less"></style>

View File

@@ -1,130 +0,0 @@
<template>
<basic-drawer forceRender v-bind="$attrs" title="钱包记录" width="60%" :visible="visible" @close="visible = false">
<vxe-toolbar ref="xToolbar" custom :refresh="{ queryMethod: queryPage }" />
<vxe-table
row-id="id"
ref="xTable"
:data="pagination.records"
:cell-style="cellStyle"
:loading="loading"
:sort-config="{ remote: true, trigger: 'cell' }"
@sort-change="sortChange"
>
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="title" title="标题" />
<vxe-column field="type" title="类型">
<template #default="{ row }">
{{ dictConvert('WalletRecordType', row.type) }}
</template>
</vxe-column>
<vxe-column field="amount" title="金额" />
<vxe-column field="orderId" title="订单号" />
<vxe-column field="createTime" title="记录时间" sortable />
<vxe-column fixed="right" width="50" :showOverflow="false" title="操作">
<template #default="{ row }">
<a-link @click="show(row)">查看</a-link>
</template>
</vxe-column>
</vxe-table>
<vxe-pager
size="medium"
:loading="loading"
:current-page="pagination.current"
:page-size="pagination.size"
:total="pagination.total"
@page-change="handleTableChange"
/>
<wallet-record-info ref="walletRecordInfo" />
</basic-drawer>
</template>
<script setup lang="ts">
import { computed, onMounted } from 'vue'
import { $ref } from 'vue/macros'
import { page, WalletRecord } from './WalletRecord.api'
import useTablePage from '/@/hooks/bootx/useTablePage'
import { VxeTable, VxeTableInstance, VxeToolbarInstance } from 'vxe-table'
import { useMessage } from '/@/hooks/web/useMessage'
import { useDict } from '/@/hooks/bootx/useDict'
import { Wallet } from '/@/views/payment/channel/wallet/manager/Wallet.api'
import BasicDrawer from '/@/components/Drawer/src/BasicDrawer.vue'
import WalletRecordInfo from './WalletRecordInfo.vue'
import ALink from "/@/components/Link/Link.vue";
// 使用hooks
const { handleTableChange, pageQueryResHandel, resetQueryParams, pagination, sortChange, sortParam, pages, model, loading } =
useTablePage(queryPage)
const { notification, createMessage, createConfirm } = useMessage()
const { dictConvert, dictDropDown } = useDict()
let visible = $ref<boolean>(false)
let wallet = $ref<Wallet>({})
let walletRecordInfo = $ref<any>()
const xTable = $ref<VxeTableInstance>()
const xToolbar = $ref<VxeToolbarInstance>()
onMounted(() => {
vxeBind()
})
/**
* 绑定
*/
function vxeBind() {
xTable?.connect(xToolbar as VxeToolbarInstance)
}
/**
* 初始化
*/
function init(record: Wallet) {
visible = true
wallet = record
queryPage()
}
/**
* 查看
*/
function show(record) {
walletRecordInfo.init(record)
}
/**
* 分页查询
*/
function queryPage() {
loading.value = true
page({
...model.queryParam,
...pages,
...sortParam,
walletId: wallet.id,
}).then(({ data }) => {
pageQueryResHandel(data)
})
return Promise.resolve()
}
function cellStyle({ row, column }) {
if (column.field == 'type') {
if (row.status == 'success') {
return { color: 'green' }
}
if (row.status == 'fail') {
return { color: 'red' }
}
if (row.status == 'progress') {
return { color: 'orange' }
}
if (row.status == 'close') {
return { color: 'gray' }
}
return { color: 'red' }
}
}
defineExpose({ init })
</script>
<style scoped lang="less"></style>

View File

@@ -1,43 +0,0 @@
import { defHttp } from '/@/utils/http/axios'
import { Result, PageResult } from '/#/axios'
import { BaseEntity } from '/#/web'
/**
* 分页
*/
export function page(params) {
return defHttp.get<Result<PageResult<WechatPayRecord>>>({
url: '/wechat/pay/record/page',
params,
})
}
/**
* 获取详情
*/
export function get(id) {
return defHttp.get<Result<WechatPayRecord>>({
url: '/wechat/pay/record/findById',
params: { id },
})
}
/**
* 记录
*/
export interface WechatPayRecord extends BaseEntity {
// 标题
title?: string
// 业务类型
type?: string
// 金额
amount?: string
// 交易订单号
orderId?: string
// 交易订单号
gatewayOrderNo?: string
// 终端ip
ip?: string
// 网关时间
gatewayTime?: string
}

View File

@@ -1,90 +0,0 @@
<template>
<basic-modal
title="查看"
v-bind="$attrs"
:loading="confirmLoading"
:width="modalWidth"
:visible="visible"
:mask-closable="showable"
@cancel="handleCancel"
>
<a-spin :spinning="confirmLoading">
<a-descriptions bordered title="" :column="{ md: 1, sm: 1, xs: 1 }">
<a-descriptions-item label="标题">
{{ wechatPayRecord.title }}
</a-descriptions-item>
<a-descriptions-item label="金额(分)">
{{ wechatPayRecord.amount }}
</a-descriptions-item>
<a-descriptions-item label="本地订单号">
{{ wechatPayRecord.orderId }}
</a-descriptions-item>
<a-descriptions-item label="网关订单号">
{{ wechatPayRecord.gatewayOrderNo }}
</a-descriptions-item>
<a-descriptions-item label="业务类型">
<a-tag>{{ dictConvert('WechatPayRecordType', wechatPayRecord.type) }}</a-tag>
</a-descriptions-item>
<a-descriptions-item label="网关时间">
{{ wechatPayRecord.gatewayTime }}
</a-descriptions-item>
<a-descriptions-item label="记录时间">
{{ wechatPayRecord.createTime }}
</a-descriptions-item>
</a-descriptions>
</a-spin>
<template #footer>
<a-button key="cancel" @click="handleCancel">取消</a-button>
</template>
</basic-modal>
</template>
<script setup lang="ts">
import { get, WechatPayRecord } from './WechatPayRecord.api'
import { $ref } from 'vue/macros'
import { BasicModal } from '/@/components/Modal'
import useFormEdit from '/@/hooks/bootx/useFormEdit'
import { useDict } from '/@/hooks/bootx/useDict'
const {
initFormEditType,
handleCancel,
search,
labelCol,
wrapperCol,
modalWidth,
title,
confirmLoading,
visible,
editable,
showable,
formEditType,
} = useFormEdit()
const { dictConvert } = useDict()
let loading = $ref(false)
let wechatPayRecord = $ref<WechatPayRecord>({})
/**
* 入口
*/
function init(record: WechatPayRecord) {
visible.value = true
wechatPayRecord = record
initData(record.id as string)
}
/**
* 初始化数据
*/
async function initData(wechatPayId) {
loading = true
const { data } = await get(wechatPayId)
loading = false
wechatPayRecord = data
}
defineExpose({ init })
</script>
<style scoped lang="less"></style>

View File

@@ -1,122 +0,0 @@
<template>
<div>
<div class="m-3 p-3 pt-5 bg-white">
<b-query :query-params="model.queryParam" :fields="fields" :default-item-count="3" @query="queryPage" @reset="resetQueryParams" />
</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"
:sort-config="{ remote: true, trigger: 'cell' }"
@sort-change="sortChange"
>
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="title" title="标题" />
<vxe-column field="type" title="类型">
<template #default="{ row }">
<a-tag>{{ dictConvert('WechatPayRecordType', row.type) }}</a-tag>
</template>
</vxe-column>
<vxe-column field="amount" title="金额" />
<vxe-column field="orderId" title="本地订单ID" width="170" />
<vxe-column field="gatewayOrderNo" title="网关订单号" width="170" />
<vxe-column field="gatewayTime" title="网关时间" sortable />
<vxe-column fixed="right" width="50" :showOverflow="false" title="操作">
<template #default="{ row }">
<a-link @click="show(row)">查看</a-link>
</template>
</vxe-column>
</vxe-table>
<vxe-pager
size="medium"
:loading="loading"
:current-page="pagination.current"
:page-size="pagination.size"
:total="pagination.total"
@page-change="handleTableChange"
/>
<wechatPay-record-info ref="wechatPayRecordInfo" />
</div>
</div>
</template>
<script setup lang="ts">
import { computed, onMounted } from 'vue'
import { $ref } from 'vue/macros'
import { page } from './WechatPayRecord.api'
import useTablePage from '/@/hooks/bootx/useTablePage'
import { VxeTable, VxeTableInstance, VxeToolbarInstance } from 'vxe-table'
import { useMessage } from '/@/hooks/web/useMessage'
import { useDict } from '/@/hooks/bootx/useDict'
import WechatPayRecordInfo from './WechatPayRecordInfo.vue'
import ALink from '/@/components/Link/Link.vue'
import BQuery from '/@/components/Bootx/Query/BQuery.vue'
import { LIST, QueryField, STRING } from '/@/components/Bootx/Query/Query'
import { LabeledValue } from 'ant-design-vue/lib/select'
// 使用hooks
const { handleTableChange, pageQueryResHandel, resetQueryParams, pagination, sortChange, sortParam, pages, model, loading } =
useTablePage(queryPage)
const { notification, createMessage, createConfirm } = useMessage()
const { dictConvert, dictDropDown } = useDict()
const xTable = $ref<VxeTableInstance>()
const xToolbar = $ref<VxeToolbarInstance>()
const wechatPayRecordInfo = $ref<any>()
let recordTypeList = $ref<LabeledValue[]>([])
const fields = computed(() => {
return [
{ field: 'title', type: STRING, name: '标题', placeholder: '请输入标题' },
{ field: 'orderId', type: STRING, name: '本地订单ID', placeholder: '请输入完整本地订单ID' },
{ field: 'type', type: LIST, name: '记录类型', placeholder: '请选择记录类型', selectList: recordTypeList },
{ field: 'gatewayOrderNo', type: STRING, name: '网关订单号', placeholder: '请输入完整网关订单号' },
] as QueryField[]
})
onMounted(() => {
vxeBind()
initData()
queryPage()
})
/**
* 绑定
*/
function vxeBind() {
xTable?.connect(xToolbar as VxeToolbarInstance)
}
/**
* 初始化数据
*/
async function initData() {
recordTypeList = await dictDropDown('WechatPayRecordType')
}
/**
* 查看
*/
function show(record) {
wechatPayRecordInfo.init(record)
}
/**
* 分页查询
*/
function queryPage() {
loading.value = true
page({
...model.queryParam,
...pages,
...sortParam,
}).then(({ data }) => {
pageQueryResHandel(data)
})
return Promise.resolve()
}
</script>
<style scoped lang="less"></style>

View File

@@ -58,13 +58,13 @@
<a-menu-item>
<a-link @click="sync(row)">同步</a-link>
</a-menu-item>
<a-menu-item v-if="[PayStatus.PROGRESS].includes(row.status)">
<a-menu-item v-if="[payStatus.PROGRESS].includes(row.status)">
<a-link @click="closeOrder(row)" danger>关闭</a-link>
</a-menu-item>
<a-menu-item v-if="row.allocationStatus === 'waiting'">
<a-link @click="allocation(row)">分账</a-link>
</a-menu-item>
<a-menu-item v-if="[PayStatus.SUCCESS, PayStatus.PARTIAL_REFUND].includes(row.status) && row.refundableBalance > 0">
<a-menu-item v-if="[payStatus.SUCCESS, payStatus.PARTIAL_REFUND].includes(row.status) && row.refundableBalance > 0">
<a-link @click="refund(row)" danger>退款</a-link>
</a-menu-item>
</a-menu>
@@ -100,7 +100,7 @@
import { useDict } from '/@/hooks/bootx/useDict'
import { VxeTableInstance, VxeToolbarInstance, VxePager, VxeTable, VxeToolbar } from 'vxe-table'
import ALink from '/@/components/Link/Link.vue'
import { PayStatus } from '/@/enums/payment/PayStatus'
import { payStatus } from '/@/enums/payment/PayStatus'
import { LabeledValue } from 'ant-design-vue/lib/select'
// 使用hooks

View File

@@ -34,7 +34,7 @@ export interface ReconcileDetail extends BaseEntity {
paymentId?: string
// 订单id
refundId?: string
// 网关订单号
// 外部订单号
gatewayOrderNo?: string
// 交易金额
amount?: string

View File

@@ -18,7 +18,7 @@
<a-descriptions-item label="本地订单ID">
{{ form.orderId }}
</a-descriptions-item>
<a-descriptions-item label="网关订单号">
<a-descriptions-item label="外部订单号">
{{ form.gatewayOrderNo }}
</a-descriptions-item>
<a-descriptions-item label="交易类型">

View File

@@ -12,9 +12,11 @@
>
<vxe-column type="seq" width="60" />
<vxe-column field="title" title="订单名称" />
<vxe-column field="amount" title="交易金额" />
<vxe-column field="amount" title="交易金额">
<template #default="{ row }"> {{ row.amount ? (row.amount / 100).toFixed(2) : 0 }} </template>
</vxe-column>
<vxe-column field="orderId" title="本地订单ID" />
<vxe-column field="gatewayOrderNo" title="网关订单号" />
<vxe-column field="gatewayOrderNo" title="外部订单号" />
<vxe-column field="repairType" title="交易类型">
<template #default="{ row }">
<a-tag>{{ dictConvert('ReconcileTrade', row.type) }}</a-tag>
@@ -70,7 +72,7 @@
{ field: 'title', type: STRING, name: '订单名称', placeholder: '请输入订单名称' },
{ field: 'type', type: LIST, name: '交易类型', placeholder: '请选择交易类型', selectList: reconcileTradeList },
{ field: 'orderId', type: STRING, name: '本地订单', placeholder: '请输入本地订单ID' },
{ field: 'gatewayOrderNo', type: STRING, name: '网关订单号', placeholder: '请输入网关订单号' },
{ field: 'gatewayOrderNo', type: STRING, name: '外部订单号', placeholder: '请输入外部订单号' },
] as QueryField[]
})
let visible = $ref(false)

View File

@@ -34,7 +34,7 @@ export interface ReconcileRecord extends BaseEntity {
paymentId?: string
// 订单id
refundId?: string
// 网关订单号
// 外部订单号
gatewayOrderNo?: string
// 交易金额
amount?: string

View File

@@ -24,7 +24,7 @@
<a-descriptions-item label="本地订单ID">
{{ form.orderId }}
</a-descriptions-item>
<a-descriptions-item v-if="form.gatewayOrderNo" label="网关订单号">
<a-descriptions-item v-if="form.gatewayOrderNo" label="外部订单号">
{{ form.gatewayOrderNo }}
</a-descriptions-item>
<a-descriptions-item label="订单类型">

View File

@@ -1,97 +1,119 @@
<template>
<div>
<div class="m-3 p-3 pt-5 bg-white">
<b-query :query-params="model.queryParam" :default-item-count="3" :fields="fields" @query="queryPage" @reset="resetQueryParams" />
</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"
:sort-config="{ remote: true, trigger: 'cell' }"
@sort-change="sortChange"
>
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="title" title="订单标题" />
<vxe-column field="orderType" title="订单类型">
<template #default="{ row }">
<a-tag>{{ dictConvert('ReconcileTrade', row.orderType) }}</a-tag>
</template>
</vxe-column>
<vxe-column field="diffType" title="差异类型">
<template #default="{ row }">
<a-tag>{{ dictConvert('ReconcileDiffType', row.diffType) }}</a-tag>
</template>
</vxe-column>
<vxe-column field="orderId" title="本地订单" />
<vxe-column field="gatewayOrderNo" title="网关订单" />
<vxe-column field="amount" title="交易金额" />
<vxe-column field="orderTime" title="订单时间" />
<vxe-column fixed="right" width="80" :showOverflow="false" title="操作">
<template #default="{ row }">
<a-link @click="show(row)">查看</a-link>
</template>
</vxe-column>
</vxe-table>
<vxe-pager
size="medium"
:loading="loading"
:current-page="pagination.current"
:page-size="pagination.size"
:total="pagination.total"
@page-change="handleTableChange"
/>
<reconcile-diff-info ref="reconcileDiffInfo" />
</div>
</div>
<basic-drawer forceRender v-bind="$attrs" title="差异明细" width="60%" :visible="visible" @close="visible = false">
<b-query :query-params="model.queryParam" :default-item-count="3" :fields="fields" @query="queryPage" @reset="resetQueryParams" />
<vxe-toolbar ref="xToolbar" custom :refresh="{ queryMethod: queryPage }" />
<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="title" title="订单标题" min-width="120" />
<vxe-column field="orderType" title="订单类型" min-width="120">
<template #default="{ row }">
<a-tag>{{ dictConvert('ReconcileTrade', row.orderType) }}</a-tag>
</template>
</vxe-column>
<vxe-column field="diffType" title="差异类型" min-width="120">
<template #default="{ row }">
<a-tag>{{ dictConvert('ReconcileDiffType', row.diffType) }}</a-tag>
</template>
</vxe-column>
<vxe-column field="tradeNo" title="交易号" min-width="120" />
<vxe-column field="outOrderNo" title="外部交易号" min-width="170" />
<vxe-column field="amount" title="交易金额" sortable min-width="120">
<template #default="{ row }"> {{ row.amount ? (row.amount / 100).toFixed(2) : 0 }} </template>
</vxe-column>
<vxe-column field="outAmount" title="外部交易金额" sortable min-width="120">
<template #default="{ row }"> {{ row.outAmount ? (row.outAmount / 100).toFixed(2) : 0 }} </template>
</vxe-column>
<vxe-column field="tradeTime" title="交易时间" sortable min-width="150" />
<vxe-column fixed="right" width="100" :showOverflow="false" title="操作">
<template #default="{ row }">
<a-link @click="show(row)">查看</a-link>
</template>
</vxe-column>
</vxe-table>
<vxe-pager
size="medium"
:loading="loading"
:current-page="pagination.current"
:page-size="pagination.size"
:total="pagination.total"
@page-change="handleTableChange"
/>
<reconcile-diff-info ref="reconcileDiffInfo" />
</basic-drawer>
</template>
<script setup lang="ts">
import BQuery from '/@/components/Bootx/Query/BQuery.vue'
import useTablePage from '/@/hooks/bootx/useTablePage'
import { useMessage } from '/@/hooks/web/useMessage'
import { useDict } from '/@/hooks/bootx/useDict'
import { LabeledValue } from 'ant-design-vue/lib/select'
import { computed, onMounted } from 'vue'
import { DATE, LIST, QueryField, STRING } from '/@/components/Bootx/Query/Query'
import { VxeTable, VxeTableInstance, VxeToolbarInstance } from 'vxe-table'
import { computed, nextTick, onMounted } from 'vue'
import { $ref } from 'vue/macros'
import { page } from './ReconcileDiff.api'
import useTablePage from '/@/hooks/bootx/useTablePage'
import ReconcileDiffInfo from './ReconcileDiffInfo.vue'
import { VxeTable, VxeTableInstance, VxeToolbarInstance } from 'vxe-table'
import { useMessage } from '/@/hooks/web/useMessage'
import { LIST, QueryField, STRING } from '/@/components/Bootx/Query/Query'
import BasicDrawer from '/@/components/Drawer/src/BasicDrawer.vue'
import BQuery from '/@/components/Bootx/Query/BQuery.vue'
import { LabeledValue } from 'ant-design-vue/lib/select'
import { useDict } from '/@/hooks/bootx/useDict'
import { ReconcileDetail } from '/@/views/payment/order/reconcile/detail/ReconcileDetail.api'
// 使用hooks
const { handleTableChange, pageQueryResHandel, resetQueryParams, sortChange, sortParam, pagination, pages, model, loading } =
const { handleTableChange, pageQueryResHandel, resetQueryParams, sortChange, pagination, pages, sortParam, model, loading } =
useTablePage(queryPage)
const { notification, createMessage, createConfirm } = useMessage()
const { dictConvert, dictDropDown } = useDict()
const { notification, createMessage } = useMessage()
const { dictDropDown, dictConvert } = useDict()
let payChannelList = $ref<LabeledValue[]>([])
let orderTypeList = $ref<LabeledValue[]>([])
let diffTypeList = $ref<LabeledValue[]>([])
// 查询条件
const fields = computed(() => {
return [
{ field: 'title', type: DATE, name: '订单标题', placeholder: '请输入订单标题' },
{ field: 'title', type: STRING, name: '订单名称', placeholder: '请输入订单名称' },
{ field: 'orderType', type: LIST, name: '订单类型', placeholder: '请选择订单类型', selectList: orderTypeList },
{ field: 'diffType', type: LIST, name: '差异类型', placeholder: '请选择差异类型', selectList: diffTypeList },
{ field: 'orderId', type: STRING, name: '本地定单', placeholder: '请输入本地定单ID' },
{ field: 'gatewayOrderNo', type: STRING, name: '外部订单号', placeholder: '请输入外部订单号' },
] as QueryField[]
})
let visible = $ref(false)
let reconcileDetail = $ref<ReconcileDetail>()
const xTable = $ref<VxeTableInstance>()
const xToolbar = $ref<VxeToolbarInstance>()
const reconcileDiffInfo = $ref<any>()
nextTick(() => {
xTable?.connect(xToolbar as VxeToolbarInstance)
})
onMounted(() => {
initData()
vxeBind()
queryPage()
})
function vxeBind() {
xTable?.connect(xToolbar as VxeToolbarInstance)
}
/**
* 初始化数据
* 初始化基础数据
*/
async function initData() {
payChannelList = await dictDropDown('AsyncPayChannel')
orderTypeList = await dictDropDown('ReconcileTrade')
diffTypeList = await dictDropDown('ReconcileDiffType')
}
/**
* 入口
*/
function init(record: ReconcileDetail) {
visible = true
reconcileDetail = record
model.queryParam = {}
xTable?.clearSort()
queryPage()
}
/**
@@ -103,17 +125,20 @@
...model.queryParam,
...pages,
...sortParam,
reconcileId: reconcileDetail?.id,
}).then(({ data }) => {
pageQueryResHandel(data)
})
return Promise.resolve()
}
/**
* 查看详情
* 查看
*/
function show(record) {
reconcileDiffInfo.init(record)
}
defineExpose({
init,
})
</script>
<style scoped lang="less"></style>

View File

@@ -1,139 +0,0 @@
<template>
<basic-drawer forceRender v-bind="$attrs" title="差异明细列表" width="60%" :visible="visible" @close="visible = false">
<b-query :query-params="model.queryParam" :default-item-count="3" :fields="fields" @query="queryPage" @reset="resetQueryParams" />
<vxe-toolbar ref="xToolbar" custom :refresh="{ queryMethod: queryPage }" />
<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="title" title="订单标题" />
<vxe-column field="orderType" title="订单类型">
<template #default="{ row }">
<a-tag>{{ dictConvert('ReconcileTrade', row.orderType) }}</a-tag>
</template>
</vxe-column>
<vxe-column field="diffType" title="差异类型">
<template #default="{ row }">
<a-tag>{{ dictConvert('ReconcileDiffType', row.diffType) }}</a-tag>
</template>
</vxe-column>
<vxe-column field="orderId" title="本地订单" />
<vxe-column field="gatewayOrderNo" title="网关订单" />
<vxe-column field="amount" title="交易金额" sortable />
<vxe-column field="orderTime" title="订单时间" sortable />
<vxe-column fixed="right" width="80" :showOverflow="false" title="操作">
<template #default="{ row }">
<a-link @click="show(row)">查看</a-link>
</template>
</vxe-column>
</vxe-table>
<vxe-pager
size="medium"
:loading="loading"
:current-page="pagination.current"
:page-size="pagination.size"
:total="pagination.total"
@page-change="handleTableChange"
/>
<reconcile-diff-info ref="reconcileDiffInfo" />
</basic-drawer>
</template>
<script setup lang="ts">
import { computed, nextTick, onMounted } from 'vue'
import { $ref } from 'vue/macros'
import { page } from './ReconcileDiff.api'
import useTablePage from '/@/hooks/bootx/useTablePage'
import ReconcileDiffInfo from './ReconcileDiffInfo.vue'
import { VxeTable, VxeTableInstance, VxeToolbarInstance } from 'vxe-table'
import { useMessage } from '/@/hooks/web/useMessage'
import { LIST, QueryField, STRING } from '/@/components/Bootx/Query/Query'
import BasicDrawer from '/@/components/Drawer/src/BasicDrawer.vue'
import BQuery from '/@/components/Bootx/Query/BQuery.vue'
import { LabeledValue } from 'ant-design-vue/lib/select'
import { useDict } from '/@/hooks/bootx/useDict'
import { ReconcileDetail } from '/@/views/payment/order/reconcile/detail/ReconcileDetail.api'
// 使用hooks
const { handleTableChange, pageQueryResHandel, resetQueryParams, sortChange, pagination, pages, sortParam, model, loading } =
useTablePage(queryPage)
const { notification, createMessage } = useMessage()
const { dictDropDown, dictConvert } = useDict()
let orderTypeList = $ref<LabeledValue[]>([])
let diffTypeList = $ref<LabeledValue[]>([])
// 查询条件
const fields = computed(() => {
return [
{ field: 'title', type: STRING, name: '订单名称', placeholder: '请输入订单名称' },
{ field: 'orderType', type: LIST, name: '订单类型', placeholder: '请选择订单类型', selectList: orderTypeList },
{ field: 'diffType', type: LIST, name: '差异类型', placeholder: '请选择差异类型', selectList: diffTypeList },
{ field: 'orderId', type: STRING, name: '本地定单', placeholder: '请输入本地定单ID' },
{ field: 'gatewayOrderNo', type: STRING, name: '网关订单号', placeholder: '请输入网关订单号' },
] as QueryField[]
})
let visible = $ref(false)
let reconcileDetail = $ref<ReconcileDetail>()
const xTable = $ref<VxeTableInstance>()
const xToolbar = $ref<VxeToolbarInstance>()
const reconcileDiffInfo = $ref<any>()
nextTick(() => {
xTable?.connect(xToolbar as VxeToolbarInstance)
})
onMounted(() => {
initData()
})
/**
* 初始化基础数据
*/
async function initData() {
orderTypeList = await dictDropDown('ReconcileTrade')
diffTypeList = await dictDropDown('ReconcileDiffType')
}
/**
* 入口
*/
function init(record: ReconcileDetail) {
visible = true
reconcileDetail = record
model.queryParam = {}
xTable?.clearSort()
queryPage()
}
/**
* 分页查询
*/
function queryPage() {
loading.value = true
page({
...model.queryParam,
...pages,
...sortParam,
recordId: reconcileDetail?.id,
}).then(({ data }) => {
pageQueryResHandel(data)
})
}
/**
* 查看
*/
function show(record) {
reconcileDiffInfo.init(record)
}
defineExpose({
init,
})
</script>
<style scoped lang="less"></style>

View File

@@ -56,16 +56,20 @@ export function compare(id: any) {
* 支付对账订单
*/
export interface ReconcileOrder extends BaseEntity {
// 批次
batchNo?: string
// 对账
reconcileNo?: string
// 日期
date?: string
// 通道
channel?: string
// 是否下载成功
down?: boolean
downOrUpload?: boolean
// 是否比对完成
compare?: boolean
// 比对结果
result?: string
// 错误码
errorCode?: string
// 错误信息
errorMsg?: string
}

View File

@@ -12,23 +12,29 @@
<a-descriptions-item label="日期">
{{ form.date }}
</a-descriptions-item>
<a-descriptions-item label="批次号">
{{ form.batchNo }}
<a-descriptions-item label="对账号">
{{ form.reconcileNo }}
</a-descriptions-item>
<a-descriptions-item label="支付通道">
<a-tag>{{ dictConvert('PayChannel', form.channel) }}</a-tag>
</a-descriptions-item>
<a-descriptions-item label="对账单下载/上传">
<a-tag v-if="form?.down" color="green">完成下载/上传</a-tag>
<a-tag v-if="form?.downOrUpload" color="green">完成下载/上传</a-tag>
<a-tag v-else color="red">未下载/上传</a-tag>
</a-descriptions-item>
<a-descriptions-item label="对账单比对">
<a-tag v-if="form?.compare" color="green">已比对</a-tag>
<a-tag v-else color="red">未比对</a-tag>
</a-descriptions-item>
<a-descriptions-item label="比对结果">
{{ dictConvert('ReconcileResult', form.result) }}
</a-descriptions-item>
<a-descriptions-item label="错误信息">
{{ form.errorMsg }}
</a-descriptions-item>
<a-descriptions-item label="错误码">
{{ form.errorCode }}
</a-descriptions-item>
<a-descriptions-item label="创建时间">
{{ form.createTime }}
</a-descriptions-item>

View File

@@ -21,13 +21,13 @@
>
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="date" title="对账日期" />
<vxe-column field="batchNo" title="批次号" />
<vxe-column field="channel" title="支付通道">
<vxe-column field="reconcileNo" title="对账号" />
<vxe-column field="channel" title="对账通道">
<template #default="{ row }">
<a-tag>{{ dictConvert('PayChannel', row.channel) }}</a-tag>
</template>
</vxe-column>
<vxe-column field="down" title="下载或上传">
<vxe-column field="down" title="下载或上传" min-width="100">
<template #default="{ row }">
<template v-if="row.down">
<a-tag v-if="row.down" color="green">已完成</a-tag>
@@ -55,25 +55,19 @@
<a-link v-else :disabled="!row.down" color="red" @click="compareOrder(row)">比对</a-link>
</template>
</vxe-column>
<vxe-column field="result" title="对账结果">
<template #default="{ row }">
{{ dictConvert('ReconcileResult', row.result) }}
</template>
</vxe-column>
<vxe-column field="errorMsg" title="错误信息" />
<vxe-column field="createTime" title="创建时间" />
<vxe-column fixed="right" width="120" :showOverflow="false" title="操作">
<vxe-column fixed="right" width="150" :showOverflow="false" title="操作">
<template #default="{ row }">
<a-link @click="show(row)">查看</a-link>
<a-divider type="vertical" />
<a-dropdown>
<a> 更多 <icon icon="ant-design:down-outlined" :size="12" /></a>
<template #overlay>
<a-menu>
<a-menu-item>
<a-link @click="showDetailPage(row)">对账明细</a-link>
</a-menu-item>
<a-menu-item>
<a-link @click="showDiffPage(row)">差异明细</a-link>
</a-menu-item>
</a-menu>
</template>
</a-dropdown>
<!-- <a-link v-if="row.result === 'consistent'" @click="showDiffPage(row)">差异明细</a-link>-->
<a-link @click="showDiffPage(row)">差异明细</a-link>
</template>
</vxe-column>
</vxe-table>
@@ -87,9 +81,8 @@
/>
</div>
<reconcile-order-create ref="reconcileOrderCreate" @ok="queryPage" />
<reconcile-detail-list ref="reconcileDetailList" />
<reconcile-order-info ref="reconcileOrderInfo" />
<reconcile-diff-list-model ref="reconcileDiffListModel" />
<reconcile-diff-list ref="reconcileDiffList" />
</div>
</template>
<script setup lang="ts">
@@ -103,10 +96,9 @@
import { VxeTable, VxeTableInstance, VxeToolbarInstance } from 'vxe-table'
import { compare, downAndSave, page } from './ReconcileOrder.api'
import ReconcileOrderInfo from './ReconcileOrderInfo.vue'
import ReconcileDetailList from '../detail/ReconcileDetailList.vue'
import ReconcileOrderCreate from './ReconcileOrderCreate.vue'
import ALink from '/@/components/Link/Link.vue'
import ReconcileDiffListModel from '/@/views/payment/order/reconcile/diff/ReconcileDiffListModel.vue'
import ReconcileDiffList from '../diff/ReconcileDiffList.vue'
import { useUpload } from '/@/hooks/bootx/useUpload'
// 使用hooks
@@ -118,12 +110,13 @@
const { tokenHeader, uploadAction } = useUpload('/order/reconcile/upload')
let payChannelList = $ref<LabeledValue[]>([])
let reconcileResultList = $ref<LabeledValue[]>([])
// 查询条件
const fields = computed(() => {
return [
{ field: 'date', type: DATE, name: '对账日期', placeholder: '请选择对账日期' },
{ field: 'batchNo', type: STRING, name: '批次号', placeholder: '请输入对账批次号' },
{ field: 'reconcileNo', type: STRING, name: '批次号', placeholder: '请输入对账批次号' },
{
field: 'channel',
type: LIST,
@@ -131,6 +124,13 @@
placeholder: '请选择对账通道',
selectList: payChannelList,
},
{
field: 'result',
type: LIST,
name: '对账结果',
placeholder: '请选择对账结果',
selectList: reconcileResultList,
},
] as QueryField[]
})
@@ -139,7 +139,7 @@
const reconcileOrderCreate = $ref<any>()
const reconcileOrderInfo = $ref<any>()
const reconcileDetailList = $ref<any>()
const reconcileDiffListModel = $ref<any>()
const reconcileDiffList = $ref<any>()
onMounted(() => {
initData()
@@ -155,6 +155,7 @@
*/
async function initData() {
payChannelList = await dictDropDown('AsyncPayChannel')
reconcileResultList = await dictDropDown('ReconcileResult')
}
/**
@@ -254,7 +255,7 @@
* 查看差异单
*/
function showDiffPage(record) {
reconcileDiffListModel.init(record)
reconcileDiffList.init(record)
}
</script>

View File

@@ -83,8 +83,8 @@
// 查询条件
const fields = computed(() => {
return [
{ field: 'paymentId', type: STRING, name: '支付单号', placeholder: '请输入支付单号' },
{ field: 'businessNo', type: STRING, name: '业务号', placeholder: '请输入业务号' },
{ field: 'orderNo', type: STRING, name: '单号', placeholder: '请输入单号' },
{ field: 'bizOrderNo', type: STRING, name: '商户订单号', placeholder: '请输入商户订单号' },
{
field: 'channel',
type: LIST,

View File

@@ -92,8 +92,7 @@
const fields = computed(() => {
return [
{ field: 'repairNo', type: STRING, name: '修复单号', placeholder: '请输入修复号' },
{ field: 'orderId', type: STRING, name: '本地订单ID', placeholder: '请输入本地订单ID' },
{ field: 'orderNo', type: STRING, name: '本地订单号', placeholder: '请输入本地订单号' },
{ field: 'tradeNo', type: STRING, name: '本地交易号', placeholder: '请输入本地交易号' },
{
field: 'repairSource',
type: LIST,
@@ -116,7 +115,7 @@
selectList: repairWayList,
},
{
field: 'asyncChannel',
field: 'channel',
type: LIST,
name: '修复通道',
placeholder: '请选择修复通道',

View File

@@ -30,7 +30,7 @@ export interface SyncRecord extends BaseEntity {
tradeNo?: string
// 商户交易号
bizTradeNo?: string
// 三方交易号
// 外部交易号
outTradeNo?: string
// 同步类型
syncType?: string

View File

@@ -91,7 +91,9 @@
// 查询条件
const fields = computed(() => {
return [
{ field: 'orderNo', type: STRING, name: '本地交易号', placeholder: '请输入本地交易号' },
{ field: 'tradeNo', type: STRING, name: '本地交易号', placeholder: '请输入本地交易号' },
{ field: 'bizTradeNo', type: STRING, name: '商户交易号', placeholder: '请输入商户交易号' },
{ field: 'bizTradeNo', type: STRING, name: '外部交易号', placeholder: '请输入外部交易号' },
{
field: 'syncType',
type: LIST,
@@ -100,7 +102,7 @@
selectList: syncTypeList,
},
{
field: 'gatewayStatus',
field: 'outTradeStatus',
type: LIST,
name: '同步结果',
placeholder: '请选择同步结果',