小程序进销存管理系统多用户多仓库,uniapp源码可生成H5页面和APP,前后端全开源 功能
前后端全开源还能打包H5和APP,多用户多仓库的设计特别适合连锁店场景。仓库模块的树形结构可以套用现成组件,但注意深度别超过三级,手机端展示会变形。整个项目最费劲的是状态机设计,特别是退货流程要和采购/销售状态联动。1、支持采购单录入、审核、入库、退货等采购过程中的记录追踪。1、支持采购单录入、审核、入库、退货等采购过程中的记录追踪。2、支持销售、出库、销售审核、出库审核、退货等跟踪。2、支持销售
小程序进销存管理系统多用户多仓库,uniapp源码可生成H5页面和APP,前后端全开源 功能 1、支持采购单录入、审核、入库、退货等采购过程中的记录追踪 2、支持销售、出库、销售审核、出库审核、退货等跟踪 3、支持产品出库、入库的数据导出 4、支持用户、仓库等管理

最近在折腾uniapp开发的小程序进销存系统,发现这玩意儿真是中小企业的福音。前后端全开源还能打包H5和APP,多用户多仓库的设计特别适合连锁店场景。今天带大家扒一扒核心功能的实现,顺手拆解几个关键代码段。

采购流程的状态管理挺有意思,看看这个采购单状态枚举:
// 采购单状态配置
const PURCHASE_STATUS = {
DRAFT: {code: 0, name: '草稿'},
AUDIT: {code: 1, name: '待审核'},
STOCK_IN: {code: 2, name: '已入库'},
RETURNED: {code: 3, name: '已退货'}
};
状态流转用Vuex做全局管理,审核动作触发时会校验仓库权限。这里有个细节——不同仓库管理员只能操作自己管辖的仓库,权限验证中间件长这样:
// 仓库操作权限校验
export const warehouseAuth = (warehouseId) => {
return async (ctx, next) => {
const userWarehouses = ctx.state.user.warehouses;
if (!userWarehouses.includes(warehouseId)) {
throw new Error('无该仓库操作权限');
}
await next();
};
};
销售模块最实用的是出库防呆设计。生成出库单时会实时校验库存,用MongoDB的原子操作避免超卖:
// 库存扣减原子操作
ProductSchema.methods.deductStock = function(num) {
return this.updateOne({
$inc: { stock: -num },
$set: { updateTime: Date.now() }
});
};
数据导出功能用了uni-file-picker组件,导出Excel时注意处理时间格式:
<uni-file-picker
limitType="[.xlsx]"
@select="handleExport"
></uni-file-picker>
// 处理时间戳转换
function formatDate(timestamp) {
return new Date(timestamp).toISOString().split('T')[0];
}
多仓库实现的关键在数据库设计,每个库存记录都带warehouseId字段。调拨操作其实可以看作出库+入库的组合事务,记得加@Transactional注解防止数据不一致。

小程序进销存管理系统多用户多仓库,uniapp源码可生成H5页面和APP,前后端全开源 功能 1、支持采购单录入、审核、入库、退货等采购过程中的记录追踪 2、支持销售、出库、销售审核、出库审核、退货等跟踪 3、支持产品出库、入库的数据导出 4、支持用户、仓库等管理

用户体系用RBAC模型,权限树存在Redis里加速鉴权。创建用户时自动生成仓库白名单,这个关联关系在用户-仓库中间表里维护。

整个项目最费劲的是状态机设计,特别是退货流程要和采购/销售状态联动。后来用策略模式封装不同状态的操作,代码清爽不少。比如退货处理器基类:
abstract class ReturnHandler {
abstract validate(order: Order): boolean;
abstract execute(order: Order): Promise<void>;
}
性能优化上有个骚操作——给高频接口加了redis缓存,但库存相关的一律不走缓存。用装饰器实现还挺方便:
@Cacheable({ ttl: 60 })
async getProductList() {
// 查询逻辑
}
源码里最值得借鉴的是错误处理机制,用uni-app的全局拦截器统一处理:
// 请求拦截
uni.addInterceptor('request', {
fail: (err) => {
if (err.statusCode === 403) {
uni.showToast({ title: '权限不足', icon: 'none' });
}
}
});
这套系统虽然界面朴素,但胜在业务流程闭环。二次开发时建议先理清状态流转图,改起来才不容易翻车。仓库模块的树形结构可以套用现成组件,但注意深度别超过三级,手机端展示会变形。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)