diff --git a/CloudBuilder/CloudBuilder.Master.Service/FamilyTreeService.auto.cs b/CloudBuilder/CloudBuilder.Master.Service/FamilyTreeService.auto.cs index 45a71ba..c618f7e 100644 --- a/CloudBuilder/CloudBuilder.Master.Service/FamilyTreeService.auto.cs +++ b/CloudBuilder/CloudBuilder.Master.Service/FamilyTreeService.auto.cs @@ -13,6 +13,7 @@ using CloudBuilder.Security.Policy; using CloudBuilder.Security.Service; using CloudBuilder.Security.Utility; using Microsoft.AspNetCore.Authorization; +using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Storage.ValueConversion.Internal; using Microsoft.Extensions.DependencyInjection; using System.Collections.Generic; @@ -791,50 +792,18 @@ namespace CloudBuilder.Master.Service throw new ValidatedException("您没有删除权限."); } - repository.DeleteNow(ent); - + // 整谱级联按 TreeId 集合式删除(三条 DELETE ... WHERE tree_id),取代旧「逐人递归删」: + // 大谱(数千族员)下递归对每人各发 SELECT+DELETE,单事务内上万次往返直接超时; + // 且旧逻辑只删了始祖一条 person,旁系 person 全遗留成孤儿。三表都带 tree_id,一把删净。 + IRepository repositorySpouse = repository.GetRepository>(); + IRepository repositoryChild = repository.GetRepository>(); IRepository repositoryPerson = repository.GetRepository>(); - FamilyPersonEntity familyPerson; - familyPerson = repositoryPerson.DetachedEntities.Where(x => x.PersonId == ent.AncestorPersonId).FirstOrDefault()!; - if (familyPerson != null) - { - repositoryPerson.DeleteNow(familyPerson); - } + repositorySpouse.Entities.Where(x => x.TreeId == key).ExecuteDelete(); + repositoryChild.Entities.Where(x => x.TreeId == key).ExecuteDelete(); + repositoryPerson.Entities.Where(x => x.TreeId == key).ExecuteDelete(); - DeleteSpouses(ent.AncestorPersonId); - DeleteChildrens(ent.AncestorPersonId); - } - - private void DeleteSpouses(string personId) - { - IRepository repositoryMap = repository.GetRepository>(); - - FamilyTreeSpouseMapEntity[] olds = repositoryMap.Entities.Where(x => x.PersonId == personId).ToArray(); - - if (olds != null && olds.Length > 0) - { - repositoryMap.DeleteNow(olds); - } - } - - private void DeleteChildrens(string personId) - { - IRepository repositoryMap = repository.GetRepository>(); - - FamilyTreeChildrenMapEntity[] olds = repositoryMap.Entities.Where(x => x.PersonId == personId).ToArray(); - - if (olds != null && olds.Length > 0) - { - repositoryMap.DeleteNow(olds); - } - - foreach (FamilyTreeChildrenMapEntity old in olds) - { - DeleteChildrens(old.ChildrenId); - - DeleteSpouses(old.ChildrenId); - } + repository.DeleteNow(ent); } [PermissionOperate(name: MasterPermissionPolicy.FamilyTree, operate: Operate.Delete)] diff --git a/CloudBuilder/CloudBuilder.Web.Entry/Properties/PublishProfiles/FolderProfile3.pubxml.user b/CloudBuilder/CloudBuilder.Web.Entry/Properties/PublishProfiles/FolderProfile3.pubxml.user index 26429fd..4cc712c 100644 --- a/CloudBuilder/CloudBuilder.Web.Entry/Properties/PublishProfiles/FolderProfile3.pubxml.user +++ b/CloudBuilder/CloudBuilder.Web.Entry/Properties/PublishProfiles/FolderProfile3.pubxml.user @@ -3,7 +3,7 @@ <_PublishTargetUrl>C:\inetpub\wwwroot\dockwebapi2 - True|2026-10-26T01:48:34.0694643Z||;True|2026-10-23T16:26:07.0320450+08:00||;True|2026-10-23T15:18:36.1507056+08:00||;True|2026-10-23T09:45:02.7814696+08:00||;True|2026-10-22T14:27:02.4892588+08:00||;True|2026-10-21T21:22:01.1456473+08:00||;True|2026-10-20T15:45:39.3393674+08:00||;True|2026-10-17T20:49:21.0401213+08:00||;True|2026-09-23T13:19:13.0148919+08:00||;True|2026-09-23T13:16:07.8584304+08:00||;True|2026-09-22T23:03:13.6509491+08:00||;True|2026-09-22T16:07:15.9177123+08:00||;True|2026-09-22T11:19:19.6087109+08:00||;True|2026-09-22T11:09:24.9165065+08:00||;True|2026-09-21T22:40:07.1232044+08:00||;True|2026-09-21T22:35:06.9446571+08:00||;True|2026-09-21T22:27:42.1146825+08:00||;False|2026-09-21T22:27:17.6066573+08:00||;True|2026-09-21T21:01:22.8888913+08:00||;True|2026-09-21T19:15:03.4753747+08:00||;True|2026-09-21T18:08:30.0866986+08:00||;True|2026-09-21T16:51:19.8137872+08:00||;True|2026-09-21T16:30:01.0950896+08:00||;True|2026-09-21T15:09:00.2326737+08:00||;True|2026-09-21T14:47:09.6120256+08:00||;True|2026-09-21T14:16:35.3194409+08:00||;True|2026-09-21T13:54:58.2829712+08:00||;True|2026-09-21T13:36:45.3134499+08:00||;True|2026-09-19T09:48:52.0085130+08:00||;False|2026-09-19T09:47:56.1658214+08:00||;True|2026-09-17T18:50:15.9493380+08:00||;True|2026-09-17T18:11:11.5364547+08:00||;True|2026-09-17T18:07:27.7830758+08:00||;True|2026-09-17T17:58:16.5798560+08:00||;True|2026-09-17T15:37:30.9025614+08:00||;True|2026-09-17T15:25:46.9116292+08:00||;True|2026-09-17T15:05:18.6592403+08:00||;True|2026-09-17T14:57:28.7997437+08:00||;True|2026-09-17T14:36:00.6339386+08:00||;True|2026-09-17T13:56:43.2376873+08:00||;True|2026-09-16T13:56:51.8724546+08:00||;True|2026-09-15T20:44:46.6559899+08:00||;True|2026-09-13T19:02:59.5654245+08:00||;True|2026-09-10T09:14:56.2914193+08:00||;True|2026-09-09T16:40:16.6461154+08:00||;True|2026-09-08T13:55:23.1502435+08:00||;True|2026-09-08T08:04:53.4279263+08:00||;True|2026-09-07T08:48:17.4682304+08:00||;True|2026-09-04T14:39:08.7878670+08:00||;True|2026-09-04T14:35:48.2937877+08:00||;True|2026-09-04T11:45:16.1372876+08:00||;True|2026-09-04T11:42:59.9356436+08:00||;True|2026-09-03T16:05:52.5270232+08:00||;True|2026-09-03T14:52:56.8559144+08:00||;True|2026-09-02T11:08:23.8720038+08:00||;True|2026-09-02T10:58:16.8081797+08:00||;True|2026-08-26T13:34:12.3805892+08:00||;True|2026-08-25T08:31:30.7787234+08:00||;True|2026-08-20T13:10:46.4725468+08:00||;True|2026-08-20T13:10:28.3142576+08:00||;True|2026-08-19T16:10:27.3362887+08:00||;True|2026-08-19T16:01:12.6234971+08:00||;True|2026-08-19T15:42:46.6576265+08:00||;True|2026-08-19T13:39:59.9363522+08:00||;True|2026-08-19T13:36:53.0379313+08:00||;True|2026-08-19T13:31:36.0841398+08:00||;True|2026-08-19T11:44:37.5319626+08:00||;True|2026-08-19T09:36:45.6000047+08:00||;True|2026-08-19T09:34:36.8468631+08:00||;True|2026-08-19T08:35:41.2202300+08:00||;True|2026-08-18T16:20:59.0170916+08:00||; + True|2026-10-26T03:00:44.2611759Z||;True|2026-10-26T09:48:34.0694643+08:00||;True|2026-10-23T16:26:07.0320450+08:00||;True|2026-10-23T15:18:36.1507056+08:00||;True|2026-10-23T09:45:02.7814696+08:00||;True|2026-10-22T14:27:02.4892588+08:00||;True|2026-10-21T21:22:01.1456473+08:00||;True|2026-10-20T15:45:39.3393674+08:00||;True|2026-10-17T20:49:21.0401213+08:00||;True|2026-09-23T13:19:13.0148919+08:00||;True|2026-09-23T13:16:07.8584304+08:00||;True|2026-09-22T23:03:13.6509491+08:00||;True|2026-09-22T16:07:15.9177123+08:00||;True|2026-09-22T11:19:19.6087109+08:00||;True|2026-09-22T11:09:24.9165065+08:00||;True|2026-09-21T22:40:07.1232044+08:00||;True|2026-09-21T22:35:06.9446571+08:00||;True|2026-09-21T22:27:42.1146825+08:00||;False|2026-09-21T22:27:17.6066573+08:00||;True|2026-09-21T21:01:22.8888913+08:00||;True|2026-09-21T19:15:03.4753747+08:00||;True|2026-09-21T18:08:30.0866986+08:00||;True|2026-09-21T16:51:19.8137872+08:00||;True|2026-09-21T16:30:01.0950896+08:00||;True|2026-09-21T15:09:00.2326737+08:00||;True|2026-09-21T14:47:09.6120256+08:00||;True|2026-09-21T14:16:35.3194409+08:00||;True|2026-09-21T13:54:58.2829712+08:00||;True|2026-09-21T13:36:45.3134499+08:00||;True|2026-09-19T09:48:52.0085130+08:00||;False|2026-09-19T09:47:56.1658214+08:00||;True|2026-09-17T18:50:15.9493380+08:00||;True|2026-09-17T18:11:11.5364547+08:00||;True|2026-09-17T18:07:27.7830758+08:00||;True|2026-09-17T17:58:16.5798560+08:00||;True|2026-09-17T15:37:30.9025614+08:00||;True|2026-09-17T15:25:46.9116292+08:00||;True|2026-09-17T15:05:18.6592403+08:00||;True|2026-09-17T14:57:28.7997437+08:00||;True|2026-09-17T14:36:00.6339386+08:00||;True|2026-09-17T13:56:43.2376873+08:00||;True|2026-09-16T13:56:51.8724546+08:00||;True|2026-09-15T20:44:46.6559899+08:00||;True|2026-09-13T19:02:59.5654245+08:00||;True|2026-09-10T09:14:56.2914193+08:00||;True|2026-09-09T16:40:16.6461154+08:00||;True|2026-09-08T13:55:23.1502435+08:00||;True|2026-09-08T08:04:53.4279263+08:00||;True|2026-09-07T08:48:17.4682304+08:00||;True|2026-09-04T14:39:08.7878670+08:00||;True|2026-09-04T14:35:48.2937877+08:00||;True|2026-09-04T11:45:16.1372876+08:00||;True|2026-09-04T11:42:59.9356436+08:00||;True|2026-09-03T16:05:52.5270232+08:00||;True|2026-09-03T14:52:56.8559144+08:00||;True|2026-09-02T11:08:23.8720038+08:00||;True|2026-09-02T10:58:16.8081797+08:00||;True|2026-08-26T13:34:12.3805892+08:00||;True|2026-08-25T08:31:30.7787234+08:00||;True|2026-08-20T13:10:46.4725468+08:00||;True|2026-08-20T13:10:28.3142576+08:00||;True|2026-08-19T16:10:27.3362887+08:00||;True|2026-08-19T16:01:12.6234971+08:00||;True|2026-08-19T15:42:46.6576265+08:00||;True|2026-08-19T13:39:59.9363522+08:00||;True|2026-08-19T13:36:53.0379313+08:00||;True|2026-08-19T13:31:36.0841398+08:00||;True|2026-08-19T11:44:37.5319626+08:00||;True|2026-08-19T09:36:45.6000047+08:00||;True|2026-08-19T09:34:36.8468631+08:00||;True|2026-08-19T08:35:41.2202300+08:00||;True|2026-08-18T16:20:59.0170916+08:00||; \ No newline at end of file diff --git a/uniapp/youjiala/src/common/global-error.ts b/uniapp/youjiala/src/common/global-error.ts index 81df5a3..2de5bef 100644 --- a/uniapp/youjiala/src/common/global-error.ts +++ b/uniapp/youjiala/src/common/global-error.ts @@ -128,7 +128,7 @@ const BENIGN_ROUTER_PATTERNS = [ ]; function isBenignRouterRejection(text: string): boolean { - return BENIGN_ROUTER_PATTERNS.some(pattern => text.includes(pattern)); + return BENIGN_ROUTER_PATTERNS.some((pattern) => text.includes(pattern)); } /** 开发期弹窗最长占用时间:过了这个点就允许下一条弹窗顶上 */ diff --git a/uniapp/youjiala/src/locale/lang/zh-CN.json b/uniapp/youjiala/src/locale/lang/zh-CN.json index 835d70f..5bb2afe 100644 --- a/uniapp/youjiala/src/locale/lang/zh-CN.json +++ b/uniapp/youjiala/src/locale/lang/zh-CN.json @@ -1027,4 +1027,4 @@ "r404_3": "页面已下线或改名,收藏夹里还是旧地址", "r404_4": "服务器刚重启、菜单还没加载出来,刷新一次即可" } -} \ No newline at end of file +} diff --git a/uniapp/youjiala/src/utils/appUpdate.ts b/uniapp/youjiala/src/utils/appUpdate.ts index 5aae7e8..8e76392 100644 --- a/uniapp/youjiala/src/utils/appUpdate.ts +++ b/uniapp/youjiala/src/utils/appUpdate.ts @@ -179,29 +179,26 @@ function downloadApk(info: AppUpdateInfo): Promise { }, ); // 事件名是 statechanged(带 d),且进度字段挂在下载对象上(部分版本在 event.target),旧代码写错名/取错层→一直 0% - task.addEventListener( - "statechanged", - (event: any) => { - const t = event?.target ?? event; - updateProgress.downloaded = Number(t?.downloadedSize ?? 0); - updateProgress.total = Number(t?.totalSize ?? 0); - const state = Number(t?.state ?? 0); - // state:3 开始接收数据 / 4 下载中 / 5 完成 / 6 失败 - if (state === 4 || state === 3) { - updateProgress.percent = - updateProgress.total > 0 - ? Math.min( - 99, - Math.floor( - (updateProgress.downloaded / updateProgress.total) * 100, - ), - ) - : -1; // 无 Content-Length:不确定态动画 - } else if (state === 6) { - reject(new Error(`下载中断\n${url}`)); - } - }, - ); + task.addEventListener("statechanged", (event: any) => { + const t = event?.target ?? event; + updateProgress.downloaded = Number(t?.downloadedSize ?? 0); + updateProgress.total = Number(t?.totalSize ?? 0); + const state = Number(t?.state ?? 0); + // state:3 开始接收数据 / 4 下载中 / 5 完成 / 6 失败 + if (state === 4 || state === 3) { + updateProgress.percent = + updateProgress.total > 0 + ? Math.min( + 99, + Math.floor( + (updateProgress.downloaded / updateProgress.total) * 100, + ), + ) + : -1; // 无 Content-Length:不确定态动画 + } else if (state === 6) { + reject(new Error(`下载中断\n${url}`)); + } + }); task.start(); }); } @@ -319,7 +316,11 @@ export async function checkAppUpdate( reason, }); uni.showModal({ - title: msg(failedInstall ? "AppUpdate.installFailed" : "AppUpdate.downloadFailed"), + title: msg( + failedInstall + ? "AppUpdate.installFailed" + : "AppUpdate.downloadFailed", + ), content: reason, showCancel: false, confirmText: msg("AppUpdate.gotIt"),