你的分享就是我们的动力 ---﹥

电商平台实战之库藏与ERP对接解决方案

电商平台实战之库存与ERP对接解决方案

需求分析

当前系统中库存是针对商品和货品的,没有细化到门店,而根据最近几个项目中客户的需求,有的客户需求库存详细到门店,并且涉及到与ERP系统中的库存对接。因此需要改进系统来适应这些需求,同时还要保证和不需要细化到门店的系统保持兼容。

目前的解决方案是将库存信息独立出来与商品、货品和门店相关,并且商品在不需要门店的情况下,属于总店。

另外,库存中增加了锁库存,只有在发货的时候采取扣减真实库存。

表的结构修改

  • 表:ZtdGoodsStock
字段名 类型 长度 是否允许为空 备注
ID Int 自增ID
ProductID Int 商品ID
GoodsID Int 货品ID
GoodsNo Varchar 20 货品编号
ZtdNo Varchar 50 门店编号
Stock Int 库存
LockStock Int 锁库存

记录处理流程

1、商品信息处理

  • 1.1 商品添加修改时的处理

    添加商品时,先添加商品信息和货品信息,然后在门店库存表插入记录(默认添加在总店),然后统计货品和商品在所有门店的库存并更新货品和商品的库存。

    存储过程控制如下:

构造货品ID集合临时表,添加货品库存信息到门店库存表(总店)
...
--注:#g为待插入货品信息临时表
insert into goods(productid,goodsno,marketprice,memberprice,weight,volume,score,storage,goodsname,supplierid,props,propsdesc,propsname,costprice) select * from #g
--货品ID集合临时表
select props,g.goodsid  into #goodsids from goods g(nolock)
where g.productid=@productid --and g.goodsid not in(select goodsid from #g) by liwenhai 20130717

--添加货品库存信息到门店库存表(总店)
select g.ProductID,g.GoodsID,g.GoodsNo,'0' as ZtdNo,g.Storage as stock,0 as LockStock into #zgs from #goodsids gt,goods g(nolock)
where gt.goodsid=g.goodsid
insert into ZtdGoodsStock(ProductID,GoodsID,GoodsNo,ZtdNo,Stock,LockStock)
select * from #zgs
...
统计所有门店的库存并更新货品和商品表库存
...
------------------------------------------------------------------------
--有多规格的情况--------------------------------------------------------
-------------------------------------------------------------------------
--统计所有门店的库存并更新货品和商品表库存
--更新货品库存和商品库存
	--货品库存
update goods set storage=isnull((select sum(zgs.stock) from ztdgoodsstock zgs where g.goodsid=zgs.goodsid),0)
from #goodsids g
	--商品库存
update product set storage=isnull((select sum(g.storage) from goods g(nolock) where g.productid=@productid),0)
...
-------------------------------------------------------------
--没有多规格的情况--------------------------------------------
--------------------------------------------------------------
...
--获取当前货品id
select @gid=@@identity
--添加货品库存信息到门店库存表(总店)
insert into ZtdGoodsStock(ProductID,GoodsID,GoodsNo,ZtdNo,Stock) values (@productid,@gid,@productno,'0',@storage)

--统计所有门店的库存并更新货品和商品表库存
--更新货品库存和商品库存
	--货品库存
update goods set storage=(select sum(zgs.Stock) from ZtdGoodsStock as zgs  where GoodsID=@gid  group  by zgs.GoodsId)   where GoodsID=@gid
	--商品库存
update Product set Storage =(select sum(storage) FROM Goods as g where g.ProductID=@productid) where ProductID=@productid
...

修改商品时,先修改商品和货品信息(可能需要更新门店库存表),这里然后统计货品和商品在所有门店的库存并更新到货品表和商品表。

有多规格的情况

删除不存在的货品

--删除不存在的货品
delete from goods where goods.productid=@productid and goods.goodsid not in (select goodsid from #g where #g.goodsid'')
--删除该货品对应的门店的库存信息
delete from ztdgoodsstock where productid=@productid and ztdgoodsstock.goodsid not in(select goodsid from #g where #g.goodsid'')

更新货品

--更新货品
update g 
set g.goodsno=gt.goodsno,g.marketprice=gt.marketprice,g.memberprice=gt.memberprice,g.weight=gt.weight,g.score=gt.score,/*g.storage=gt.storage,*/g.goodsname=gt.goodsname,g.props=gt.props,g.propsdesc=gt.propsdesc,g.propsname=gt.propsname,costprice=gt.costprice
from goods g(nolock),#g gt
where g.goodsid=gt.goodsid
--更新该货品对应门店的总店库存信息
update zgs
set zgs.goodsno=gt.goodsno,zgs.stock=gt.storage
from ztdgoodsstock zgs,#g gt
where zgs.goodsid=gt.goodsid and zgs.ztdno='0'

插入新货品

--插入新货品
	insert into goods(productid,goodsno,marketprice,memberprice,weight,volume,score,storage,goodsname,supplierid,props,propsdesc,propsname,costprice) 
	select productid,goodsno,marketprice,memberprice,weight,volume,score,storage,goodsname,supplierid,props,propsdesc,propsname,costprice
	from #g where #g.goodsid=''
--添加该货品对应门店的新库存信息
	select g.ProductID,g.GoodsID,g.GoodsNo,'0' as ZtdNo,g.Storage as stock,0 as LockStock into #zgs from #g gt 
	left join Goods g(nolock) on gt.goodsno=g.goodsno	
where gt.goodsid not in(select GoodsID from goods g where g.productid=@productid)
	--避免重复插入
	insert into ZtdGoodsStock(ProductID,GoodsID,GoodsNo,ZtdNo,Stock,LockStock) 
	select * from #zgs
	

统计所有门店的库存并更新货品和商品表库存

--统计所有门店的库存并更新货品和商品表库存
	--更新货品库存和商品库存
		--货品库存
	update goods set storage= tb.stock
	from
	(
    select goodsid,sum(zgs.stock)  as stock
	from ztdgoodsstock zgs(nolock) 
	where zgs.productid=@productid
	group by zgs.goodsid
	) as tb 
	where goods.goodsid=tb.goodsid
	--update goods set storage=isnull((select sum(zgs.stock) from ztdgoodsstock zgs(nolock),#g g(nolock) where zgs.goodsid=g.goodsid group by zgs.goodsid),0)
		--商品库存
	update product set storage=isnull((select sum(g.storage) from goods g(nolock) where g.productid=@productid),0)

没有多规格的情况

删除多规格取消时的数据

update top (1) goods
	set goodsno=@productno,marketprice=@marketprice,memberprice=@memberprice,weight=@weight,volume=@Volume,score=@score,/*storage=@storage,*/goodsname=@productname,props=null,propsdesc=null,costprice=@costprice
	where productid=@productid 

    --删除多规格取消时的数据
	delete from goods where isnull(props,'')'' and isnull(propsdesc,'')'' and productid=@productid
	--获取最新的goodsid,设置groupprice要用到
	declare @gid int
	select @gid=goodsid from goods g(nolock)where productid=@productid
	--多规格取消时门店的库存
	delete from ztdgoodsstock where goodsid@gid and productid=@productid	

更新门店(总店)库存

	--更新门店(总店)库存
	update top(1) ztdgoodsstock 
	set stock=@storage
	where productid=@productid 

统计所有门店的库存并更新货品和商品表库存

--统计所有门店的库存并更新货品和商品表库存
	 --更新货品库存和商品库存
		--货品库存
	update goods set storage=(select sum(zgs.Stock) from ZtdGoodsStock as zgs  where zgs.productid=@productid   group  by zgs.GoodsId)  where productid=@productid 
		--商品库存
	update Product set Storage =(select sum(storage) FROM Goods as g where g.ProductID=@productid) where ProductID=@productid

删除商品时,同步删除门店对应的库存。

	--删除货品在门店的库存信息
	delete ztdgoodsstock from ztdgoodsstock,#temp where ztdgoodsstock.productid=#temp.[value]	
	--删除货品信息
	delete goods from goods,#temp where goods.productid=#temp.[value]	
    --删除商品信息
	delete product from product,#temp where product.productid=#temp.[value]
  • 1.2 门店后台更新库存
  • 1.3 erp同步库存

2、订单流程的处理

  • 2.1 详情页面加入购物车判断
  • 2.2 购物车页面更新购物车
  • 2.3 生成订单时的判断
  • 2.4 后台取消订单
  • 2.5 发货

未完待续(笔者工作很忙,不能及时更新,请耐心等待。。。,有问题请留言)

转载请注明:特维博客 » 电商平台实战之库存与ERP对接解决方案