feat: 结算调整单接入金蝶列表展示与冲销预检
This commit is contained in:
@@ -17,6 +17,10 @@ export const approve = id => request({ url: `${baseUrl}/approve`, method: 'post'
|
|||||||
export const returnBill = (id, reason) =>
|
export const returnBill = (id, reason) =>
|
||||||
request({ url: `${baseUrl}/return`, method: 'post', data: { id, reason } });
|
request({ url: `${baseUrl}/return`, method: 'post', data: { id, reason } });
|
||||||
export const repush = id => request({ url: `${baseUrl}/repush`, method: 'post', params: { id } });
|
export const repush = id => request({ url: `${baseUrl}/repush`, method: 'post', params: { id } });
|
||||||
|
export const syncKingdee = id =>
|
||||||
|
request({ url: `${baseUrl}/sync-kingdee`, method: 'post', timeout: 30000, params: { id } });
|
||||||
|
export const kingdeeWriteOffPrecheck = formalSettlementId =>
|
||||||
|
request({ url: `${baseUrl}/kingdee-writeoff-precheck`, method: 'get', params: { formalSettlementId } });
|
||||||
|
|
||||||
export const approvalStatusOptions = [
|
export const approvalStatusOptions = [
|
||||||
{ label: '草稿', value: 'draft' },
|
{ label: '草稿', value: 'draft' },
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ export const settlementAdjustmentTableColumns = [
|
|||||||
{ label: '合同名称', prop: 'contractName', minWidth: 170 },
|
{ label: '合同名称', prop: 'contractName', minWidth: 170 },
|
||||||
{ label: '调整金额', prop: 'adjustmentAmount', minWidth: 130, money: true },
|
{ label: '调整金额', prop: 'adjustmentAmount', minWidth: 130, money: true },
|
||||||
{ label: '审核状态', prop: 'approvalStatusName', minWidth: 110, status: true },
|
{ label: '审核状态', prop: 'approvalStatusName', minWidth: 110, status: true },
|
||||||
|
{ label: '金蝶单据状态', prop: 'kingdeeSyncStatus', minWidth: 130, kingdee: true },
|
||||||
|
{ label: '金蝶单据号', prop: 'kingdeeBillNo', minWidth: 150 },
|
||||||
{ label: '当前节点', prop: 'currentNode', minWidth: 120 },
|
{ label: '当前节点', prop: 'currentNode', minWidth: 120 },
|
||||||
{ label: '当前处理人', prop: 'currentProcessor', minWidth: 130 },
|
{ label: '当前处理人', prop: 'currentProcessor', minWidth: 130 },
|
||||||
{ label: '创建人', prop: 'createUserName', minWidth: 110 },
|
{ label: '创建人', prop: 'createUserName', minWidth: 110 },
|
||||||
|
|||||||
@@ -414,6 +414,8 @@ export default {
|
|||||||
});
|
});
|
||||||
this.details = [];
|
this.details = [];
|
||||||
this.recalculate();
|
this.recalculate();
|
||||||
|
// 金蝶冲销预检:软提示,不阻断建单(金蝶不可用时静默降级)
|
||||||
|
this.precheckWriteOff(formalSettlementId);
|
||||||
this.loading = true;
|
this.loading = true;
|
||||||
try {
|
try {
|
||||||
const { data } = await api.getFormalDetails(formalSettlementId);
|
const { data } = await api.getFormalDetails(formalSettlementId);
|
||||||
@@ -431,6 +433,19 @@ export default {
|
|||||||
this.loading = false;
|
this.loading = false;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
async precheckWriteOff(formalSettlementId) {
|
||||||
|
try {
|
||||||
|
const { data } = await api.kingdeeWriteOffPrecheck(formalSettlementId);
|
||||||
|
if (String(this.form.formalSettlementId) !== String(formalSettlementId)) return;
|
||||||
|
const result = data?.data || data || {};
|
||||||
|
if (!result.message) return;
|
||||||
|
if (result.syncStatus === 'synced' && result.writtenOff === false)
|
||||||
|
this.$message.warning(result.message);
|
||||||
|
else this.$message.info(result.message);
|
||||||
|
} catch (error) {
|
||||||
|
// 预检软提示:金蝶查询失败静默降级,不阻断建单
|
||||||
|
}
|
||||||
|
},
|
||||||
addFeeRow() {
|
addFeeRow() {
|
||||||
this.details.push({
|
this.details.push({
|
||||||
formalSettlementDetailId: null,
|
formalSettlementDetailId: null,
|
||||||
|
|||||||
@@ -93,11 +93,16 @@
|
|||||||
><el-tag v-else-if="column.status" :type="statusType(row.approvalStatus)" class="status-text">{{
|
><el-tag v-else-if="column.status" :type="statusType(row.approvalStatus)" class="status-text">{{
|
||||||
row[column.prop] || '-'
|
row[column.prop] || '-'
|
||||||
}}</el-tag
|
}}</el-tag
|
||||||
|
><el-tag
|
||||||
|
v-else-if="column.kingdee"
|
||||||
|
:type="kingdeeStatusType(row.kingdeeSyncStatus)"
|
||||||
|
class="status-text"
|
||||||
|
>{{ kingdeeSyncName(row.kingdeeSyncStatus) }}</el-tag
|
||||||
><span v-else-if="column.money">{{ formatMoney(row[column.prop]) }}</span
|
><span v-else-if="column.money">{{ formatMoney(row[column.prop]) }}</span
|
||||||
><span v-else>{{ displayValue(row[column.prop]) }}</span></template
|
><span v-else>{{ displayValue(row[column.prop]) }}</span></template
|
||||||
></el-table-column
|
></el-table-column
|
||||||
>
|
>
|
||||||
<el-table-column label="操作" width="120" fixed="right" align="center"
|
<el-table-column label="操作" width="320" fixed="right" align="center"
|
||||||
><template #default="{ row }"
|
><template #default="{ row }"
|
||||||
><div class="settlement-adjustment-page__links">
|
><div class="settlement-adjustment-page__links">
|
||||||
<el-link
|
<el-link
|
||||||
@@ -138,6 +143,15 @@
|
|||||||
type="danger"
|
type="danger"
|
||||||
@click="handleReturn(row)"
|
@click="handleReturn(row)"
|
||||||
>驳回</el-link
|
>驳回</el-link
|
||||||
|
><el-link
|
||||||
|
v-if="
|
||||||
|
hasPermission('settlement_adjustment_sync') &&
|
||||||
|
row.approvalStatus === 'approved' &&
|
||||||
|
row.kingdeeSyncStatus !== 'synced'
|
||||||
|
"
|
||||||
|
type="primary"
|
||||||
|
@click="handleSyncKingdee(row)"
|
||||||
|
>推送金蝶</el-link
|
||||||
><el-link
|
><el-link
|
||||||
v-if="
|
v-if="
|
||||||
hasPermission('settlement_adjustment_repush') &&
|
hasPermission('settlement_adjustment_repush') &&
|
||||||
@@ -180,6 +194,7 @@ import * as api from '@/api/settlement/settlementAdjustment';
|
|||||||
import { settlementAdjustmentSearchFields } from '@/option/settlement/settlementAdjustmentSearch';
|
import { settlementAdjustmentSearchFields } from '@/option/settlement/settlementAdjustmentSearch';
|
||||||
import organizationSearch from '@/mixins/organization-search';
|
import organizationSearch from '@/mixins/organization-search';
|
||||||
import { settlementAdjustmentTableColumns } from '@/option/settlement/settlementAdjustmentTable';
|
import { settlementAdjustmentTableColumns } from '@/option/settlement/settlementAdjustmentTable';
|
||||||
|
import { kingdeeSyncStatusOptions } from '@/option/settlement/formalSettlementSearch';
|
||||||
import SettlementAdjustmentEditor from './components/settlement-adjustment-editor.vue';
|
import SettlementAdjustmentEditor from './components/settlement-adjustment-editor.vue';
|
||||||
import SettlementTableTools from './components/settlement-table-tools.vue';
|
import SettlementTableTools from './components/settlement-table-tools.vue';
|
||||||
import { isAdministrator } from '@/utils/auth';
|
import { isAdministrator } from '@/utils/auth';
|
||||||
@@ -300,12 +315,10 @@ export default {
|
|||||||
},
|
},
|
||||||
async handleApprove(row) {
|
async handleApprove(row) {
|
||||||
await this.$confirm('审批通过后将更新关联正式结算单,确认继续?', '提示');
|
await this.$confirm('审批通过后将更新关联正式结算单,确认继续?', '提示');
|
||||||
await api.approve(row.id);
|
const res = await api.approve(row.id);
|
||||||
if (row.kingdeeSyncStatus === 'synced')
|
// data=false:自动同步金蝶失败;data=true 且 msg 带已推送场景的手工冲销提示
|
||||||
this.$message.warning(
|
if (res.data.data === true || res.data.data === false) this.$message.warning(res.data.msg);
|
||||||
'调整已生效,本地已更新;原结算单已推送金蝶,请财务先手工冲销旧应付单后再重新推送。'
|
else this.$message.success(res.data.msg || '审批通过');
|
||||||
);
|
|
||||||
else this.$message.success('审批通过');
|
|
||||||
this.loadTable();
|
this.loadTable();
|
||||||
},
|
},
|
||||||
async handleReturn(row) {
|
async handleReturn(row) {
|
||||||
@@ -317,14 +330,19 @@ export default {
|
|||||||
this.$message.success('已驳回');
|
this.$message.success('已驳回');
|
||||||
this.loadTable();
|
this.loadTable();
|
||||||
},
|
},
|
||||||
|
async handleSyncKingdee(row) {
|
||||||
|
const res = await api.syncKingdee(row.id);
|
||||||
|
this.$message.success(`已推送金蝶:${res.data.data || '-'}`);
|
||||||
|
this.loadTable();
|
||||||
|
},
|
||||||
async handleRepush(row) {
|
async handleRepush(row) {
|
||||||
await this.$confirm(
|
await this.$confirm(
|
||||||
'请确认金蝶旧应付单已由财务手工冲销,继续将生成全新财务应付单。',
|
'请确认金蝶旧应付/应收单已由财务手工冲销,继续将生成全新财务应付/应收单。',
|
||||||
'高危操作确认',
|
'高危操作确认',
|
||||||
{ type: 'warning', confirmButtonText: '确认重新推送' }
|
{ type: 'warning', confirmButtonText: '确认重新推送' }
|
||||||
);
|
);
|
||||||
const { data } = await api.repush(row.id);
|
const { data } = await api.repush(row.id);
|
||||||
this.$message.success(`已生成新金蝶应付单:${data?.data || data || '-'}`);
|
this.$message.success(`已生成新金蝶单据:${data?.data || data || '-'}`);
|
||||||
this.loadTable();
|
this.loadTable();
|
||||||
},
|
},
|
||||||
statusType(status) {
|
statusType(status) {
|
||||||
@@ -333,6 +351,12 @@ export default {
|
|||||||
'info'
|
'info'
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
kingdeeStatusType(status) {
|
||||||
|
return { synced: 'success', failed: 'danger' }[status] || 'info';
|
||||||
|
},
|
||||||
|
kingdeeSyncName(value) {
|
||||||
|
return kingdeeSyncStatusOptions.find(item => item.value === value)?.label || value || '-';
|
||||||
|
},
|
||||||
displayValue(value) {
|
displayValue(value) {
|
||||||
return value === null || value === undefined || value === '' ? '-' : value;
|
return value === null || value === undefined || value === '' ? '-' : value;
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user