尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

保安公司智慧管理系统开发方案:从排班考勤到巡逻轨迹的完整实践

保安公司智慧管理系统开发方案:从排班考勤到巡逻轨迹的完整实践 我发现一个挺有意思的现象每年到了毕业季软件工程、计算机相关专业的学生都在找一个“看起来有技术含量、又不会把工作量撑爆”的选题。“保安公司智慧管理系统”这类题目在毕设选题表里其实出现频率很高但真正把它做明白、答辩时不心虚的人很少。原因是这类系统表面看就是一个普通的增删改查后台很多学生套一个外卖系统的模板就交差了结果被老师一问业务流程就露馅。这个题目我帮人完整设计过一版也陪跑过答辩今天就把整个建设与开发方案摊开讲从选题思路、业务拆解、数据库设计、技术选型到核心代码实现全部走一遍。如果你正为毕设选题发愁或者想把智慧管理系统做得不像“课设作品”而是“可落地产品”这篇值得看完。1. 选题价值判断为什么保安行业值得做一套管理系统我看到很多人选管理系统类题目时喜欢做“学生管理系统”“图书管理系统”“超市进销存”。不是不行而是这些题目太泛滥了答辩时老师能挑的毛病可以列一长串。保安公司智慧管理系统的题眼在于它不光是“管人”还涉及“管岗位”“管任务”“管结算”是一套带有物联网属性的业务管理系统。评审老师第一眼看到的功能边界是“排班-考勤-派岗-巡逻-薪酬结算”这条完整闭环这就比普通管理系统天然高出半级。1.1 保安行业的真实管理痛点论文里不会写但答辩时很加分保安公司本质上是一个典型的人员密集型外包服务企业。白天你在商场看到的是保安员站岗巡逻但回到公司总部管理要面对的事情非常多几百上千名分布在各个驻点的保安员怎么排班、怎么统计工时、怎么防止代打卡、怎么确认巡逻路线真的走到了点位、怎么按项目合同结算服务费、月底怎么核算工资。传统模式下这些工作全靠EXCEL表格和一个调度员的大脑遇到临时顶班、突发状况往往一通电话打过去人调不调得动全看运气。这套系统的核心价值是把“人盯人”变成“数据盯人”清晰记录每个保安员在什么时间、哪个驻点、做了什么事所有过程留痕。这样的业务价值一旦讲清楚整个毕设的立题动机就不空洞了。1.2 这个选题在答辩现场的评分亮点毕设评审最看重三样东西工作量是否饱和、业务理解是否深刻、系统能否演示流畅。从工作量看智慧管理系统天然包含多个端管理后台排班、人员、合同、工资、保安员移动端打卡、接任务、上报、巡逻轨迹、消息推送随便一做就是两万行代码起步。从业务理解看只要在论文里把“多驻点排班冲突”“跨项目顶班审批”这类复杂场景讲明白老师会认为你对业务流程做了深入思考。从演示效果看移动端打卡配合地图轨迹绘制的演示效果远比纯后台表格列表亮眼。2. 业务蓝图甲方视角下的功能需求到底长什么样很多学生一开始就纠结表结构、接口设计这是本末倒置。做业务系统第一步永远是把用户的角色和流程理清楚。保安公司的主要使用角色可以分成四类公司领导、运营调度员、驻点队长、一线保安员外加一个财务角色。2.1 从四条角色线梳理需求公司领导要看的是一张大屏或一套统计报表各驻点在岗人数、今日出勤率、异常事件数量、月度人力成本。他不关心具体某个人几点打卡只关心公司整体运营情况。运营调度员是系统最高频的使用者。他负责维护所有驻点和岗位信息给每个驻点设定需要多少班次、每个班次需要几个人然后手动或自动地把保安员安排到对应班次。临时有人请假时他要能快速找到可替班人员并完成调班。驻点队长管理一个具体项目点的日常运转比如确认队员到岗情况、审核巡逻任务完成与否、处理现场突发事件的填报。一线保安员通过移动端完成上下班打卡、接收排班通知、查看巡逻任务、按路线巡逻并在点位打卡还可以在线提交请假申请。财务人员每个月要根据考勤汇总数据、岗位津贴标准、加班时长一键生成工资核算表并导出给银行代发。2.2 功能模块全景与优先级划分如果你按角色的眼光去拆功能直接呼之欲出。我习惯把整个系统分成基础信息、核心业务、数据决策三大层。层级功能模块核心内容优先级基础信息层组织架构公司-驻点-岗位三级结构高基础信息层人员管理员工档案、入职离职、证书管理高基础信息层合同管理甲方服务合同、驻点人员配置高核心业务层排班管理班次设置、自动排班、调班审批高核心业务层考勤打卡位置打卡、人脸识别、异常申诉高核心业务层巡逻管理路线规划、点位打卡、轨迹生成中核心业务层任务上报异常事件、交接班记录中数据决策层工资核算出勤统计、津贴计算、工资单高数据决策层统计大屏在岗情况、出勤趋势、成本分析中优先级判断的核心逻辑是先保证业务闭环能跑通再考虑数据价值挖掘。排班、考勤、工资这三件事是保安公司最离不开的必须做扎实巡逻是行业特色是你论文里区别于普通人事系统的核心亮点也建议重点做大屏这类属于锦上添花有余力再上。2.3 关键业务流程一次完整的排班到结算链路理解系统业务流程我建议画一条主线答辩的时候你按这条线讲逻辑就非常清晰运营调度员在系统里创建驻点和岗位设定上班周期点击自动排班后系统生成下个月的排班表。保安员登录手机端看到自己的班次安排到岗后在驻点范围内打卡签到。下班时再次打卡签退系统根据打卡时间计算实际工时。巡逻时段内保安员沿系统规划的路线巡检每到一处扫描点位二维码或蓝牙信标完成打卡。月底系统汇总所有考勤记录结合排班计划和请假数据自动扣减计算出每个保安员当月的出勤工时与工资财务确认后即可导出工资表。这套链路里每个环节的数据都有关联——排班数据驱动考勤规则考勤数据驱动工资计算形成一个天然的“数据血缘”写论文时你甚至可以画一张DWD层到ADS层的数据流向图一下子把项目拔高到数据治理的层次。3. 数据库设计六张核心表如何支撑整套业务流转数据库是这类系统的地基。很多毕设翻车就翻在表设计上——要么是字段缺失导致业务做到一半发现流程走不通要么是表之间关联混乱查询时多层嵌套JOIN直接把性能拖垮。这里直接给出我经过实践验证的核心表设计方案。3.1 人员与岗位建模的细节第一张核心表是员工表t_security_guard主键用自增ID或雪花ID都行考虑到毕设演示规模自增ID完全够用。字段建议id、name、phone、id_card_no脱敏存储、avatar、entry_date、position_id当前岗位、hire_status、create_time、update_time。要特别加上一个contract_type字段区分劳务合同和实习协议因为后面工资核算会按不同类型走不同税率。第二张是驻点与岗位表t_post包含id、post_name、project_id所属项目、address、lng、lat经纬度用于打卡范围判定、work_type三班倒/两班倒/长白班、need_people岗位所需人数、remark。经纬度字段千万要加后面做位置打卡就靠它算距离。3.2 排班表与考勤表的关系设计第三张是排班表t_schedule这是整个系统逻辑最复杂的表。字段包括id、post_id、guard_id、work_date、shift_type早班/中班/晚班、start_time、end_time、status草稿/已发布/已替换/已取消、create_by、create_time。设计难点在于一个保安员在同一天只能有一个班次但调班时会涉及“换班”操作也就是A和B交换班次。我的做法是不直接删除原排班记录而是把原记录状态改为“已替换”同时新增一条新排班。这样保留了完整的操作痕迹查询某人某个时间段的历史排班时能还原每一次变动的原因。第四张是考勤打卡表t_attendance字段id、guard_id、schedule_id、work_date、clock_in_time、clock_out_time、clock_in_typeGPS定位/人脸识别/二维码、clock_out_type、work_hours、attendance_status正常/迟到/早退/缺勤/外勤以及一个很关键的source_type标记数据来源是手动补录还是自动生成。考勤数据不建议直接用打卡流水表而是每天凌晨通过定时任务根据排班表批量生成每个保安员当天的考勤记录打卡时更新这条记录的上下班时间。这样月底统计数据时只需要对每个保安员按状态和工时统计不需要扫描海量打卡流水再group by性能完全不同。3.3 巡逻任务表的轨迹打法第五张是巡逻任务表t_patrol_task字段id、post_id、task_name、route_pointsJSON数组按顺序存储点位坐标及名称、start_time、end_time、need_person、status。第六张是巡逻打卡记录表t_patrol_record字段id、task_id、guard_id、point_index、point_name、lat、lng、scan_code、clock_time。每次保安员扫到点位二维码就插入一条记录。生成轨迹时按任务和人员分组按point_index排序再把经纬度抛给前端绘制地图折线即可。这里有一个很多教程不会告诉你的坑点位距离不能太近否则保安员站在一个点就能连续扫码完成整条路线。我建议在设计点位时校验前后两个点的间距低于30米直接拒绝保存这个业务规则写在数据库层的Service里评审时讲出来是实实在在的细节亮点。3.4 数据库设计的两个实践要点第一个要点是尽量减少多对多关联。人员和岗位看起来是多对多但实际上因为排班表的存在你完全可以认为“某个人某天属于某个岗位”这样就把人员-岗位的多对多关系拆解成了排班表与岗位表的一对多以及排班表与人员表的一对一逻辑瞬间清晰。第二个要点是冗余字段不能怕。比如考勤表里冗余schedule_id看起来违反了第三范式但实际查询时非常高效。做业务系统的毕设不要被范式束缚性能与查询便利性优先。4. 技术选型与项目架构毕设场景下的务实搭配技术选型这个问题我见过太多人一上来就要搞Spring Cloud微服务、分布式事务、RocketMQ结果做了一个学期连注册中心都没跑通。毕设选题的本质是完成一个可信的软件交付过程不是研发一套高并发架构。做过就业项目的同学都懂真实的企业级系统往往是单体架构起步的只有在业务规模真正膨胀之后才会拆成微服务。4.1 前后端分离Spring Boot Vue 组合的理由后端选用Spring Boot 2.7.x理由很直接生态最成熟、资料最多、遇到问题一搜就有答案。Spring Boot 3.x虽然已经发布但部分中间件兼容性在毕设阶段容易踩坑建议保持2.7版本。Java 8 Maven MySQL 5.7/8.0的组合是最稳定的底座。前端选用Vue 3 Element Plus ECharts。Vue 3的组合式API写起来比Vue 2清爽很多而且Element Plus的表格、表单、弹窗组件覆盖了后台系统90%的界面需求。地图轨迹展示建议直接用高德地图JS API免费额度对毕设来说足够。移动端不需要单独开发App用H5页面适配手机屏幕即可降低不少工作量。4.2 权限模型为什么直接用三张表搞定保安公司系统里人员的权限差异非常明显领导要看全局报表调度员要操作排班队长只能管理本驻点保安员只能看到自己的任务。权限模型最经典的做法是RBAC基于角色的访问控制五张表用户表、角色表、菜单表、用户角色关联表、角色菜单关联表。很多学生会纠结要不要引入Spring Security。我的建议是如果你对Spring Security不熟用Shiro更省心如果连Shiro也嫌重直接在Interceptor里写一个自定义权限拦截器也行。毕设答辩考察的核心是你的思路而不是框架用得多高深。我自己在项目中用Shiro因为它的注解式权限控制比较直观RequiresPermissions(schedule:edit)一行就能解决大部分接口鉴权。4.3 项目目录与部署方案后端包结构建议按业务模块划分而不是按技术层划分com.security.smart ├── controller │ ├── ScheduleController.java │ ├── AttendanceController.java │ ├── PatrolController.java │ └── SalaryController.java ├── service │ ├── ScheduleService.java │ └── SalaryService.java ├── mapper ├── entity ├── common │ ├── Result.java │ ├── BusinessException.java │ └── GlobalExceptionHandler.java └── config ├── ShiroConfig.java └── WebConfig.java部署方案上毕设阶段不需要买服务器本地一台电脑演示完全足够。但为了保险起见建议装一个Docker Desktop把MySQL和Redis用docker-compose一键启动避免答辩时环境变量不一致导致项目跑不起来。这里再多提一句凡是做管理系统类的毕设Redis不是必需品但如果你在登录模块里用Redis存了Token并配置了30分钟过期这就是一个区分度的加分项。5. 核心业务实现细节巡逻定位、自动排班、工资一键核算有了表结构和技术骨架真正的编码阶段就这么几个硬骨头。我按难度从高到低逐一拆解。5.1 巡逻打卡的防作弊设计巡逻打卡最原始的做法是GPS定位签到但GPS可以被模拟定位欺骗。现在行业里比较可靠的做法是“GPS范围校验 二维码/蓝牙信标二次校验”。实操方案是每个巡逻点位预置一个二维码保安员到达点位后先用手机调起GPS记录经纬度再调用摄像头扫描二维码。后端收到请求后做两道校验第一根据经纬度计算与点位标准坐标的距离如果距离超过100米直接拒绝第二校验二维码内容里的pointId和当前巡逻任务是否匹配防止扫错点位或者跨点位作弊。扫码需要用手机摄像头识别在一个H5页面里集成html5-qrcode组件就行代码量不大但演示效果非常直观。我代码里还加了一个短时间内的重复校验同一人同一点位连续打卡间隔少于5分钟会给出提示这在实际场景里是为了防止保安员在一个点位反复刷任务进度。5.2 自动排班的贪心实现排班是调度员最头疼的工作也是系统最有技术含量的模块。自动排班的本质是在满足“每个班次人数要求”和“每个保安员连续工作时长限制”的前提下给出一个较优的人员分配结果。我采用贪心策略实现从第一天开始遍历当天所有班次对每个班次的人选优先选择“近7天累计工时最少”且“昨天没有上夜班”的保安员。排序条件在SQL或内存中完成每选定一个人就减少该班次的剩余需求人数填满后进入下一天。关键约束代码的伪代码思路如下for (LocalDate date start; !date.isAfter(end); date date.plusDays(1)) { ListShift shifts shiftMapper.selectByDate(date); for (Shift shift : shifts) { int needNum shift.getNeedPeople(); ListGuard candidates getAvailableGuards(date, shift); // 按最近7天工时升序排序优先排工时少的人 candidates.sort(Comparator.comparingInt(g - workHoursService.calcHours(g.getId(), date, 7))); for (Guard guard : candidates) { if (needNum 0) break; // 校验连续排班规则 if (validator.canAssign(guard.getId(), shift, date)) { scheduleMapper.insert(...); needNum--; } } } }这段代码的逻辑看起来不长但通过合理的排序与规则校验足以处理70%的排班场景。实在遇到无解情况比如夜间班次没人愿意上系统生成“人员不足预警”清单由调度员手动处理。这个设计思路在答辩时讲出来会让人眼前一亮因为它真实地处理了业务中不可完全自动化的部分。提醒一句自动排班的“自动”绝对不是智能意义上的最优解而是规则引擎意义上的可行解。你要在论文里如实描述它是什么、能做什么避免用“智能算法”这类显得不专业的表述。但如果你有自信可以在自动排班的基础上加一个遗传算法优化的讨论作为论文的展望章节这是最稳妥的提分策略。5.3 工资核算的完整链路工资核算是我觉得最容易被低估的模块。很多学生把它做成简单的“基本工资×出勤天数”这跟现实严重脱节。保安公司的工资结构一般包含基本工资、岗位津贴、绩效奖金、加班工资、餐补/交通补贴以及应扣项社保个人部分、请假扣款。实现工资核算时最稳妥的方法是建立一张t_salary_config表针对不同岗位设定不同的薪资结构参数post_id、base_salary、position_allowance、performance_bonus、overtime_rate、social_security_base。月末执行核算时遍历上月的考勤汇总数据按照配置计算每一项。这里有一个非常关键的细节加班工资要区分工作日加班和节假日加班倍数不一样。你要在考勤表里额外存一个holiday_flag字段节假日打卡记录标记为1核算时自动按3倍标准计算。这个字段的灵感来源是真实劳动法规定答辩老师在运行时如果注意到这一点学术态度上的好感度会直接拉满。工资核算完成后生成t_salary_record记录每个保安员当月的应发总额、实发总额、扣款明细。页面支持导出Excel用EasyExcel一行代码就能实现工作量不大但演示时很出效果。5.4 消息触达站内信还是对接第三方推送排班发布后、工资核算完成后、巡逻任务下发时都需要通知到人。最low的做法是没有通知用户自己刷新页面看。标准做法是站内信系统建一张t_message表和一张t_user_message关联表用户在移动端看到小红点后点开详情。站内信系统代码量小、效果直接也方便在论文里描述“消息中心”模块。更接近企业真实场景的做法是接入钉钉/企业微信/阿里云短信。比如排班发布后通过阿里云短信API发送一条“您X月X日排班为晚班18:00-22:00”的短信。短信费用很低但演示时如果录一段收到短信的视频绝对是一个记忆点。不推荐在毕设里去接第三方IM推送平台如极光推送等一方面H5页面的推送支持有限另一方面集成配置会让答辩前的最后一晚变得异常痛苦。6. 答辩与调试避坑评审老师爱问的边界问题最后这部分没有做成那种“常见问题大全”我把评审实务里真正出高频率的问题整理一下顺带给出能展示你深度的回答方向。6.1 为什么不做微服务架构这个问题几乎必被问到因为题目里有“智慧系统”四个字老师很可能试探性的问一句。正确的回答不是“微服务难”而是“当前业务规模不需要”保安公司日常在线的操作人员可能就一两百人单体应用在200并发下性能完全足够而微服务拆分后会引入服务治理、分布式事务、链路追踪等额外的复杂性对于系统维护来说是负资产。这个回答展示了你做软件架构时的工程判断力比会堆技术更难得。6.2 排班冲突和数据一致性怎么解决这个问题考察并发和数据一致性的理解。调度员A和调度员B同时给同一个保安员排同一个时间段的班怎么处理我的方案有两层第一层是数据库唯一索引guard_id work_date shift_type从物理层面杜绝重复排班第二层是Service方法上的synchronized或乐观锁版本号防止并发插入时索引冲突抛异常影响用户体验。能把这个答案完整说出来老师基本不会再为难。6.3 保安员离职、请假后排班表怎么调整这个业务问题看似简单但考的是数据状态流转。我的建议是给人员状态和排班状态都设计清晰的流转图谱在职-请假-离职三种人员状态草稿-已发布-已替换-已取消四种排班状态。离职员工只做逻辑删除不物理删除保留所有关联的历史排班、考勤和工资记录。调班时创建新的排班记录并作废原记录防止财务对账时发现工时对不上。6.4 项目排期建议三个月的开发节奏毕设周期一般是三个月很多人前两个月都在摸鱼最后一个星期疯狂赶工做出来的东西质量可想而知。我推荐一个经过验证的节奏第1周业务调研输出功能清单和原型草图完成数据库设计初稿第2-4周完成后端基础框架和核心模块人员、排班、考勤这是整个系统的地基第5-7周完成移动端页面、巡逻打卡、消息中心端到端串通一遍主流程第8-9周工资核算、报表大屏、权限细化第10周深度的自测和边角场景补全比如异常打卡、调班冲突、数据导出的健壮性第11周录制演示视频、整理技术要点第12周写论文、做PPT、内部模拟答辩这样分配的主要原因是核心闭环越早打通后面就越是从容你有充足的时间去完善细节而不是担心功能跑不通。我个人在实际操刀这套方案时最大的体会是“业务流程远比技术本身复杂”。市面上很多毕设课设系统一上来就让你复制代码却没人告诉你保安公司排班要考虑夜班换班、节假日加班、项目合同驻点人数变更这些琐碎但关键的规则。这些规则一旦在代码里落地项目就直接超过六成毕设的深度。最后再分享一个小建议数据库和原型图做完先找身边在物业公司、保安公司有熟人资源的同学朋友帮忙看一眼哪怕只是要几张真实排班表和工资条的脱敏样例都能让你的系统更加真实可信。
返回列表