From 742272026b52410ddd3e8e092918fc24caf25843 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=85=E6=88=BF?= Date: Thu, 8 Jan 2026 15:50:21 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E9=A1=B92:=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E7=BC=96=E6=8E=92=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 变更点1 - 使用项目maxParticipants: - 优先使用项目配置的单位容纳人数进行分组 - 未配置时回退到全局配置(35人) - 添加日志记录使用的容纳人数 变更点2 - 实现集体优先策略: - 集体项目(projectType=2)优先于单人项目(projectType=1) - 同类型项目按预计时长降序排列 - 添加排序结果日志便于调试 Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com> --- .../buckets/.bloomcycle.bin/xl.meta | Bin 743 -> 743 bytes .../buckets/.usage-cache.bin.bkp/xl.meta | Bin 628 -> 630 bytes .../buckets/.usage-cache.bin/xl.meta | Bin 628 -> 630 bytes .../.minio.sys/buckets/.usage.json/xl.meta | Bin 2360 -> 2360 bytes .../.usage-cache.bin.bkp/xl.meta | Bin 636 -> 636 bytes .../000000-assets/.usage-cache.bin/xl.meta | Bin 636 -> 636 bytes .../assets/.usage-cache.bin.bkp/xl.meta | Bin 575 -> 575 bytes .../buckets/assets/.usage-cache.bin/xl.meta | Bin 575 -> 575 bytes .../MartialScheduleArrangeServiceImpl.java | 28 ++++++++++++++---- 9 files changed, 23 insertions(+), 5 deletions(-) diff --git a/minio_data/.minio.sys/buckets/.bloomcycle.bin/xl.meta b/minio_data/.minio.sys/buckets/.bloomcycle.bin/xl.meta index a222be542b5e9e37fe9e4af5424c77258e3560b6..7b4d10bf0bd6a0bfdceb5bb01b43839c5b68320f 100644 GIT binary patch delta 332 zcmaFP`kZxw2G1t0x1xgFM_7KyzGUC%5pE=epZNliJ?^RG{=727$@> zOcfPSWts5_f;!q;-y^ubI$q4b5Zq23AvP8S_o$AJTqvBI$fzTzFag1})lt`7iQrb6 PP0VvZaJTA6o<0QtyRdV3 delta 332 zcmaFP`kZxw2G7RXS{q;9Ji_AU?-wx9#8{xR;MpVRP$!jD_xrY$sc$!rV7oOn|C(K|iNA0C@A*#uYRxTIALpheOXl3@Ty;+G@QZavTp7TiWqERGQBi7M z3B!`S)QXa`u1A&^mn0UIq^2C_VFjtE&y0`1s?^RG{=71_7vw z%=nlCQ8&xg}9Gu{=)w@T!2s zq7uj8%&OGli5D3TF9ETD^itoD%-qz=5*-jjCjK#<9KooTwj{MAG5w}Oin)=AXNJ`a z4v5WtkRrR{sNL~tbJX;czvZ#L`q0zUEWgH$Lu0G{Ul#^ZhPjjXGRjGxUgeWmToPK4 zl30>@oQIVG2r}anw`$*5aeneQMkl+4`W=gsGbXJy00Z4ijIDm#7UdVqGBR;eB-~a#s delta 270 zcmeyy@`YuB2G7RXT7B=ej7~9QnYpQ#B|0F6O#EZ2z9h9IG5w~3nWeF5N|L!@ie+k2 zs!^h$MM|<+nwhy_nu)1Jia}D+WJ5+Z`-Nra(vwazoVzU1{*tkANnUAA&XI?vnwJiF z+aK=Bt5uX*StjVl1$9C#PwJhxfLYEq(LLUaSq8SRSW-cvV1R zQHf)4W>sqO#ET4vmw;G6dZ}+nW^U?bi4KS%6aSb_j$l+vTasFmn0`|s#oWlmG%d|I z)y%}$$lSolAj#6)BGt&y%p%3yFv-MXVcEI#q|*%NOkb+ZU~F8HSDKS^|szyInc?mOkxkm&Fwr@=jTX1O2}~n03cR&8~^|S delta 270 zcmeyy@`YuB2G7RXTDfx;A7K&tAbV}1iLrpj$EFjj=Xx;AH~8g#D<#opVtJhU!Bqi? zMJ0~GnN_L96E89xTmoVN>7~9QnYpQ#B|0F6O#EZ2z9h9IG5w~3nWeF5N|L!@ie+k2 zs!^h$MM|<+nwhy_nu)1Jia}D+WJ5+Z`-Nra(vwazoZFKx_L#A8NnUAA&XI?vnwJiF z+aK=Bt5uXe+IFe zDzkxJk^Ea#GcYtcH8D9hFk?1mVqrKkG%-0fGG;YnFl1$8Ff?JIcFt#F%K*-PhK(cv zfuwGAY;45`tdIF0?~^m7Y7(EA@Tem`ykk7+UeO4Tn>7zktQjFYSZ9S<}zIx#aY RH#0IdH#9akH?!CQU~ncGUF4sYR{CvIEkr(#cf5D6#!VOP;USL delta 190 zcmV;v073u!1pEY$C=9WiDbG=r#01q7E%%W$GZ6Z5v;+XRLa(6)WI@EO2wjnPe+IFe zDbG=rk^D6$q-AtrXW1Y)Wi&ZvV>vKoV`DRAF)%SQGBaZ`Gc!43Wic{jFfufgF##qu zp?1z^V#@%|%dBB30fD4$b!=?J>Dt2ywyVkYB(Nb1JlKTFrt91xvj8&W=8Y)bt|{d1 sVw1B0G8@CHOks0$Rd8fsbY;g31poj50BK)e)hgStr;-AA1j^PtI+vGFTmS$7 diff --git a/minio_data/.minio.sys/buckets/000000-assets/.usage-cache.bin/xl.meta b/minio_data/.minio.sys/buckets/000000-assets/.usage-cache.bin/xl.meta index ddd7e8c02c7bf4eba38d66fc0b945b21f68535b5..b4cf9507b045632af9a4b4898cd8f85d8ae884fb 100644 GIT binary patch delta 189 zcmeyv@`q)D2G1t0H`6w29bu{4Tpu#g#8_b8`gQwjZQVZZau?Y4wz1ZGVtG9qM9suM zrjsKW)nb;UmL#U%R4}znO-xNrG%-v~G)poyHA_iLGB&U}#?p(4`DdiB2)Bs+`eJo8*S0CNfAVHV pBk9wtd=iUGLJLw7OHz;XurdHaW_;pS?V0iyCoxs9xUGn?0suo|Pgno| delta 190 zcmV;v073u!1pEY$C=9WiDWAqk!~`a;+a{4TGY~rZw+-=4L-M>t&5e$dfU}Wze+IFe zDWAqkk^D6$q-AtrXW1Y)Wi&ZvV>vKoV`DRAF)%SQGBaZ`Gc!43Wic{jFfufgF##qu zp?1z^V#@%|FN?;u0fD4$b!=?J>Dt2ywyVkYB(Nb1JlKTFrt91xvj8&W=8Y)bt|{d1 sVw1B0G8@CHOks0$Rd8fsbY;g31poj50BK)e)hgStr;-AA1j^PtI?Vf0cK`qY diff --git a/minio_data/.minio.sys/buckets/assets/.usage-cache.bin.bkp/xl.meta b/minio_data/.minio.sys/buckets/assets/.usage-cache.bin.bkp/xl.meta index 7d13aa91edd3cb1cdab3905e83fb803e0bb7d1e5..6333f9d00cc07b1c9a6ef5aea205f2fe4b1417ca 100644 GIT binary patch delta 176 zcmdnbvY%yw2G1t0H-0iHM_8mE)l8pgVk{u)@XT&!jqjF~0_GJ(+g|*hSYFQtQ8V$6 zjY6t-3U5>Z0C;0X!vFvP diff --git a/src/main/java/org/springblade/modules/martial/service/impl/MartialScheduleArrangeServiceImpl.java b/src/main/java/org/springblade/modules/martial/service/impl/MartialScheduleArrangeServiceImpl.java index cc0c213..ebb6012 100644 --- a/src/main/java/org/springblade/modules/martial/service/impl/MartialScheduleArrangeServiceImpl.java +++ b/src/main/java/org/springblade/modules/martial/service/impl/MartialScheduleArrangeServiceImpl.java @@ -458,10 +458,14 @@ public class MartialScheduleArrangeServiceImpl implements IMartialScheduleArrang } // 自动拆分大组:如果人数过多,拆分成多个小组 - // 改进策略:根据人数动态拆分,确保能充分利用所有时间槽 - // 目标:让分组数量接近可用时间槽数量,实现均匀分配 + // 优先使用项目配置的单位容纳人数(maxParticipants) int maxPeoplePerGroup; - if (members.size() <= scheduleConfig.getMaxPeoplePerGroup()) { + Integer projectMax = project.getMaxParticipants(); + if (projectMax != null && projectMax > 0) { + // 使用项目配置的单位容纳人数 + maxPeoplePerGroup = projectMax; + log.debug("项目 '{}' 使用自定义容纳人数: {}", projectName, projectMax); + } else if (members.size() <= scheduleConfig.getMaxPeoplePerGroup()) { // 35人以内不拆分 maxPeoplePerGroup = members.size(); } else { @@ -585,8 +589,22 @@ public class MartialScheduleArrangeServiceImpl implements IMartialScheduleArrang log.info("总共初始化了 {} 个场地×时间段组合", slots.size()); - // 按预计时长降序排序(先安排时间长的) - groups.sort((a, b) -> b.getEstimatedDuration() - a.getEstimatedDuration()); + // 排序策略: 集体项目(projectType=2)优先,同类型按预计时长降序 + groups.sort((a, b) -> { + // 1. 集体项目优先于单人项目 + int aType = a.getProjectType() != null ? a.getProjectType() : 1; + int bType = b.getProjectType() != null ? b.getProjectType() : 1; + if (aType != bType) { + return bType - aType; // 2(集体) > 1(单人) + } + // 2. 同类型按预计时长降序(先安排时间长的) + int aDuration = a.getEstimatedDuration() != null ? a.getEstimatedDuration() : 0; + int bDuration = b.getEstimatedDuration() != null ? b.getEstimatedDuration() : 0; + return bDuration - aDuration; + }); + + log.info("排序后分组顺序(集体优先): {}", + groups.stream().map(g -> g.getGroupName() + "(type=" + g.getProjectType() + ")").collect(java.util.stream.Collectors.joining(", "))); // 使用轮询算法进行均匀分配 int assignedCount = 0;