feat(v3.4.13): partner column, version release cascade, client UX fixes
- HQ stores: partner column uses companyName/name/phone via partnerOptionLabel - Dev plan: version RELEASED auto-marks tasks RELEASED and tickets PUBLISHED with releasedVersionNo - mini-user/h5-shop/h5-partner v3.4.13 UX fixes (store UI, iOS scan OAuth, partner login guard) - Docs: v3.4.13 dev doc + status audit updates Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -107,6 +107,7 @@ enum SupportTicketStatus {
|
||||
DEVELOPING
|
||||
TESTING
|
||||
PASSED
|
||||
PUBLISHED
|
||||
}
|
||||
|
||||
enum SupportTicketPriority {
|
||||
@@ -671,6 +672,8 @@ model CommonSupportTicket {
|
||||
reviewedAt DateTime? @map("reviewed_at") @db.DateTime(3)
|
||||
remark String? @db.VarChar(512)
|
||||
attachmentUrls Json? @map("attachment_urls")
|
||||
releasedVersionNo String? @map("released_version_no") @db.VarChar(32)
|
||||
publishedAt DateTime? @map("published_at") @db.DateTime(3)
|
||||
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
|
||||
updatedAt DateTime @updatedAt @map("updated_at") @db.DateTime(3)
|
||||
completedAt DateTime? @map("completed_at") @db.DateTime(3)
|
||||
@@ -678,6 +681,7 @@ model CommonSupportTicket {
|
||||
@@index([status, createdAt])
|
||||
@@index([ticketType, status])
|
||||
@@index([creatorId])
|
||||
@@index([releasedVersionNo])
|
||||
@@map("common_support_ticket")
|
||||
|
||||
devPlanTasks DevPlanTask[]
|
||||
|
||||
@@ -671,6 +671,10 @@ export class DevPlanService {
|
||||
|
||||
}
|
||||
|
||||
if (status === 'RELEASED') {
|
||||
await this.cascadeVersionReleased(row.id, row.versionNo);
|
||||
}
|
||||
|
||||
return this.getVersion(row.id);
|
||||
|
||||
}
|
||||
@@ -739,6 +743,14 @@ export class DevPlanService {
|
||||
|
||||
await this.prisma.devPlanVersion.update({ where: { id }, data });
|
||||
|
||||
if (
|
||||
dto.status === 'RELEASED' &&
|
||||
existing.status !== 'RELEASED'
|
||||
) {
|
||||
const versionNo = (dto.versionNo ?? existing.versionNo).trim();
|
||||
await this.cascadeVersionReleased(id, versionNo);
|
||||
}
|
||||
|
||||
if (dto.taskIds != null) await this.replaceVersionTasks(id, dto.taskIds);
|
||||
|
||||
return this.getVersion(id);
|
||||
@@ -775,6 +787,46 @@ export class DevPlanService {
|
||||
|
||||
}
|
||||
|
||||
private async cascadeVersionReleased(versionId: bigint, versionNo: string) {
|
||||
const links = await this.prisma.devPlanVersionTask.findMany({
|
||||
where: { versionId },
|
||||
select: { taskId: true },
|
||||
});
|
||||
if (!links.length) return;
|
||||
|
||||
const taskIds = links.map((l) => l.taskId);
|
||||
const now = new Date();
|
||||
|
||||
await this.prisma.$transaction(async (tx) => {
|
||||
await tx.devPlanTask.updateMany({
|
||||
where: { id: { in: taskIds }, status: { not: 'RELEASED' } },
|
||||
data: { status: 'RELEASED', completedAt: now },
|
||||
});
|
||||
|
||||
const tasks = await tx.devPlanTask.findMany({
|
||||
where: { id: { in: taskIds }, supportTicketId: { not: null } },
|
||||
select: { supportTicketId: true },
|
||||
});
|
||||
const ticketIds = [
|
||||
...new Set(
|
||||
tasks
|
||||
.map((t) => t.supportTicketId)
|
||||
.filter((id): id is bigint => id != null),
|
||||
),
|
||||
];
|
||||
if (!ticketIds.length) return;
|
||||
|
||||
await tx.commonSupportTicket.updateMany({
|
||||
where: { id: { in: ticketIds }, status: { not: 'REJECTED' } },
|
||||
data: {
|
||||
status: 'PUBLISHED',
|
||||
releasedVersionNo: versionNo,
|
||||
publishedAt: now,
|
||||
},
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
private async addVersionTasks(versionId: bigint, taskIds: string[]) {
|
||||
|
||||
if (!taskIds.length) return;
|
||||
|
||||
@@ -74,7 +74,7 @@ export class AdminStoresService {
|
||||
take: pageSize,
|
||||
include: {
|
||||
cityRef: { select: { id: true, name: true, code: true } },
|
||||
partnerAccount: { select: { id: true, companyName: true } },
|
||||
partnerAccount: { select: { id: true, companyName: true, name: true, phone: true } },
|
||||
category: { select: { id: true, name: true, parentId: true } },
|
||||
bindings: {
|
||||
where: { storeAccount: { isPrimary: 1 } },
|
||||
|
||||
Reference in New Issue
Block a user