feat: publish member notices and balance-aware order settlement
Deploy olons-admin production / deploy (push) Successful in 8m50s
Deploy olons-admin production / deploy (push) Successful in 8m50s
This commit is contained in:
@@ -136,9 +136,9 @@
|
||||
<n-descriptions-item label="会员编号">{{ detail.memberNo }}</n-descriptions-item>
|
||||
<n-descriptions-item label="手机号">{{ detail.mobile }}</n-descriptions-item>
|
||||
<n-descriptions-item label="真实姓名">{{
|
||||
detail.realNameMask || '-'
|
||||
detail.realName || detail.realNameMask || '-'
|
||||
}}</n-descriptions-item>
|
||||
<n-descriptions-item label="证件号">{{ detail.idNoMask || '-' }}</n-descriptions-item>
|
||||
<n-descriptions-item label="证件号">{{ detail.idNo || detail.idNoMask || '-' }}</n-descriptions-item>
|
||||
<n-descriptions-item label="团队层级">{{ detail.level }}</n-descriptions-item>
|
||||
<n-descriptions-item label="可用余额">{{
|
||||
money(detail.availableAmount)
|
||||
@@ -165,12 +165,6 @@
|
||||
>收货地址</n-button
|
||||
>
|
||||
<n-button v-if="hasPermission(['/appMember/team'])" @click="openTeam">团队查询</n-button>
|
||||
<n-button
|
||||
v-if="hasPermission(['/appMember/sensitive'])"
|
||||
type="warning"
|
||||
@click="openSensitive('member', detail.id)"
|
||||
>授权查看明文</n-button
|
||||
>
|
||||
</n-space>
|
||||
</n-spin>
|
||||
</n-modal>
|
||||
@@ -184,14 +178,8 @@
|
||||
<n-spin :show="relatedLoading">
|
||||
<n-form label-placement="left" label-width="110">
|
||||
<template v-if="relatedType === 'payment'">
|
||||
<n-alert v-if="paymentForm.id" type="info" :show-icon="false">
|
||||
当前默认显示脱敏资料;留空保存不会覆盖原敏感字段或收款码。
|
||||
<n-button
|
||||
v-if="hasPermission(['/appMember/sensitive'])"
|
||||
text
|
||||
type="primary"
|
||||
@click="openSensitive('payment', paymentForm.id)"
|
||||
>授权查看明文</n-button>
|
||||
<n-alert v-if="paymentForm.id" type="warning" :show-icon="false">
|
||||
敏感资料已明文展示;请仅用于当前业务处理。留空保存不会覆盖原敏感字段或收款码。
|
||||
</n-alert>
|
||||
<n-form-item label="开户人"
|
||||
><n-input v-model:value="paymentForm.holder" :placeholder="paymentForm.holderMask || '留空不修改'"
|
||||
@@ -284,35 +272,6 @@
|
||||
<n-empty v-if="!ledgerLoading && ledgerRows.length === 0" description="暂无账变记录" />
|
||||
</n-modal>
|
||||
|
||||
<n-modal
|
||||
v-model:show="showSensitive"
|
||||
preset="dialog"
|
||||
title="授权查看敏感信息"
|
||||
:show-icon="false"
|
||||
>
|
||||
<n-alert type="error"
|
||||
>明文仅用于当前业务目的,请勿复制传播。本次操作将记录查看人、对象、用途和结果。</n-alert
|
||||
>
|
||||
<n-form label-placement="top">
|
||||
<n-form-item label="用途编码"
|
||||
><n-input
|
||||
v-model:value="sensitiveForm.purposeCode"
|
||||
placeholder="如 customer_service_verify"
|
||||
/></n-form-item>
|
||||
<n-form-item label="用途说明"
|
||||
><n-input v-model:value="sensitiveForm.purposeText" type="textarea"
|
||||
/></n-form-item>
|
||||
<n-checkbox v-model:checked="sensitiveForm.confirm">我确认业务需要并接受留痕</n-checkbox>
|
||||
</n-form>
|
||||
<n-code v-if="sensitiveResult" :code="sensitiveResult" language="json" word-wrap />
|
||||
<template #action
|
||||
><n-space
|
||||
><n-button @click="showSensitive = false">关闭</n-button
|
||||
><n-button type="error" @click="revealSensitive">确认查看</n-button></n-space
|
||||
></template
|
||||
>
|
||||
</n-modal>
|
||||
|
||||
<n-modal v-model:show="showStatus" preset="dialog" title="信息" :show-icon="false">
|
||||
<div>确定{{ statusForm.toStatus === 1 ? '启用' : '禁用' }}此用户吗?</div>
|
||||
<template #action
|
||||
@@ -341,8 +300,11 @@
|
||||
>
|
||||
</n-modal>
|
||||
|
||||
<n-modal v-model:show="showNotice" preset="card" title="发送弹幕" class="related-modal">
|
||||
<n-modal v-model:show="showNotice" preset="card" title="发送系统通知" class="related-modal">
|
||||
<n-form label-placement="left" label-width="100">
|
||||
<n-alert type="info" :show-icon="false">
|
||||
仅当前会员可见;会员在任意已登录页面通常15秒内收到系统通知弹窗,首页公告栏继续轮询。
|
||||
</n-alert>
|
||||
<n-form-item label="用户ID"
|
||||
><n-input :value="String(noticeMember?.id || '')" disabled
|
||||
/></n-form-item>
|
||||
@@ -352,8 +314,18 @@
|
||||
<n-form-item label="用户手机"
|
||||
><n-input :value="noticeMember?.mobile || ''" disabled
|
||||
/></n-form-item>
|
||||
<n-form-item label="发送内容"
|
||||
><n-input v-model:value="noticeForm.content" placeholder="请输入发送内容"
|
||||
<n-form-item label="通知标题"
|
||||
><n-input v-model:value="noticeForm.title" maxlength="120" placeholder="请输入通知标题"
|
||||
/></n-form-item>
|
||||
<n-form-item label="通知内容"
|
||||
><n-input v-model:value="noticeForm.content" type="textarea" maxlength="500" placeholder="请输入通知内容"
|
||||
/></n-form-item>
|
||||
<n-form-item label="有效期"
|
||||
><n-date-picker
|
||||
v-model:formatted-value="noticeDateRange"
|
||||
type="datetimerange"
|
||||
value-format="yyyy-MM-dd HH:mm:ss"
|
||||
clearable
|
||||
/></n-form-item>
|
||||
</n-form>
|
||||
<template #action
|
||||
@@ -389,7 +361,6 @@
|
||||
AddressList,
|
||||
AddressEdit,
|
||||
AddressDelete,
|
||||
Sensitive,
|
||||
Team,
|
||||
StatusRequest,
|
||||
LedgerList,
|
||||
@@ -429,7 +400,7 @@
|
||||
editFormRef = ref<any>(),
|
||||
memberTableWrapRef = ref<HTMLElement | null>(null);
|
||||
const [register] = useForm({
|
||||
gridProps: { cols: '1 s:1 m:2 l:3 xl:4 2xl:4' },
|
||||
gridProps: { cols: '1 s:2 m:4 l:6 xl:8 2xl:8' },
|
||||
labelWidth: 80,
|
||||
schemas,
|
||||
});
|
||||
@@ -439,7 +410,6 @@
|
||||
showRelatedForm = ref(false),
|
||||
showTeam = ref(false),
|
||||
showLedger = ref(false),
|
||||
showSensitive = ref(false),
|
||||
showStatus = ref(false),
|
||||
showWallet = ref(false),
|
||||
showNotice = ref(false),
|
||||
@@ -454,20 +424,12 @@
|
||||
teamRows = ref<any[]>([]),
|
||||
relatedType = ref<'payment' | 'address'>('payment'),
|
||||
teamLevel = ref(3),
|
||||
sensitiveResult = ref(''),
|
||||
walletYuan = ref<number | null>(null),
|
||||
memberLevelOptions = ref<any[]>([]),
|
||||
noticeMember = ref<MemberRecord | null>(null);
|
||||
const editForm = reactive<any>({}),
|
||||
paymentForm = reactive<any>({}),
|
||||
addressForm = reactive<any>({}),
|
||||
sensitiveForm = reactive<any>({
|
||||
targetType: 'member',
|
||||
targetId: 0,
|
||||
purposeCode: '',
|
||||
purposeText: '',
|
||||
confirm: false,
|
||||
}),
|
||||
statusForm = reactive<any>({ memberId: 0, toStatus: 2, reasonCode: '', reasonText: '' }),
|
||||
walletForm = reactive<any>({
|
||||
memberId: 0,
|
||||
@@ -508,8 +470,8 @@
|
||||
trigger: ['input', 'blur'],
|
||||
},
|
||||
};
|
||||
const noticeForm = reactive({ memberId: 0, title: '', content: '', sourceType: 2 });
|
||||
const noticeDateRange = ref<[string, string]>(['', '']);
|
||||
const noticeForm = reactive({ memberId: 0, title: '', content: '', sourceType: 1 });
|
||||
const noticeDateRange = ref<[string, string] | null>(null);
|
||||
const ledgerRows = ref<any[]>([]),
|
||||
ledgerMember = ref<MemberRecord | null>(null);
|
||||
const reset = (obj, value) => {
|
||||
@@ -580,7 +542,7 @@
|
||||
auth: ['/appMember/walletRequest'],
|
||||
},
|
||||
{
|
||||
label: '弹幕',
|
||||
label: '弹窗',
|
||||
color: '#009688',
|
||||
onClick: () => openNotice(record),
|
||||
auth: ['/appMember/noticeEdit'],
|
||||
@@ -772,16 +734,16 @@
|
||||
reset(paymentForm, {
|
||||
memberId,
|
||||
id: bank?.id || 0,
|
||||
holder: '',
|
||||
holder: bank?.holder || bank?.holderMask || '',
|
||||
holderMask: bank?.holderMask || '',
|
||||
identityNo: '',
|
||||
identityNo: bank?.identityNo || bank?.identityNoMask || '',
|
||||
identityNoMask: bank?.identityNoMask || '',
|
||||
bankName: bank?.bankName || '',
|
||||
mobile: '',
|
||||
mobile: bank?.mobile || bank?.mobileMask || '',
|
||||
mobileMask: bank?.mobileMask || '',
|
||||
bankAccount: '',
|
||||
bankAccount: bank?.accountNo || bank?.accountNoMask || '',
|
||||
accountNoMask: bank?.accountNoMask || '',
|
||||
digitalWallet: '',
|
||||
digitalWallet: bank?.digitalRmbCode || bank?.digitalRmbCodeMask || '',
|
||||
digitalRmbCodeMask: bank?.digitalRmbCodeMask || '',
|
||||
alipayQrCode: bank?.alipayQrUrl || '',
|
||||
wechatQrCode: bank?.wechatQrUrl || '',
|
||||
@@ -794,8 +756,8 @@
|
||||
reset(addressForm, {
|
||||
id: row?.id || 0,
|
||||
memberId,
|
||||
receiver: '',
|
||||
mobile: '',
|
||||
receiver: row?.receiver || row?.receiverMask || '',
|
||||
mobile: row?.mobile || row?.mobileMask || '',
|
||||
region,
|
||||
originalRegion: region,
|
||||
province: row?.province || '',
|
||||
@@ -839,7 +801,7 @@
|
||||
province: '',
|
||||
city: '',
|
||||
district: '',
|
||||
address: '',
|
||||
address: row?.address || row?.addressMask || '',
|
||||
isDefault: 2,
|
||||
});
|
||||
}
|
||||
@@ -893,9 +855,11 @@
|
||||
memberId: row.memberId,
|
||||
accountType: row.accountType,
|
||||
bankName: row.bankName,
|
||||
holder: '',
|
||||
mobile: '',
|
||||
accountNo: '',
|
||||
holder: row.holder || row.holderMask || '',
|
||||
identityNo: row.identityNo || row.identityNoMask || '',
|
||||
mobile: row.mobile || row.mobileMask || '',
|
||||
accountNo: row.accountNo || row.accountNoMask || '',
|
||||
digitalRmbCode: row.digitalRmbCode || row.digitalRmbCodeMask || '',
|
||||
verifyStatus: row.verifyStatus,
|
||||
isDefault: row.isDefault,
|
||||
});
|
||||
@@ -903,30 +867,15 @@
|
||||
reset(addressForm, {
|
||||
id: row.id,
|
||||
memberId: row.memberId,
|
||||
receiver: '',
|
||||
mobile: '',
|
||||
receiver: row.receiver || row.receiverMask || '',
|
||||
mobile: row.mobile || row.mobileMask || '',
|
||||
province: row.province,
|
||||
city: row.city,
|
||||
district: row.district,
|
||||
address: '',
|
||||
address: row.address || row.addressMask || '',
|
||||
isDefault: row.isDefault,
|
||||
});
|
||||
}
|
||||
function openSensitive(type, targetId) {
|
||||
reset(sensitiveForm, {
|
||||
targetType: type,
|
||||
targetId,
|
||||
purposeCode: '',
|
||||
purposeText: '',
|
||||
confirm: false,
|
||||
});
|
||||
sensitiveResult.value = '';
|
||||
showSensitive.value = true;
|
||||
}
|
||||
async function revealSensitive() {
|
||||
const r: any = await Sensitive(sensitiveForm);
|
||||
sensitiveResult.value = JSON.stringify({ accessNo: r.accessNo, ...r.fields }, null, 2);
|
||||
}
|
||||
async function openTeam(memberId = detail.value.id) {
|
||||
detail.value = { ...detail.value, id: memberId };
|
||||
showTeam.value = true;
|
||||
@@ -1000,13 +949,21 @@
|
||||
const start = new Date(),
|
||||
end = new Date(start.getTime() + 30 * 24 * 60 * 60 * 1000);
|
||||
noticeMember.value = row;
|
||||
reset(noticeForm, { memberId: row.id, title: '会员弹幕', content: '', sourceType: 2 });
|
||||
reset(noticeForm, { memberId: row.id, title: '系统通知', content: '', sourceType: 1 });
|
||||
noticeDateRange.value = [formatDate(start), formatDate(end)];
|
||||
showNotice.value = true;
|
||||
}
|
||||
async function submitNotice() {
|
||||
if (!noticeForm.title.trim()) {
|
||||
message.warning('请填写通知标题');
|
||||
return;
|
||||
}
|
||||
if (!noticeForm.content.trim()) {
|
||||
message.warning('请填写弹幕内容');
|
||||
message.warning('请填写通知内容');
|
||||
return;
|
||||
}
|
||||
if (!noticeDateRange.value) {
|
||||
message.warning('请选择通知有效期');
|
||||
return;
|
||||
}
|
||||
await NoticeEdit({
|
||||
@@ -1014,7 +971,7 @@
|
||||
startAt: noticeDateRange.value[0],
|
||||
endAt: noticeDateRange.value[1],
|
||||
});
|
||||
message.success('弹幕已发送');
|
||||
message.success('系统通知已发送');
|
||||
showNotice.value = false;
|
||||
}
|
||||
const relatedColumns = computed(() =>
|
||||
@@ -1025,8 +982,8 @@
|
||||
key: 'accountType',
|
||||
render: (r) => dict.getLabel('paymentAccountType', r.accountType),
|
||||
},
|
||||
{ title: '持有人', key: 'holderMask' },
|
||||
{ title: '账号', key: 'accountNoMask' },
|
||||
{ title: '持有人', key: 'holder' },
|
||||
{ title: '账号', key: 'accountNo' },
|
||||
{ title: '银行', key: 'bankName' },
|
||||
{
|
||||
title: '操作',
|
||||
@@ -1034,11 +991,6 @@
|
||||
render: (r) =>
|
||||
h(NSpace, {}, () => [
|
||||
h(NButton, { size: 'small', onClick: () => editRelated(r) }, () => '编辑'),
|
||||
h(
|
||||
NButton,
|
||||
{ size: 'small', onClick: () => openSensitive('payment', r.id) },
|
||||
() => '查看明文'
|
||||
),
|
||||
h(
|
||||
NButton,
|
||||
{ size: 'small', type: 'error', onClick: () => deleteRelated(r.id) },
|
||||
@@ -1048,21 +1000,16 @@
|
||||
},
|
||||
]
|
||||
: [
|
||||
{ title: '收货人', key: 'receiverMask' },
|
||||
{ title: '手机号', key: 'mobileMask' },
|
||||
{ title: '收货人', key: 'receiver' },
|
||||
{ title: '手机号', key: 'mobile' },
|
||||
{ title: '地区', key: 'province', render: (r) => r.province + r.city + r.district },
|
||||
{ title: '地址', key: 'addressMask' },
|
||||
{ title: '地址', key: 'address' },
|
||||
{
|
||||
title: '操作',
|
||||
key: 'action',
|
||||
render: (r) =>
|
||||
h(NSpace, {}, () => [
|
||||
h(NButton, { size: 'small', onClick: () => editRelated(r) }, () => '编辑'),
|
||||
h(
|
||||
NButton,
|
||||
{ size: 'small', onClick: () => openSensitive('address', r.id) },
|
||||
() => '查看明文'
|
||||
),
|
||||
h(
|
||||
NButton,
|
||||
{ size: 'small', type: 'error', onClick: () => deleteRelated(r.id) },
|
||||
|
||||
@@ -7,7 +7,7 @@ import { defRangeShortcuts } from '@/utils/dateUtil';
|
||||
const dict = useDictStore();
|
||||
|
||||
export interface MemberRecord {
|
||||
id: number; memberNo: string; username: string; mobile: string; realNameMask: string;
|
||||
id: number; memberNo: string; username: string; mobile: string; realName: string; realNameMask: string;
|
||||
availableAmount: number; frozenAmount: number; parentId: number; parentUsername: string;
|
||||
inviteCode: string; memberStatus: number; riskStatus: number; autoDispatch: number; memberCategory: number;
|
||||
isTestAccount: number; lastLoginAt?: string; lastLoginIpMask: string; lastLoginRegion: string;
|
||||
@@ -34,7 +34,7 @@ export const columns = [
|
||||
{ title: '会员编号', key: 'memberNo', width: 170 },
|
||||
{ title: '账号', key: 'username', width: 130 },
|
||||
{ title: '手机号', key: 'mobile', width: 130 },
|
||||
{ title: '绑卡姓名', key: 'realNameMask', width: 100 },
|
||||
{ title: '真实姓名', key: 'realName', width: 100 },
|
||||
{ title: '可用余额', key: 'availableAmount', width: 120, render: (row: MemberRecord) => money(row.availableAmount) },
|
||||
{ title: '冻结余额', key: 'frozenAmount', width: 120, render: (row: MemberRecord) => money(row.frozenAmount) },
|
||||
{ title: '上级用户', key: 'parentUsername', width: 120, render: (row: MemberRecord) => row.parentUsername || '-' },
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div>
|
||||
<div class="n-layout-page-header"><n-card :bordered="false" title="订单列表">手动单匹配后立即完成并允许余额为负;自动单可在预约时间前人工匹配,逾期未处理则由系统自动匹配。</n-card></div>
|
||||
<div class="n-layout-page-header"><n-card :bordered="false" title="订单列表">匹配时会校验会员可用余额;余额不足的订单保留为待处理,充值审核通过且余额足够后自动完成并结算本金及佣金。</n-card></div>
|
||||
<n-card :bordered="false" class="proCard">
|
||||
<BasicForm ref="searchFormRef" @register="register" @submit="reloadTable" @reset="reloadTable" />
|
||||
<BasicTable ref="actionRef" :columns="columns" :request="loadDataTable" :row-key="(row)=>row.id" :action-column="actionColumn" :scroll-x="scrollX" :resize-height-offset="-10000">
|
||||
@@ -45,6 +45,9 @@
|
||||
<n-form-item label="商品数量">
|
||||
<n-input-number v-model:value="matchForm.quantity" :min="1" :max="999" />
|
||||
</n-form-item>
|
||||
<n-alert v-if="matchShortfall > 0" type="warning" :bordered="false">
|
||||
会员余额不足:当前可用 {{ yuan(matchMember.availableAmount) }},订单金额 {{ yuan(selectedProduct.priceAmount * matchForm.quantity) }},还差 {{ yuan(matchShortfall) }}。订单将保留为待处理,充值审核通过且余额足够后自动完成。
|
||||
</n-alert>
|
||||
</n-form>
|
||||
</n-spin>
|
||||
<template #action>
|
||||
@@ -99,6 +102,7 @@ const approvalColumns=[{title:'节点',key:'stepNo',width:70},{title:'操作人I
|
||||
const matchLoading=ref(false),productLoading=ref(false),matchSubmitting=ref(false),products=ref<any[]>([]),selectedProduct=ref<any>();
|
||||
const matchMember=reactive({id:0,username:'',availableAmount:0,frozenAmount:0});
|
||||
const matchForm=reactive({id:0,productId:0,quantity:1});
|
||||
const matchShortfall=computed(()=>Math.max(0,(selectedProduct.value?.priceAmount||0)*matchForm.quantity-matchMember.availableAmount));
|
||||
const amountMember=reactive({username:'',availableAmount:0});
|
||||
const amountForm=reactive<{id:number;amount:number|null;quantity:number}>({id:0,amount:null,quantity:1});
|
||||
const amountSubmitting=ref(false);
|
||||
@@ -123,7 +127,7 @@ function clearProductFilter(){Object.assign(productFilter,{name:'',priceMin:null
|
||||
function selectProduct(row){selectedProduct.value=row;matchForm.productId=row.id}
|
||||
async function confirmMatch(){
|
||||
if(!matchForm.productId){message.error('请先选择商品');return}
|
||||
matchSubmitting.value=true;try{await TradeOrderMatch(matchForm);message.success('订单已匹配并完成');showMatch.value=false;reloadTable()}finally{matchSubmitting.value=false}
|
||||
matchSubmitting.value=true;try{await TradeOrderMatch(matchForm);message.success('订单已匹配;如余额不足将保持待处理,充值审核通过且余额足够后自动完成');showMatch.value=false;reloadTable()}finally{matchSubmitting.value=false}
|
||||
}
|
||||
async function view(row){detail.value=await TradeOrderView({id:row.id});showDetail.value=true}
|
||||
function openAmount(row){Object.assign(amountMember,{username:row.username,availableAmount:row.availableAmount});Object.assign(amountForm,{id:row.id,amount:Number(row.totalAmount||0)/100,quantity:row.quantity||1});showAmount.value=true}
|
||||
@@ -137,7 +141,8 @@ const actionColumn=reactive({width:300,title:'操作',key:'action',fixed:'right'
|
||||
if(row.canForcePay)actions.push({label:'强制付款',type:'primary',onClick:()=>forcePay(row)});
|
||||
if(row.canFreeze)actions.push({label:'冻结订单',type:'warning',onClick:()=>freezeOrder(row)});
|
||||
const hasManualActions=row.canChangeAmount||row.canForcePay||row.canFreeze;
|
||||
if(!hasManualActions&&row.orderType===2&&row.orderStatus===2&&row.canReview)actions.push({label:'审核任务',type:'warning',onClick:()=>router.push({name:'task_submission_list',query:{tradeOrderId:String(row.id)}})});
|
||||
if(!hasManualActions&&row.paymentStatus==='balance_pending')actions.push({label:'余额不足待处理',type:'error',disabled:true,title:row.message||'充值审核通过且余额足够后将自动完成'});
|
||||
else if(!hasManualActions&&row.orderType===2&&row.orderStatus===2&&row.canReview)actions.push({label:'审核任务',type:'warning',onClick:()=>router.push({name:'task_submission_list',query:{tradeOrderId:String(row.id)}})});
|
||||
else if(!hasManualActions&&row.orderType===2&&row.orderStatus===2)actions.push({label:'等待会员付款',disabled:true,title:'等待会员完成付款'});
|
||||
if(!hasManualActions)actions.push({label:'详情',onClick:()=>view(row)});
|
||||
return h(TableAction as any,{style:'button',actions});
|
||||
|
||||
@@ -30,9 +30,13 @@ export const columns = [
|
||||
{ title: '佣金', key: 'commissionAmount', width: 110, render: (r) => yuan(r.commissionAmount) },
|
||||
{ title: '下单时间', key: 'createdAt', width: 180 },
|
||||
{ title: '解冻时间', key: 'unfrozenAt', width: 180 },
|
||||
{ title: '消息', key: 'message', width: 180, ellipsis: { tooltip: true } },
|
||||
{ title: '订单状态', key: 'orderStatus', width: 110, render: (r) => r.orderType === 2 && r.orderStatus === 2
|
||||
? h(NTag, { type: 'warning', bordered: false }, { default: () => '待付款' })
|
||||
{ title: '消息', key: 'message', width: 280, ellipsis: { tooltip: true }, render: (r) => r.paymentStatus === 'balance_pending'
|
||||
? h(NTag, { type: 'error', bordered: false }, { default: () => r.message || '余额不足,待处理' })
|
||||
: r.message },
|
||||
{ title: '订单状态', key: 'orderStatus', width: 130, render: (r) => r.paymentStatus === 'balance_pending'
|
||||
? h(NTag, { type: 'error', bordered: false }, { default: () => '余额不足待处理' })
|
||||
: r.orderType === 2 && r.orderStatus === 2
|
||||
? h(NTag, { type: 'warning', bordered: false }, { default: () => '待付款' })
|
||||
: tag('tradeOrderStatus', r.orderStatus) },
|
||||
{ title: '冻结状态', key: 'freezeStatus', width: 110, render: (r) => tag('tradeFreezeStatus', r.freezeStatus) },
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user