基于Jeecgboot前后端分离的ERP系统开发代码生成(五)

简介: 基于Jeecgboot前后端分离的ERP系统开发代码生成(五)

   这个部分主要是对采购入库经过审核进行库存更新与库存变动日志记录

1、通过两个表erp_goods_stock和erp_goods_stock_log生成两个模块,分别是商品库存表与库存变动表

  其中的前后端代码可以直接拿过来使用,当然以后很多地方还需要修改,目前先完成基本功能。

2、对采购入库审核通过的代码如下:

@Override
  @Transactional
  public Result approvePass(String id) throws Exception {
    ErpInSheet erpInSheet = erpInSheetMapper.selectById(id);
    if (erpInSheet == null) {
      return Result.error("采购入库单不存在!");
    }
    if (erpInSheet.getStatus() == 2 ) {
      return Result.error("采购入库单已审核通过,不能再次审核!");
    }
    
    erpInSheet.setStatus(2); //审核通过标志 2代表通过
    SysUser loginUser = iErpThirdService.getLoginUser();
    LambdaUpdateWrapper<ErpInSheet> updateOrderWrapper = Wrappers.lambdaUpdate(ErpInSheet.class)
            .set(ErpInSheet::getApproveBy, loginUser.getUsername())
            .set(ErpInSheet::getApproveTime, LocalDateTime.now())
            .eq(ErpInSheet::getId, erpInSheet.getId());
    if(erpInSheetMapper.update(erpInSheet, updateOrderWrapper) != 1) {
      return Result.error("采购入库单信息已过期,请刷新重试!");
    }
    Wrapper<ErpInSheetDetail> queryDetailWrapper = Wrappers.lambdaQuery(ErpInSheetDetail.class)
            .eq(ErpInSheetDetail::getSheetId, erpInSheet.getId())
            .orderByAsc(ErpInSheetDetail::getOrderNo);
        List<ErpInSheetDetail> details = erpInSheetDetailService.list(queryDetailWrapper);
        for (ErpInSheetDetail detail : details) {
          ErpGoodsStockVo erpGoodsStockVo = new ErpGoodsStockVo();
          erpGoodsStockVo.setScId(erpInSheet.getScId());
          erpGoodsStockVo.setGoodsId(detail.getGoodsId());
          erpGoodsStockVo.setStockNum(detail.getOrderNum());
          erpGoodsStockVo.setTaxAmount(NumberUtil.mul(detail.getTaxPrice(), detail.getOrderNum()));
          erpGoodsStockVo.setUnTaxAmount(NumberUtil.mul(NumberUtil.calcUnTaxPrice(detail.getTaxPrice(), detail.getTaxRate()), detail.getOrderNum()));
          erpGoodsStockVo.setTaxPrice(detail.getTaxPrice());
          erpGoodsStockVo.setUnTaxPrice(NumberUtil.calcUnTaxPrice(detail.getTaxPrice(), detail.getTaxRate()));
          erpGoodsStockVo.setBizCode(erpInSheet.getCode());
          erpGoodsStockVo.setBizDetailId(detail.getId());
          erpGoodsStockVo.setBizId(erpInSheet.getId());
          erpGoodsStockVo.setBizType(GoodsStockType.PURCHASE.getCode());
          erpGoodsStockService.inStock(erpGoodsStockVo);
        }
    return Result.OK("审核通过完成");
  }

这里用了两个枚举

public enum GoodsStockType implements BaseEnum<Integer> {
  PURCHASE(1, "采购入库"), PURCHASE_RETURN(2, "采购退货出库"), SALE(3, "销售出库"), SALE_RETURN(4,
          "销售退货入库"), RETAIL(5,
          "零售出库"), RETAIL_RETURN(6, "零售退货入库"), CHECK_STOCK_IN(7, "盘点入库"), CHECK_STOCK_OUT(8,
          "盘点出库"), STOCK_COST_ADJUST(
          9, "库存成本调整");
      @EnumValue
      private final Integer code;
      private final String desc;
      GoodsStockType(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
      }
      @Override
      public Integer getCode() {
        return this.code;
      }
      @Override
      public String getDesc() {
        return this.desc;
      }
}
/**
 * @Description: Enum基类
 * @Author: nbacheng
 * @Date:   2022-11-25
 * @Version: V1.0
 */
public interface BaseEnum<T extends Serializable> extends Serializable {
    /**
     * 获取枚举值
     *
     * @return
     */
    T getCode();
    /**
     * 获取描述
     *
     * @return
     */
    String getDesc();
  }

3、上面同时调用了inStock的方法,代码如下:

@Override
  @Transactional
  public void inStock(ErpGoodsStockVo erpGoodsStockVo) throws Exception {
      Wrapper<ErpGoodsStock> queryWrapper = Wrappers.lambdaQuery(ErpGoodsStock.class)
              .eq(ErpGoodsStock::getGoodsId, erpGoodsStockVo.getGoodsId()).eq(ErpGoodsStock::getScId, erpGoodsStockVo.getScId());
  
      ErpGoodsStock inerpGoodsStock =  erpGoodsStockMapper.selectOne(queryWrapper);
      ErpGoodsStockLog erpGoodsStockLog = new ErpGoodsStockLog();
      if(inerpGoodsStock == null) {
      //第一次入库,新增记录
      inerpGoodsStock = new ErpGoodsStock();
      inerpGoodsStock.setScId(erpGoodsStockVo.getScId());
      inerpGoodsStock.setGoodsId(erpGoodsStockVo.getGoodsId());
      inerpGoodsStock.setStockNum(erpGoodsStockVo.getStockNum());
      inerpGoodsStock.setTaxPrice(erpGoodsStockVo.getTaxPrice());
      inerpGoodsStock.setTaxAmount(erpGoodsStockVo.getTaxAmount());
      inerpGoodsStock.setUnTaxPrice(erpGoodsStockVo.getUnTaxPrice());
      inerpGoodsStock.setUnTaxAmount(erpGoodsStockVo.getUnTaxAmount());
  
      erpGoodsStockMapper.insert(inerpGoodsStock);
      
      erpGoodsStockLog.setOriStockNum(0);
      erpGoodsStockLog.setOriUnTaxPrice(BigDecimal.ZERO);
      erpGoodsStockLog.setOriTaxPrice(BigDecimal.ZERO);
    }
    else {//已有库存数量金额更新
      LambdaUpdateWrapper<ErpGoodsStock> updateWrapper = Wrappers.lambdaUpdate(ErpGoodsStock.class)
              .eq(ErpGoodsStock::getScId, erpGoodsStockVo.getScId())
              .eq(ErpGoodsStock::getGoodsId, erpGoodsStockVo.getGoodsId());
      
      erpGoodsStockLog.setOriStockNum(inerpGoodsStock.getStockNum());
      erpGoodsStockLog.setOriUnTaxPrice(inerpGoodsStock.getUnTaxPrice());
      erpGoodsStockLog.setOriTaxPrice(inerpGoodsStock.getTaxPrice());
      inerpGoodsStock.setScId(erpGoodsStockVo.getScId());
      inerpGoodsStock.setGoodsId(erpGoodsStockVo.getGoodsId());
      inerpGoodsStock.setStockNum(inerpGoodsStock.getStockNum() + erpGoodsStockVo.getStockNum());
      inerpGoodsStock.setTaxAmount(NumberUtil.add(inerpGoodsStock.getTaxAmount(), erpGoodsStockVo.getTaxAmount()));
      inerpGoodsStock.setTaxPrice(NumberUtil.div(inerpGoodsStock.getTaxAmount(), inerpGoodsStock.getStockNum()));
      inerpGoodsStock.setUnTaxAmount(NumberUtil.add(inerpGoodsStock.getUnTaxAmount(), erpGoodsStockVo.getUnTaxAmount()));
      inerpGoodsStock.setUnTaxPrice(NumberUtil.div(inerpGoodsStock.getUnTaxAmount(), inerpGoodsStock.getStockNum()));
      if(erpGoodsStockMapper.update(inerpGoodsStock, updateWrapper) != 1) {
        throw new Exception("入库更新信息已过期,请刷新重试!");
      }
    }
    erpGoodsStockLog.setGoodsId(erpGoodsStockVo.getGoodsId());
    erpGoodsStockLog.setScId(erpGoodsStockVo.getScId());
    erpGoodsStockLog.setStockNum(erpGoodsStockVo.getStockNum());
    erpGoodsStockLog.setTaxAmount(erpGoodsStockVo.getTaxAmount());
    erpGoodsStockLog.setUnTaxAmount(erpGoodsStockVo.getUnTaxAmount());
    erpGoodsStockLog.setCurStockNum(inerpGoodsStock.getStockNum());
    erpGoodsStockLog.setCurTaxPrice(inerpGoodsStock.getTaxPrice());
    erpGoodsStockLog.setCurUnTaxPrice(inerpGoodsStock.getUnTaxPrice());
    erpGoodsStockLog.setBizCode(erpGoodsStockVo.getBizCode());
    erpGoodsStockLog.setBizDetailId(erpGoodsStockVo.getBizDetailId());
    erpGoodsStockLog.setBizId(erpGoodsStockVo.getBizId());
    erpGoodsStockLog.setBizType(erpGoodsStockVo.getBizType());
    erpGoodsStockLogService.save(erpGoodsStockLog);
    
  }

4、效果图:

两条采购入库

库存表

库存变动表


相关文章
|
11天前
|
消息中间件 缓存 JavaScript
如何开发ERP(离散制造-MTO)系统中的生产管理板块(附架构图+流程图+代码参考)
本文详解离散制造MTO模式下的ERP生产管理模块,涵盖核心问题、系统架构、关键流程、开发技巧及数据库设计,助力企业打通计划与执行“最后一公里”,提升交付率、降低库存与浪费。
|
14天前
|
消息中间件 JavaScript 前端开发
如何开发ERP(离散制造-MTO)系统中的技术管理板块(附架构图+流程图+代码参考)
本文详解ERP(离散制造-MTO)系统中的技术管理板块,涵盖产品定义、BOM、工序、工艺文件及变更控制的结构化与系统化管理。内容包括技术管理的核心目标、总体架构、关键组件、业务流程、开发技巧与最佳实践,并提供完整的参考代码,助力企业将技术数据转化为可执行的生产指令,提升制造效率与质量。
|
14天前
|
消息中间件 JavaScript 关系型数据库
如何开发一套ERP(离散制造-MTO)系统(附架构图+流程图+代码参考)
本文介绍了面向离散制造-MTO(按订单生产)模式的ERP系统设计与实现方法。内容涵盖ERP系统定义、总体架构设计、主要功能模块解析、关键业务流程(订单到交付、BOM展开、MRP逻辑、排产等)、开发技巧(DDD、微服务、事件驱动)、参考代码示例、部署上线注意事项及实施效果评估。旨在帮助企业与开发团队构建高效、灵活、可扩展的ERP系统,提升订单交付能力与客户满意度。
|
3月前
|
人工智能 运维 安全
如何自己开发一套ERP系统?
本文探讨了企业自建ERP系统的可行性,分析了轻量、中型和重型ERP的区别,并指出自研ERP需明确业务需求、流程逻辑及投入成本。文章建议企业在决定自研前,应先梳理清楚管理逻辑,而非盲目追求技术方案。
|
3月前
|
SQL 存储 供应链
如何开发ERP系统中的库存管理板块(附架构图+流程图+代码参考)
本文介绍如何通过ERP系统实现企业库存管理的数字化与自动化,涵盖仓库管理、库位管理、出入库操作、库存调拨与盘点等功能设计,并提供开发技巧及代码参考,帮助企业提升库存管理效率,减少错误与资源浪费。
|
8天前
|
监控 供应链 前端开发
如何开发ERP(离散制造-MTO)系统中的财务管理板块(附架构图+流程图+代码参考)
本文详解离散制造MTO企业ERP系统中财务管理模块的搭建,聚焦应收账款与应付账款管理,涵盖核心功能、业务流程、开发技巧及Python代码示例,助力企业实现财务数据准确、实时可控,提升现金流管理能力。
|
8天前
|
供应链 监控 JavaScript
如何开发ERP(离散制造-MTO)系统中的库存管理板块(附架构图+流程图+代码参考)
本文详解MTO模式下ERP库存管理的关键作用,涵盖核心模块、业务流程、开发技巧与代码示例,助力制造企业提升库存周转率、降低缺货风险,实现高效精准的库存管控。
|
13天前
|
消息中间件 JavaScript BI
如何开发ERP(离散制造-MTO)系统中的客户管理板块(附架构图+流程图+代码参考)
本文详解离散制造-MTO模式下ERP系统客户管理模块的设计与实现,涵盖架构图、流程图、功能拆解、开发技巧及TypeScript参考代码,助力企业打通客户信息与报价、生产、交付全链路,提升响应效率与订单准交率。
|
13天前
|
JSON 前端开发 关系型数据库
如何开发ERP(离散制造-MTO)系统中的销售管理板块(附架构图+流程图+代码参考)
针对离散制造MTO模式,销售管理是业务核心入口,贯穿报价、订单、ATP、排产与交付。本文详解其架构设计、关键流程、数据模型及开发实践,助力企业提升交付准确率与运营效率。
|
3月前
|
SQL 数据挖掘 API
如何开发ERP系统中的质量管理板块(附架构图+流程图+代码参考)
质量管理在ERP系统中的作用不仅仅是记录质量检验数据,它还涉及到从物料采购、生产过程、到最终产品的全流程管理。如何搭建一个高效、可靠的质量管理板块,成为了许多企业在进行ERP系统开发时需要重点考虑的问题。本文将详细介绍如何开发ERP系统中的质量管理板块,涵盖功能模块、业务流程、开发技巧和实现效果等方面,并提供具体的代码参考。

热门文章

最新文章