修复合同到期时间与终止恢复规则
- 合同动作中文化并将到期时间设为必填\n- 隐藏修订记录无业务意义的删除时间\n- 禁止已终止合同直接启用,统一三端状态规则\n- 补充回归测试、模拟数据回填和中文文档
This commit is contained in:
@@ -17,6 +17,7 @@ const ruleSource = readFileSync(resolve(root, 'src/api/resource-page-rules.ts'),
|
||||
const listSource = readFileSync(resolve(root, 'src/views/shared/CrudListPage.vue'), 'utf8');
|
||||
const detailSource = readFileSync(resolve(root, 'src/views/resource/ResourceDetailContent.vue'), 'utf8');
|
||||
const displaySource = readFileSync(resolve(root, 'src/api/resource-display.ts'), 'utf8');
|
||||
const resourceSource = readFileSync(resolve(root, 'src/api/resources.ts'), 'utf8');
|
||||
const treeResources = new Set(['ec_category', 'platform_menu']);
|
||||
const listResources = contract.resources.filter((item) => !treeResources.has(item.name));
|
||||
const createModes = new Set(['writable', 'editable', 'append_only', 'managed']);
|
||||
@@ -59,9 +60,18 @@ for (const marker of [
|
||||
"product_info_identity: '气瓶唯一标识'",
|
||||
"product_code: '气瓶编码'",
|
||||
"if (key === 'contract_status') return contractStatusLabel(Number(value))",
|
||||
"terminate: '终止合同'",
|
||||
"key === 'expired_at'",
|
||||
"return '待补录'",
|
||||
]) {
|
||||
if (!displaySource.includes(marker)) fail(`合同详情中文展示缺少 ${marker}`);
|
||||
}
|
||||
if (!resourceSource.includes("visibleFor: { field: 'contract_status', values: [0] }")) {
|
||||
fail('合同启用动作未限制为草稿状态');
|
||||
}
|
||||
if (!detailSource.includes("!['deleted_at', 'DeletedAt'].includes(column)")) {
|
||||
fail('聚合详情表未隐藏公共软删除字段');
|
||||
}
|
||||
for (const marker of [
|
||||
"Number(row.contract_status) !== 0",
|
||||
"![0, 1].includes(Number(row.status))",
|
||||
|
||||
@@ -175,10 +175,21 @@ function relationLabel(
|
||||
|
||||
/** 格式化不依赖字段定义的通用值。 */
|
||||
export function displayRawValue(key: string, value: unknown) {
|
||||
// 历史合同可能缺少到期时间,明确提示补录,避免将数据缺失误认为无期限合同。
|
||||
if (key === 'expired_at' && (value == null || value === '')) return '待补录';
|
||||
if (value == null || value === '') return '-';
|
||||
if (typeof value === 'boolean') return value ? '是' : '否';
|
||||
if (key === 'status') return recordStatusLabel(Number(value));
|
||||
if (key === 'contract_status') return contractStatusLabel(Number(value));
|
||||
if (key === 'action') {
|
||||
return (
|
||||
{
|
||||
activate: '启用合同',
|
||||
renew: '续签合同',
|
||||
terminate: '终止合同',
|
||||
}[String(value)] ?? `未知动作(${String(value)})`
|
||||
);
|
||||
}
|
||||
if (
|
||||
amountKeys.has(key) ||
|
||||
key.endsWith('_amount') ||
|
||||
|
||||
@@ -464,10 +464,10 @@ export const resources: ResourceUiDefinition[] = [
|
||||
f('title', { required: true }), f('terms'),
|
||||
f('file_uri', { label: '合同附件', type: 'contract-file' }),
|
||||
f('default_delivery_fee'),
|
||||
f('signed_at', { required: true }), f('effective_at', { required: true }), f('expired_at'),
|
||||
f('signed_at', { required: true }), f('effective_at', { required: true }), f('expired_at', { required: true, emptyText: '待补录' }),
|
||||
], 'list', [
|
||||
{ name: '启用合同', resource: '/gasorder_contract/:identity/activate', fields: reason, visibleFor: { field: 'contract_status', values: [0, 13] } },
|
||||
{ name: '续签合同', resource: '/gasorder_contract/:identity/renew', fields: [f('effective_at', { required: true }), f('expired_at'), ...reason], visibleFor: { field: 'contract_status', values: [11, 12] } },
|
||||
{ name: '启用合同', resource: '/gasorder_contract/:identity/activate', fields: reason, visibleFor: { field: 'contract_status', values: [0] } },
|
||||
{ name: '续签合同', resource: '/gasorder_contract/:identity/renew', fields: [f('effective_at', { required: true }), f('expired_at', { required: true }), ...reason], visibleFor: { field: 'contract_status', values: [11, 12] } },
|
||||
{ name: '终止合同', resource: '/gasorder_contract/:identity/terminate', danger: true, fields: reason, visibleFor: { field: 'contract_status', values: [11] } },
|
||||
], { canCreate: true, canEdit: true }),
|
||||
define('gasorder_contract_product', '合同气瓶', 'append_only', [relation('gasorder_contract_identity', '/gasorder_contract', true, {
|
||||
|
||||
@@ -147,7 +147,11 @@ const collections = computed(() =>
|
||||
...new Set(
|
||||
rows.flatMap((row) =>
|
||||
Object.keys(row).filter(
|
||||
(column) => column !== 'id' && !column.endsWith('_id'),
|
||||
// 聚合事实表不展示公共软删除元数据,避免只读修订记录出现无业务意义的“删除时间”。
|
||||
(column) =>
|
||||
column !== 'id' &&
|
||||
!column.endsWith('_id') &&
|
||||
!['deleted_at', 'DeletedAt'].includes(column),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user