基于JAVA语言的生鲜超市销售系统 开源项目

在这里插入图片描述



一、摘要

1.1 项目介绍

基于JAVA+Vue+SpringBoot+MySQL的生鲜超市销售系统,包含了商品档案、商品进货、商品销售、供应商、活动管理、消息通知模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,生鲜超市销售系统基于角色的访问控制,给超市管理员、店长角色使用,可将权限精确到按钮级别,您可以自定义角色并分配权限,系统适合设计精确的权限约束需求。

1.2 项目录屏


二、功能模块

2.1 商品档案模块

生鲜超市销售系统的商品档案模块是系统中管理商品信息的重要组成部分。该模块主要用于对商品进行增加、删除、修改和查询等操作,管理员或操作员可以通过该功能在系统中添加新的商品信息。在增加商品时,需要输入商品的基本信息,如商品名称、商品编码、商品分类、商品描述、规格、单位、进价、售价等。系统还可以支持上传商品图片,以便更直观地展示商品。删除商品功能可以用于删除系统中已存在的商品信息。管理员或操作员可以通过商品的编码或其他唯一标识来选择需要删除的商品。删除商品时,系统会进行确认提示,防止误操作。修改商品功能用于修改已存在的商品信息。管理员或操作员可以通过商品的编码或其他标识来选择需要修改的商品。可以修改的信息包括商品名称、商品分类、商品描述、规格、单位、进价、售价等。修改商品信息前,系统会显示当前的商品信息,方便用户进行修改。查询商品功能用于查询系统中已存在的商品信息。管理员或操作员可以通过商品的编码、名称、分类等关键词进行查询。系统会根据输入的关键词进行模糊匹配,并展示符合条件的商品列表。用户可以通过查询结果查看商品的详细信息。通过以上四个功能,生鲜超市销售系统的商品档案模块可以有效管理和维护商品信息,提高商品管理的效率和准确性。

2.2 商品进货模块

生鲜超市销售系统的商品进货模块是用于管理商品进货信息的重要模块。该模块主要包括增加、删除、修改和查询商品进货记录的功能,管理员或操作员可以通过该功能添加新的进货记录。在添加进货记录时,需要输入相关的信息,如进货日期、供应商、商品名称、数量、进货价格等。系统还可以支持上传进货单据的图片,以便更直观地展示进货信息。删除进货记录功能可以用于删除系统中已存在的进货记录。管理员或操作员可以通过进货记录的编号或其他标识来选择需要删除的记录。删除进货记录时,系统会进行确认提示,以防误操作。修改进货记录功能用于修改已存在的进货记录。管理员或操作员可以通过进货记录的编号或其他标识来选择需要修改的记录。可以修改的信息包括进货日期、供应商、商品名称、数量、进货价格等。修改进货记录前,系统会显示当前记录的详细信息,方便用户进行修改。查询进货记录功能用于查询系统中已存在的进货记录。管理员或操作员可以通过进货日期、供应商、商品名称等关键词进行查询。系统会根据输入的关键词进行模糊匹配,并展示符合条件的进货记录列表。用户可以通过查询结果查看详细的进货信息。通过以上四个功能,生鲜超市销售系统的商品进货模块可以有效管理和记录商品的进货信息,提高进货管理的效率和准确性。

2.3 商品销售模块

生鲜超市销售系统的商品销售模块是系统中的核心模块之一,主要负责管理和处理商品的增加、删除、修改和查询操作,增加商品功能用于向系统中添加新的商品。在增加商品时,需要输入商品的相关信息,如商品名称、价格、库存数量、供应商信息等。系统会将新商品的信息存储在数据库中,并为该商品分配一个唯一的商品编号。删除商品功能用于从系统中删除不再销售的商品。在删除商品时,需要输入要删除的商品编号或名称。系统会根据输入的信息在数据库中查找对应的商品,并将其从数据库中删除。修改商品功能用于修改商品的信息。在修改商品时,可以选择输入要修改的商品编号或名称,系统会根据输入的信息在数据库中查找对应的商品,并显示出该商品的详细信息。然后,可以对商品的各个属性进行修改,如价格、库存数量、供应商信息等。修改完成后,系统会将修改后的信息保存到数据库中。查询商品功能用于查询系统中的商品信息。可以通过商品编号、名称、价格范围等条件进行查询。系统会根据输入的查询条件,在数据库中查找符合条件的商品,并将查询结果显示出来。查询结果可以包括商品的详细信息、库存数量、供应商信息等。通过以上四个功能,生鲜超市销售系统的商品销售模块可以方便地管理和处理商品的增加、删除、修改和查询操作,提高了系统的效率和准确性。同时,该模块还可以与其他模块(如库存管理、订单管理等)进行联动,实现全面的商品管理和销售流程控制。

2.4 供应商模块

生鲜超市销售系统的供应商模块是管理和处理供应商信息的模块,主要负责供应商的增加、删除、修改和查询操作,增加供应商功能用于向系统中添加新的供应商。在增加供应商时,需要输入供应商的相关信息,如供应商名称、联系人、联系电话、地址等。系统会将新供应商的信息存储在数据库中,并为该供应商分配一个唯一的供应商编号。删除供应商功能用于从系统中删除不再合作的供应商。在删除供应商时,需要输入要删除的供应商编号或名称。系统会根据输入的信息在数据库中查找对应的供应商,并将其从数据库中删除。修改供应商功能用于修改供应商的信息。在修改供应商时,可以选择输入要修改的供应商编号或名称,系统会根据输入的信息在数据库中查找对应的供应商,并显示出该供应商的详细信息。然后,可以对供应商的各个属性进行修改,如联系人、联系电话、地址等。修改完成后,系统会将修改后的信息保存到数据库中。查询供应商功能用于查询系统中的供应商信息。可以通过供应商编号、名称、联系人等条件进行查询。系统会根据输入的查询条件,在数据库中查找符合条件的供应商,并将查询结果显示出来。查询结果可以包括供应商的详细信息、联系方式、供货产品等。通过以上四个功能,生鲜超市销售系统的供应商模块可以方便地管理和处理供应商的增加、删除、修改和查询操作,提高了系统的效率和准确性。同时,该模块还可以与其他模块进行联动,实现全面的供应链管理和流程控制。

2.5 活动管理模块

生鲜超市销售系统的活动管理模块是用于管理各种促销活动和优惠活动的模块,主要包括活动的增加、删除、修改和查询操作,增加活动功能用于向系统中添加新的促销活动或优惠活动。在增加活动时,需要输入活动的相关信息,如活动名称、时间范围、参与商品等。系统会将新活动的信息存储在数据库中,并为该活动分配一个唯一的活动编号。删除活动功能用于从系统中删除已经结束或不再进行的活动。在删除活动时,需要输入要删除的活动编号或名称。系统会根据输入的信息在数据库中查找对应的活动,并将其从数据库中删除。修改活动功能用于修改活动的信息。在修改活动时,可以选择输入要修改的活动编号或名称,系统会根据输入的信息在数据库中查找对应的活动,并显示出该活动的详细信息。然后,可以对活动的各个属性进行修改,如时间范围、参与商品等。修改完成后,系统会将修改后的信息保存到数据库中。查询活动功能用于查询系统中的活动信息。可以通过活动编号、名称、时间范围等条件进行查询。系统会根据输入的查询条件,在数据库中查找符合条件的活动,并将查询结果显示出来。查询结果可以包括活动的详细信息、参与商品、优惠内容等。通过以上四个功能,生鲜超市销售系统的活动管理模块可以方便地管理和处理各种促销活动和优惠活动,提高了系统的营销效果和客户满意度。同时,该模块还可以与其他模块进行联动,实现全面的销售活动管理和效果跟踪。

2.6 消息通知模块

生鲜超市销售系统的消息通知模块是用于管理和发送系统内部通知的模块,主要包括消息的增加、删除、修改和查询操作,增加消息功能用于向系统中添加新的消息通知。在增加消息时,需要输入消息的标题、内容、接收人等相关信息。系统将新的消息保存在数据库中,并为每条消息分配一个唯一的消息编号。删除消息功能用于从系统中删除已经发送或不再需要的消息。在删除消息时,需要输入要删除的消息编号或标题。系统根据输入的信息在数据库中查找对应的消息,并将其从数据库中删除。修改消息功能用于修改已存在的消息内容或接收人。在修改消息时,可以选择输入要修改的消息编号或标题,系统根据输入的信息在数据库中查找对应的消息,并显示出消息的详细内容。可以对消息的标题、内容、接收人等进行修改,并将修改后的信息保存到数据库中。查询消息功能用于查询系统中的消息。可以通过消息编号、标题、接收人等条件进行查询。系统根据输入的查询条件在数据库中查找符合条件的消息,并将查询结果显示出来。查询结果可以包括消息的标题、内容、发送时间等信息。通过以上四个功能,生鲜超市销售系统的消息通知模块可以方便地管理和处理内部通知的增加、删除、修改和查询操作,实现了消息的灵活管理和及时传达。同时,该模块也可以与其他模块(如订单管理、售后服务等)进行联动,实现系统内部各功能模块之间的信息交流和协作。


三、系统展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


四、核心代码

4.1 查询商品

equestMapping(value = "/getByPage", method = RequestMethod.GET)
@ApiOperation(value = "查询商品")
public Result<IPage<Commodity>> getByPage(@ModelAttribute Commodity commodity ,@ModelAttribute PageVo page){
    QueryWrapper<Commodity> qw = new QueryWrapper<>();
    if(!ZwzNullUtils.isNull(commodity.getNature())) {
        qw.eq("nature",commodity.getNature());
    }
    if(!ZwzNullUtils.isNull(commodity.getAssetName())) {
        qw.like("asset_name",commodity.getAssetName());
    }
    if(!ZwzNullUtils.isNull(commodity.getShopId())) {
        qw.eq("shop_id",commodity.getShopId());
    }
    if(!ZwzNullUtils.isNull(commodity.getTypeId())) {
        qw.eq("type_id",commodity.getTypeId());
    }
    User currUser = securityUtil.getCurrUser();
    BigDecimal discount = currUser.getDiscount();

    String today = DateUtil.today();
    IPage<Commodity> data = iCommodityService.page(PageUtil.initMpPage(page),qw);
    for (Commodity co : data.getRecords()) {
        Integer shopDiscount = null;
        if(!ZwzNullUtils.isNull(co.getSupplierId())) {
            Supplier supplier = iSupplierService.getById(co.getSupplierId());
            if(supplier != null) {
                co.setSupplierName(supplier.getName());
            }
        }
        if(!ZwzNullUtils.isNull(co.getTypeId())) {
            CommodityType type = iCommodityTypeService.getById(co.getTypeId());
            if(type != null) {
                co.setTypeName(type.getTitle());
            }
        }
        if(!ZwzNullUtils.isNull(co.getShopId())) {
            Shop shop = iShopService.getById(co.getShopId());
            if(shop != null) {
                co.setShopName(shop.getTitle());
                QueryWrapper<ShopActivity> saQw = new QueryWrapper<>();
                saQw.eq("shop_id",shop.getId());
                saQw.le("start_date",today);
                saQw.ge("end_date",today);
                List<ShopActivity> shopActivityList = iShopActivityService.list(saQw);
                if(shopActivityList.size() > 0) {
                    int number = 100;
                    for (ShopActivity sa : shopActivityList) {
                        if(sa.getDiscount().intValue() < number) {
                            number = sa.getDiscount().intValue();
                        }
                    }
                    if(shopDiscount == null) {
                        shopDiscount = number;
                    } else if(shopDiscount > number){
                        shopDiscount = number;
                    }
                }
            }
        }
        if(shopDiscount == null) {
            shopDiscount = 100;
        }
        if(discount != null) {
            if(discount.intValue() < shopDiscount) {
                shopDiscount = discount.intValue();
            }
        }
        co.setDiscount(shopDiscount);
    }
    return new ResultUtil<IPage<Commodity>>().setData(data);
}

4.2 商品入库

@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);
}

4.3 商品出库

@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("手慢啦!库存不足!");
        }
    }
    commodityOut.setDate(DateUtil.now());
    iCommodityOutService.saveOrUpdate(commodityOut);
    return new ResultUtil<CommodityOut>().setData(commodityOut);
}

4.4 查询商品类型

@RequestMapping(value = "/getByPage", method = RequestMethod.GET)
@ApiOperation(value = "查询商品类型")
public Result<IPage<CommodityType>> getByPage(@ModelAttribute CommodityType commodityType ,@ModelAttribute PageVo page){
    QueryWrapper<CommodityType> qw = new QueryWrapper<>();
    if(!ZwzNullUtils.isNull(commodityType.getCreateBy())) {
    }
    IPage<CommodityType> data = iCommodityTypeService.page(PageUtil.initMpPage(page),qw);
    return new ResultUtil<IPage<CommodityType>>().setData(data);
}

4.5 查询店铺活动

@RequestMapping(value = "/getByPage", method = RequestMethod.GET)
@ApiOperation(value = "查询店铺活动")
public Result<IPage<ShopActivity>> getByPage(@ModelAttribute ShopActivity shopActivity ,@ModelAttribute PageVo page){
    QueryWrapper<ShopActivity> qw = new QueryWrapper<>();
    if(!ZwzNullUtils.isNull(shopActivity.getShopId())) {
        qw.eq("shop_id",shopActivity.getShopId());
    }
    if(!ZwzNullUtils.isNull(shopActivity.getTitle())) {
        qw.eq("title",shopActivity.getTitle());
    }
    IPage<ShopActivity> data = iShopActivityService.page(PageUtil.initMpPage(page),qw);
    for (ShopActivity activity : data.getRecords()) {
        String shopId = activity.getShopId();
        if(!ZwzNullUtils.isNull(shopId)) {
            Shop shop = iShopService.getById(shopId);
            if(shop != null) {
                activity.setShopName(shop.getTitle());
            }
        }
    }
    return new ResultUtil<IPage<ShopActivity>>().setData(data);
}

五、免责说明

  • 本项目仅供个人学习使用,商用授权请联系博主,否则后果自负。
  • 博主拥有本软件构建后的应用系统全部内容所有权及独立的知识产权,拥有最终解释权。
  • 如有问题,欢迎在仓库 Issue 留言,看到后会第一时间回复,相关意见会酌情考虑,但没有一定被采纳的承诺或保证。

下载本系统代码或使用本系统的用户,必须同意以下内容,否则请勿下载!

  1. 出于自愿而使用/开发本软件,了解使用本软件的风险,且同意自己承担使用本软件的风险。
  2. 利用本软件构建的网站的任何信息内容以及导致的任何版权纠纷和法律争议及后果和博主无关,博主对此不承担任何责任。
  3. 在任何情况下,对于因使用或无法使用本软件而导致的任何难以合理预估的损失(包括但不仅限于商业利润损失、业务中断与业务信息丢失),博主概不承担任何责任。
  4. 必须了解使用本软件的风险,博主不承诺提供一对一的技术支持、使用担保,也不承担任何因本软件而产生的难以预料的问题的相关责任。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡晗靓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值