fix some bug

This commit is contained in:
Timi
2026-08-03 19:20:51 +08:00
parent dd8534eaad
commit 2c3f93cd73
8 changed files with 94 additions and 39 deletions
+1 -1
View File
@@ -4,7 +4,7 @@
<t-cell <t-cell
v-for="(item, index) in customerList" v-for="(item, index) in customerList"
:key="item.id || item.code || index" :key="item.id || item.code || index"
:note="item.code" :note="item.code || ''"
hover hover
@click="handleSelect(item)" @click="handleSelect(item)"
> >
+3 -2
View File
@@ -1,8 +1,8 @@
<template> <template>
<div class="customer-profile-card"> <div class="customer-profile-card">
<t-button v-if="photoURL" variant="text" class="avatar-trigger" @click="openPhotoViewer"> <button v-if="photoURL" type="button" class="avatar-trigger" @click.stop="openPhotoViewer">
<t-image :src="photoURL" :alt="customerName" fit="cover" class="avatar" /> <t-image :src="photoURL" :alt="customerName" fit="cover" class="avatar" />
</t-button> </button>
<div v-else class="avatar fallback" v-text="avatarText" /> <div v-else class="avatar fallback" v-text="avatarText" />
<div class="content"> <div class="content">
<div class="header"> <div class="header">
@@ -66,6 +66,7 @@ function openPhotoViewer(): void {
width: 4rem; width: 4rem;
height: 4rem; height: 4rem;
display: block; display: block;
cursor: pointer;
background: transparent; background: transparent;
border-radius: .875rem; border-radius: .875rem;
} }
+34 -20
View File
@@ -36,26 +36,12 @@
<body-area-selector v-model="selectedAreas" /> <body-area-selector v-model="selectedAreas" />
</div> </div>
</t-cell-group> </t-cell-group>
<t-cell-group v-if="inviter" :title="`被 ${inviter.name} 邀请`" class="invite" theme="card"> <t-cell-group v-if="inviter" :title="`由 ${inviter.name} 邀请`" class="invite" theme="card">
<t-cell <customer-profile-card
:title="inviter.name" class="profile-card"
arrow :customer="inviter"
@click="goCustomerDetail(inviter)" @click="goCustomerDetail(inviter)"
>
<template #description>
<telephone-link :value="inviter.telephone" placeholder="未填写电话" />
</template>
<template #leftIcon>
<t-image
v-if="getCustomerPhotoURL(inviter)"
class="avatar"
:src="getCustomerPhotoURL(inviter)"
:alt="inviter.name"
fit="cover"
/> />
<div v-else class="avatar fallback" v-text="(inviter.name || '客').slice(0, 1)" />
</template>
</t-cell>
</t-cell-group> </t-cell-group>
<div class="invite"> <div class="invite">
<div class="header"> <div class="header">
@@ -77,8 +63,8 @@
<t-cell-group theme="card"> <t-cell-group theme="card">
<t-swipe-cell <t-swipe-cell
class="item" class="item"
v-for="item in invitees" v-for="(item, index) in invitees"
:key="item.id || item.code" :key="item.id || item.code || index"
> >
<t-cell <t-cell
arrow arrow
@@ -465,6 +451,21 @@ watch(() => route.params.id, async () => {
margin: 0 1rem; margin: 0 1rem;
} }
:deep(.t-cell__title) {
flex: 0 0 auto;
}
:deep(.t-cell__title-text) {
white-space: nowrap;
}
:deep(.t-cell__note) {
flex: 1 1 auto;
min-width: 0;
white-space: normal;
overflow-wrap: anywhere;
}
.conditioning-part { .conditioning-part {
gap: .5rem; gap: .5rem;
padding: 1rem; padding: 1rem;
@@ -474,6 +475,19 @@ watch(() => route.params.id, async () => {
.invite { .invite {
.inviter-profile {
gap: .5rem;
display: flex;
cursor: pointer;
padding: .75rem;
align-items: center;
.profile-card {
flex: 1;
min-width: 0;
}
}
.item { .item {
.title { .title {
+2 -2
View File
@@ -415,7 +415,7 @@ async function saveCustomer(): Promise<void> {
const customerCode = formModel.code.trim(); const customerCode = formModel.code.trim();
const payload: Customer = { const payload: Customer = {
...(currentCustomer.value || {}), ...(currentCustomer.value || {}),
code: customerCode || undefined, code: customerCode || null,
name: formModel.name, name: formModel.name,
gender: formModel.gender || undefined, gender: formModel.gender || undefined,
age: Number(formModel.age) || undefined, age: Number(formModel.age) || undefined,
@@ -426,7 +426,7 @@ async function saveCustomer(): Promise<void> {
remark: formModel.note, remark: formModel.note,
disease: formModel.disease, disease: formModel.disease,
conditioningPart: selectedAreas.value, conditioningPart: selectedAreas.value,
introducerCustomerId: formModel.inviterCustomerId || undefined, introducerCustomerId: formModel.inviterCustomerId || null,
attachmentIdList: photoTempFileId.value ? [photoTempFileId.value] : undefined attachmentIdList: photoTempFileId.value ? [photoTempFileId.value] : undefined
}; };
+3 -3
View File
@@ -16,8 +16,8 @@
<section class="items"> <section class="items">
<div <div
class="item" class="item"
v-for="item in customerList" v-for="(item, index) in customerList"
:key="item.id || item.code" :key="item.id || item.code || index"
@click="goDetail(item)" @click="goDetail(item)"
> >
<t-image v-if="getCustomerPhotoURL(item)" :src="getCustomerPhotoURL(item)" :alt="item.name" fit="cover" class="avatar" /> <t-image v-if="getCustomerPhotoURL(item)" :src="getCustomerPhotoURL(item)" :alt="item.name" fit="cover" class="avatar" />
@@ -28,7 +28,7 @@
<h4 class="value" v-text="item.name" /> <h4 class="value" v-text="item.name" />
<gender-icon :value="item.gender" size="1.125rem" /> <gender-icon :value="item.gender" size="1.125rem" />
</div> </div>
<span class="meta gray" v-text="item.code" /> <span class="meta gray" v-text="item.code || ''" />
</div> </div>
<div class="line"> <div class="line">
<div class="gray"> <div class="gray">
@@ -45,6 +45,7 @@
required-mark required-mark
/> />
<t-form-item label="登记时间" content-align="right"> <t-form-item label="登记时间" content-align="right">
<div class="time-actions">
<t-button <t-button
theme="primary" theme="primary"
variant="outline" variant="outline"
@@ -52,6 +53,15 @@
:content="registeredAtText || '此刻'" :content="registeredAtText || '此刻'"
@click="openRegisteredAtPicker" @click="openRegisteredAtPicker"
/> />
<t-button
v-if="registeredAtText"
theme="primary"
variant="text"
size="extra-small"
content="此刻"
@click="resetRegisteredAt"
/>
</div>
</t-form-item> </t-form-item>
<t-form-item label="登记备注"> <t-form-item label="登记备注">
<t-textarea <t-textarea
@@ -123,8 +133,9 @@
</div> </div>
<t-popup v-model="registeredAtPickerVisible" placement="bottom"> <t-popup v-model="registeredAtPickerVisible" placement="bottom">
<t-date-time-picker <t-date-time-picker
v-if="registeredAtPickerVisible"
v-model="registeredAtDraftText" v-model="registeredAtDraftText"
:default-value="registeredAtDraftText" :start="minimumDateTimeText"
:mode="['date', 'minute']" :mode="['date', 'minute']"
format="YYYY-MM-DD HH:mm" format="YYYY-MM-DD HH:mm"
title="登记时间" title="登记时间"
@@ -169,6 +180,7 @@ const selectedCustomerList = ref<Customer[]>([]);
const registrationEventList = ref<RegistrationEvent[]>([]); const registrationEventList = ref<RegistrationEvent[]>([]);
const selectedRegistrationEventIdList = ref<string[]>([]); const selectedRegistrationEventIdList = ref<string[]>([]);
const recentRecordList = ref<RegistrationEventRecord[]>([]); const recentRecordList = ref<RegistrationEventRecord[]>([]);
const minimumDateTimeText = "1970-01-01 00:00";
const registeredAtText = ref(""); const registeredAtText = ref("");
const registeredAtDraftText = ref(""); const registeredAtDraftText = ref("");
const registeredAtPickerVisible = ref(false); const registeredAtPickerVisible = ref(false);
@@ -436,6 +448,11 @@ function confirmRegisteredAt(): void {
registeredAtPickerVisible.value = false; registeredAtPickerVisible.value = false;
} }
function resetRegisteredAt(): void {
registeredAtText.value = "";
registeredAtDraftText.value = "";
}
async function submitRecord(): Promise<void> { async function submitRecord(): Promise<void> {
if (!validateForm()) { if (!validateForm()) {
return; return;
@@ -611,6 +628,13 @@ watch(customerCode, async (value) => {
padding: 0 1rem; padding: 0 1rem;
margin-top: 1rem; margin-top: 1rem;
} }
.time-actions {
gap: .5rem;
display: flex;
align-items: center;
justify-content: flex-end;
}
} }
.record-photo { .record-photo {
@@ -560,6 +560,22 @@ onUnmounted(() => {
.cell { .cell {
padding: .5rem; padding: .5rem;
:deep(.t-cell__title) {
flex: 1 1 0;
min-width: 0;
}
:deep(.t-cell__title-text) {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
:deep(.t-cell__note) {
flex: 0 0 auto;
white-space: nowrap;
}
.photo { .photo {
width: 3.5rem; width: 3.5rem;
height: 3.5rem; height: 3.5rem;
+2 -2
View File
@@ -8,7 +8,7 @@ export type BodyAreaValue = {
}; };
export type Customer = { export type Customer = {
code?: string; code?: string | null;
name?: string; name?: string;
gender?: CustomerGender; gender?: CustomerGender;
age?: number; age?: number;
@@ -19,7 +19,7 @@ export type Customer = {
remark?: string; remark?: string;
disease?: string; disease?: string;
conditioningPart?: BodyAreaValue; conditioningPart?: BodyAreaValue;
introducerCustomerId?: string; introducerCustomerId?: string | null;
creatorUserId?: string; creatorUserId?: string;
lastSignInAt?: number; lastSignInAt?: number;
introducerCustomer?: Customer; introducerCustomer?: Customer;