一.系统开发工具与环境搭建
1.系统设计开发工具
后端使用Java编程语言的Spring boot框架
项目架构:B/S架构
运行环境:win10/win11、jdk17
前端:
技术:框架Vue.js;UI库:ElementUI;
开发工具:Visual Studio Code;
后端:
技术:Java语言、mybatis plus、Spring boot框架;
开发工具:IDEA 2023.3.3版本;
数据库:
数据库:mysql5.7/8.0
数据库工具:Navicat12版本;
二. 系统实现(部分展示)
1.登录模块
系统一共分为三个角色,管理员,食堂工作人员,供应商。根据角色的不同而展示的界面有所不同。输入用户名和密码,并选择自己对应的角色进行登录。
关键代码如下:
public String SignIn(AppUserDto input){
LambdaQueryWrapper<AppUser> queryWrapper = Wrappers.<AppUser>lambdaQuery()
.eq(Extension.isNotNullOrEmpty(input.getUserName()),AppUser::getUserName,input.getUserName())
.eq(Extension.isNotNullOrEmpty(input.getPassword()),AppUser::getPassword,input.getPassword())
.eq(input.getRoleType()!=null,AppUser::getRoleType,input.getRoleType());List<AppUser> items=_AppUserMpper.selectList(queryWrapper);
if(items.stream().count()==0)
{
throw new CustomException("请检查登录的账号或者密码,角色是否都正确!");
}
Map<String, String> map = new HashMap<>();
map.put(SysConst.UserIdClaim,items.get(0).getId().toString());
map.put(SysConst.RoleTypeClaim,items.get(0).getRoleType().toString());
String token=JWTUtils.getToken(map);
return token;
}
2.数据分析
三种角色,可以查看每个食堂档口所购买的食材种类及数量,为了便于他们更直观地理解这些数据,提供了图表展示的功能。
关键代码如下:
//查询当前档口的采购单
List<PurchasingOrder> purchasingOrderList = purchasingOrders.stream().filter(purchasingOrder -> purchasingOrder.getStallsId().equals(stalls.getId())).collect(Collectors.toList());
//并且订单状态为采购完成
purchasingOrderList = purchasingOrderList.stream().filter(purchasingOrder -> purchasingOrder.getPurchasingOrderStatus().equals(Enums.PurchasingOrderStatus.已完成.index())).collect(Collectors.toList());
//得到这些采购订单的Id集合
List<Integer> purchasingOrderIds = purchasingOrderList.stream().map(PurchasingOrder::getId).collect(Collectors.toList());
//查询出关联的采购订单明细
List<PurchasingOrderDet> dets = purchasingOrderDets.stream().filter(purchasingOrderDet -> purchasingOrderIds.contains(purchasingOrderDet.getPurchasingOrderId())).collect(Collectors.toList());
//得到这些采购订单明细的食材Id集合
List<Integer> foodIds = dets.stream().map(PurchasingOrderDet::getFoodId).collect(Collectors.toList());
//对食材进行去重
foodIds = foodIds.stream().distinct().collect(Collectors.toList());
3.系统通知管理
管理员向所有用户或特定的用户群体传达必要的信息。这些通知可能包含关于系统维护、更新、政策变更、安全警告或其他紧急事项的重要公告。
关键代码如下:
public SysNoticeDto Get(SysNoticePagedInput input) {
if(input.getId()==null)
{
return new SysNoticeDto();
}
PagedResult<SysNoticeDto> pagedResult =List(input);
return pagedResult.getTotalCount()>0?pagedResult.getItems().stream().findFirst().get():new SysNoticeDto();
}
4.用户管理
管理员需要管理用户的账户信息,包括创建、编辑或删除用户账户。
关键代码如下:
public AppUserDto Get(AppUserPagedInput input) {
if(input.getId()==null)
{
return new AppUserDto();
}
PagedResult<AppUserDto> pagedResult =List(input);
return pagedResult.getTotalCount()>0?pagedResult.getItems().stream().findFirst().get():new AppUserDto();
}
5.档口管理
管理员负责维护档口的详细信息,包括档口的位置、所属工作人员等。这些信息对于顾客了解档口服务至关重要。
关键代码如下:
IPage<Stalls> pageRecords = _StallsMpper.selectPage(page, queryWrapper);
//获取所有满足条件的数据行数
Long totalCount = _StallsMpper.selectCount(queryWrapper);
//把Stalls实体转换成Stalls传输模型
List<StallsDto> items = Extension.copyBeanList(pageRecords.getRecords(), StallsDto.class);
for (StallsDto item : items)
//查询出关联的创建用户信息
AppUserDto CreatorAppUserDTO = new AppUserDto();
AppUser CreatorAppUserEntity = _AppUserMapper.selectOne(Wrappers.<AppUser>lambdaQuery().eq(AppUser::getId, item.getCreatorId()));
if (CreatorAppUserEntity != null) {
BeanUtils.copyProperties(CreatorAppUserDTO, CreatorAppUserEntity);
item.setCreatorAppUserDto(CreatorAppUserDTO);
}
6.食材管理
管理员需要管理食材的详细信息,如食材名称、价格、供应商信息、库存量等。这有助于确保食材的质量和供应的稳定性。
关键代码如下:
//声明一个支持食材查询的(拉姆达)表达式
LambdaQueryWrapper<Food> queryWrapper = Wrappers.<Food>lambdaQuery()
.eq(input.getId()!=null&&input.getId()!=0,Food::getId,input.getId())
.eq(input.getCreatorId()!=null,Food::getCreatorId,input.getCreatorId());
7.供应商管理
管理员负责配置和管理系统中的供应设置,包括供应商管理、价格设置、库存阈值等,以确保供应链的顺畅运作。
关键代码如下:
LambdaQueryWrapper<FoodSupply> queryWrapper = Wrappers.<FoodSupply>lambdaQuery()
.eq(input.getId() != null && input.getId() != 0, FoodSupply::getId, input.getId())
.eq(input.getCreatorId() != null, FoodSupply::getCreatorId, input.getCreatorId());
);
8.采购订单管理
管理员需要管理采购订单,包括档口、跟踪采购状态、采购日期等。这有助于确保食材和其他必需品的及时补充。
关键代码如下:
LambdaQueryWrapper<PurchasingOrder> queryWrapper = Wrappers.<PurchasingOrder>lambdaQuery()
.eq(input.getId() != null && input.getId() != 0, PurchasingOrder::getId, input.getId())
.eq(input.getCreatorId() != null, PurchasingOrder::getCreatorId, input.getCreatorId());
9.入库订单管理
管理员负责监督物品的入库流程,包括检查物品质量、记录入库数量、更新库存信息等。这是确保库存准确性的关键步骤。
关键代码如下:
LambdaQueryWrapper<InOrder> queryWrapper = Wrappers.<InOrder>lambdaQuery()
.eq(input.getId() != null && input.getId() != 0, InOrder::getId, input.getId())
.eq(input.getCreatorId() != null, InOrder::getCreatorId, input.getCreatorId());
10.出库订单管理
管理员需要管理物品的出库流程,包括订单状态、记录总数量、档口、用途等。
关键代码如下:
LambdaQueryWrapper<OutOrder> queryWrapper = Wrappers.<OutOrder>lambdaQuery()
.eq(input.getId() != null && input.getId() != 0, OutOrder::getId, input.getId())
.eq(input.getCreatorId() != null, OutOrder::getCreatorId, input.getCreatorId());
三.需求分析
(1) 管理员
1. 数据分析:可以查看每个食堂档口所购买的食材种类及数量,为了便于他们更直观地理解这些数据,提供了图表展示的功能。
2. 系统通知:管理员负责管理和配置系统通知,确保重要信息的及时传达。
3. 用户管理:管理员需要管理用户的账户信息,包括创建、编辑、删除用户账户。
4. 档口信息管理:管理员负责维护档口的详细信息,包括档口的位置、营业时间、联系方式等。
5. 食材管理:管理员需要管理食材的详细信息,如食材名称、价格、供应商信息、库存量等。
6. 供应配置管理:管理员负责配置和管理系统中的供应设置,包括供应商管理、价格设置、库存阈值等。
7. 采购订单管理:管理员需要管理采购订单,包括创建订单、跟踪订单状态、确认收货等。这有助于确保食材和其他必需品的及时补充。
8. 入库管理:管理员负责监督物品的入库流程,包括检查物品质量、记录入库数量、更新库存信息等。这是确保库存准确性的关键步骤。
9. 出库订单管理:管理员需要管理物品的出库流程,包括审核出库请求、记录出库数量、更新库存信息等。这有助于防止库存短缺,并确保物品的合理分配。
(2) 供应商
1.查看系统通知:通过实时监控这些通知,供应商能够及时响应各种情况,确保业务流程的顺畅。
2.食材管理:供应商能够提供各种各样的新鲜食材。这些食材不仅包括新鲜的蔬菜、水果,还包括各种肉类、海鲜等。
3.供应配置管理:供应商可以保证产品的及时供应,同时也能够根据市场需求的变化灵活调整供应策略。
4.采购订单管理:让食堂的工作人员需要进行食材采购,在查看了供应商的食材供应情况后,食堂工作人员可以根据自己的需求,选择是否接单。系统还提供了查看采购明细的功能。
(3) 食材工作人员
1. 采购订单:食堂工作人员根据自己自己的需求去采购,选择供应商,查询出该供应商的供应的食材,输入采购数量,进行采购。
2. 入库订单:食堂的工作人员拥有权限和能力去查看已经成功入库的订单。他们可以了解订单的具体信息,包括但不限于订单的日期、供应商、价格、数量以及预计的到货时间等。
3. 出库订单:这样的权限使得他们能够了解哪些物品已经被领取,从而更好地管理食堂的库存,确保食堂的正常运营。
4. 档口总库存:食堂工作人员可以查看总库存,这意味着他们可以通过系统或记录来了解食堂的存货情况。总库存是指食堂中所有食材、调料和其他物品的数量总和。