基于springboot的铁路制服换发管理软件设计与实现

基于springboot的铁路制服换发管理软件设计与实现 一、项目背景与意义铁路系统作为国家重要的交通基础设施拥有庞大的职工队伍。职工制服是铁路企业形象、安全管理和职业规范的重要体现。传统的铁路制服换发管理多依赖纸质台账、Excel表格或简单的信息系统存在以下痛点数据分散统计困难人员信息、制服尺码、库存、发放记录分散在不同部门难以实时汇总和精准统计。流程繁琐效率低下从需求申请、审批、采购、入库到发放涉及多环节人工流转易出错且周期长。库存管理不透明制服库存数量、型号、存放位置不清容易导致积压或短缺。缺乏历史追溯员工历次换发记录查询不便无法有效分析换发周期和成本。因此设计与实现一套基于SpringBoot的铁路制服换发管理软件旨在实现制服管理的数字化、流程化和智能化提升管理效率降低运营成本并为企业决策提供数据支持具有重要的现实意义。二、技术栈选型本项目采用前后端分离的架构模式后端基于SpringBoot快速构建前端使用Vue.js具体技术栈如下1. 后端技术栈核心框架Spring Boot 2.7.x安全框架Spring Security JWT (JSON Web Token)数据持久层MyBatis-Plus数据库MySQL 8.0缓存RedisAPI文档Swagger2 / Knife4j项目管理Maven其他Lombok, Hutool工具包2. 前端技术栈框架Vue 3 Composition API构建工具ViteUI组件库Element Plus状态管理Pinia路由Vue RouterHTTP客户端Axios3. 开发与部署版本控制Git容器化Docker持续集成/部署Jenkins (可选)三、系统核心功能模块设计系统主要分为后台管理端和员工自助端核心功能模块如下1. 系统管理模块用户管理员工信息导入、角色分配角色与权限管理基于RBAC模型部门管理操作日志审计2. 基础数据管理模块制服品类管理如夏装、冬装、大衣等制服型号与尺码管理供应商管理3. 库存管理模块制服入库、出库记录实时库存查询与预警库存盘点4. 换发流程管理模块核心员工需求申请员工在线提交换发申请选择品类、型号、尺码。多级审批流班组长 → 车间主任 → 物资部门支持自定义流程。采购管理根据审批通过的汇总需求生成采购单。发放与签收库管根据发放单进行出库员工扫码或签字确认签收。历史记录查询员工和管理员均可查询历次换发记录。5. 统计报表模块按部门、时间统计换发数量与成本库存周转率分析员工换发周期分析报表四、核心代码实现示例1. 实体类设计 (UniformChangeApplication.java)import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import java.time.LocalDateTime; Data TableName(uniform_change_application) public class UniformChangeApplication { TableId(type IdType.AUTO) private Long id; private Long employeeId; // 申请人ID private Long uniformItemId; // 制服品类ID private String size; // 尺码 private String reason; // 换发原因新入职、破损、尺码不合等 private Integer status; // 状态0-草稿1-提交待审2-审批中3-已批准4-已驳回5-已发放6-已签收 private String currentApprover; // 当前审批人角色 private String approvalComment; private LocalDateTime applyTime; private LocalDateTime updateTime; TableLogic private Integer deleted; // 逻辑删除 }2. 审批流程服务 (ApprovalService.java)import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; Service public class ApprovalService { Autowired private UniformChangeApplicationMapper applicationMapper; Autowired private ApprovalRecordMapper recordMapper; Autowired private WorkflowConfigService workflowConfigService; Transactional public void submitApproval(Long applicationId, Long approverId, String comment, Boolean approved) { UniformChangeApplication application applicationMapper.selectById(applicationId); if (application null || !application.getStatus().equals(1)) { throw new RuntimeException(申请单状态异常或不存在); } // 保存审批记录 ApprovalRecord record new ApprovalRecord(); record.setApplicationId(applicationId); record.setApproverId(approverId); record.setComment(comment); record.setApproved(approved); record.setApprovalTime(LocalDateTime.now()); recordMapper.insert(record); if (approved) { // 获取下一级审批角色 String nextRole workflowConfigService.getNextApprovalRole(application.getCurrentApprover()); if (nextRole ! null) { // 还有下一级更新当前审批人 application.setCurrentApprover(nextRole); application.setStatus(2); // 审批中 } else { // 审批完成进入待发放状态 application.setStatus(3); // 已批准 application.setCurrentApprover(null); // 触发库存锁定或生成发放单 inventoryService.lockInventory(application); } } else { // 审批驳回 application.setStatus(4); // 已驳回 application.setCurrentApprover(null); } application.setUpdateTime(LocalDateTime.now()); applicationMapper.updateById(application); } }3. 库存锁定与发放 (InventoryService.java 关键方法)import org.springframework.stereotype.Service; Service public class InventoryService { Autowired private InventoryMapper inventoryMapper; /** * 为已批准的申请锁定库存 */ Transactional public void lockInventory(UniformChangeApplication application) { LambdaQueryWrapperlt;Inventorygt; wrapper new LambdaQueryWrapperlt;gt;(); wrapper.eq(Inventory::getUniformItemId, application.getUniformItemId()) .eq(Inventory::getSize, application.getSize()) .ge(Inventory::getAvailableQuantity, 1) // 可用数量大于0 .orderByAsc(Inventory::getStorageDate); // 先进先出 Inventory inventory inventoryMapper.selectOne(wrapper); if (inventory null) { throw new RuntimeException(库存不足无法锁定); } // 减少可用数量增加锁定数量 inventory.setAvailableQuantity(inventory.getAvailableQuantity() - 1); inventory.setLockedQuantity(inventory.getLockedQuantity() 1); inventoryMapper.updateById(inventory); // 记录库存锁定关联 InventoryLock lock new InventoryLock(); lock.setApplicationId(application.getId()); lock.setInventoryId(inventory.getId()); lock.setLockTime(LocalDateTime.now()); inventoryLockMapper.insert(lock); } /** 执行发放扣减锁定库存 */ Transactional public void issueUniform(Long applicationId, Long operatorId) { // 查询关联的库存锁定记录 InventoryLock lock inventoryLockMapper.selectOne( new LambdaQueryWrapperlt;InventoryLockgt;() .eq(InventoryLock::getApplicationId, applicationId) ); Inventory inventory inventoryMapper.selectById(lock.getInventoryId()); // 扣减锁定数量增加出库数量 inventory.setLockedQuantity(inventory.getLockedQuantity() - 1); inventory.setIssuedQuantity(inventory.getIssuedQuantity() 1); inventoryMapper.updateById(inventory); // 更新申请单状态为已发放 UniformChangeApplication application new UniformChangeApplication(); application.setId(applicationId); application.setStatus(5); // 已发放 application.setUpdateTime(LocalDateTime.now()); applicationMapper.updateById(application); // 记录发放日志... } }4. 控制器示例 (UniformController.java)import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; RestController RequestMapping(/api/uniform) Api(tags 制服换发管理) public class UniformController { Autowired private UniformChangeApplicationService applicationService; PostMapping(/apply) ApiOperation(员工提交换发申请) public Resultlt;Stringgt; apply(RequestBody UniformApplyDTO dto, RequestHeader(Authorization) String token) { Long employeeId JwtUtil.getUserIdFromToken(token); applicationService.submitApplication(dto, employeeId); return Result.success(申请提交成功等待审批); } GetMapping(/myApplications) ApiOperation(查询我的申请记录) public Resultlt;Pagelt;UniformChangeApplicationVOgt;gt; getMyApplications( RequestParam(defaultValue 1) Integer pageNum, RequestParam(defaultValue 10) Integer pageSize, RequestHeader(Authorization) String token) { Long employeeId JwtUtil.getUserIdFromToken(token); Pagelt;UniformChangeApplicationVOgt; page applicationService.getMyApplications(employeeId, pageNum, pageSize); return Result.success(page); } }五、数据库表结构核心设计1. 制服换发申请表 (uniform_change_application)CREATE TABLE uniform_change_application ( id bigint NOT NULL AUTO_INCREMENT, employee_id bigint NOT NULL COMMENT 员工ID, uniform_item_id bigint NOT NULL COMMENT 制服品类ID, size varchar(10) NOT NULL COMMENT 尺码, reason varchar(200) DEFAULT NULL COMMENT 换发原因, status tinyint NOT NULL DEFAULT 0 COMMENT 状态, current_approver varchar(50) DEFAULT NULL COMMENT 当前审批人角色, approval_comment varchar(500) DEFAULT NULL COMMENT 审批意见, apply_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT 申请时间, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, deleted tinyint DEFAULT 0 COMMENT 逻辑删除, PRIMARY KEY (id), KEY idx_employee_id (employee_id), KEY idx_status (status) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT制服换发申请表;2. 库存表 (inventory)CREATE TABLE inventory ( id bigint NOT NULL AUTO_INCREMENT, uniform_item_id bigint NOT NULL COMMENT 制服品类ID, size varchar(10) NOT NULL COMMENT 尺码, total_quantity int NOT NULL DEFAULT 0 COMMENT 总数量, available_quantity int NOT NULL DEFAULT 0 COMMENT 可用数量, locked_quantity int NOT NULL DEFAULT 0 COMMENT 锁定数量, issued_quantity int NOT NULL DEFAULT 0 COMMENT 已发放数量, storage_location varchar(100) DEFAULT NULL COMMENT 存放位置, storage_date date DEFAULT NULL COMMENT 入库日期, PRIMARY KEY (id), UNIQUE KEY uk_item_size (uniform_item_id,size) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT库存表;六、总结与展望本文介绍了基于SpringBoot的铁路制服换发管理软件的设计与实现涵盖了项目背景、技术栈选型、核心功能模块、关键代码示例及数据库设计。该系统通过数字化流程有效解决了传统管理方式的痛点提升了管理效率和透明度。未来可扩展方向移动端适配开发微信小程序或APP方便员工随时提交申请和查询。智能推荐基于员工历史尺码数据智能推荐本次换发尺码。物联网集成与智能仓储柜集成实现制服自助领取。大数据分析深入分析换发数据为制服采购预算和设计改进提供决策支持。