Merge pull request '金蝶单据状态着色并悬浮展示失败原因+认领流水认领记录的改造' (#9) from feature/20261027-hcs-bif-all-web into master

Reviewed-on: #9
This commit was merged in pull request #9.
This commit is contained in:
2026-11-04 16:33:35 +08:00
23 changed files with 460 additions and 101 deletions
@@ -708,7 +708,9 @@
:rows="changeRecordDetailRows"
/>
<template v-if="!pageMode" #footer>
<el-button v-if="editable" @click="handleSyncPlaceholder">同步</el-button>
<el-button v-if="canSync" type="primary" plain :loading="syncLoading" @click="handleSync"
>同步</el-button
>
<el-button @click="visible = false">取消</el-button>
<el-button
v-if="editable"
@@ -724,7 +726,9 @@
>
</template>
<div v-if="pageMode && !publicMode" class="formal-editor__page-actions">
<el-button v-if="editable" @click="handleSyncPlaceholder">同步</el-button>
<el-button v-if="canSync" type="primary" plain :loading="syncLoading" @click="handleSync"
>同步</el-button
>
<el-button @click="visible = false">取消</el-button>
<el-button
v-if="editable"
@@ -1051,6 +1055,7 @@ import {
claimInvoices as claimInvoicesApi,
queryInvoicePool,
save,
syncKingdee,
} from '@/api/settlement/formalSettlement';
import {
getDetail as getPreSettlementDetail,
@@ -1128,6 +1133,7 @@ export default {
loading: false,
draftSaving: false,
saving: false,
syncLoading: false,
form: createFormalSettlementForm(),
sources: [],
details: [],
@@ -1271,6 +1277,16 @@ export default {
editable() {
return !this.readonly;
},
// 查看页面「同步」按钮:仅已审批且未同步金蝶(含推送失败)的单据显示,口径与后端推送闸门一致
canSync() {
return (
this.readonly &&
!this.publicMode &&
this.hasPermission('sync') &&
this.form.approvalStatus === 'approved' &&
this.form.kingdeeSyncStatus !== 'synced'
);
},
isAdmin() {
return isAdministrator(this.userInfo);
},
@@ -2887,8 +2903,30 @@ export default {
remark: this.form.remark,
};
},
handleSyncPlaceholder() {
this.$message.info('开发中');
// 查看页面单张推送金蝶(A102-2/A302-2):结果与异常原因弹框展示,成败后均刷新详情与列表
async handleSync() {
if (this.syncLoading) return;
this.syncLoading = true;
try {
const res = await syncKingdee(this.form.id, { meta: { suppressErrorMessage: true } });
await this.loadFormalDetail(this.recordId);
this.$emit('success');
let message = `同步成功:${this.unwrapData(res) || '-'}`;
if (['pending', 'partial'].includes(this.form.attachmentSyncStatus)) {
message += '\n该单附件未全部上传,可重推补传';
}
await this.$alert(message, '同步结果', { type: 'success', confirmButtonText: '知道了' });
} catch (error) {
const reason = String(error?.message || error || '未知错误').trim() || '未知错误';
await this.loadFormalDetail(this.recordId);
this.$emit('success');
await this.$alert(`同步失败,${reason}`, '同步结果', {
type: 'error',
confirmButtonText: '知道了',
});
} finally {
this.syncLoading = false;
}
},
async handleDraftSave() {
// 保存草稿:不做表单校验,直接落草稿并返回列表刷新
@@ -60,7 +60,17 @@
}}</el-tag>
</template>
<template #kingdeeSyncStatus="{ row }">{{ kingdeeSyncName(row.kingdeeSyncStatus) }}</template>
<template #kingdeeSyncStatus="{ row }">
<el-tooltip
:disabled="row.kingdeeSyncStatus !== 'failed'"
:content="row.kingdeeFailReason || '推送金蝶失败,可点击「同步金蝶」重试'"
placement="top"
>
<el-tag :type="kingdeeStatusType(row.kingdeeSyncStatus)">{{
kingdeeSyncName(row.kingdeeSyncStatus)
}}</el-tag>
</el-tooltip>
</template>
<template #kingdeeLockStatus="{ row }">
<el-tooltip v-if="lockTag(row).show" :content="lockTag(row).tip" placement="top">
@@ -84,6 +94,7 @@
<script>
import { invoiceStatusName } from '@/option/settlement/formalSettlementSearch';
import { kingdeeSyncName, paymentStatusName } from '@/option/settlement/formalSettlement';
import { kingdeeStatusType } from '@/utils/kingdee';
export default {
name: 'FormalSettlementTablePanel',
@@ -186,6 +197,7 @@ export default {
''
);
},
kingdeeStatusType,
invoiceName(value, settlementType) {
return invoiceStatusName(value, settlementType);
},
@@ -507,6 +507,8 @@ export default {
const rows = this.selection;
if (rows.some(row => row.approvalStatus !== 'approved' || row.settlementType !== 'payable'))
return this.$message.warning('仅审批通过的付款结算单允许发起付款申请');
if (rows.some(row => row.adjustStatus === 'adjusted'))
return this.$message.warning('已调整的结算单不可再发起付款,请使用调整后的新单');
const contractIds = new Set(rows.map(row => String(row.contractId || '')));
if (contractIds.size !== 1 || contractIds.has(''))
return this.$message.warning('付款申请必须选择同一个合同的付款结算单');
@@ -93,11 +93,15 @@
><el-tag v-else-if="column.status" :type="statusType(row.approvalStatus)" class="status-text">{{
row[column.prop] || '-'
}}</el-tag
><el-tag
><el-tooltip
v-else-if="column.kingdee"
:disabled="row.kingdeeSyncStatus !== 'failed'"
:content="row.kingdeeFailReason || '推送金蝶失败,请重试'"
placement="top"
><el-tag
:type="kingdeeStatusType(row.kingdeeSyncStatus)"
class="status-text"
>{{ kingdeeSyncName(row.kingdeeSyncStatus) }}</el-tag
></el-tooltip
><span v-else-if="column.money">{{ formatMoney(row[column.prop]) }}</span
><span v-else>{{ displayValue(row[column.prop]) }}</span></template
></el-table-column
@@ -182,6 +186,7 @@ import { settlementAdjustmentSearchFields } from '@/option/settlement/settlement
import organizationSearch from '@/mixins/organization-search';
import { settlementAdjustmentTableColumns } from '@/option/settlement/settlementAdjustmentTable';
import { kingdeeSyncStatusOptions } from '@/option/settlement/formalSettlementSearch';
import { kingdeeStatusType } from '@/utils/kingdee';
import SettlementAdjustmentEditor from './components/settlement-adjustment-editor.vue';
import SettlementTableTools from './components/settlement-table-tools.vue';
import { isAdministrator } from '@/utils/auth';
@@ -369,9 +374,7 @@ export default {
'info'
);
},
kingdeeStatusType(status) {
return { synced: 'success', failed: 'danger' }[status] || 'info';
},
kingdeeStatusType,
kingdeeSyncName(value) {
return kingdeeSyncStatusOptions.find(item => item.value === value)?.label || value || '-';
},