From fcacab52c2d1c7b32148e09232189f8b605984f6 Mon Sep 17 00:00:00 2001 From: yovinchen Date: Tue, 1 Jul 2025 15:42:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=96=87=E4=BB=B6=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E8=AF=86=E5=88=AB=E4=BB=A5=E5=8F=8A=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- log/seat_allocation_log.txt | 127 +++++++++ log/座位信息_最终分配.xlsx | Bin 0 -> 5630 bytes log/最终座位分配日志.xlsx | Bin 0 -> 5371 bytes seat_allocation_log.txt | 528 +++++------------------------------- seat_allocation_system.py | 260 +++++++++++++++--- windows_build.py | 38 ++- 人员信息.xlsx | Bin 16331 -> 10457 bytes 座位信息.xlsx | Bin 15328 -> 12639 bytes 座位信息_最终分配.xlsx | Bin 11609 -> 0 bytes 最终座位分配日志.xlsx | Bin 9383 -> 0 bytes 运行座位分配系统.bat | 81 +++--- 11 files changed, 486 insertions(+), 548 deletions(-) create mode 100644 log/seat_allocation_log.txt create mode 100644 log/座位信息_最终分配.xlsx create mode 100644 log/最终座位分配日志.xlsx delete mode 100644 座位信息_最终分配.xlsx delete mode 100644 最终座位分配日志.xlsx diff --git a/log/seat_allocation_log.txt b/log/seat_allocation_log.txt new file mode 100644 index 0000000..7cf755d --- /dev/null +++ b/log/seat_allocation_log.txt @@ -0,0 +1,127 @@ +[2025-07-01 15:41:09] ============================================================ +[2025-07-01 15:41:09] 座位分配系统 - 文件校验 +[2025-07-01 15:41:09] ============================================================ +[2025-07-01 15:41:09] === 开始加载数据 === +[2025-07-01 15:41:09] 正在读取人员信息文件: 人员信息.xlsx +[2025-07-01 15:41:09] 正在读取座位信息文件: 座位信息.xlsx +[2025-07-01 15:41:09] 开始过滤座位数据... +[2025-07-01 15:41:09] 原始数据行数: 17 +[2025-07-01 15:41:09] 过滤后数据行数: 6 +[2025-07-01 15:41:09] 移除无效行数: 11 +[2025-07-01 15:41:09] ✅ 已过滤掉 11 行无效数据(空行、示例数据等) +[2025-07-01 15:41:09] 有效座位区域: 西北门入口场地A5区 +[2025-07-01 15:41:09] 有效座位楼层: 场地 +[2025-07-01 15:41:09] 清理文字数据中的空格... +[2025-07-01 15:41:09] ✅ 文字数据清理完成 +[2025-07-01 15:41:09] ✅ 文件加载成功 +[2025-07-01 15:41:09] 人员信息: 6 行 × 6 列 +[2025-07-01 15:41:09] 座位信息: 6 行 × 12 列 +[2025-07-01 15:41:09] +=== 人员信息结构校验 === +[2025-07-01 15:41:09] ✅ 所有必需列都存在 +[2025-07-01 15:41:09] +数据完整性检查: +[2025-07-01 15:41:09] ✅ 姓名 列数据完整 +[2025-07-01 15:41:09] ✅ 证件类型 列数据完整 +[2025-07-01 15:41:09] ✅ 证件号 列数据完整 +[2025-07-01 15:41:09] ✅ 手机号 列数据完整 +[2025-07-01 15:41:09] ✅ 姓名无重复 +[2025-07-01 15:41:09] +=== 连坐组校验 === +[2025-07-01 15:41:09] ✅ 第 1 组: 叶一帆 (单独) +[2025-07-01 15:41:09] ✅ 第 2 组: 刘泽 (单独) +[2025-07-01 15:41:09] ✅ 第 3 组: 黄锡恩 (单独) +[2025-07-01 15:41:09] ✅ 第 4 组: 胡中, 丁逸夫 (2人连坐) +[2025-07-01 15:41:09] ✅ 第 5 组: 沈佳琰 (单独) +[2025-07-01 15:41:09] +=== 座位信息结构校验 === +[2025-07-01 15:41:09] ✅ 所有必需列都存在 +[2025-07-01 15:41:09] ✅ 区域 列数据完整 +[2025-07-01 15:41:09] ✅ 楼层 列数据完整 +[2025-07-01 15:41:09] ✅ 排号 列数据完整 +[2025-07-01 15:41:09] ✅ 座位号 列数据完整 +[2025-07-01 15:41:09] +座位结构分析: +[2025-07-01 15:41:09] +座位结构分析: +[2025-07-01 15:41:09] ✅ 西北门入口场地A5区-场地-19排: 6 个座位完全连续 (1-6) +[2025-07-01 15:41:09] +=== 容量和可行性校验 === +[2025-07-01 15:41:09] 总人数: 6 +[2025-07-01 15:41:09] 总座位数: 6 +[2025-07-01 15:41:09] ✅ 座位充足: 剩余 0 个座位 +[2025-07-01 15:41:09] +连坐组需求分析: +[2025-07-01 15:41:09] 最大连坐组: 2 人 +[2025-07-01 15:41:09] +连续座位可行性分析: +[2025-07-01 15:41:09] 西北门入口场地A5区-场地-19排: 最大连续 6 个座位 +[2025-07-01 15:41:09] +全场最大连续座位: 6 个 +[2025-07-01 15:41:09] ✅ 可以容纳最大连坐组 +[2025-07-01 15:41:09] 可容纳最大连坐组的排数: 1 个 +[2025-07-01 15:41:09] +连坐组分布: +[2025-07-01 15:41:09] 单人组: 4 个 +[2025-07-01 15:41:09] 2人连坐组: 1 个 +[2025-07-01 15:41:09] +============================================================ +[2025-07-01 15:41:09] 校验结果总结 +[2025-07-01 15:41:09] ============================================================ +[2025-07-01 15:41:09] 人员信息结构: ✅ 通过 +[2025-07-01 15:41:09] 连坐组完整性: ✅ 通过 +[2025-07-01 15:41:09] 座位信息结构: ✅ 通过 +[2025-07-01 15:41:09] 容量可行性: ✅ 通过 +[2025-07-01 15:41:09] +总体校验结果: ✅ 全部通过 +[2025-07-01 15:41:09] +🎉 文件校验通过,可以进行座位分配! +[2025-07-01 15:41:19] +============================================================ +[2025-07-01 15:41:19] 开始座位分配 +[2025-07-01 15:41:19] ============================================================ +[2025-07-01 15:41:19] +=== 人员连坐需求分析 === +[2025-07-01 15:41:19] 总共识别出 5 个座位组: +[2025-07-01 15:41:19] 单人组: 4 个 +[2025-07-01 15:41:19] 2人连坐组: 1 个 +[2025-07-01 15:41:19] +=== 高级座位结构分析 === +[2025-07-01 15:41:19] ✅ 西北门入口场地A5区-场地-19排: 6 个座位完全连续 +[2025-07-01 15:41:19] +=== 开始智能座位分配 === +[2025-07-01 15:41:19] 需要分配 5 个组 +[2025-07-01 15:41:19] +处理第 1 组: 胡中 (group, 2 人) +[2025-07-01 15:41:19] 分配到 西北门入口场地A5区-场地-19排 (连续座位: 1-2) +[2025-07-01 15:41:19] 胡中 -> 1号 +[2025-07-01 15:41:19] 丁逸夫 -> 2号 +[2025-07-01 15:41:19] +处理第 2 组: 叶一帆 (single, 1 人) +[2025-07-01 15:41:19] 分配到 西北门入口场地A5区-场地-19排: 叶一帆 -> 3号 +[2025-07-01 15:41:19] +处理第 3 组: 刘泽 (single, 1 人) +[2025-07-01 15:41:19] 分配到 西北门入口场地A5区-场地-19排: 刘泽 -> 4号 +[2025-07-01 15:41:19] +处理第 4 组: 黄锡恩 (single, 1 人) +[2025-07-01 15:41:19] 分配到 西北门入口场地A5区-场地-19排: 黄锡恩 -> 5号 +[2025-07-01 15:41:19] +处理第 5 组: 沈佳琰 (single, 1 人) +[2025-07-01 15:41:19] 分配到 西北门入口场地A5区-场地-19排: 沈佳琰 -> 6号 +[2025-07-01 15:41:19] +座位分配结果已保存到: log/座位信息_最终分配.xlsx +[2025-07-01 15:41:19] 分配日志已保存到: log/最终座位分配日志.xlsx +[2025-07-01 15:41:19] +=== 分配统计 === +[2025-07-01 15:41:19] 总共分配了 6 个座位 +[2025-07-01 15:41:19] +按组大小统计: +[2025-07-01 15:41:19] 单人组: 4 个组, 4 人 +[2025-07-01 15:41:19] 2人连坐组: 1 个组, 2 人 +[2025-07-01 15:41:19] +=== 连续性验证 === +[2025-07-01 15:41:19] ✅ 组 1 (胡中): 2人连坐,座位连续 [1, 2] +[2025-07-01 15:41:19] +连续性检查结果: 1/1 个多人组座位连续 (100.0%) +[2025-07-01 15:41:19] +🎉 座位分配完成! \ No newline at end of file diff --git a/log/座位信息_最终分配.xlsx b/log/座位信息_最终分配.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d505a1282c0f080ecc042d12bf54f539d823d625 GIT binary patch literal 5630 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%0D*{8)-fYTr>bc@eTk$@p}XD zfH>Q^ScAc?E)W0u`D+)+OkLEN=b;FNFb`tH{e&%QQR1-OqgIp2ap=o+n-6FDM4jqr zRUyehpjS;-i3WmVnoodmLaU$fbdOAeTcU(>q0twrWU;oQUQ2Mqx=Q6#ujK&bz8s7- zcK;IGp!{C2jO|rT1oZ@67p?O}q6kZ@vR5jIbeXZgBqYv)qd~2(NT_ggu<>r}2=G}K zm#q5op|4LJ{4= z9vxJ2JzOAad%(cD#n}?_t;b3>f?02#R{Mth`Wgf-FTk49C9N8jwD) zUzgNf4Py`iHf+mnbSAB6R+m@_fQ22!v2?A87LMi0)}J@{cRkRW$=+&e`Q{PdI|)T0 z{;_56XIF6+(z0Nc3Ag_Nb)eHIS}0OtO>&Nikdu)^aHq2IVWSSr9mm)D2G#l+I$WST zXi=09-1lDm+@X@X??>_$ZK!|`3)cRH9uth=v&K6VZw?~&9 zF$rVA4_DeED8cg%#vY|YCrxM}V}$g~XplR4aug!;)DAIW1m|0WKNf#})sJud-?*@L z1U+gs7K-i1mdBRmr1Oxo(3Z!xJ}`72EyJ5W!-KtZbDe62iMl|1Y!xd)mB8Pthzt;C zc1OYCHu$bSUSVwdQ9EO^K%%x;j2%LS32pNRB=zM=~j zZhtGf!T6_tz9U}ayh8;59Pj`Dg5UmearLqXyZmas7WL+1(|L%l$-1$U)U~vWWC|XQ zt0d3a!WP3?)69aHO^bMoE!$f8Ye^FJ?kplIbD&4m*$twW;`R9(uW7cph1uSRJ=o9K zl?2aL?ADuiVNJLYDA|>m-$`-LCTQ6#xffSpS=-#i!Pf)T5VRBj;IkQOX{E6L;gnnb z<4B``_hYV!oPZX!qm8!%4;J~@Z8vI1CHyV)nN4H}6uDZtU zO+7z%5)7s1eK6l{2g!LCTD<=CQI^~jQ>tZG&OK%5Mn1)GH-<<(h&WOrQXalRNhp#*u_b6SX=`V(VpDWDj5uSV*8HGvlnr5lgM7$N4$y; zV}lPRAQ#lx??T*(CW;pS+>D+nX=_#9`$S?$(f88?^R2@-y@ukX%!KP~OyHR;dW-4UE@#-VC^51sHTXdfyVrJUut%0gH zSy^1=grFREYL|JKeJ@Y9@vNReDd3|WyII!DJc9=Us#09Jpt#Yq86wUvC(Qj^U5-rK?VFR)B2w{-woD#a#Q3y44hy8>;+Az0ZYUpk zkS9uZWTJ$>t@~^1GlxLzewjBWZtT~YQr;gnh&AdMq^!1U@+LqTn@H9NZs<{y(w)5S zSW(WZ%&xW;!rC`IHPB*`5l$$YCyRI*(fx zloz^K4w-qOcv>$TeEjso>7yLJs5@L)x!g~3`Ig6b;wj)8a_Qq7uxbVWT(2$co4+38{ZmE!yX%dmNK$_w38wr_?r$Oeo#MYlRTD3MCzuC6q?~vYKv6WA zi(1HCLPj1QbO8*Mt1Rx^r|JMG(KPZrg{QQAx3qc)iu4iHo)#rOv1SN zA zgH59i<4$|TqYlFawm2BuuJPqZje>w7V&Fqeo7Yu4iT>U&$*^Y&`}z$6aK-vkhLzLZ zwOdK1hsr>ykO@vB8>nBWZzEZVqbu0a)l}EZ3GDLhmx@Xg;lEVWYYO}7X3H<+B(=*O z&9T>x2km~A|0UZT;tF{^|4}8Uk|0?%zZdb{<%+qu&H{Z{#7bPxOO})_MCx-uqCqHj z7NeVz2JuZ{X87Y8XRNhX4ZcJVJW(|<&L}UuYXS|wae?79kbIohK@x-Es&~AVR!L+v?8T9o>1@~TjGtWk!B zD6Jat-5f}_a}cqrD$zIvy_f+RT#92oWT2zC=T}Q3j%INUN*j|7xWL&ObpNeP`<>#b zewny_W8n>`<^C)ybm=9*rJj)HIb(tQA$m{6Fx`nqHtV$!r59oD^?}b+IV`bPlOTLm zyj&95h@zm9qW$+l6_U`uJ^@IE|Nq$PHv0CA=r2QEs;r|A~TPf~>{JW&CL_ZbNU^?LSZ+WN-hsDt;Sy zyAJ*V-b0o} 1号 -[2025-06-30 20:58:53] 彭玉荣 -> 2号 -[2025-06-30 20:58:53] 袁会池 -> 3号 -[2025-06-30 20:58:53] 杨文芳 -> 4号 -[2025-06-30 20:58:53] 张艳芳 -> 5号 -[2025-06-30 20:58:53] -处理第 2 组: 常洁 (group, 4 人) -[2025-06-30 20:58:53] 分配到 L区7895通道-五层-8排 (连续座位: 1-4) -[2025-06-30 20:58:53] 常洁 -> 1号 -[2025-06-30 20:58:53] 陈媛 -> 2号 -[2025-06-30 20:58:53] 王晨婧 -> 3号 -[2025-06-30 20:58:53] 胡艳彬 -> 4号 -[2025-06-30 20:58:53] -处理第 3 组: 尹泽 (group, 4 人) -[2025-06-30 20:58:53] 分配到 L区7895通道-五层-9排 (连续座位: 6-9) -[2025-06-30 20:58:53] 尹泽 -> 6号 -[2025-06-30 20:58:53] 尹依伊 -> 7号 -[2025-06-30 20:58:53] 夏明慧 -> 8号 -[2025-06-30 20:58:53] 贾娜 -> 9号 -[2025-06-30 20:58:53] -处理第 4 组: 赵占博 (group, 4 人) -[2025-06-30 20:58:53] 分配到 L区7895通道-五层-10排 (连续座位: 1-4) -[2025-06-30 20:58:53] 赵占博 -> 1号 -[2025-06-30 20:58:53] 孙羽佳 -> 2号 -[2025-06-30 20:58:53] 季海洋 -> 3号 -[2025-06-30 20:58:53] 刘柳 -> 4号 -[2025-06-30 20:58:53] -处理第 5 组: 刘晓雨 (group, 3 人) -[2025-06-30 20:58:53] 分配到 A区136通道-五层-10排 (连续座位: 6-8) -[2025-06-30 20:58:53] 刘晓雨 -> 6号 -[2025-06-30 20:58:53] 李宇峥 -> 7号 -[2025-06-30 20:58:53] 李霞 -> 8号 -[2025-06-30 20:58:53] -处理第 6 组: 王建华 (group, 3 人) -[2025-06-30 20:58:53] 分配到 A区136通道-五层-11排 (连续座位: 5-7) -[2025-06-30 20:58:53] 王建华 -> 5号 -[2025-06-30 20:58:53] 赵雅楠 -> 6号 -[2025-06-30 20:58:53] 王格 -> 7号 -[2025-06-30 20:58:53] -处理第 7 组: 白建新 (group, 3 人) -[2025-06-30 20:58:53] 分配到 A区136通道-五层-11排 (连续座位: 8-10) -[2025-06-30 20:58:53] 白建新 -> 8号 -[2025-06-30 20:58:53] 李海生 -> 9号 -[2025-06-30 20:58:53] 李苓 -> 10号 -[2025-06-30 20:58:53] -处理第 8 组: 马志鑫 (group, 3 人) -[2025-06-30 20:58:53] 分配到 A区136通道-五层-11排 (连续座位: 11-13) -[2025-06-30 20:58:53] 马志鑫 -> 11号 -[2025-06-30 20:58:53] 肖金玲 -> 12号 -[2025-06-30 20:58:53] 马学利 -> 13号 -[2025-06-30 20:58:53] -处理第 9 组: 朱仁龙 (group, 3 人) -[2025-06-30 20:58:53] 分配到 A区136通道-三层-12排 (连续座位: 2-4) -[2025-06-30 20:58:53] 朱仁龙 -> 2号 -[2025-06-30 20:58:53] 肖俊斌 -> 3号 -[2025-06-30 20:58:53] 孙铭泽 -> 4号 -[2025-06-30 20:58:53] -处理第 10 组: 黄鹤 (group, 3 人) -[2025-06-30 20:58:53] 分配到 A区136通道-三层-12排 (连续座位: 5-7) -[2025-06-30 20:58:53] 黄鹤 -> 5号 -[2025-06-30 20:58:53] 张刚 -> 6号 -[2025-06-30 20:58:53] 张宸宁 -> 7号 -[2025-06-30 20:58:53] -处理第 11 组: 安春利 (group, 2 人) -[2025-06-30 20:58:53] 分配到 A区136通道-五层-10排 (连续座位: 9-10) -[2025-06-30 20:58:53] 安春利 -> 9号 -[2025-06-30 20:58:53] 杨茗珺 -> 10号 -[2025-06-30 20:58:53] -处理第 12 组: 侯俊帆 (group, 2 人) -[2025-06-30 20:58:53] 分配到 A区136通道-五层-11排 (连续座位: 1-2) -[2025-06-30 20:58:53] 侯俊帆 -> 1号 -[2025-06-30 20:58:53] 杨璇羽 -> 2号 -[2025-06-30 20:58:53] -处理第 13 组: 刘金龙 (group, 2 人) -[2025-06-30 20:58:53] 分配到 A区136通道-三层-12排 (连续座位: 8-9) -[2025-06-30 20:58:53] 刘金龙 -> 8号 -[2025-06-30 20:58:53] 杨宇航 -> 9号 -[2025-06-30 20:58:53] -处理第 14 组: 张城 (group, 2 人) -[2025-06-30 20:58:53] 分配到 A区136通道-三层-12排 (连续座位: 10-11) -[2025-06-30 20:58:53] 张城 -> 10号 -[2025-06-30 20:58:53] 张倩 -> 11号 -[2025-06-30 20:58:53] -处理第 15 组: 陈新闻 (group, 2 人) -[2025-06-30 20:58:53] 分配到 L区552通道-三层-12排 (连续座位: 12-13) -[2025-06-30 20:58:53] 陈新闻 -> 12号 -[2025-06-30 20:58:53] 刘佳欢 -> 13号 -[2025-06-30 20:58:53] -处理第 16 组: 孙昊 (group, 2 人) -[2025-06-30 20:58:53] 分配到 L区552通道-三层-13排 (连续座位: 1-2) -[2025-06-30 20:58:53] 孙昊 -> 1号 -[2025-06-30 20:58:53] 晋秋跃 -> 2号 -[2025-06-30 20:58:53] -处理第 17 组: 高尚谦 (group, 2 人) -[2025-06-30 20:58:53] 分配到 L区552通道-三层-13排 (连续座位: 3-4) -[2025-06-30 20:58:53] 高尚谦 -> 3号 -[2025-06-30 20:58:53] 胡梦幻 -> 4号 -[2025-06-30 20:58:53] -处理第 18 组: 郝罡 (group, 2 人) -[2025-06-30 20:58:53] 分配到 L区552通道-三层-13排 (连续座位: 5-6) -[2025-06-30 20:58:53] 郝罡 -> 5号 -[2025-06-30 20:58:53] 林杰 -> 6号 -[2025-06-30 20:58:53] -处理第 19 组: 王璐瑶 (group, 2 人) -[2025-06-30 20:58:53] 分配到 L区552通道-三层-13排 (连续座位: 7-8) -[2025-06-30 20:58:53] 王璐瑶 -> 7号 -[2025-06-30 20:58:53] 刘昌昊 -> 8号 -[2025-06-30 20:58:53] -处理第 20 组: 陈宇 (group, 2 人) -[2025-06-30 20:58:53] 分配到 L区552通道-三层-13排 (连续座位: 9-10) -[2025-06-30 20:58:53] 陈宇 -> 9号 -[2025-06-30 20:58:53] 房晨 -> 10号 -[2025-06-30 20:58:53] -处理第 21 组: 赵瑞 (group, 2 人) -[2025-06-30 20:58:53] 分配到 L区552通道-三层-13排 (连续座位: 11-12) -[2025-06-30 20:58:53] 赵瑞 -> 11号 -[2025-06-30 20:58:53] 郭闯远 -> 12号 -[2025-06-30 20:58:53] -处理第 22 组: 尚校 (group, 2 人) -[2025-06-30 20:58:53] 分配到 L区552通道-三层-14排 (连续座位: 1-2) -[2025-06-30 20:58:53] 尚校 -> 1号 -[2025-06-30 20:58:53] 尚冕 -> 2号 -[2025-06-30 20:58:53] -处理第 23 组: 徐金瑞 (group, 2 人) -[2025-06-30 20:58:53] 分配到 L区552通道-三层-14排 (连续座位: 3-4) -[2025-06-30 20:58:53] 徐金瑞 -> 3号 -[2025-06-30 20:58:53] 赵春颖 -> 4号 -[2025-06-30 20:58:53] -处理第 24 组: 杨文 (group, 2 人) -[2025-06-30 20:58:53] 分配到 L区552通道-三层-14排 (连续座位: 5-6) -[2025-06-30 20:58:53] 杨文 -> 5号 -[2025-06-30 20:58:53] 马新雨 -> 6号 -[2025-06-30 20:58:53] -处理第 25 组: 周勇 (group, 2 人) -[2025-06-30 20:58:53] 分配到 L区552通道-三层-14排 (连续座位: 7-8) -[2025-06-30 20:58:53] 周勇 -> 7号 -[2025-06-30 20:58:53] 常佳琦 -> 8号 -[2025-06-30 20:58:53] -处理第 26 组: 李慧 (group, 2 人) -[2025-06-30 20:58:53] 分配到 L区552通道-五层-14排 (连续座位: 10-11) -[2025-06-30 20:58:53] 李慧 -> 10号 -[2025-06-30 20:58:53] 白杨 -> 11号 -[2025-06-30 20:58:53] -处理第 27 组: 赵欣悦 (group, 2 人) -[2025-06-30 20:58:53] 分配到 L区552通道-五层-14排 (连续座位: 12-13) -[2025-06-30 20:58:53] 赵欣悦 -> 12号 -[2025-06-30 20:58:53] 金子昂 -> 13号 -[2025-06-30 20:58:53] -处理第 28 组: 马梓涵 (group, 2 人) -[2025-06-30 20:58:53] 分配到 L区552通道-五层-15排 (连续座位: 1-2) -[2025-06-30 20:58:53] 马梓涵 -> 1号 -[2025-06-30 20:58:53] 宋晓娟 -> 2号 -[2025-06-30 20:58:53] -处理第 29 组: 张春红 (group, 2 人) -[2025-06-30 20:58:53] 分配到 L区552通道-五层-15排 (连续座位: 3-4) -[2025-06-30 20:58:53] 张春红 -> 3号 -[2025-06-30 20:58:53] 蒋梦娇 -> 4号 -[2025-06-30 20:58:53] -处理第 30 组: 肖垚 (group, 2 人) -[2025-06-30 20:58:53] 分配到 L区552通道-五层-15排 (连续座位: 5-6) -[2025-06-30 20:58:53] 肖垚 -> 5号 -[2025-06-30 20:58:53] 韩文娟 -> 6号 -[2025-06-30 20:58:53] -处理第 31 组: 粘旻环 (group, 2 人) -[2025-06-30 20:58:53] 分配到 L区552通道-五层-15排 (连续座位: 10-11) -[2025-06-30 20:58:53] 粘旻环 -> 10号 -[2025-06-30 20:58:53] 李怡台 -> 11号 -[2025-06-30 20:58:53] -处理第 32 组: 文志 (group, 2 人) -[2025-06-30 20:58:53] 分配到 L区552通道-五层-15排 (连续座位: 12-13) -[2025-06-30 20:58:53] 文志 -> 12号 -[2025-06-30 20:58:53] 刘薇 -> 13号 -[2025-06-30 20:58:53] -处理第 33 组: 于浩 (group, 2 人) -[2025-06-30 20:58:53] 分配到 L区552通道-五层-16排 (连续座位: 1-2) -[2025-06-30 20:58:53] 于浩 -> 1号 -[2025-06-30 20:58:53] 王雅暄 -> 2号 -[2025-06-30 20:58:53] -处理第 34 组: 高跃 (group, 2 人) -[2025-06-30 20:58:53] 分配到 L区552通道-五层-16排 (连续座位: 3-4) -[2025-06-30 20:58:53] 高跃 -> 3号 -[2025-06-30 20:58:53] 李敏 -> 4号 -[2025-06-30 20:58:53] -处理第 35 组: 吴晓辉 (group, 2 人) -[2025-06-30 20:58:53] 分配到 L区552通道-五层-16排 (连续座位: 5-6) -[2025-06-30 20:58:53] 吴晓辉 -> 5号 -[2025-06-30 20:58:53] 王子宁 -> 6号 -[2025-06-30 20:58:53] -处理第 36 组: 丁勇 (group, 2 人) -[2025-06-30 20:58:53] 分配到 L区552通道-五层-16排 (连续座位: 7-8) -[2025-06-30 20:58:53] 丁勇 -> 7号 -[2025-06-30 20:58:53] 焦雯 -> 8号 -[2025-06-30 20:58:53] -处理第 37 组: 田悦 (group, 2 人) -[2025-06-30 20:58:53] 分配到 L区552通道-五层-16排 (连续座位: 9-10) -[2025-06-30 20:58:53] 田悦 -> 9号 -[2025-06-30 20:58:53] 叶贵天 -> 10号 -[2025-06-30 20:58:53] -处理第 38 组: 王鹏舒 (single, 1 人) -[2025-06-30 20:58:53] 分配到 L区7895通道-五层-9排: 王鹏舒 -> 10号 -[2025-06-30 20:58:53] -处理第 39 组: 吴旭 (single, 1 人) -[2025-06-30 20:58:53] 分配到 L区7895通道-五层-10排: 吴旭 -> 5号 -[2025-06-30 20:58:53] -处理第 40 组: 刘捷 (single, 1 人) -[2025-06-30 20:58:53] 分配到 A区136通道-五层-12排: 刘捷 -> 1号 -[2025-06-30 20:58:53] -处理第 41 组: 张艺馨 (single, 1 人) -[2025-06-30 20:58:53] 分配到 L区552通道-三层-13排: 张艺馨 -> 13号 -[2025-06-30 20:58:53] -处理第 42 组: 张然殊 (single, 1 人) -[2025-06-30 20:58:53] 分配到 L区552通道-三层-14排: 张然殊 -> 9号 -[2025-06-30 20:58:53] -处理第 43 组: 王莲 (single, 1 人) -[2025-06-30 20:58:53] 分配到 L区552通道-五层-15排: 王莲 -> 7号 -[2025-06-30 20:58:53] -处理第 44 组: 解子辰 (single, 1 人) -[2025-06-30 20:58:53] 分配到 L区552通道-五层-16排: 解子辰 -> 11号 -[2025-06-30 20:58:53] -处理第 45 组: 张瑞 (single, 1 人) -[2025-06-30 20:58:53] 分配到 L区552通道-五层-16排: 张瑞 -> 12号 -[2025-06-30 20:58:53] -处理第 46 组: 李薏 (single, 1 人) -[2025-06-30 20:58:53] 分配到 L区552通道-五层-16排: 李薏 -> 13号 -[2025-06-30 20:58:53] -处理第 47 组: 张松 (single, 1 人) -[2025-06-30 20:58:53] 分配到 L区552通道-五层-17排: 张松 -> 1号 -[2025-06-30 20:58:53] -处理第 48 组: 游伊萌 (single, 1 人) -[2025-06-30 20:58:53] 分配到 L区552通道-五层-17排: 游伊萌 -> 2号 -[2025-06-30 20:58:53] -座位分配结果已保存到: 座位信息_最终分配.xlsx -[2025-06-30 20:58:53] 分配日志已保存到: 最终座位分配日志.xlsx -[2025-06-30 20:58:53] -=== 分配统计 === -[2025-06-30 20:58:53] 总共分配了 100 个座位 -[2025-06-30 20:58:53] -按组大小统计: -[2025-06-30 20:58:53] 单人组: 11 个组, 11 人 -[2025-06-30 20:58:53] 2人连坐组: 27 个组, 54 人 -[2025-06-30 20:58:53] 3人连坐组: 6 个组, 18 人 -[2025-06-30 20:58:53] 4人连坐组: 3 个组, 12 人 -[2025-06-30 20:58:53] 5人连坐组: 1 个组, 5 人 -[2025-06-30 20:58:53] -=== 连续性验证 === -[2025-06-30 20:58:53] ✅ 组 1 (杨文彦): 5人连坐,座位连续 [1, 2, 3, 4, 5] -[2025-06-30 20:58:53] ✅ 组 2 (常洁): 4人连坐,座位连续 [1, 2, 3, 4] -[2025-06-30 20:58:53] ✅ 组 3 (尹泽): 4人连坐,座位连续 [6, 7, 8, 9] -[2025-06-30 20:58:53] ✅ 组 4 (赵占博): 4人连坐,座位连续 [1, 2, 3, 4] -[2025-06-30 20:58:53] ✅ 组 5 (刘晓雨): 3人连坐,座位连续 [6, 7, 8] -[2025-06-30 20:58:53] ✅ 组 6 (王建华): 3人连坐,座位连续 [5, 6, 7] -[2025-06-30 20:58:53] ✅ 组 7 (白建新): 3人连坐,座位连续 [8, 9, 10] -[2025-06-30 20:58:53] ✅ 组 8 (马志鑫): 3人连坐,座位连续 [11, 12, 13] -[2025-06-30 20:58:53] ✅ 组 9 (朱仁龙): 3人连坐,座位连续 [2, 3, 4] -[2025-06-30 20:58:53] ✅ 组 10 (黄鹤): 3人连坐,座位连续 [5, 6, 7] -[2025-06-30 20:58:53] ✅ 组 11 (安春利): 2人连坐,座位连续 [9, 10] -[2025-06-30 20:58:53] ✅ 组 12 (侯俊帆): 2人连坐,座位连续 [1, 2] -[2025-06-30 20:58:53] ✅ 组 13 (刘金龙): 2人连坐,座位连续 [8, 9] -[2025-06-30 20:58:53] ✅ 组 14 (张城): 2人连坐,座位连续 [10, 11] -[2025-06-30 20:58:53] ✅ 组 15 (陈新闻): 2人连坐,座位连续 [12, 13] -[2025-06-30 20:58:53] ✅ 组 16 (孙昊): 2人连坐,座位连续 [1, 2] -[2025-06-30 20:58:53] ✅ 组 17 (高尚谦): 2人连坐,座位连续 [3, 4] -[2025-06-30 20:58:53] ✅ 组 18 (郝罡): 2人连坐,座位连续 [5, 6] -[2025-06-30 20:58:53] ✅ 组 19 (王璐瑶): 2人连坐,座位连续 [7, 8] -[2025-06-30 20:58:53] ✅ 组 20 (陈宇): 2人连坐,座位连续 [9, 10] -[2025-06-30 20:58:53] ✅ 组 21 (赵瑞): 2人连坐,座位连续 [11, 12] -[2025-06-30 20:58:53] ✅ 组 22 (尚校): 2人连坐,座位连续 [1, 2] -[2025-06-30 20:58:53] ✅ 组 23 (徐金瑞): 2人连坐,座位连续 [3, 4] -[2025-06-30 20:58:53] ✅ 组 24 (杨文): 2人连坐,座位连续 [5, 6] -[2025-06-30 20:58:53] ✅ 组 25 (周勇): 2人连坐,座位连续 [7, 8] -[2025-06-30 20:58:53] ✅ 组 26 (李慧): 2人连坐,座位连续 [10, 11] -[2025-06-30 20:58:53] ✅ 组 27 (赵欣悦): 2人连坐,座位连续 [12, 13] -[2025-06-30 20:58:53] ✅ 组 28 (马梓涵): 2人连坐,座位连续 [1, 2] -[2025-06-30 20:58:53] ✅ 组 29 (张春红): 2人连坐,座位连续 [3, 4] -[2025-06-30 20:58:53] ✅ 组 30 (肖垚): 2人连坐,座位连续 [5, 6] -[2025-06-30 20:58:53] ✅ 组 31 (粘旻环): 2人连坐,座位连续 [10, 11] -[2025-06-30 20:58:53] ✅ 组 32 (文志): 2人连坐,座位连续 [12, 13] -[2025-06-30 20:58:53] ✅ 组 33 (于浩): 2人连坐,座位连续 [1, 2] -[2025-06-30 20:58:53] ✅ 组 34 (高跃): 2人连坐,座位连续 [3, 4] -[2025-06-30 20:58:53] ✅ 组 35 (吴晓辉): 2人连坐,座位连续 [5, 6] -[2025-06-30 20:58:53] ✅ 组 36 (丁勇): 2人连坐,座位连续 [7, 8] -[2025-06-30 20:58:53] ✅ 组 37 (田悦): 2人连坐,座位连续 [9, 10] -[2025-06-30 20:58:53] -连续性检查结果: 37/37 个多人组座位连续 (100.0%) -[2025-06-30 20:58:53] -🎉 座位分配完成! \ No newline at end of file +[2025-07-01 15:33:27] 校验结果总结 +[2025-07-01 15:33:27] ============================================================ +[2025-07-01 15:33:27] 人员信息结构: ✅ 通过 +[2025-07-01 15:33:27] 连坐组完整性: ✅ 通过 +[2025-07-01 15:33:27] 座位信息结构: ❌ 失败 +[2025-07-01 15:33:27] 容量可行性: ✅ 通过 +[2025-07-01 15:33:27] +总体校验结果: ❌ 存在问题 +[2025-07-01 15:33:27] +⚠️ 请修复上述问题后再进行座位分配。 \ No newline at end of file diff --git a/seat_allocation_system.py b/seat_allocation_system.py index f908ed0..9d8ff11 100644 --- a/seat_allocation_system.py +++ b/seat_allocation_system.py @@ -55,28 +55,142 @@ def check_dependencies(): return True -def check_data_files(): - """检查必要的数据文件""" - required_files = ['人员信息.xlsx', '座位信息.xlsx'] - missing_files = [] +def auto_detect_files(): + """自动检测和识别Excel文件""" + print("\n=== 自动文件识别系统 ===") - print("\n检查数据文件...") - for file_name in required_files: - if Path(file_name).exists(): - print(f"✅ {file_name} 存在") + # 扫描当前目录下的所有xlsx文件 + current_dir = Path('.') + xlsx_files = list(current_dir.glob('*.xlsx')) + + # 过滤掉输出文件和示例文件 + exclude_patterns = ['座位信息_最终分配', '最终座位分配日志', '_示例', '_temp', '_backup'] + xlsx_files = [f for f in xlsx_files if not any(pattern in f.name for pattern in exclude_patterns)] + + print(f"发现 {len(xlsx_files)} 个Excel文件:") + for i, file_path in enumerate(xlsx_files, 1): + file_size = file_path.stat().st_size / 1024 # KB + print(f" {i}. {file_path.name} ({file_size:.1f} KB)") + + if len(xlsx_files) == 0: + print("\n❌ 未找到Excel文件") + print("请确保当前目录下有Excel数据文件") + return None, None + + if len(xlsx_files) > 2: + print(f"\n⚠️ 发现 {len(xlsx_files)} 个Excel文件,超过2个") + print("为避免混淆,请确保目录下只有2个数据文件") + print("(程序会自动忽略输出文件和示例文件)") + + print("\n请手动移除多余文件,或选择要使用的文件:") + for i, file_path in enumerate(xlsx_files, 1): + print(f" {i}. {file_path.name}") + + return None, None + + # 分析文件结构 + print(f"\n正在分析文件结构...") + file_info = [] + + for file_path in xlsx_files: + try: + # 读取文件获取基本信息 + df = pd.read_excel(file_path, nrows=5) # 只读前5行进行分析 + + info = { + 'path': file_path, + 'name': file_path.name, + 'columns': len(df.columns), + 'rows': len(df) + 1, # 加上标题行 + 'column_names': list(df.columns), + 'sample_data': df.head(2) # 获取前2行样本数据 + } + file_info.append(info) + + print(f"\n📄 {file_path.name}:") + print(f" 列数: {info['columns']}") + print(f" 行数: {info['rows']}+ (仅检查前5行)") + print(f" 列名: {', '.join(str(col) for col in info['column_names'][:6])}{'...' if len(info['column_names']) > 6 else ''}") + + except Exception as e: + print(f"\n❌ 读取文件 {file_path.name} 失败: {e}") + return None, None + + # 根据列数自动识别文件类型 + personnel_file = None + seat_file = None + + print(f"\n=== 文件类型识别 ===") + + for info in file_info: + if info['columns'] == 5 or info['columns'] == 6: # 人员信息通常是5-6列 + # 进一步检查列名是否符合人员信息格式 + col_names = [str(col).lower() for col in info['column_names']] + personnel_keywords = ['姓名', 'name', '证件', 'id', '手机', 'phone', '备注', 'remark'] + + if any(keyword in ' '.join(col_names) for keyword in personnel_keywords): + personnel_file = info + print(f"✅ {info['name']} -> 识别为人员信息文件 ({info['columns']}列)") + else: + print(f"⚠️ {info['name']} 有{info['columns']}列,但列名不符合人员信息格式") + + elif info['columns'] >= 10: # 座位信息通常是10-12列 + # 进一步检查列名是否符合座位信息格式 + col_names = [str(col).lower() for col in info['column_names']] + seat_keywords = ['区域', 'area', '楼层', 'floor', '排号', 'row', '座位', 'seat'] + + if any(keyword in ' '.join(col_names) for keyword in seat_keywords): + seat_file = info + print(f"✅ {info['name']} -> 识别为座位信息文件 ({info['columns']}列)") + else: + print(f"⚠️ {info['name']} 有{info['columns']}列,但列名不符合座位信息格式") else: - missing_files.append(file_name) - print(f"❌ {file_name} 不存在") + print(f"❓ {info['name']} 有{info['columns']}列,无法自动识别类型") - if missing_files: - print(f"\n❌ 缺少必要文件: {', '.join(missing_files)}") - print("\n请确保以下文件存在于程序同一目录下:") - print("1. 人员信息.xlsx - 包含姓名、证件类型、证件号、手机号、备注等列") - print("2. 座位信息.xlsx - 包含区域、楼层、排号、座位号等列") + # 验证识别结果 + if personnel_file is None: + print(f"\n❌ 未找到人员信息文件") + print("人员信息文件应包含: 姓名、证件类型、证件号、手机号、备注等列") + return None, None + + if seat_file is None: + print(f"\n❌ 未找到座位信息文件") + print("座位信息文件应包含: 区域、楼层、排号、座位号等列") + return None, None + + print(f"\n🎉 文件识别成功!") + print(f"人员信息: {personnel_file['name']}") + print(f"座位信息: {seat_file['name']}") + + # 显示文件内容预览 + print(f"\n=== 文件内容预览 ===") + + print(f"\n📋 人员信息文件预览 ({personnel_file['name']}):") + print(personnel_file['sample_data'].to_string(index=False, max_cols=10)) + + print(f"\n🪑 座位信息文件预览 ({seat_file['name']}):") + print(seat_file['sample_data'].to_string(index=False, max_cols=10)) + + return personnel_file['path'], seat_file['path'] + +def check_data_files(): + """检查并自动识别数据文件""" + print("\n=== 数据文件检查 ===") + + # 首先尝试自动识别 + personnel_file, seat_file = auto_detect_files() + + if personnel_file is None or seat_file is None: + print(f"\n❌ 自动识别失败") + print("\n请检查以下要求:") + print("1. 确保目录下有且仅有2个Excel文件") + print("2. 人员信息文件应有5-6列(姓名、证件类型、证件号、手机号、备注等)") + print("3. 座位信息文件应有10+列(区域、楼层、排号、座位号等)") + print("4. 列名应包含相关关键词") print("\n提示: 您可以参考示例文件来准备数据") - return False + return False, None, None - return True + return True, str(personnel_file), str(seat_file) # 只有在依赖检查通过后才导入这些包 if check_dependencies(): @@ -95,7 +209,12 @@ else: class Logger: """日志记录器""" def __init__(self, log_file='seat_allocation_log.txt'): - self.log_file = log_file + # 创建log文件夹 + self.log_dir = Path('log') + self.log_dir.mkdir(exist_ok=True) + + # 设置日志文件路径 + self.log_file = self.log_dir / log_file self.logs = [] def log(self, message, print_to_console=True): @@ -117,6 +236,10 @@ class Logger: except Exception as e: print(f"保存日志失败: {e}") return False + + def get_log_path(self, filename): + """获取log文件夹中的文件路径""" + return self.log_dir / filename class SeatAllocationSystem: """座位分配系统""" @@ -127,34 +250,44 @@ class SeatAllocationSystem: self.seat_df = None self.seating_groups = [] self.row_analysis = {} + self.personnel_file = None + self.seat_file = None + + def set_data_files(self, personnel_file, seat_file): + """设置数据文件路径""" + self.personnel_file = personnel_file + self.seat_file = seat_file def load_data(self): """加载人员信息和座位信息数据""" self.logger.log("=== 开始加载数据 ===") - # 检查文件是否存在 - personnel_file = '人员信息.xlsx' - seat_file = '座位信息.xlsx' - - if not Path(personnel_file).exists(): - self.logger.log(f"❌ 错误: {personnel_file} 文件不存在") + # 使用自动识别的文件路径 + if not self.personnel_file or not self.seat_file: + self.logger.log("❌ 错误: 数据文件路径未设置") return False - if not Path(seat_file).exists(): - self.logger.log(f"❌ 错误: {seat_file} 文件不存在") + if not Path(self.personnel_file).exists(): + self.logger.log(f"❌ 错误: {self.personnel_file} 文件不存在") + return False + + if not Path(self.seat_file).exists(): + self.logger.log(f"❌ 错误: {self.seat_file} 文件不存在") return False try: + self.logger.log(f"正在读取人员信息文件: {self.personnel_file}") # 读取人员信息,指定数据类型 - self.personnel_df = pd.read_excel(personnel_file, dtype={ + self.personnel_df = pd.read_excel(self.personnel_file, dtype={ '姓名': 'str', '证件类型': 'str', '证件号': 'str', # 证件号作为字符串读取,避免X被转换 '手机号': 'str' }) + self.logger.log(f"正在读取座位信息文件: {self.seat_file}") # 读取座位信息,指定数据类型 - self.seat_df = pd.read_excel(seat_file, dtype={ + seat_df_raw = pd.read_excel(self.seat_file, dtype={ '区域': 'str', '楼层': 'str', '排号': 'str', @@ -165,6 +298,9 @@ class SeatAllocationSystem: '手机号': 'str', '签发地/国籍': 'str' }) + + # 过滤和清洗座位数据 + self.seat_df = self.filter_seat_data(seat_df_raw) # 清理文字信息中的空格 self.clean_text_data() @@ -197,6 +333,52 @@ class SeatAllocationSystem: self.logger.log("✅ 文字数据清理完成") + def filter_seat_data(self, seat_df_raw): + """过滤和清洗座位数据,移除空行和无效数据""" + self.logger.log("开始过滤座位数据...") + + original_count = len(seat_df_raw) + self.logger.log(f"原始数据行数: {original_count}") + + # 关键列,这些列都不能为空 + key_columns = ['区域', '楼层', '排号', '座位号'] + + # 创建过滤条件:关键列都不能为空且不能为'nan'字符串 + filter_condition = True + for col in key_columns: + if col in seat_df_raw.columns: + # 过滤空值、NaN、'nan'字符串 + col_condition = ( + seat_df_raw[col].notna() & + (seat_df_raw[col].astype(str).str.strip() != '') & + (seat_df_raw[col].astype(str).str.lower() != 'nan') + ) + filter_condition = filter_condition & col_condition + + # 应用过滤条件 + seat_df_filtered = seat_df_raw[filter_condition].copy() + + # 重置索引 + seat_df_filtered.reset_index(drop=True, inplace=True) + + filtered_count = len(seat_df_filtered) + removed_count = original_count - filtered_count + + self.logger.log(f"过滤后数据行数: {filtered_count}") + self.logger.log(f"移除无效行数: {removed_count}") + + if removed_count > 0: + self.logger.log(f"✅ 已过滤掉 {removed_count} 行无效数据(空行、示例数据等)") + + # 显示过滤后的数据概览 + if filtered_count > 0: + areas = seat_df_filtered['区域'].unique() + floors = seat_df_filtered['楼层'].unique() + self.logger.log(f"有效座位区域: {', '.join(areas)}") + self.logger.log(f"有效座位楼层: {', '.join(floors)}") + + return seat_df_filtered + def validate_personnel_structure(self): """校验人员信息文件结构""" self.logger.log("\n=== 人员信息结构校验 ===") @@ -805,14 +987,14 @@ class SeatAllocationSystem: """保存分配结果""" try: # 保存更新后的座位信息 - output_file = '座位信息_最终分配.xlsx' + output_file = self.logger.get_log_path('座位信息_最终分配.xlsx') seat_df_result.to_excel(output_file, index=False) self.logger.log(f"\n座位分配结果已保存到: {output_file}") # 保存分配日志 if assignment_log: log_df = pd.DataFrame(assignment_log) - log_file = '最终座位分配日志.xlsx' + log_file = self.logger.get_log_path('最终座位分配日志.xlsx') log_df.to_excel(log_file, index=False) self.logger.log(f"分配日志已保存到: {log_file}") @@ -960,17 +1142,21 @@ class SeatAllocationSystem: def main(): """主函数""" print("=" * 60) - print("座位分配系统 v1.0") + print("座位分配系统 v2.0 (智能识别版)") print("=" * 60) try: - # 检查数据文件 - if not check_data_files(): + # 自动检查和识别数据文件 + success, personnel_file, seat_file = check_data_files() + if not success: input("\n按Enter键退出...") return print("\n开始运行座位分配系统...") system = SeatAllocationSystem() + + # 设置识别出的文件路径 + system.set_data_files(personnel_file, seat_file) # 运行校验 if system.run_validation(): @@ -980,10 +1166,10 @@ def main(): # 运行分配 if system.run_allocation(): print("\n🎉 座位分配完成!") - print("请查看以下输出文件:") - print("- 座位信息_最终分配.xlsx (分配结果)") - print("- 最终座位分配日志.xlsx (详细日志)") - print("- seat_allocation_log.txt (运行日志)") + print("请查看log文件夹中的输出文件:") + print("- log/座位信息_最终分配.xlsx (分配结果)") + print("- log/最终座位分配日志.xlsx (详细日志)") + print("- log/seat_allocation_log.txt (运行日志)") else: print("\n❌ 座位分配失败!") else: diff --git a/windows_build.py b/windows_build.py index 6157881..217847a 100644 --- a/windows_build.py +++ b/windows_build.py @@ -349,32 +349,48 @@ chcp 65001 >nul title 座位分配系统 echo ========================================== -echo 座位分配系统 v1.0 +echo 座位分配系统 v2.0 echo ========================================== echo. -:: 检查数据文件 -if not exist "人员信息.xlsx" ( - echo [错误] 缺少文件: 人员信息.xlsx +:: 检查Excel文件 +echo 正在扫描Excel文件... + +:: 计算xlsx文件数量 +set count=0 +for %%f in (*.xlsx) do ( + :: 排除输出和示例文件 + echo "%%f" | findstr /v /i "最终分配\|分配日志\|示例\|temp\|backup" >nul + if not errorlevel 1 ( + set /a count+=1 + echo 发现文件: %%f + ) +) + +if %count% equ 0 ( echo. - echo 请将 人员信息_示例.xlsx 重命名为 人员信息.xlsx - echo 并按照格式填入您的数据 + echo [错误] 未找到Excel数据文件 echo. + echo 请确保当前目录下有Excel数据文件: + echo 1. 人员信息文件 (5-6列): 姓名、证件类型、证件号、手机号、备注等 + echo 2. 座位信息文件 (10+列): 区域、楼层、排号、座位号等 + echo. + echo 提示: 程序会自动识别文件类型,无需固定文件名 pause exit /b 1 ) -if not exist "座位信息.xlsx" ( - echo [错误] 缺少文件: 座位信息.xlsx +if %count% gtr 2 ( echo. - echo 请将 座位信息_示例.xlsx 重命名为 座位信息.xlsx - echo 并按照格式填入您的数据 + echo [警告] 发现超过2个Excel文件 + echo 为避免识别混淆,请确保目录下只有2个数据文件 echo. + echo 请移除多余文件后重试 pause exit /b 1 ) -echo [成功] 数据文件检查通过 +echo [成功] 找到 %count% 个Excel文件,程序将自动识别文件类型 echo. echo 正在启动座位分配系统... echo. diff --git a/人员信息.xlsx b/人员信息.xlsx index 3c32e218fdad10aa0dd755bd26f71cde6fbcfcad..d2c27b6fa03c6a172023cfab67001930387b6f6e 100644 GIT binary patch literal 10457 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 F{{SGe?+pL| literal 16331 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 AqyPW_ diff --git a/座位信息.xlsx b/座位信息.xlsx index e09103c6bd1452ea57214b983a69f4b3f80de3dc..bdb940d108082dc4c37846d1191ef29882169fe8 100644 GIT binary patch delta 5386 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 L7{`+LZ{z;~r=S%7 delta 8081 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 diff --git a/座位信息_最终分配.xlsx b/座位信息_最终分配.xlsx deleted file mode 100644 index b920e9d64c0e62f75e219b1ea326f10fabdebfb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11609 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 diff --git a/运行座位分配系统.bat b/运行座位分配系统.bat index daf93fa..aafa296 100644 --- a/运行座位分配系统.bat +++ b/运行座位分配系统.bat @@ -1,13 +1,13 @@ @echo off chcp 65001 >nul -title 座位分配系统 v1.0 +title 座位分配系统 v2.0 :: 设置颜色 color 0F echo. echo ========================================== -echo 座位分配系统 v1.0 +echo 座位分配系统 v2.0 echo ========================================== echo. echo 正在检查运行环境... @@ -28,60 +28,49 @@ if not exist "座位分配系统.exe" ( echo [成功] 程序文件检查通过 -:: 检查数据文件 -set "missing_files=" +:: 检查Excel文件 +echo 正在扫描Excel文件... -if not exist "人员信息.xlsx" ( - echo [错误] 缺少文件: 人员信息.xlsx - set "missing_files=1" -) else ( - echo [成功] 人员信息.xlsx 存在 +:: 计算xlsx文件数量 +set count=0 +for %%f in (*.xlsx) do ( + :: 排除输出和示例文件 + echo "%%f" | findstr /v /i "最终分配\|分配日志\|示例\|temp\|backup" >nul + if not errorlevel 1 ( + set /a count+=1 + echo 发现文件: %%f + ) ) -if not exist "座位信息.xlsx" ( - echo [错误] 缺少文件: 座位信息.xlsx - set "missing_files=1" -) else ( - echo [成功] 座位信息.xlsx 存在 -) - -:: 如果有缺失文件,给出指导 -if defined missing_files ( +if %count% equ 0 ( echo. - echo ========================================== - echo 数据文件缺失提示 - echo ========================================== + echo [错误] 未找到Excel数据文件 echo. - echo 请按照以下步骤准备数据文件: - echo. - echo 1. 如果您有示例文件,请重命名: - echo - 人员信息_示例.xlsx → 人员信息.xlsx - echo - 座位信息_示例.xlsx → 座位信息.xlsx - echo. - echo 2. 数据文件格式要求: - echo. - echo 人员信息.xlsx 必需列: - echo - 姓名: 人员姓名 - echo - 证件类型: 身份证/护照等 - echo - 证件号: 证件号码 - echo - 手机号: 联系电话 - echo - 备注: 连坐人数(留空=单独坐) - echo. - echo 座位信息.xlsx 必需列: - echo - 区域: 座位区域 - echo - 楼层: 楼层信息 - echo - 排号: 排号 - echo - 座位号: 具体座位号 - echo. - echo 3. 连坐规则: - echo - 单人: 备注列留空 - echo - 多人: 第一人填写总人数,其他人留空 - echo - 示例: 张三(备注:3)、李四(空)、王五(空) + echo 请确保当前目录下有Excel数据文件: + echo 1. 人员信息文件 (5-6列): 姓名、证件类型、证件号、手机号、备注等 + echo 2. 座位信息文件 (10+列): 区域、楼层、排号、座位号等 echo. + echo 提示: 程序会自动识别文件类型,无需固定文件名 pause exit /b 1 ) +if %count% gtr 2 ( + echo. + echo [警告] 发现超过2个Excel文件 + echo 为避免识别混淆,请确保目录下只有2个数据文件 + echo 程序会自动排除输出文件和示例文件 + echo. + echo 当前Excel文件: + for %%f in (*.xlsx) do echo %%f + echo. + echo 请移除多余文件后重试 + pause + exit /b 1 +) + +echo [成功] 找到 %count% 个Excel文件,程序将自动识别文件类型 + echo. echo ========================================== echo 开始运行程序