优化智能气阀状态中文展示

列表和详情统一显示中文状态,状态弹窗区分当前状态与目标状态并排除原状态,同时保留服务端业务校验,补充专项检查和中文文档。
This commit is contained in:
czl231
2026-08-13 22:17:16 +08:00
parent e5289e8f8a
commit 457bcfb450
7 changed files with 167 additions and 9 deletions

View File

@@ -18,10 +18,13 @@
<a-alert v-if="isOwnershipAction" class="action-alert" type="warning" show-icon>
智能气阀只能有一个当前归属选择新归属后会自动清空其他归属操作会写入审计记录
</a-alert>
<a-alert v-if="isProductLifecycleAction" class="action-alert" type="info" show-icon>
当前状态{{ currentProductStatusLabel }}请选择一个不同的目标状态服务端会校验检修和订单占用情况
</a-alert>
<a-form :model="form" layout="vertical">
<ResourceFieldForm
v-model="form"
:fields="action?.fields ?? []"
:fields="actionFields"
:required-keys="requiredKeys"
:relation-options="relations.options"
:relation-loading="relations.loading"
@@ -56,14 +59,39 @@ const emit = defineEmits<{
const form = reactive<Record<string, any>>({});
const submitting = ref(false);
const relations = useResourceRelations();
const isProductLifecycleAction = computed(
() => props.action?.resource === '/product_info/:identity/lifecycle',
);
const actionFields = computed(() =>
(props.action?.fields ?? []).map((field) =>
isProductLifecycleAction.value && field.key === 'product_status'
? {
...field,
options: (field.options ?? []).filter(
(option) => String(option.value) !== String(props.record.product_status),
),
}
: field,
),
);
const requiredKeys = computed(() =>
(props.action?.fields ?? [])
actionFields.value
.filter((field) => field.required)
.map((field) => field.key),
);
const isOwnershipAction = computed(
() => props.action?.resource === '/product_info/:identity',
);
const currentProductStatusLabel = computed(() => {
const statusField = props.action?.fields?.find(
(field) => field.key === 'product_status',
);
return (
statusField?.options?.find(
(option) => String(option.value) === String(props.record.product_status),
)?.label ?? `未知状态(${String(props.record.product_status ?? '')}`
);
});
const ownershipKeys = [
'warehouse_identity',
'gas_basic_identity',
@@ -95,12 +123,12 @@ watch(
() => [props.visible, props.action?.name] as const,
async ([visible]) => {
if (!visible || !props.action) return;
for (const field of props.action.fields ?? []) {
for (const field of actionFields.value) {
form[field.key] = isOwnershipAction.value
? props.record[field.key]
: undefined;
}
await relations.preload(props.action.fields ?? []);
await relations.preload(actionFields.value);
if (props.action.resource.includes('/menu')) {
try {
const [menus, assigned] = await Promise.all([
@@ -125,14 +153,14 @@ async function submit() {
const action = props.action;
if (!action) return;
if (
(action.fields ?? []).some(
actionFields.value.some(
(field) => field.required && isMissingField(form[field.key]),
)
) {
Message.warning('请填写必填字段');
return;
}
const invalidPassword = (action.fields ?? []).find(
const invalidPassword = actionFields.value.find(
(field) =>
field.type === 'password' &&
!isMissingField(form[field.key]) &&
@@ -151,7 +179,7 @@ async function submit() {
}
submitting.value = true;
try {
const payload = buildResourcePayload(action.fields ?? [], form, 'create');
const payload = buildResourcePayload(actionFields.value, form, 'create');
if (isOwnershipAction.value) {
for (const key of ownershipKeys) payload[key] = String(form[key] ?? '');
}