目录
一、摘要
1.1 项目介绍
基于JAVA+Vue+SpringBoot+MySQL的便利店物资管理系统,包含了供应商模块、商品档案模块、商品进货模块、商品销售模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,便利店物资管理系统基于角色的访问控制,给管理员、店员使用,可将权限精确到按钮级别,您可以自定义角色并分配权限,系统适合设计精确的权限约束需求。
1.2 项目录屏
二、功能模块
通过对便利店实际需求的研究,我将便利店仓库物资信息管理系统的功能模块分为系统登陆模块、便利店管理员模块、菜单权限模块、商品管理模块、商品进货模块、商品出库模块,以下将分别进行阐述。
2.1 系统登陆模块
登陆注册模块用于便利店仓库物资信息管理系统的登陆,用户输入登陆账号、密码和图形验证码即可完成登陆,登陆界面要当简洁美观,无需对用户进行培训即可投入使用。
2.2 便利店管理员模块
便利店管理模块用于维护便利店工作人员的档案,包括对便利店员工的增加、删除、修改、编辑、导出操作。管理员的字段应包括登陆账号、登陆密码、姓名、性别、手机号、身份证号、家庭地址、备注信息等。
2.3 菜单权限模块
菜单权限模块用于管理每一个登陆角色拥有哪些菜单权限,如便利店管理员需要拥有全部菜单权限,而仓库管理员只需拥有进货菜单即可,无需看到用户管理模块。这个基于角色的访问控制,需要在菜单权限模块中设计和实现。
2.4 商品管理模块
商品管理模块用于管理便利店中全部商品类型,如方便面、火腿肠等等。这些商品类型需要为进货模块和出库模块提供基础数据支持,商品档案的字段应当包括商品ID、商品名称、商品类型、商品供应商、型号、商品单价、现有数量、总价等字段,在商品管理模块中,管理员可以对商品档案进行增加、删除、修改、更新操作。
2.5 商品进货模块
在商品档案的建立之后,仓库管理员可以对商品进行进货登记,增加商品的库存。仓库员需要先选择商品类型,然后输入进货发票号和入库数量,如有需要还可以输入备注信息,完成进货登记。进货模块的字段需要包括商品ID、商品名称、发票单号、商品型号、单价、入库数量、总价、备注信息。
2.6 商品出库模块
商品入库之后,如果投入到便利店中,需要进行出库操作,出库也是由出库管理员完成。出库员先选择商品类型,此时可以看到商品剩余的库存量,接着从用户档案中选择出库领用人,最后输入出库数量,完成商品出库操作。出库单需要包括商品ID、商品名称、商品型号、商品单价、出库数量、总价、领用人、备注信息。
三、系统设计
3.1 总体设计
通过对便利店实际需求的需求分析,我将便利店仓库物资信息管理系统的架构分为六大模块,分别是系统登陆模块、便利店管理员模块、菜单权限模块、商品管理模块、商品进货模块、商品出库模块如下图所示。
3.2 可行性分析
系统开发的可行性的评估,主要是从三个方面进行的,分别是对现有系统的分析、对技术的可行性分析和社会因素的分析。
3.2.1 对现有系统的分析
便利店仓库物资信息管理系统的设计与实现具有重要意义:用户管理商品更加方便快捷,只需注册账号进行登录,便可以在自己的电脑上进行出入库商品操作,可以根据需要修改自己的个人信息,用户也可以随时根据需要进行出入库,发送过程方便快捷;针对这一问题,便利店仓库物资信息管理系统有利于减少用户在出入库的操作时间,减轻出入库等待时间的占比,在一定程度上提高了用户的便利店工作效率。
3.2.2 技术的可行性分析
该系统分析了设计初期各种技术体系结构的优缺点,并最终采用了广泛而高安全性J2EE技术。J2EE技术的重点是系统的外部可拓展性以及开发早期的标准化部署。因此,J2EE技术可以完全支持便利店仓库物资管理系统的研究和开发。面向对象的思想将以上所说作为研究对象,来研究、分析、探索这些事物之间的关系。一般情况下,问题域里的所有内容都可以一个一个地转换为软件系统中的对象。面向对象技术使系统更易于开发人员理解和使用,这使系统的用户可以了解研发的原理和过程。MySQL是关系数据库,并且MySQL体积小,速度快,并且是开源代码,因此它拥有广泛的应用。综上,开发技术可行,不存在工程难题。
3.2.3 社会因素的分析
计算机和网络技术在ERP领域的应用,能够有效的解决用户仓库货物清点难、货物杂乱多等问题,可以节省时间、合理分配资源等,所以便利店仓库物资管理系统是具有重要意义的。
四、系统实现
五、核心代码
5.1 新增供应商
@RequestMapping(value = "/insert", method = RequestMethod.POST)
@ApiOperation(value = "新增供应商")
public Result<Supplier> insert(Supplier supplier){
iSupplierService.saveOrUpdate(supplier);
return new ResultUtil<Supplier>().setData(supplier);
}
5.2 编辑供应商
@RequestMapping(value = "/update", method = RequestMethod.POST)
@ApiOperation(value = "编辑供应商")
public Result<Supplier> update(Supplier supplier){
iSupplierService.saveOrUpdate(supplier);
return new ResultUtil<Supplier>().setData(supplier);
}
5.3 新增商品入库单
@RequestMapping(value = "/insert", method = RequestMethod.POST)
@ApiOperation(value = "新增商品入库单")
public Result<CommodityIn> insert(CommodityIn commodityIn){
CommodityIn oldWarehousing = iCommodityInService.getById(commodityIn.getId());
double oldNumber = 0.0;
if(oldWarehousing != null){
oldNumber = oldWarehousing.getNumber() == null ? 0.0 : Double.parseDouble(oldWarehousing.getNumber());
}
// 入库,更新库存
Commodity assetsType = iCommodityService.getById(commodityIn.getAssetId());
if(assetsType != null){
// number = 现在仓库总数量 + 该入库单现增加数量 - 该入库单原有增加数量
double number = Double.parseDouble(assetsType.getNumber()) + Double.parseDouble(commodityIn.getNumber()) - oldNumber;
assetsType.setNumber(number + "");
assetsType.setTotalPrice((Double.parseDouble(assetsType.getUnitPrice()) * number) + "");
// existNumber = 现在仓库存在数量 + 该入库单现增加数量 - 该入库单原有增加数量
double existNumber = Double.parseDouble(assetsType.getExistingNumber()) + Double.parseDouble(commodityIn.getNumber()) - oldNumber;
if(existNumber < 0) {
return ResultUtil.error("入库数量大于已出库数量!");
}
assetsType.setExistingNumber(existNumber + "");
iCommodityService.saveOrUpdate(assetsType);
}
iCommodityInService.saveOrUpdate(commodityIn);
return new ResultUtil<CommodityIn>().setData(commodityIn);
}
5.4 新增商品出库单
@RequestMapping(value = "/insert", method = RequestMethod.POST)
@ApiOperation(value = "新增商品出库单")
public Result<CommodityOut> insert(CommodityOut commodityOut){
CommodityOut oldWarehouseOut = iCommodityOutService.getById(commodityOut.getId());
double oldNumber = 0.0;
if(oldWarehouseOut != null){
oldNumber = Double.parseDouble(oldWarehouseOut.getNumber());
}
// outNumber 要出库的数量
double outNumber = Double.parseDouble(commodityOut.getNumber());
Commodity oldAssetsType = iCommodityService.getById(commodityOut.getAssetId());
if(oldAssetsType != null){
// newNumber 出库后还有的数量 = 仓库原本还有的数量 - 出库单的出库数量 + 原有出库单的出库数量
Double newNumber = Double.parseDouble(oldAssetsType.getExistingNumber()) - outNumber + oldNumber;
if(newNumber >= 0){
oldAssetsType.setExistingNumber(newNumber + "");
iCommodityService.saveOrUpdate(oldAssetsType);
}else{
return ResultUtil.error("手慢啦!库存不足!");
}
}
iCommodityOutService.saveOrUpdate(commodityOut);
return new ResultUtil<CommodityOut>().setData(commodityOut);
}
5.5 购买单个商品
@RequestMapping(value = "/buy", method = RequestMethod.GET)
@ApiOperation(value = "购买单个商品")
public Result<Commodity> buy(@RequestParam String id,@RequestParam float number){
Commodity commodity = iCommodityService.getById(id);
if(commodity == null) {
return ResultUtil.error("商品不存在");
}
User currUser = securityUtil.getCurrUser();
double oldNumber = 0.0;
double outNumber = number;
Commodity oldAssetsType = iCommodityService.getById(id);
if(oldAssetsType != null){
// newNumber 出库后还有的数量 = 仓库原本还有的数量 - 出库单的出库数量 + 原有出库单的出库数量
Double newNumber = Double.parseDouble(oldAssetsType.getExistingNumber()) - outNumber + oldNumber;
if(newNumber >= 0){
oldAssetsType.setExistingNumber(newNumber + "");
iCommodityService.saveOrUpdate(oldAssetsType);
}else{
return ResultUtil.error("手慢啦!库存不足!");
}
}
CommodityOut out = new CommodityOut();
out.setAssetId(commodity.getId());
out.setAssetName(commodity.getAssetName());
out.setRecipientsId(currUser.getId());
out.setRecipients(currUser.getNickname());
out.setNature(commodity.getNature());
out.setModel(commodity.getModel());
out.setUnitPrice(commodity.getUnitPrice());
out.setNumber(number + "");
out.setRemarks("买家主动购买");
iCommodityOutService.saveOrUpdate(out);
return new ResultUtil<Commodity>().setData(iCommodityService.getById(id));
}
六、免责说明
- 本项目仅供个人学习使用,商用授权请联系博主,否则后果自负。
- 博主拥有本软件构建后的应用系统全部内容所有权及独立的知识产权,拥有最终解释权。
- 如有问题,欢迎在仓库 Issue 留言,看到后会第一时间回复,相关意见会酌情考虑,但没有一定被采纳的承诺或保证。
下载本系统代码或使用本系统的用户,必须同意以下内容,否则请勿下载!
- 出于自愿而使用/开发本软件,了解使用本软件的风险,且同意自己承担使用本软件的风险。
- 利用本软件构建的网站的任何信息内容以及导致的任何版权纠纷和法律争议及后果和博主无关,博主对此不承担任何责任。
- 在任何情况下,对于因使用或无法使用本软件而导致的任何难以合理预估的损失(包括但不仅限于商业利润损失、业务中断与业务信息丢失),博主概不承担任何责任。
- 必须了解使用本软件的风险,博主不承诺提供一对一的技术支持、使用担保,也不承担任何因本软件而产生的难以预料的问题的相关责任。