Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b9b579dc14 | |||
| 6ae23bb959 | |||
| 4294c92e43 | |||
| b840530fe9 | |||
| e6a1370de2 |
@@ -20,21 +20,47 @@
|
||||
<el-form-item label="受票单位">
|
||||
<el-input v-model="query.buyerName" clearable @keyup.enter="handleQuery" />
|
||||
</el-form-item>
|
||||
<el-form-item label="销方税号">
|
||||
<el-input
|
||||
<el-form-item label="开票单位(销方)">
|
||||
<el-select
|
||||
v-model="query.salerTaxNo"
|
||||
clearable
|
||||
style="width: 180px"
|
||||
filterable
|
||||
remote
|
||||
reserve-keyword
|
||||
:remote-method="keyword => searchCustomers(keyword, 'saler')"
|
||||
:loading="customerLoading.saler"
|
||||
placeholder="输入名称搜索或直接粘贴税号"
|
||||
style="width: 220px"
|
||||
@keyup.enter="handleQuery"
|
||||
/>
|
||||
>
|
||||
<el-option
|
||||
v-for="item in customerOptions.saler"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="购方税号">
|
||||
<el-input
|
||||
<el-form-item label="受票单位(购方)">
|
||||
<el-select
|
||||
v-model="query.buyerTaxNo"
|
||||
clearable
|
||||
style="width: 180px"
|
||||
filterable
|
||||
remote
|
||||
reserve-keyword
|
||||
:remote-method="keyword => searchCustomers(keyword, 'buyer')"
|
||||
:loading="customerLoading.buyer"
|
||||
placeholder="输入名称搜索或直接粘贴税号"
|
||||
style="width: 220px"
|
||||
@keyup.enter="handleQuery"
|
||||
/>
|
||||
>
|
||||
<el-option
|
||||
v-for="item in customerOptions.buyer"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="发票类型">
|
||||
<el-select
|
||||
@@ -109,7 +135,7 @@
|
||||
<el-table-column label="剩余可用金额" min-width="130" align="right">
|
||||
<template #default="{ row }">{{ formatMoney(row.availableTaxAmount) }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="kingdeeBillNo" label="金蝶单据号" min-width="210" show-overflow-tooltip />
|
||||
<!--<el-table-column prop="kingdeeBillNo" label="金蝶单据号" min-width="210" show-overflow-tooltip />-->
|
||||
<el-table-column label="认领状态" min-width="100" align="center">
|
||||
<template #default="{ row }">
|
||||
<el-tag v-if="row.claimed" type="danger" size="small">已认领</el-tag>
|
||||
@@ -167,6 +193,8 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import request from '@/axios';
|
||||
import { getList as getCustomerList } from '@/api/vehicle/customer-archive';
|
||||
import {
|
||||
downloadKingdeeInvoiceFile,
|
||||
isKingdeePathAttachment,
|
||||
@@ -199,6 +227,9 @@ export default {
|
||||
page: { current: 1, size: 10, total: 0 },
|
||||
// 正在查看/下载附件的发票号(行级 loading 守卫)
|
||||
attachmentBusy: null,
|
||||
// 销/购方客商下拉:远程按名称搜客商档案,选中带出税号查询;手动输入的裸税号直接作为值过滤
|
||||
customerOptions: { saler: [], buyer: [] },
|
||||
customerLoading: { saler: false, buyer: false },
|
||||
query: this.emptyQuery(),
|
||||
};
|
||||
},
|
||||
@@ -296,6 +327,39 @@ export default {
|
||||
this.query = this.emptyQuery();
|
||||
this.handleQuery();
|
||||
},
|
||||
// 客商名称远程搜索:含 18 位社会信用代码特征(数字+大写字母)时按裸税号直查;
|
||||
// 否则搜客商档案,取客商发票信息(blade_customer_invoice_info)的抬头/税号作选项——票池税号是开票税号,非统一信用代码
|
||||
async searchCustomers(keyword, side) {
|
||||
const text = String(keyword || '').trim();
|
||||
if (!text) return;
|
||||
if (/^[0-9A-Z]{15,20}$/.test(text)) {
|
||||
this.customerOptions[side] = [{ label: `${text}(手输税号)`, value: text }];
|
||||
return;
|
||||
}
|
||||
this.customerLoading[side] = true;
|
||||
try {
|
||||
const data = this.unwrap(await getCustomerList(1, 20, { fullName: text }));
|
||||
const customers = (data.records || []).filter(item => item.id);
|
||||
if (!customers.length) {
|
||||
this.customerOptions[side] = [];
|
||||
return;
|
||||
}
|
||||
// 列表接口不带发票信息,逐户取 detail(detail 组装 invoices,每户一张发票信息)
|
||||
const options = await Promise.all(
|
||||
customers.map(async customer => {
|
||||
const detail = this.unwrap(await request({ url: '/blade-transport/customer-archive/detail', method: 'get', params: { id: customer.id } }));
|
||||
return (detail?.invoices || [])
|
||||
.filter(invoice => invoice.taxNo)
|
||||
.map(invoice => ({ label: `${invoice.invoiceTitle || customer.fullName}(${invoice.taxNo})`, value: invoice.taxNo }));
|
||||
})
|
||||
);
|
||||
this.customerOptions[side] = options.flat().filter(
|
||||
(option, index, list) => list.findIndex(item => item.value === option.value) === index
|
||||
);
|
||||
} finally {
|
||||
this.customerLoading[side] = false;
|
||||
}
|
||||
},
|
||||
unwrap(response) {
|
||||
const body = response?.data || response || {};
|
||||
return body?.data || body;
|
||||
|
||||
@@ -13,6 +13,7 @@ export const invoiceApplicationTableColumns = [
|
||||
{ prop: 'currentProcessor', label: '当前处理人', minWidth: 130 },
|
||||
{ prop: 'kingdeeBillNo', label: '金蝶单据号', minWidth: 150 },
|
||||
{ prop: 'kingdeeStatusName', label: '金蝶单据状态', minWidth: 140 },
|
||||
{ prop: 'kingdeeLockStatus', label: '金蝶锁状态', minWidth: 150 },
|
||||
{ prop: 'attachmentSyncStatusName', label: '附件同步', minWidth: 100 },
|
||||
];
|
||||
|
||||
|
||||
@@ -17,5 +17,6 @@ export const paymentApplicationTableColumns = [
|
||||
{ prop: 'currentProcessor', label: '当前处理人', minWidth: 120 },
|
||||
{ prop: 'kingdeeBillNo', label: '金蝶单据号', minWidth: 130 },
|
||||
{ prop: 'kingdeeStatusName', label: '金蝶单据状态', minWidth: 130 },
|
||||
{ prop: 'kingdeeLockStatus', label: '金蝶锁状态', minWidth: 150 },
|
||||
{ prop: 'attachmentSyncStatusName', label: '附件同步', minWidth: 100 },
|
||||
];
|
||||
|
||||
@@ -21,6 +21,7 @@ export const formalSettlementTableColumns = [
|
||||
{ label: '当前处理人', prop: 'currentProcessor', minWidth: 130 },
|
||||
{ label: '金蝶单据号', prop: 'kingdeeBillNo', minWidth: 150 },
|
||||
{ label: '金蝶单据状态', prop: 'kingdeeSyncStatus', minWidth: 135 },
|
||||
{ label: '金蝶锁状态', prop: 'kingdeeLockStatus', minWidth: 150 },
|
||||
{ label: '附件同步', prop: 'attachmentSyncStatusName', minWidth: 100 },
|
||||
{ label: '创建人', prop: 'createUserName', minWidth: 110 },
|
||||
{ label: '创建时间', prop: 'createTime', minWidth: 170 },
|
||||
|
||||
@@ -115,6 +115,12 @@
|
||||
{{ displayValue(row[column.prop]) }}
|
||||
</el-tag>
|
||||
<span v-else-if="column.money">{{ formatMoney(row[column.prop]) }}</span>
|
||||
<template v-else-if="column.prop === 'kingdeeLockStatus'">
|
||||
<el-tooltip v-if="lockTag(row).show" :content="lockTag(row).tip" placement="top">
|
||||
<el-tag :type="lockTag(row).type" class="status-text">{{ lockTag(row).label }}</el-tag>
|
||||
</el-tooltip>
|
||||
<span v-else>-</span>
|
||||
</template>
|
||||
<span v-else>{{ displayValue(row[column.prop]) }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@@ -183,7 +189,9 @@
|
||||
>
|
||||
<el-link
|
||||
v-if="
|
||||
hasPermission('invoice_application_void') && row.approvalStatus === 'approved'
|
||||
hasPermission('invoice_application_void') &&
|
||||
row.approvalStatus === 'approved' &&
|
||||
row.kingdeeLockStatus !== 'locked'
|
||||
"
|
||||
type="danger"
|
||||
@click="handleVoid(row)"
|
||||
@@ -448,6 +456,28 @@ export default {
|
||||
''
|
||||
);
|
||||
},
|
||||
lockTag(row) {
|
||||
if (row.kingdeeLockStatus === 'locked') {
|
||||
return { show: true, type: 'danger', label: '金蝶锁定中', tip: '该单据已被金蝶锁定,不可编辑/作废' };
|
||||
}
|
||||
if (row.kingdeeLockStatus === 'failed') {
|
||||
if ((row.kingdeeTryCount || 0) >= 5) {
|
||||
return {
|
||||
show: true,
|
||||
type: 'danger',
|
||||
label: '锁定失败·已达上限',
|
||||
tip: row.kingdeeLockFailReason || '自动补偿次数已用完,请重推「同步金蝶」立即补锁',
|
||||
};
|
||||
}
|
||||
return {
|
||||
show: true,
|
||||
type: 'warning',
|
||||
label: '锁定失败·补偿中',
|
||||
tip: row.kingdeeLockFailReason || '系统将自动补偿重锁',
|
||||
};
|
||||
}
|
||||
return { show: false };
|
||||
},
|
||||
displayValue(value) {
|
||||
return value === null || value === undefined || value === '' ? '-' : value;
|
||||
},
|
||||
|
||||
@@ -138,6 +138,12 @@
|
||||
>{{ row[column.prop] || '-' }}</el-tag
|
||||
>
|
||||
<span v-else-if="column.money">{{ formatMoney(row[column.prop]) }}</span>
|
||||
<template v-else-if="column.prop === 'kingdeeLockStatus'">
|
||||
<el-tooltip v-if="lockTag(row).show" :content="lockTag(row).tip" placement="top">
|
||||
<el-tag :type="lockTag(row).type" class="status-text">{{ lockTag(row).label }}</el-tag>
|
||||
</el-tooltip>
|
||||
<span v-else>-</span>
|
||||
</template>
|
||||
<span v-else>{{ displayValue(row[column.prop]) }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@@ -200,7 +206,9 @@
|
||||
>
|
||||
<el-link
|
||||
v-if="
|
||||
hasPermission('payment_application_void') && row.approvalStatus === 'approved'
|
||||
hasPermission('payment_application_void') &&
|
||||
row.approvalStatus === 'approved' &&
|
||||
row.kingdeeLockStatus !== 'locked'
|
||||
"
|
||||
type="danger"
|
||||
@click="handleVoid(row)"
|
||||
@@ -496,6 +504,28 @@ export default {
|
||||
''
|
||||
);
|
||||
},
|
||||
lockTag(row) {
|
||||
if (row.kingdeeLockStatus === 'locked') {
|
||||
return { show: true, type: 'danger', label: '金蝶锁定中', tip: '该单据已被金蝶锁定,不可编辑/作废' };
|
||||
}
|
||||
if (row.kingdeeLockStatus === 'failed') {
|
||||
if ((row.kingdeeTryCount || 0) >= 5) {
|
||||
return {
|
||||
show: true,
|
||||
type: 'danger',
|
||||
label: '锁定失败·已达上限',
|
||||
tip: row.kingdeeLockFailReason || '自动补偿次数已用完,请重推「同步金蝶」立即补锁',
|
||||
};
|
||||
}
|
||||
return {
|
||||
show: true,
|
||||
type: 'warning',
|
||||
label: '锁定失败·补偿中',
|
||||
tip: row.kingdeeLockFailReason || '系统将自动补偿重锁',
|
||||
};
|
||||
}
|
||||
return { show: false };
|
||||
},
|
||||
displayValue(value) {
|
||||
return value === null || value === undefined || value === '' ? '-' : value;
|
||||
},
|
||||
|
||||
@@ -88,6 +88,12 @@
|
||||
<span v-else-if="column.prop === 'kingdeeSyncStatus'">{{
|
||||
kingdeeSyncName(row.kingdeeSyncStatus)
|
||||
}}</span>
|
||||
<template v-else-if="column.prop === 'kingdeeLockStatus'">
|
||||
<el-tooltip v-if="lockTag(row).show" :content="lockTag(row).tip" placement="top">
|
||||
<el-tag :type="lockTag(row).type" class="status-text">{{ lockTag(row).label }}</el-tag>
|
||||
</el-tooltip>
|
||||
<span v-else>-</span>
|
||||
</template>
|
||||
<span v-else>{{ displayValue(row[column.prop]) }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@@ -226,6 +232,28 @@ export default {
|
||||
kingdeeSyncName(value) {
|
||||
return kingdeeSyncStatusOptions.find(item => item.value === value)?.label || value || '-';
|
||||
},
|
||||
lockTag(row) {
|
||||
if (row.kingdeeLockStatus === 'locked') {
|
||||
return { show: true, type: 'danger', label: '金蝶锁定中', tip: '该单据已被金蝶锁定,不可编辑/作废' };
|
||||
}
|
||||
if (row.kingdeeLockStatus === 'failed') {
|
||||
if ((row.kingdeeTryCount || 0) >= 5) {
|
||||
return {
|
||||
show: true,
|
||||
type: 'danger',
|
||||
label: '锁定失败·已达上限',
|
||||
tip: row.kingdeeLockFailReason || '自动补偿次数已用完,请重推「同步金蝶」立即补锁',
|
||||
};
|
||||
}
|
||||
return {
|
||||
show: true,
|
||||
type: 'warning',
|
||||
label: '锁定失败·补偿中',
|
||||
tip: row.kingdeeLockFailReason || '系统将自动补偿重锁',
|
||||
};
|
||||
}
|
||||
return { show: false };
|
||||
},
|
||||
displayValue(value) {
|
||||
return value === null || value === undefined || value === '' ? '-' : value;
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user