diff --git a/src/api/business/contract-change.js b/src/api/business/contract-change.js index 4f407ec..739be83 100644 --- a/src/api/business/contract-change.js +++ b/src/api/business/contract-change.js @@ -1,4 +1,5 @@ import { createCrudApi } from './common'; +import { APPROVE_TIMEOUT } from '@/api/common'; import request from '@/axios'; const baseUrl = '/blade-transport/contract-change'; @@ -35,8 +36,7 @@ export const approve = id => url: `${baseUrl}/approve`, method: 'post', params: { id }, - // 审批通过后同步推送合规(附件转传可达 20s+),覆盖全局 10s 超时 - timeout: 120000, + timeout: APPROVE_TIMEOUT, }); export const reject = id => diff --git a/src/api/business/contract-manage.js b/src/api/business/contract-manage.js index 10f560c..543a825 100644 --- a/src/api/business/contract-manage.js +++ b/src/api/business/contract-manage.js @@ -1,4 +1,5 @@ import { createCrudApi } from './common'; +import { APPROVE_TIMEOUT } from '@/api/common'; import request from '@/axios'; const baseUrl = '/blade-transport/contract-manage'; @@ -36,8 +37,7 @@ export const approve = id => url: `${baseUrl}/approve`, method: 'post', params: { id }, - // 审批通过后同步推送合规(附件转传可达 20s+),覆盖全局 10s 超时 - timeout: 120000, + timeout: APPROVE_TIMEOUT, }); export const reject = id => diff --git a/src/api/business/hcs.js b/src/api/business/hcs.js index 740b016..e81aad0 100644 --- a/src/api/business/hcs.js +++ b/src/api/business/hcs.js @@ -69,11 +69,11 @@ export const refreshMasterData = () => timeout: 60000, }); -export const getRisk = customerCode => +export const getRisk = (customerCode, creditCode, customerName) => request({ url: `${baseUrl}/risk`, method: 'get', - params: { customerCode }, + params: { customerCode, creditCode, customerName }, timeout: 30000, }); diff --git a/src/api/business/project-change.js b/src/api/business/project-change.js index f1de353..c369a5f 100644 --- a/src/api/business/project-change.js +++ b/src/api/business/project-change.js @@ -1,4 +1,5 @@ import { createCrudApi } from './common'; +import { APPROVE_TIMEOUT } from '@/api/common'; import request from '@/axios'; const baseUrl = '/blade-transport/project-change'; @@ -35,6 +36,7 @@ export const approve = id => url: `${baseUrl}/approve`, method: 'post', params: { id }, + timeout: APPROVE_TIMEOUT, }); export const reject = id => diff --git a/src/api/common.js b/src/api/common.js index 7e03551..884286c 100644 --- a/src/api/common.js +++ b/src/api/common.js @@ -2,7 +2,7 @@ import request from '@/axios'; import { ElLoading, ElMessage } from 'element-plus'; /** 审核按钮统一超时:审批通过后可能同步推送金蝶等耗时操作,覆盖全局 10s */ -export const APPROVE_TIMEOUT = 30000; +export const APPROVE_TIMEOUT = 60 * 1000; /** * 文件流返回 diff --git a/src/api/payment/receiptClaimRecord.js b/src/api/payment/receiptClaimRecord.js index 570888d..90e8633 100644 --- a/src/api/payment/receiptClaimRecord.js +++ b/src/api/payment/receiptClaimRecord.js @@ -8,20 +8,12 @@ export const getDetail = id => request({ url: `${baseUrl}/detail`, method: 'get' export const updateAttachments = data => request({ url: `${baseUrl}/attachments`, method: 'post', data }); export const voidClaim = id => request({ url: `${baseUrl}/void`, method: 'post', params: { id } }); -export const queryKingdeeResult = () => - request({ url: `${baseUrl}/query-kingdee-result`, method: 'post' }); export const claimStatusOptions = [ { label: '已认领', value: 'claimed' }, { label: '已作废', value: 'voided' }, ]; -export const pushStatusOptions = [ - { label: '未推送', value: 'none' }, - { label: '已推送', value: 'pushed' }, - { label: '推送失败', value: 'failed' }, -]; - export const kingdeeBillStatusOptions = [ { label: '未生成', value: 'none' }, { label: '已推送', value: 'pushed' }, diff --git a/src/api/payment/receiptFlow.js b/src/api/payment/receiptFlow.js index 231e0ac..4520988 100644 --- a/src/api/payment/receiptFlow.js +++ b/src/api/payment/receiptFlow.js @@ -2,6 +2,9 @@ import request from '@/axios'; const baseUrl = '/blade-transport/receipt-flow'; +/** 收款流水同步需远程拉取金蝶收款单并逐条落库,覆盖全局 10s 超时 */ +export const SYNC_TIMEOUT = 30000; + export const getList = (current, size, params) => request({ url: `${baseUrl}/list`, method: 'get', params: { current, size, ...params } }); export const getDetail = id => request({ url: `${baseUrl}/detail`, method: 'get', params: { id } }); @@ -12,9 +15,7 @@ export const getSettlementCandidates = (keyword, flowId) => params: { keyword, flowId }, }); export const claim = data => request({ url: `${baseUrl}/claim`, method: 'post', data }); -export const sync = () => request({ url: `${baseUrl}/sync`, method: 'post' }); -export const pushKingdee = flowId => - request({ url: `${baseUrl}/push-kingdee`, method: 'post', params: { flowId } }); +export const sync = () => request({ url: `${baseUrl}/sync`, method: 'post', timeout: SYNC_TIMEOUT }); export const claimStatusOptions = [ { label: '未认领', value: 'unclaimed' }, @@ -22,12 +23,6 @@ export const claimStatusOptions = [ { label: '认领完成', value: 'claimed' }, ]; -export const pushStatusOptions = [ - { label: '未推送', value: 'none' }, - { label: '已推送', value: 'pushed' }, - { label: '推送失败', value: 'failed' }, -]; - export const kingdeeBillStatusOptions = [ { label: '已推送', value: 'pushed' }, { label: '审核通过', value: 'approved' }, diff --git a/src/api/vehicle/customer-archive.js b/src/api/vehicle/customer-archive.js index 1ccf902..150ec85 100644 --- a/src/api/vehicle/customer-archive.js +++ b/src/api/vehicle/customer-archive.js @@ -163,6 +163,42 @@ export const queryKingdeeCustomer = creditCode => { }); }; +// 金蝶供应商编码查询(A901-1):新增客商填写信用代码后即时回显 +export const querySupplierCode = creditCode => { + return request({ + url: '/blade-transport/customer-archive/query-supplier-code', + method: 'get', + timeout: 30000, + params: { + creditCode, + }, + }); +}; + +// 金蝶开户行查询(A905-3):收款信息填写开户行失焦后精确匹配带出联行号 +export const queryKingdeeBank = bankName => { + return request({ + url: '/blade-transport/customer-archive/query-bank', + method: 'get', + timeout: 30000, + params: { + bankName, + }, + }); +}; + +// 金蝶联行号校验(A905-3):收款信息保存前按联行号精确匹配,查不到不允许保存 +export const queryKingdeeBankByNumber = cnapsCode => { + return request({ + url: '/blade-transport/customer-archive/query-bank-by-number', + method: 'get', + timeout: 30000, + params: { + cnapsCode, + }, + }); +}; + export const syncKingdee = id => { return request({ url: '/blade-transport/customer-archive/sync-kingdee', diff --git a/src/option/base/measurement-unit.js b/src/option/base/measurement-unit.js index 84609cc..7a952ff 100644 --- a/src/option/base/measurement-unit.js +++ b/src/option/base/measurement-unit.js @@ -38,6 +38,7 @@ export const createOption = () => ({ delBtn: false, selection: true, dialogClickModal: false, + menuWidth: 320, menuFixed: 'right', column: [ { diff --git a/src/option/business/contract-manage.js b/src/option/business/contract-manage.js index 398391a..8285515 100644 --- a/src/option/business/contract-manage.js +++ b/src/option/business/contract-manage.js @@ -640,6 +640,15 @@ export const option = createCrudOption([ addDisplay: false, editDisplay: false, }, + { + label: '客商风险', + prop: 'customerRisk', + slot: true, + order: 189, + minWidth: 150, + addDisplay: false, + editDisplay: false, + }, { label: '金蝶合同ID', prop: 'kingdeeId', diff --git a/src/option/payment/paymentApplication.js b/src/option/payment/paymentApplication.js index 65494a3..9a74a22 100644 --- a/src/option/payment/paymentApplication.js +++ b/src/option/payment/paymentApplication.js @@ -169,7 +169,7 @@ export const paymentApplicationOption = ({ { label: '当前节点', prop: 'currentNode', minWidth: 120, formatter: textFormatter }, { label: '当前处理人', prop: 'currentProcessor', minWidth: 120, formatter: textFormatter }, { label: '金蝶单据号', prop: 'kingdeeBillNo', minWidth: 130, formatter: textFormatter }, - { label: '金蝶单据状态', prop: 'kingdeeStatusName', minWidth: 130, formatter: textFormatter }, + { label: '金蝶单据状态', prop: 'kingdeeStatusName', slot: true, minWidth: 130 }, { label: '金蝶锁状态', prop: 'kingdeeLockStatus', slot: true, minWidth: 150 }, { label: '附件同步', prop: 'attachmentSyncStatusName', minWidth: 100, formatter: textFormatter }, ], diff --git a/src/option/payment/receiptClaimRecord.js b/src/option/payment/receiptClaimRecord.js index d1f1d96..c445762 100644 --- a/src/option/payment/receiptClaimRecord.js +++ b/src/option/payment/receiptClaimRecord.js @@ -1,7 +1,7 @@ export const receiptClaimRecordTableColumns = [ - { prop: 'receiptNoticeNo', label: '认领通知单', minWidth: 150, link: true }, + { prop: 'receiptNoticeNo', label: '收款单号', minWidth: 150, link: true }, { prop: 'payerName', label: '付款人', minWidth: 130 }, - { prop: 'receiptAmount', label: '付款金额', minWidth: 130, money: true }, + { prop: 'receiptAmount', label: '收款金额', minWidth: 130, money: true }, { prop: 'counterpartyName', label: '对方户名', minWidth: 150 }, { prop: 'counterpartyAccount', label: '对方账号', minWidth: 170 }, { prop: 'counterpartyBank', label: '对方开户行', minWidth: 150 }, diff --git a/src/option/payment/receiptFlow.js b/src/option/payment/receiptFlow.js index 983f4a1..ff2ac33 100644 --- a/src/option/payment/receiptFlow.js +++ b/src/option/payment/receiptFlow.js @@ -1,18 +1,23 @@ export const receiptFlowTableColumns = [ - { prop: 'receiptNoticeNo', label: '认领通知单', minWidth: 150, link: true }, + { prop: 'receiptNoticeNo', label: '收款单号', minWidth: 150, link: true }, { prop: 'payerName', label: '付款人', minWidth: 130 }, - { prop: 'receiptAmount', label: '付款金额', minWidth: 130, money: true }, + { prop: 'receiptAmount', label: '收款金额', minWidth: 130, money: true }, { prop: 'counterpartyName', label: '对方户名', minWidth: 150 }, { prop: 'counterpartyAccount', label: '对方账号', minWidth: 170 }, { prop: 'counterpartyBank', label: '对方开户行', minWidth: 150 }, + { prop: 'payeeName', label: '收款人(公司)', minWidth: 150 }, + //{ prop: 'orgNumber', label: '收款公司编码', minWidth: 130 }, + //{ prop: 'openOrgNumber', label: '核算组织编码', minWidth: 130 }, { prop: 'summary', label: '摘要', minWidth: 160 }, { prop: 'transactionTime', label: '交易时间', minWidth: 170 }, { prop: 'claimStatusName', label: '认领状态', minWidth: 110, status: true }, - { prop: 'kingdeeClaimStatusName', label: '公告状态', minWidth: 110 }, { prop: 'claimedAmount', label: '已认领金额', minWidth: 130, money: true }, - { prop: 'unclaimedAmount', label: '金蝶未认领金额', minWidth: 140, money: true }, - { prop: 'pushStatusName', label: '推送状态', minWidth: 110, status: true }, - { prop: 'pushFailReason', label: '推送失败原因', minWidth: 160 }, - { prop: 'kingdeeBillNo', label: '金蝶收款单号', minWidth: 150 }, + { prop: 'remainingAmount', label: '剩余可认领金额', minWidth: 140, money: true }, + { prop: 'unmatchAmountRec', label: '未匹配金额', minWidth: 140, money: true }, + //{ prop: 'matchAmountRec', label: '已匹配收款金额', minWidth: 140, money: true }, + //{ prop: 'matchAmountPay', label: '已匹配付款金额', minWidth: 140, money: true }, + //{ prop: 'unmatchAmountPay', label: '未匹配付款金额', minWidth: 140, money: true }, + //{ prop: 'settleAmount', label: '已结算金额', minWidth: 130, money: true }, + //{ prop: 'unsettleAmount', label: '未结算金额', minWidth: 130, money: true }, { prop: 'kingdeeBillStatusName', label: '金蝶状态', minWidth: 110 }, ]; diff --git a/src/option/settlement/formalSettlement.js b/src/option/settlement/formalSettlement.js index e9523be..6a0e213 100644 --- a/src/option/settlement/formalSettlement.js +++ b/src/option/settlement/formalSettlement.js @@ -16,6 +16,7 @@ import { approvalStatusOptions, invoiceStatusOptions, kingdeeSyncStatusOptions, + kingdeeWriteOffStatusOptions, paymentStatusOptions, } from './formalSettlementSearch'; import { formalSettlementTableColumns } from './formalSettlementTable'; @@ -87,6 +88,7 @@ const COLUMN_EXTRA = { searchPlaceholder: '请选择', }, kingdeeLockStatus: { slot: true }, + kingdeeWriteOffStatus: { slot: true }, createTime: { width: 180 }, }; @@ -99,7 +101,8 @@ const buildTableColumns = () => } // link / status 标记的列统一走单元格插槽 if (column.link || column.status) extra.slot = true; - if (!extra.formatter) extra.formatter = textFormatter; + // 插槽列不挂兜底 formatter:avue 中 formatter 会覆盖单元格插槽渲染 + if (!extra.slot && !extra.formatter) extra.formatter = textFormatter; return { ...column, ...extra }; }); @@ -170,4 +173,5 @@ export const formalSettlementOption = () => ({ }); export const kingdeeSyncName = value => pickLabel(kingdeeSyncStatusOptions, value); +export const kingdeeWriteOffName = value => pickLabel(kingdeeWriteOffStatusOptions, value); export const paymentStatusName = value => pickLabel(paymentStatusOptions, value); diff --git a/src/option/settlement/formalSettlementSearch.js b/src/option/settlement/formalSettlementSearch.js index cd4d811..cd4805f 100644 --- a/src/option/settlement/formalSettlementSearch.js +++ b/src/option/settlement/formalSettlementSearch.js @@ -34,6 +34,11 @@ export const kingdeeSyncStatusOptions = [ { label: '同步失败', value: 'failed' }, ]; +export const kingdeeWriteOffStatusOptions = [ + { label: '未冲销', value: 'unwrittenoff' }, + { label: '已冲销', value: 'writtenoff' }, +]; + export const formalSettlementSearchFields = [ { label: '结算单号', prop: 'formalSettlementNo', type: 'input' }, { label: '预付结算单号', prop: 'preSettlementNo', type: 'input' }, diff --git a/src/option/settlement/formalSettlementTable.js b/src/option/settlement/formalSettlementTable.js index 93393b9..117ae86 100644 --- a/src/option/settlement/formalSettlementTable.js +++ b/src/option/settlement/formalSettlementTable.js @@ -25,6 +25,7 @@ export const formalSettlementTableColumns = [ { label: '来源原单号', prop: 'originFormalSettlementNo', minWidth: 170 }, { label: '金蝶单据号', prop: 'kingdeeBillNo', minWidth: 150 }, { label: '金蝶单据状态', prop: 'kingdeeSyncStatus', minWidth: 135 }, + { label: '金蝶冲销状态', prop: 'kingdeeWriteOffStatus', minWidth: 135 }, { label: '金蝶锁状态', prop: 'kingdeeLockStatus', minWidth: 150 }, { label: '附件同步', prop: 'attachmentSyncStatusName', minWidth: 100 }, { label: '创建人', prop: 'createUserName', minWidth: 110 }, diff --git a/src/utils/kingdee.js b/src/utils/kingdee.js new file mode 100644 index 0000000..4a4f6ab --- /dev/null +++ b/src/utils/kingdee.js @@ -0,0 +1,24 @@ +/** + * 金蝶单据状态公共映射 + */ + +/** 金蝶单据状态 → el-tag 颜色类型(failed 状态列表页悬浮展示失败原因) */ +export const KINGDEE_STATUS_TAG_TYPES = { + synced: 'success', + paid: 'success', + invoiced: 'success', + paying: 'warning', + failed: 'danger', +}; + +/** 金蝶单据状态 → el-tag 颜色类型,未映射状态返回 info */ +export const kingdeeStatusType = status => KINGDEE_STATUS_TAG_TYPES[status] || 'info'; + +/** 金蝶冲销状态 → el-tag 颜色类型(已冲销=绿、未冲销=黄) */ +export const KINGDEE_WRITEOFF_TAG_TYPES = { + writtenoff: 'success', + unwrittenoff: 'warning', +}; + +/** 金蝶冲销状态 → el-tag 颜色类型,未映射状态(null=未校验)返回 info */ +export const kingdeeWriteOffTagType = status => KINGDEE_WRITEOFF_TAG_TYPES[status] || 'info'; diff --git a/src/utils/risk-display.js b/src/utils/risk-display.js new file mode 100644 index 0000000..224e92f --- /dev/null +++ b/src/utils/risk-display.js @@ -0,0 +1,28 @@ +/** + * 客商/合同风险标签公共展示逻辑(黑名单=金蝶黑名单 A801-5 命中,与后端 HcsCreditCheckSupport 口径一致): + * 等级与黑名单组合展示、等级在前;内部组织客商默认无风险 + */ + +/** 金蝶黑名单命中判定(客商档案行:失信类别/列入事由任一非空) */ +export function isKingdeeBlack(category, reason) { + return !!(category || reason); +} + +/** 合同行黑名单判定(推送链路按金蝶命中口径落库 kingdeeBlackStatus=yes) */ +export function isContractBlack(blackStatus) { + return String(blackStatus || '').toLowerCase() === 'yes'; +} + +/** 风险标签文案:riskLevel=C101-1 等级(0/1/2);isBlack=金蝶黑名单命中;customerKind=internal 显示"无风险" */ +export function resolveRiskTagName(riskLevel, isBlack, customerKind) { + const levelName = { 2: '高风险', 1: '中风险', 0: '低风险' }[riskLevel] || ''; + if (isBlack) return levelName ? `${levelName}、黑名单` : '黑名单'; + if (levelName) return levelName; + if (customerKind === 'internal') return '无风险'; + return ''; +} + +/** 是否红色风险标签(黑名单命中或高风险) */ +export function isRiskyTag(riskLevel, isBlack) { + return isBlack || riskLevel === '2'; +} diff --git a/src/views/base/airport-master.vue b/src/views/base/airport-master.vue index 9969378..6a99afa 100644 --- a/src/views/base/airport-master.vue +++ b/src/views/base/airport-master.vue @@ -60,6 +60,13 @@