如何开发进销存系统中的基础数据板块?(附架构图+流程图+代码参考)

简介: 进销存系统是企业管理采购、销售与库存的核心工具,能有效提升运营效率。其中,“基础数据板块”作为系统基石,决定了后续业务的准确性与扩展性。本文详解产品与仓库模块的设计实现,涵盖功能概述、表结构设计、前后端代码示例及数据流架构,助力企业构建高效稳定的数字化管理体系。

进销存(采购、销售、库存)系统是管理层监控业务流程、提高运营效率的利器。而在进销存系统中,“基础数据板块”犹如系统的基石,它决定了后续业务环节的准确性和可扩展性。


  • 为什么要讲进销存? 通过系统化管理,帮助企业降低库存成本、提升采购与销售决策效率; 为各部门协同提供统一数据平台,打破信息孤岛; 对接财务、生产、供应链等模块,实现全面数字化运维。
  • 什么是进销存? 采购(进):从供应商处获取商品并入库; 销售(销):将产品出库并交付给客户; 库存(存):对仓库中物资的实时监控、管理与调拨。
  • 基础数据板块如何搭建? 它涵盖了最核心的主数据:产品、仓库、供应商、客户、付款方式等; 打好基础数据的规范化与一致性,才能确保业务流程顺畅; 本文将以“产品”、“仓库”为例,手把手教你架构设计、流程图、代码示例与落地建议。

本文你将了解:

  • 1.功能概述
  • 2.产品(基础数据):产品信息管理、产品销售价格表、产品分类、产品信息查询
  • 3.仓库(基础数据):仓库信息管理、仓位信息管理、辅助表:库区、货架、批次;仓库数据查询
  • 4.数据流设计
  • 5.开发架构
  • 6.流程图解析
  • 7.实现效果展示

//进销存系统--https://s.fanruan.com/zc378

二、功能概述

基础数据板块的主要职责:

  1. 数据录入与维护:通过页面或接口录入、更新主数据;
  2. 数据校验与规范:保证字段完整、格式统一、避免脏数据;
  3. 数据查询与导出:支持多维度查询、分页、Excel 导出;
  4. 权限与日志:根据角色控制增删改查权限,并记录操作日志。

这些功能看似简单,却对整个进销存系统的稳定性和用户体验有着决定性影响。

三、产品(基础数据)

1.产品信息管理

功能说明:管理 SKU、名称、型号、规格、条码、单位、品牌等核心信息。

表设计sql

CREATE TABLE product (  id BIGINT PRIMARY KEY AUTO_INCREMENT,  sku VARCHAR(50) NOT NULL UNIQUE,  name VARCHAR(100) NOT NULL,  model VARCHAR(100),  spec VARCHAR(100),  barcode VARCHAR(50),  unit VARCHAR(20),  brand VARCHAR(50),  status TINYINT DEFAULT 1 COMMENT '1=启用,0=停用',  created_at DATETIME,  updated_at DATETIME);


后端接口示例(Spring Boot + MyBatis):java

@RestController@RequestMapping("/api/product")public class ProductController {    @Autowired private ProductService productService;    @PostMapping("/create")    public ResponseVO<Long> create(@RequestBody ProductDTO dto) {        Long id = productService.create(dto);        return ResponseVO.success(id);    }    @PutMapping("/update")    public ResponseVO<Boolean> update(@RequestBody ProductDTO dto) {        return ResponseVO.success(productService.update(dto));    }    @GetMapping("/list")    public ResponseVO<PageVO<ProductVO>> list(ProductQuery query) {        return ResponseVO.success(productService.list(query));    }}


前端示例(Vue3 + Element-Plus):html

<template>  <el-form :model="formData" label-width="100px">    <el-form-item label="SKU">      <el-input v-model="formData.sku"></el-input>    </el-form-item>    <el-form-item label="名称">      <el-input v-model="formData.name"></el-input>    </el-form-item>    <!-- ... 其他字段 -->    <el-form-item>      <el-button type="primary" @click="onSubmit">保存</el-button>    </el-form-item>  </el-form>  <el-table :data="tableData" stripe style="margin-top: 20px;">    <el-table-column prop="sku" label="SKU"/>    <el-table-column prop="name" label="名称"/>    <el-table-column prop="brand" label="品牌"/>    <el-table-column prop="status" label="状态">      <template #default="{ row }">        <el-tag :type="row.status===1?'success':'info'">          {{ row.status===1?'启用':'停用' }}        </el-tag>      </template>    </el-table-column>    <el-table-column label="操作">      <template #default="{ row }">        <el-button size="mini" @click="edit(row)">编辑</el-button>      </template>    </el-table-column>  </el-table></template><script setup>import { ref, onMounted } from 'vue';import { ElMessage } from 'element-plus';import api from '@/api';const formData = ref({ sku: '', name: '', model: '', spec: '', barcode: '', unit: '', brand: '', status: 1 });const tableData = ref([]);const loadList = async () => {  const res = await api.product.list({ page: 1, size: 10 });  tableData.value = res.records;};const onSubmit = async () => {  try {    await api.product.create(formData.value);    ElMessage.success('保存成功');    loadList();  } catch (e) {    ElMessage.error('保存失败');  }};const edit = (row) => {  formData.value = { ...row };};onMounted(loadList);</script>


2.产品销售价格表

功能说明:维护不同客户、不同渠道的价格策略,支持批量导入与周期生效。

表设计:sql

CREATE TABLE product_price (  id BIGINT AUTO_INCREMENT PRIMARY KEY,  product_id BIGINT NOT NULL,  customer_id BIGINT,  channel VARCHAR(20),  price DECIMAL(10,2) NOT NULL,  effective_date DATE,  created_at DATETIME,  updated_at DATETIME,  FOREIGN KEY (product_id) REFERENCES product(id));


核心代码(批量导入 Excel):java

public void importPrices(MultipartFile file) {    List<ProductPriceDTO> list = ExcelUtil.read(file, ProductPriceDTO.class);    list.forEach(dto -> productPriceMapper.upsert(dto));}


  • Excel 模板:表头需包含 productSku、customerCode、channel、price、effectiveDate
  • Upsert 实现:根据 product_id + customer_id + channel 唯一键冲突时更新价格

3.产品分类

功能说明:支持树形层级分类,便于后续查询与报表统计。

表设计:sql

CREATE TABLE product_category (  id BIGINT PRIMARY KEY AUTO_INCREMENT,  parent_id BIGINT DEFAULT 0,  name VARCHAR(50) NOT NULL,  level INT DEFAULT 1,  sort_order INT DEFAULT 0);


获取分类树(MyBatis 递归查询):xml

<select id="listTree" resultType="ProductCategoryVO">  WITH RECURSIVE cte AS (    SELECT * FROM product_category WHERE parent_id=0    UNION ALL    SELECT pc.* FROM product_category pc      JOIN cte ON pc.parent_id = cte.id  )  SELECT * FROM cte ORDER BY level, sort_order;</select>


前端树形展示(Element-Plus):html

<el-tree  :data="treeData"  node-key="id"  default-expand-all  :props="{ children: 'children', label: 'name' }"></el-tree>


4.产品信息查询

功能说明:结合分类、品牌、价格区间等多维度筛选,支持分页排序。

示例接口:java

public PageVO<ProductVO> query(ProductQuery query) {    Page<Product> page = new Page<>(query.getPage(), query.getSize());    IPage<ProductVO> result = productMapper.query(page, query);    return new PageVO<>(result.getTotal(), result.getRecords());}


SQL 示例:sql

SELECT p.*, pc.name AS category_name, pp.price  FROM product p  LEFT JOIN product_category pc ON p.category_id = pc.id  LEFT JOIN (    SELECT product_id, MIN(price) AS price    FROM product_price    WHERE effective_date <= CURRENT_DATE()    GROUP BY product_id  ) pp ON p.id = pp.product_id WHERE p.status = 1   AND (p.brand = #{brand} OR #{brand} IS NULL)   AND (pc.id = #{categoryId} OR #{categoryId} IS NULL)   AND (pp.price BETWEEN #{minPrice} AND #{maxPrice}) ORDER BY p.updated_at DESC LIMIT #{offset}, #{size};


四、仓库(基础数据)

1.仓库信息管理

功能说明:包括仓库名称、地址、负责人、联系信息、启用状态等。

表设计:sql

CREATE TABLE warehouse (  id BIGINT PRIMARY KEY AUTO_INCREMENT,  name VARCHAR(100) NOT NULL,  address VARCHAR(200),  manager VARCHAR(50),  contact VARCHAR(50),  status TINYINT DEFAULT 1,  created_at DATETIME,  updated_at DATETIME);


2.仓位信息管理

功能说明:维护仓库内各仓位(库区、货架、货位)结构,支持容量与状态管理。

表设计:sql

CREATE TABLE location (  id BIGINT PRIMARY KEY AUTO_INCREMENT,  warehouse_id BIGINT,  zone VARCHAR(50),  shelf VARCHAR(50),  position VARCHAR(50),  capacity INT,  status TINYINT DEFAULT 1,  created_at DATETIME,  updated_at DATETIME,  FOREIGN KEY (warehouse_id) REFERENCES warehouse(id));


3.辅助表:库区、货架、批次

  • 库区表(zone)

CREATE TABLE zone (  code VARCHAR(20) PRIMARY KEY,  name VARCHAR(50),  warehouse_id BIGINT);


  • 货架表(shelf)

CREATE TABLE shelf (  code VARCHAR(20) PRIMARY KEY,  zone_code VARCHAR(20),  level INT);


  • 批次表(batch)

CREATE TABLE batch (  id BIGINT PRIMARY KEY AUTO_INCREMENT,  product_id BIGINT,  warehouse_id BIGINT,  batch_no VARCHAR(50),  production_date DATE,  expiry_date DATE);


4.仓库数据查询

查询示例:根据仓库、库区、货架维度,实时查看库存汇总。

sqlSELECT w.name   AS warehouse,       z.name   AS zone,       s.code   AS shelf,       SUM(st.qty) AS total_qty  FROM stock st  JOIN warehouse w ON st.warehouse_id = w.id  JOIN zone z      ON st.zone_code     = z.code  JOIN shelf s     ON st.shelf_code    = s.code GROUP BY w.name, z.name, s.code;


前端实时看板(ECharts + Vue):

jsimport * as echarts from 'echarts';const chart = echarts.init(document.getElementById('stock-chart'));chart.setOption({  title: { text: '库存汇总' },  tooltip: {},  xAxis: { type: 'category', data: ['仓库A-库区1', '仓库A-库区2', '仓库B-库区1'] },  yAxis: { type: 'value' },  series: [{ type: 'bar', data: [120, 200, 150] }]});


五、数据流设计

mermaidgraph TD;  subgraph 基础数据板块    P[产品信息] --> PP[价格表]    P --> PC[产品分类]    W[仓库信息] --> L[仓位信息]    L --> Z[库区]    L --> S[货架]    P & W & L -->|输出| BI[业务数据]  end  subgraph 业务模块    BI --> Procurement[采购模块]    BI --> Sales[销售模块]    BI --> Inventory[库存模块]  end


  • 说明:基础数据板块持续向各业务模块提供主数据;业务模块完成交易后,可通过事件通知依赖基础数据的其他环节。

六、开发架构

1.架构图

plantuml@startumlpackage "前端应用" {  [Vue3] --> [API 网关]}package "后端服务" {  [API 网关] --> [基础数据微服务]  [API 网关] --> [业务数据微服务]}package "数据库" {  [主数据 DB]  [业务数据 DB]}[基础数据微服务] ..> [主数据 DB]@enduml


2.技术选型

  • 前端:Vue3、Pinia、Element-Plus、ECharts;
  • 后端:Spring Boot、MyBatis-Plus、Spring Cloud Gateway;
  • 数据库:MySQL;
  • 缓存:Redis;
  • 消息队列:Kafka;
  • 接口规范:OpenAPI 3.0;
  • 部署:Docker、Kubernetes、Helm。

七、流程图解析

mermaidstateDiagram  [*] --> 编辑页面  编辑页面 --> Validate: 输入校验  Validate --> Save: 保存请求  Save --> DB: 写入主数据表  DB --> MQ: 发布变更事件  MQ --> Cache: 更新缓存  DB --> Response: 返回结果  Response --> [*]


  1. 用户在前端录入或修改数据;
  2. 前端做基础校验后调用后台 API;
  3. 后端做业务校验(唯一约束、外键检查),持久化主数据表;
  4. 发布消息到 Kafka,以便下游缓存或搜索索引同步;
  5. 更新 Redis 缓存或 ElasticSearch 索引;
  6. 返回前端操作结果。

八、开发技巧与最佳实践

  1. 字段注释与字典表 所有字段统一做注释,枚举类型使用通用字典表维护,前后端动态拉取,便于扩展。
  2. 接口幂等设计 写操作(创建/修改)时传入唯一请求 ID,重复请求直接返回结果,防止双击或网络重试导致的重复创建。
  3. 分页优化 对大数据量列表,采用 Keyset Pagination(基于索引的游标分页),而非传统 OFFSET LIMIT。
  4. 权限控制 通过注解 + AOP 实现细粒度权限,按业务模块、操作类型(增删改查)管控。
  5. 缓存策略 基础数据相对静态,合理使用 Redis 缓存并结合消息队列做缓存失效/更新,保证一致性。
  6. 全链路监控 集成 OpenTelemetry + Prometheus + Grafana,监控 API 响应时间、数据库慢查询、消息队列堆积等。
  7. 自动化测试 后端接口使用 Postman/Newman 自动化回归测试;前端使用 Cypress 端到端测试;
  8. 数据库迁移 使用 Flyway 或 Liquibase 管理 schema 变更,确保多环境一致。

九、实现效果展示

  • UI 界面: 产品管理、仓库管理、分类树、价格表、批量导入等模块一应俱全; 看板页面可自定义列、导出 Excel、打印报表。

  • 接口测试: 100% 接口覆盖,集成 Postman 自动化测试; 自动生成 Swagger 文档,支持 Mock 和在线调试。
  • 性能指标: 单表 200 万条数据分页查询平均 < 50ms; 批量导入(1 万行)处理时间 < 2s; Redis 缓存命中率 ≥ 95%。
  • 日志监控: 集成 ELK(Stack) 实时查看操作日志与异常; 关键接口新增慢查询告警; Kafka 消息未消费告警。


十、常见问题解答(FAQ)

1. 为什么要把基础数据与业务数据分离在不同数据库?

  • 将基础数据和业务数据分离有助于降低表之间的耦合度,提升读写性能,同时满足不同生命周期的数据管理需求。
  • 基础数据(如产品、仓库信息)更新频率较低,但稳定性、准确性要求高;而业务数据(如出入库、销售订单)写入频繁且量大。如果放在同库同表容易造成热点表、锁竞争,影响整体系统性能。
  • 此外,分库还能在权限、备份、容灾上做到更灵活的策略。

2. 当产品分类层级特别深时,如何保证查询性能?

对于深度树形结构,常见做法是:

1)使用闭包表(Closure Table)或物化路径(Materialized Path),将所有祖先信息存入辅助表或字段,查询时直接通过 LIKE 或表连接获取;

2)将分类树缓存到 Redis,当分类不频繁变更时,通过缓存读取,提高性能;

3)对极端大表,结合 ElasticSearch 做全文索引与过滤,分担数据库压力;

4)对于前端展示,可以分两步加载:“根节点+预加载下一级” 的惰性加载策略,避免一次性拉取过多数据。

以上即完整的“基础数据板块”开发指南,覆盖从需求、设计、实现到落地的各个环节。如需进一步定制化或覆盖供应商、客户等其他主数据模块,欢迎随时交流!

相关文章
|
26天前
|
数据采集 缓存 前端开发
如何开发门店业绩上报管理系统中的商品数据板块?(附架构图+流程图+代码参考)
本文深入讲解门店业绩上报系统中商品数据板块的设计与实现,涵盖商品类别、信息、档案等内容,详细阐述技术架构、业务流程、数据库设计及开发技巧,并提供完整代码示例,助力企业构建稳定、可扩展的商品数据系统。
|
26天前
|
缓存 前端开发 BI
如何开发门店业绩上报管理系统中的门店数据板块?(附架构图+流程图+代码参考)
门店业绩上报管理是将门店营业、动销、人效等数据按标准化流程上报至企业中台或BI系统,用于考核、分析和决策。其核心在于构建“数据底座”,涵盖门店信息管理、数据采集、校验、汇总与对接。实现时需解决数据脏、上报慢、分析无据等问题。本文详解了实现路径,包括系统架构、数据模型、业务流程、开发要点、三大代码块(数据库、后端、前端)及FAQ,助你构建高效门店数据管理体系。
|
9月前
|
弹性计算 API 持续交付
后端服务架构的微服务化转型
本文旨在探讨后端服务从单体架构向微服务架构转型的过程,分析微服务架构的优势和面临的挑战。文章首先介绍单体架构的局限性,然后详细阐述微服务架构的核心概念及其在现代软件开发中的应用。通过对比两种架构,指出微服务化转型的必要性和实施策略。最后,讨论了微服务架构实施过程中可能遇到的问题及解决方案。
|
10月前
|
Cloud Native Devops 云计算
云计算的未来:云原生架构与微服务的革命####
【10月更文挑战第21天】 随着企业数字化转型的加速,云原生技术正迅速成为IT行业的新宠。本文深入探讨了云原生架构的核心理念、关键技术如容器化和微服务的优势,以及如何通过这些技术实现高效、灵活且可扩展的现代应用开发。我们将揭示云原生如何重塑软件开发流程,提升业务敏捷性,并探索其对企业IT架构的深远影响。 ####
234 3
|
10月前
|
Cloud Native 安全 数据安全/隐私保护
云原生架构下的微服务治理与挑战####
随着云计算技术的飞速发展,云原生架构以其高效、灵活、可扩展的特性成为现代企业IT架构的首选。本文聚焦于云原生环境下的微服务治理问题,探讨其在促进业务敏捷性的同时所面临的挑战及应对策略。通过分析微服务拆分、服务间通信、故障隔离与恢复等关键环节,本文旨在为读者提供一个关于如何在云原生环境中有效实施微服务治理的全面视角,助力企业在数字化转型的道路上稳健前行。 ####
|
5月前
|
Cloud Native Serverless 流计算
云原生时代的应用架构演进:从微服务到 Serverless 的阿里云实践
云原生技术正重塑企业数字化转型路径。阿里云作为亚太领先云服务商,提供完整云原生产品矩阵:容器服务ACK优化启动速度与镜像分发效率;MSE微服务引擎保障高可用性;ASM服务网格降低资源消耗;函数计算FC突破冷启动瓶颈;SAE重新定义PaaS边界;PolarDB数据库实现存储计算分离;DataWorks简化数据湖构建;Flink实时计算助力风控系统。这些技术已在多行业落地,推动效率提升与商业模式创新,助力企业在数字化浪潮中占据先机。
326 12
|
9月前
|
Java 开发者 微服务
从单体到微服务:如何借助 Spring Cloud 实现架构转型
**Spring Cloud** 是一套基于 Spring 框架的**微服务架构解决方案**,它提供了一系列的工具和组件,帮助开发者快速构建分布式系统,尤其是微服务架构。
646 70
从单体到微服务:如何借助 Spring Cloud 实现架构转型
|
7月前
|
传感器 监控 安全
智慧工地云平台的技术架构解析:微服务+Spring Cloud如何支撑海量数据?
慧工地解决方案依托AI、物联网和BIM技术,实现对施工现场的全方位、立体化管理。通过规范施工、减少安全隐患、节省人力、降低运营成本,提升工地管理的安全性、效率和精益度。该方案适用于大型建筑、基础设施、房地产开发等场景,具备微服务架构、大数据与AI分析、物联网设备联网、多端协同等创新点,推动建筑行业向数字化、智能化转型。未来将融合5G、区块链等技术,助力智慧城市建设。
327 0
|
10月前
|
Dubbo Java 应用服务中间件
服务架构的演进:从单体到微服务的探索之旅
随着企业业务的不断拓展和复杂度的提升,对软件系统架构的要求也日益严苛。传统的架构模式在应对现代业务场景时逐渐暴露出诸多局限性,于是服务架构开启了持续演变之路。从单体架构的简易便捷,到分布式架构的模块化解耦,再到微服务架构的精细化管理,企业对技术的选择变得至关重要,尤其是 Spring Cloud 和 Dubbo 等微服务技术的对比和应用,直接影响着项目的成败。 本篇文章会从服务架构的演进开始分析,探索从单体项目到微服务项目的演变过程。然后也会对目前常见的微服务技术进行对比,找到目前市面上所常用的技术给大家进行讲解。
329 1
服务架构的演进:从单体到微服务的探索之旅
|
9月前
|
设计模式 负载均衡 监控
探索微服务架构下的API网关设计
在微服务的大潮中,API网关如同一座桥梁,连接着服务的提供者与消费者。本文将深入探讨API网关的核心功能、设计原则及实现策略,旨在为读者揭示如何构建一个高效、可靠的API网关。通过分析API网关在微服务架构中的作用和挑战,我们将了解到,一个优秀的API网关不仅要处理服务路由、负载均衡、认证授权等基础问题,还需考虑如何提升系统的可扩展性、安全性和可维护性。文章最后将提供实用的代码示例,帮助读者更好地理解和应用API网关的设计概念。
233 8

热门文章

最新文章