✌全网粉丝20W+,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌
文末获取项目下载方式
一、项目背景介绍:
我国便利店形成在20世纪90年代初期,现在已经成为我国零售业的一种重要形态,为国民经济的发展起发挥了极大的作用。随着便利店高速的发展,其经营管理也变得愈加复杂,早期的售货员站柜台的形式早已不能满足现有销售也的发展,这样就迫切地需要引入新的管理技术。
随着经济的高速发展,便利店的信息化工作也在紧锣密鼓地进行,与此同时伴随着便利店规模的不断扩大以及各种信息流量的日益增多,其经营管理也变得愈加复杂,而且以往在便利店日常管理中,商品进货、销售、库存等决策主要以经验为主,缺乏实时分析功能,并且伴随着商业运转的中间环节也越来越多,因此以前的手工操作方式就不能适应便利店快速的信息发展的需要,而在计算机科学技术日益发展和成熟的今天,依靠现代化的计算机信息处理技术来管理便利店日常工作中的各类商品及用户的信息数据,既节省了大量的人力、物力、改善了员工的工作条件,减轻了劳动强度,同时也能够快速反映出商品的进销存状况和各种反馈信息分析,使管理人员快速对市场的变化做出对应决策,加快便利店的发展。从而极大地提高便利店的工作效率。
关于库存管理,在美国,有些企业库存周期只有8天,但有些中国企业的库存周期长达51天,仅运输成本一项,占销售额的比例就高达20%-30%。从物流成本构成看,中国物流管理成本占总成本的14%,而美国只有3.8%。对物流企业进行库存管理,其实就是降低其成本。物流企业作为供应链的一部分,不管是对库存进行管理还是要降低成本,都要在供应链的角度上来实行。由于我国物流业发展还处于起步到成熟的阶段,整体的物流规划能力的经验尚不足,并且物流信息化程度不高,许多物流管理还是以人工管理,直接导致了仓储和库存成本居高不下。但从20世纪60年代以来企业信息化的趋势来看,物流企业的库存管理也需趋向于信息化、网络化和高度集成化,随着信息技术的高速发展和国外大型物流企业的纷纷涌入中国,作为现代企业的物流管理的核心部分——库存管理,也要适应时代的发展。
二、项目技术简介:
三、系统功能模块介绍:
四、数据库设计:
1:‘系统用户表’(sys_emp)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 主键 |
user_name | varchar | NULL | 用户名 |
pass_word | varchar | NULL | 密码 |
name | varchar | NULL | 姓名 |
sex | int | NULL | 性别[1:男,2:女] |
head_img | varchar | NULL | 头像 |
status | int | NULL | 状态[1:可用,2:禁用] |
type | int | NULL | 类型[1:老板,2:员工] |
create_time | datetime | NULL | 创建时间 |
tel | varchar | NULL | 联系方式 |
varchar | NULL | qq邮箱 |
2:‘员工操作记录表’(sys_emp_logs)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 主键 |
emp_id | bigint | NULL | 员工ID |
goods_id | bigint | NULL | 商品ID |
type | int | NULL | 类型[1:入库,2:出库,3:下架] |
content | text | NULL | 详细内容 |
create_time | datetime | NULL | 创建时间 |
3:‘商品表’(sys_goods)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 主键 |
goods_name | varchar | NULL | 商品名称 |
goods_img | varchar | NULL | 商品 |
status | int | NULL | 商品状态[1:上架,2:下架] |
price | varchar | NULL | 单价 |
create_time | datetime | NULL | 创建时间 |
type_id | bigint | NULL | 商品所属分类 |
valid_time | datetime | NULL | 商品有效时间 |
4:‘商品库存表’(sys_goods_stock)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 主键 |
goods_id | bigint | NULL | 商品ID |
stock | int | NULL | 库存数量 |
create_time | datetime | NULL | 创建时间 |
5:‘商品类型表’(sys_goods_type)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 主键 |
type_name | varchar | NULL | 分类名称 |
create_time | datetime | NULL | 创建时间 |
6:‘商品预警值配置’(sys_goods_warn)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 主键 |
goods_id | bigint | NULL | 商品ID |
stock_warn_num | int | NULL | 商品预警值 |
create_time | datetime | NULL | 创建时间 |
7:‘预警记录表’(sys_warn_records)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 主键 |
goods_id | bigint | NULL | 商品ID |
warn_num | int | NULL | 预警值 |
current_warn_num | int | NULL | 当前数量 |
create_time | datetime | NULL | 创建时间 |
五、功能模块:
登录模块:前端实现主要是员工登录以及商品相关界面的显示实现。基于Web界面实现的可上下滑动翻页的界面,主要展示便利店的商品信息和库存信息
库存管理: 员工登录成功后,即可进入库存管理界面,可以进行商品的库存信息修改,包括出入库信息的编辑和删除。
分类管理:员工在添加商品成功后,即可进入分类管理界面,可以进行商品的分类信息的修改和保存,便于商品的分类管理以及相关商品的分类查询。
商品管理: 员工在登录成功后,即可进入商品管理界面,可以进行商品的信息的修改和保存,便于商品的分类管理以及相关商品的库存信息编辑。
后端实现:后端实现主要是老板用户进行员工操作记录编辑以及相关商品的库存信息查询时进行的数据交互实现。为了直观地展示后端实现地具体内容,分别展示数据库加载信息的操作记录界面、预警记录界面、预警值管理界面和员工管理界面
六、代码示例:
@PostMapping()
public ReturnMsg login(@RequestBody SysEmpDTO sysEmpDTO) throws Exception {
Assert.isTrue(StrUtil.isNotEmpty(sysEmpDTO.getUserName())
&& StrUtil.isNotEmpty(sysEmpDTO.getPassWord()), "账号或密码不能为空!");
LambdaQueryWrapper<SysEmpDTO> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(SysEmpDTO::getUserName,sysEmpDTO.getUserName()).
eq(SysEmpDTO::getPassWord,sysEmpDTO.getPassWord()).last(BaseConstant.LIMIT_ONE);
SysEmpDTO loginUser = sysEmpService.getOne(queryWrapper);
Assert.notNull(loginUser,"账号或密码错误!");
if(loginUser.getStatus() != 1) {
throw new Exception("账号被冻结!");
}
return ReturnMsg.ok(loginUser);
}
@GetMapping("/{id}")
public ReturnMsg getUserInfo(@PathVariable("id") Long id) {
List<String> roles = new ArrayList<>();
Map<String, Object> map = new HashMap<>();
roles.add("admin");
map.put("roles", roles);
map.put("introduction", "打工人...");
SysEmpDTO userInfo = sysEmpService.getById(id);
map.put("name", userInfo.getName());
map.put("avatar", StrUtil.isNotEmpty(userInfo.getHeadImg()) ? userInfo.getHeadImg() : "http://www.elitetest.cn/img/logo.png");
return ReturnMsg.ok(map);
}
@DeleteMapping()
public ReturnMsg logOut() {
return ReturnMsg.ok();
}
/**
* 默认分页查询
*
* @param sysGoodsDTO
* @return
* @throws IOException
*/
@PostMapping("/page")
public ReturnMsg page(@RequestBody SysGoodsDTO sysGoodsDTO) {
return ReturnMsg.ok(baseService.basePage(sysGoodsDTO));
}
@Override
protected void beforeSaveOrUpdate(SysGoodsDTO entity) throws Exception {
boolean flag = false;
if (entity.getId() == null) {
LambdaQueryWrapper<SysGoodsDTO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(SysGoodsDTO::getGoodsName,entity.getGoodsName());
if(CollectionUtil.isNotEmpty( this.baseService.list(queryWrapper))) throw new Exception("商品名称不能重复");
flag = true;
}
entity.setFlag(flag);
super.beforeSaveOrUpdate(entity);
}
@Override
protected ReturnMsg afterSaveOrUpdate(SysGoodsDTO entity, boolean flag, String msg) throws Exception {
if (entity.getFlag()) {
SysEmpLogsDTO sysEmpLogsDTO = new SysEmpLogsDTO();
sysEmpLogsDTO.setCreateTime(new Date());
sysEmpLogsDTO.setEmpId(entity.getEmpId());
sysEmpLogsDTO.setGoodsId(entity.getId());
SysGoodsDTO goodsInfo = this.baseService.getById(entity.getId());
SysEmpDTO empInfo = sysEmpService.getById(entity.getEmpId());
String concent = "员工【" + empInfo.getName() + "】对商品:【" + goodsInfo.getGoodsName() + "】进行入库操作";
sysEmpLogsDTO.setContent(concent);
sysEmpLogsDTO.setType(1);
sysEmpLogsService.save(sysEmpLogsDTO);
}
return super.afterSaveOrUpdate(entity, flag, msg);
}
@Override
@Transactional(rollbackFor = Exception.class)
protected void beforeRemoveByIds(List<Long> idList) throws Exception {
LambdaQueryWrapper<SysGoodsDTO> queryWrapper = new LambdaQueryWrapper<>();
for (Long aLong : idList) {
queryWrapper.eq(SysGoodsDTO::getTypeId,aLong);
List<SysGoodsDTO> list = sysGoodsService.list(queryWrapper);
if(CollectionUtil.isNotEmpty(list)) throw new Exception("当前分类下存在商品,不能删除该分类!");
}
super.beforeRemoveByIds(idList);
}
/**
*
* @param entity
* @throws Exception
*/
@Override
protected void beforeSaveOrUpdate(SysGoodsTypeDTO entity) throws Exception {
if (entity.getId() == null) {
LambdaQueryWrapper<SysGoodsTypeDTO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(SysGoodsTypeDTO::getTypeName,entity.getTypeName());
if(CollectionUtil.isNotEmpty( this.baseService.list(queryWrapper)))
throw new Exception("分类名称不能重复");
}
super.beforeSaveOrUpdate(entity);
}
@Override
protected ReturnMsg afterRemoveByIds(boolean flag, List<Long> list) {
LambdaQueryWrapper<SysGoodsStockDTO> stockDTOLambdaQueryWrapper = new LambdaQueryWrapper<>();
stockDTOLambdaQueryWrapper.in(SysGoodsStockDTO::getGoodsId,list);
sysGoodsStockService.remove(stockDTOLambdaQueryWrapper);
LambdaQueryWrapper<SysGoodsWarnDTO> sysGoodsWarnDTOLambdaQueryWrapper = new LambdaQueryWrapper<>();
sysGoodsWarnDTOLambdaQueryWrapper.in(SysGoodsWarnDTO::getGoodsId,list);
sysGoodsWarnService.remove(sysGoodsWarnDTOLambdaQueryWrapper);
LambdaQueryWrapper<SysEmpLogsDTO> sysEmpLogsDTOLambdaQueryWrapper = new LambdaQueryWrapper<>();
sysEmpLogsDTOLambdaQueryWrapper.in(SysEmpLogsDTO::getGoodsId,list);
sysEmpLogsService.remove(sysEmpLogsDTOLambdaQueryWrapper);
LambdaQueryWrapper<SysWarnRecordsDTO> sysWarnRecordsDTOLambdaQueryWrapper = new LambdaQueryWrapper<>();
sysWarnRecordsDTOLambdaQueryWrapper.in(SysWarnRecordsDTO::getGoodsId,list);
sysWarnRecordsService.remove(sysWarnRecordsDTOLambdaQueryWrapper);
return super.afterRemoveByIds(flag, list);
}
/**
* 上下架操作
*
* @param sysGoodsDTO
* @return
*/
@PostMapping("/on")
public ReturnMsg on(@RequestBody SysGoodsDTO sysGoodsDTO) {
this.baseService.updateById(sysGoodsDTO);
SysEmpLogsDTO sysEmpLogsDTO = new SysEmpLogsDTO();
sysEmpLogsDTO.setCreateTime(new Date());
sysEmpLogsDTO.setEmpId(sysGoodsDTO.getEmpId());
sysEmpLogsDTO.setGoodsId(sysGoodsDTO.getId());
SysGoodsDTO goodsInfo = this.baseService.getById(sysGoodsDTO.getId());
SysEmpDTO empInfo = sysEmpService.getById(sysGoodsDTO.getEmpId());
String type = sysGoodsDTO.getStatus() == 1 ? "上架" : "下架";
String concent = "员工" + empInfo.getName() + "对商品:【" + goodsInfo.getGoodsName() + "】进行" + type + "操作";
sysEmpLogsDTO.setContent(concent);
sysEmpLogsDTO.setType(sysGoodsDTO.getStatus() == 1 ? 4: 3);
sysEmpLogsService.save(sysEmpLogsDTO);
return ReturnMsg.ok(baseService.basePage(sysGoodsDTO));
}
@Override
public Page<SysEmpDTO> basePage(SysEmpDTO sysEmpDTO) {
if (null != sysEmpDTO.getCurrent() && null != sysEmpDTO.getPageSize())
sysEmpDTO.setCurrent((sysEmpDTO.getCurrent() - 1) * sysEmpDTO.getPageSize());
List<SysEmpDTO> list = this.baseMapper.findList(sysEmpDTO);
int count = this.baseMapper.findPageCount(sysEmpDTO);
Page<SysEmpDTO> page = new Page<>();
page.setTotal(count);
page.setRecords(list);
return page;
}
七、论文参考:
八、项目总结:
便利店库存管理系统主要用来记录便利店商品的库存以及商品的出库和入库记录信息。这种基于数据库实现的数据管理系统能够准确记录便利店的商品类型以及操作记录,能够有利于现代便利店的信息化管理。
整个系统操作简单方便,系统界面安全良好,简单明了的页面布局,可以很方便进行信息查询以及记录统计。其次,员工登录后可以编辑个人信息,将个人信息加载到系统管理员用户管理的界面中,老板打开用户管理界面后即时可见便利店库存管理系统中信息,处理时会立刻在对应地点实时刷新。
在系统实现过程中,遇到了页面显示不规范、数据库连接无法实现参数的传递等问题,这些问题通过在网上寻找有关资料以及在同学的帮助下得到了解决。在此过程中,不仅学到了很多编程技巧,也提高了自己解决实际问题的能力,学会如何从大量的信息中筛选出所需有用的信息。
这次基于WEB的便利店库存管理系统的开发,参考了很多相关系统,取长补短,吸取了其他系统的优秀设计方案对该系统进行完善,但是该系统还是有很多的不足之处,有待以后进一步学习。例如商品信息内容的来源在系统中采用特定信息条目,希望后续可以通过Java实现网络信息的即时获取,将信息的其他数据也加载到系统的主页进行显示。
综上所述,便利店库存管理系统经过测试运行,各项功能都基本完善,界面布局优化完整,使用方便,操作容易,本次系统设计与实现顺利完成。
九、源码获取:
大家点赞、收藏、关注、评论啦 、查看获取联系方式
能力,学会如何从大量的信息中筛选出所需有用的信息。
这次基于WEB的便利店库存管理系统的开发,参考了很多相关系统,取长补短,吸取了其他系统的优秀设计方案对该系统进行完善,但是该系统还是有很多的不足之处,有待以后进一步学习。例如商品信息内容的来源在系统中采用特定信息条目,希望后续可以通过Java实现网络信息的即时获取,将信息的其他数据也加载到系统的主页进行显示。
综上所述,便利店库存管理系统经过测试运行,各项功能都基本完善,界面布局优化完整,使用方便,操作容易,本次系统设计与实现顺利完成。
九、源码获取:
大家点赞、收藏、关注、评论啦 、查看获取联系方式
链接点击直达:下载链接