商品模块表结构及逻辑说明1涉及到表1.1商品表(es_goods)商品表goodsid名称货号品牌id所属分类id类型id商品类型计量单位重量是否上架商品列表图片商品图片简介详细描述销售价格成本价市场价参数字串规格字串是否开启规格配件字串添加时间最后更新时间浏览次数购买次数是否可用库存积分页面标题页面关键字页面内容描述p20p19p18p17p16p15p14p13p12p11p10p9p8p7p6p5p4p3p2p1排序have_field是否是团购是否限时抢购评价值库存报警数是否特价是否支持打折度数最小值度数最大值mediumint(8)varchar(200)varchar(200)mediumint(8)mediumint(8)mediumint(8)enum('normal','bind')varchar(20)decimal(20,3)smallint(1)longtextlongtextvarchar(255)longtextdecimal(20,3)decimal(20,3)decimal(20,3)longtextlongtextsmallint(1)longtextbigint(8)bigint(8)int(10)int(10)smallint(1)mediumint(8)int(10)varchar(255)varchar(1000)varchar(1000)varchar(255)varchar(255)varchar(255)varchar(255)varchar(255)varchar(255)varchar(255)varchar(255)varchar(255)varchar(255)varchar(255)varchar(255)varchar(255)varchar(255)varchar(255)varchar(255)varchar(255)varchar(255)varchar(255)varchar(255)intsmallint(1)smallint(1)smallint(1)intinttinyint(1)tinyint(1)double(8,2)double(8,2)pk用于存储商品基本信息,其中字段P1至P21用于存储商品自定义属性。直接将自定义属性存储于商品表中的目的是为了提高查询效率确实存在更好的搜索方案,如Lucene,这将是javashop进步将要改进的商品的自定义参数信息存储于es_goods_type表,在后面会有详细的介绍1.2货品表(es_product)在javashop中关于货品的定义:某一种商品可能有多种规格,那么每一种规格就是一个货品。如某某衬衫是一个商品,他可能存在L号及白色和S号白色两种货品。es_product用于存储货品数据,其中goods_id字段和es_goods表关联,其它字段定义了这种货品可能特有的属性,如库存、价格或重量等。在多库房的情况下,库存的存储会变得相对复杂,此处的库存是指全部库房的库存和。而es_goods表中的store字段记录了此商品所有货品、所有库房的库存之和。1.3货品库存表(es_product_store)这个表是为了定义多个库房的货品库存情况,其中depotid字段和es_depot(库房表)关联。货品product_idgoods_id名称货号库存价格规格折扣重量...mediumint(8)mediumint(8)varchar(255)varchar(50)mediumint(8)decimal(20,3)longtextdecimal(20,3)decimal(20,3)pk货品库存storeidgoodsidproductiddepotidstore...intintintintintpk1.4商品库房对照表(es_goods_depot)此表记录了某个库房是否完成了商品的进货。这里涉及到了Javashop关于“进货任务”的概念,在Javashop中商品入库的流程为:添加商品信息形成进货任务任务提醒完成进货“添加商品信息”和”进货”可能是由不同的角色完成的,“进货员”是否完成了某个商品的“进货任务”便记录在此表中,其中iscmpl为1表示完成了此商品的进货任务。1.5商品分类表(es_goods_cat)此表定义了商品的分类,es_goods表中的cat_id和此表关联。1.6商品类型表(es_goods_type)类型和类别不同,类型定义了商品的特性,如手机有“网络制式”、“机身内存”、“屏幕尺寸”等等属性和参数,还要定义其“摩托罗拉”或是“诺基亚”的品牌,属性和参数的字段是props、params。商品库房对照表idgoodsiddepotidiscmpl...intintintsmallint(1)pk商品类别cat_id类别名称父id路径商品数量显示次序类型显示到列表类别图...mediumint(8)varchar(200)mediumint(8)varchar(200)mediumint(8)smallint(5)mediumint(8)enum('0','1')varchar(255)pk商品类型type_id类型名称属性参数是否可用是否是实体商品是否有属性是否有参数是否关联品牌have_field...mediumint(8)varchar(100)longtextlongtextsmallint(1)smallint(1)smallint(1)smallint(1)smallint(1)smallint(1)pk类型和品牌的关系是一对多,对照表为:类型品牌对照表2商品模块逻辑分析2.1商品信息的维护商品模块也是基于Javashop的组件机制,其核心逻辑在“商品核心组件”(GoodsCoreComponent)中,此组件包主要插件有:商品基本信息插件商品相册插件商品自定义属性插件商品自定义参数插件1.商品基本信息是对商品名称、价格、重量等属性的维护2.商品相册是对商品表的image_default\image_file两个字段维护3.自定义属性是对商品表的p1-p20字段维护4.自定义参数是对商品表的params字段维护。2.2对于规格的管理对于商品规格的处理,涉及到两个组件:“标准货品组件”和“自定义规格组件”。两个组件同时只能启用一个2.2.1规格组件(GoodsSpecComponent)规格组件用于处理商品带有多种规格的情况,负责商品添加、修改、库存维护、配货发货环节的逻辑。2.2.2标准货品组件(ProductComponent)此组件用于处理一种商品只对应一种规格的情况,在某些电子商务中的商品很简单,没有规格,一个商品即是一个货品,如果使用规格组件去处理会使业务变得过于复杂。因此提供标准货品组件,他也会涉及商品添加、修改、库存维护、配货发货环节的逻辑,但只考虑了单类型品牌对照表type_idbrand_idmediumint(8)mediumint(8)一货品的情况。2.3商品自定义属性及参数的存储es_goods_type中的props及params字段存储了某个商品类型的自定义属性及自定义参数情况。他们均以JSON格式存储于数据库中,参数JSON对应的Java实体对像为GoodsParam属性JSON对应的Java实体为Attribute在数据库中JSON字串的样子:[{datatype:,hidden:0,name:包装,nums:[0,0],optionAr:[盒装,瓶装],optionMap:[{num:0,selected:0,url:,name:盒装},{num:0,selected:0,url:,name:瓶装}],options:盒装,瓶装,required:0,type:3,unit:,valStr:,value:,valueList:[]},{datatype:,hidden:0,name:口味,nums:[0,0,0,0],optionAr:[白咖啡,卡布奇诺,其它,特色咖啡],optionMap:[{num:0,selected:0,url:,name:白咖啡},{num:0,selected:0,url:,name:卡布奇诺},{num:0,selected:0,url:,name:其它},{num:0,selected:0,url:,name:特色咖啡}],options:白咖啡,卡布奇诺,其它,特色咖啡,required:0,type:3,unit:,valStr:,value:,valueList:[]}]在运行期Javashop会将他们转为Java对象并显示到页面中:2.4商品库存的维护我们上面提到,商品的库存涉及到的表有:es_product_store、es_goods_depot。他们是通过一系列的插件来完成维护的。2.4.1库存创建插件GoodsDepotCreatePlugin此插件用于在添加商品时创建每个商品对应的库存维护情况,即对es_goods_depot表维护。2.4.2规格库存插件他们在以下包中:com.enation.app.shop.component.spec.plugin.store这些插件处理了带规格商品的库存维护的逻辑2.4.3标准货品库存插件他们在以下包中:com.enation.app.shop.component.product.plugin.store这些插件处理了不带规格商品的库存维护的逻辑