完善配送订单列表可读信息

This commit is contained in:
czl231
2026-08-25 23:32:58 +08:00
parent 59a01192c0
commit 44014a0e4f
7 changed files with 154 additions and 11 deletions

View File

@@ -138,5 +138,9 @@ assert(recordPage.includes('if (saving.value) return'), '订单保存缺少显
assert(orderCreation.includes('productAmount + deliveryFee - discountAmount'), '订单金额预估公式不正确');
assert(orderCreation.includes("优惠金额必须小于商品金额与配送费之和"), '优惠金额缺少应付金额正数校验');
assert(orderPreview.includes('金额仅供预览'), '订单金额预估未声明服务端最终计算');
assert(definitions.includes("listDisplayKey: 'address'"), '订单列表收货地址未使用受控地址快照');
assert(definitions.includes("listDisplayKey: 'contract_products_summary'"), '订单列表合同气瓶未使用可读摘要');
assert(listPage.includes('function displayListField'), '资源列表未支持后端派生展示字段');
assert(listPage.includes('field.listDetailLink'), '订单气瓶摘要缺少详情入口');
console.log(`独立资源页面契约通过:详情 ${listResources.length},新建 ${creatable.size},编辑 ${editable.size}`);

View File

@@ -49,6 +49,10 @@ export type ResourceField = {
listCopyable?: boolean;
/** 关联选项优先展示的业务字段。 */
relationOptionLabelKey?: string;
/** 列表使用后端派生的只读展示字段,不改变提交字段。 */
listDisplayKey?: string;
/** 列表摘要可直接进入当前记录详情。 */
listDetailLink?: boolean;
/** 合同气瓶等关系的组合展示方式。 */
relationOptionDisplay?: 'product-name-type';
/** 为默认候选追加中文标识,并在加载完成后自动选择。 */
@@ -564,6 +568,9 @@ const deliveryOverrides: ResourceUiDefinition[] = [
}),
relation('user_address_identity', '/user_address', true, {
label: '收货地址',
listDisplayKey: 'address',
listDetailLink: false,
emptyText: '未填写',
placeholder: '请先选择配送合同,再选择该合同用户的收货地址',
relationOptionLabelKey: 'address',
relationOptionDefaultKey: 'is_default',
@@ -581,6 +588,9 @@ const deliveryOverrides: ResourceUiDefinition[] = [
required: true,
type: 'identity-list',
relation: '/gasorder_contract_product',
listDisplayKey: 'contract_products_summary',
listDetailLink: true,
emptyText: '未填写',
placeholder: '请输入智能气阀名称、气瓶类型或气瓶编码搜索',
relationOptionDisplay: 'product-name-type',
relationEmptyText: '该合同暂无可用气瓶,请先为合同绑定气瓶',

View File

@@ -1,4 +1,4 @@
<!-- 功能描述展示配送点标准资源列表并导航到独立记录页版本v1.1.0 -->
<!-- 功能描述展示配送点标准资源列表并导航到独立记录页版本v1.2.0 -->
<template>
<a-card :title="listTitle" :bordered="false">
<template v-if="isCredentialList" #extra>
@@ -75,11 +75,15 @@
@click="previewListContractAttachment(record)"
>查看附件</a-button>
<span v-else-if="field.type === 'contract-file'">暂无附件</span>
<a-link v-else-if="field.listDetailLink" @click="openRecord('detail', record)">
{{ displayListField(field, record) }}
</a-link>
<template v-else-if="field.listDisplayKey">{{ displayListField(field, record) }}</template>
<IdentityText
v-else-if="(field.type === 'identity' || field.listCopyable) && fieldValue(field, record)"
:value="fieldValue(field, record)"
/>
<template v-else>{{ displayResourceValue(definition, field.key, record[field.key] ?? record[`${field.key}_masked`]) }}</template>
<template v-else>{{ displayListField(field, record) }}</template>
</template>
</a-table-column>
<a-table-column title="状态" :width="100">
@@ -245,6 +249,19 @@ function fieldValue(field: ResourceField, row: ResourceRow) {
return String(row[field.key] ?? row[`${field.key}_masked`] ?? '');
}
/** 优先使用后端受控派生字段展示列表摘要,空值使用字段业务文案。 */
function displayListField(field: ResourceField, row: ResourceRow) {
if (field.listDisplayKey) {
const value = row[field.listDisplayKey];
return value == null || value === '' ? (field.emptyText ?? '-') : String(value);
}
return displayResourceValue(
props.definition,
field.key,
row[field.key] ?? row[`${field.key}_masked`],
);
}
/** 加载当前列表和来源关系筛选。 */
async function load() {
avatarLoader.reset();