当前位置: 首页 > 后端技术 > PHP

电商系统设计的产品(二)

时间:2023-03-29 21:36:35 PHP

电商人每天都在用,比如某只猫,某只狗等等,电商系统的设计看似复杂其实很简单,看似简单其实很复杂买家购买一件商品后,会经历一个商品系统->交易系统->订单系统->物流系统->售后系统的流程。完成上述过程即完成了一笔交易。经常网购的童鞋都知道这一点。今天我们就来聊一聊从商品系统到交易系统、订单系统的存储过程及其设计中应该注意的“坑”。存储商品系统的SKU和SPU的设计过程前面两篇文章讲解过SPU??(StandardProductUnit)标准化产品单位SKU(StockKeepingUnit)库存单位现在我们对商品系统数据表的设计有了清晰的认识,为什么它是这样设计的。那么问题来了,用户购买的商品如何存储在订单/交易系统中呢?相关问题现在有这样一个场景,小明在某宝买了一个疯狂的手机,颜色是红色,存储是32G。他选择使用某宝支付。SKU商品颜色入库001爱疯手机红32G002爱疯手机红256G003爱疯手机黑32G004爱疯手机黑256G小明选择购买SKU=001的产品,一般情况下订单要关联此SKU编码保持数据一致性。订单号用户SKUSN110小明001的设计有一个缺点。产品的名称和价格不固定。如果商家修改了商品的标题或其他属性,则小明以8000元购买了iCrazy手机。经过几年的降价,商家修改了价格,结果小明的购买清单也变成了修改后的价格,所以这种只关联的设计是不可取的(至少在电商中不行)系统)。订单号用户SKU商品名称商品价格商品封面图片商品其他属性SN110小明001爱凤手机8000aifeng.png其他属性设计如上表,有人可能会问“关联是什么意思?”我的回答是“KeepDataassociation”,虽然商家可能会改变商品的属性,但是作为程序员,他应该尽可能记录下用户的所有行为。文末有订单表的数据结构。其实在电商系统的设计上,个人觉得不应该区分多商户电商和单用户电商(至少开发者不应该区分),但是在早期设计应将多商户概念引入系统。即使只有一家官方商店?!当涉及多个商户时,需要考虑用户统一下单的问题。购物车下单,多个商品来自多个商家。如果分单,如何下单,通知多商户等等,多商户的问题不是本章的重点。这次先提出这几点。一个问题,有兴趣的同学可以提前想一想,后续文章会详细说明,购物车下单,多个商品来自多个商家。如果订单来自多个商家,那么订单的数据库接口应该是这样的设计订单表订单号用户SN110小明订单详情表订单号SKU用户商户SN110001小明官方SN110002小明第三方无论购买多少产品以及该商品属于多少商户,我们应该将用户一次购买的商品归于一个订单。订单下关联多个商品详情。在售后操作中,也方便买家退换单品。文末有详细的数据结构设计后台函数列表。此处提供函数名称和URL以供参考。回收站/产品/回收订单列表/订单后台的设计和操作套路我会单独写一篇介绍。这里只是一张粗略的表格。数据表orderordertableCREATETABLE`order`(`id`int(10)unsignedNOTNULLAUTO_INCREMENT,`order_no`varchar(100)COLLATEutf8mb4_unicode_ciNOTNULLCOMMENT'ordernumber',`order_sn`varchar(100)COLLATEutf8mb4_unicode_ciNNULLCOMMENT'交易编号',`member_id`int(11)NOTNULLCOMMENT'客户编号',`supplier_id`int(11)DEFAULT'0'COMMENT'商户代码',`supplier_name`varchar(255)COLLATEutf8mb4_unicode_ciDEFAULTNULLCOMMENT'商户名称',`order_status`tinyint(4)NOTNULLDEFAULT'0'COMMENT'订单状态0未付款,1已付款,2已发货,3已签收,-1退货申请,-2退货中,-3已退货,-4取消交易-5取消申请',`after_status`tinyint(4)NOTNULLDEFAULT'0'COMMENT'用户售后状态0未发起售后1售后申请-1售后已取消2processing200processingDone',`product_count`int(11)NOTNULLDEFAULT'0'COMMENT'quantity',`product_amount_total`decimal(12,4)NOTNULLCOMMENT'总价',`order_amount_total`decimal(12,4)NOTNULLDEFAULT'0.0000'COMMENT'实际支付金额',`logistics_fee`decimal(12,4)NOTNULLCOMMENT'运费金额',`address_id`int(11)NOTNULLCOMMENT'收货地址码',`pay_channel`tinyint(4)NOTNULLDEFAULT'0'COMMENT'支付渠道0余额1微信2支付宝',`out_trade_no`varchar(255)COLLATEutf8mb4_unicode_ciDEFAULTNULLCOMMENT'订单支付号',`escrow_trade_no`varchar(255)COLLATEutf8mb4_unicode_ciDEFAULTNULLCOMMENT'第三方支付流水号',`pay_time`int(11)NOTNULLDEFAULT'0'COMMENT'付款时间',`delivery_time`int(11)NOTNULLDEFAULT'0'COMMENT'发货时间',`order_settlement_status`tinyint(4)NOTNULLDEFAULT'0'COMMENT'订单结算状态0未结算1已结算',`order_settlement_time`int(11)NOTNULLDEFAULT'0'COMMENT'订单结算时间',`is_package`enum('0','1')COLLATEutf8mb4_unicode_ciNOTNULLDEFAULT'0'COMMENT'是否为包',`is_integral`enum('0','1')COLLATEutf8mb4_unicode_ciDEFAULT'0'COMMENT'是否为积分产品',`created_at`timestampNULLDEFAULTNULL,`updated_at`timestampNULLDEFAULTNULL,`deleted_at`timestampNULLDEFAULTNULL,PRIMARYKEY(`id`),KEY`order_order_sn_member_id_order_status_out_trade_`no_order`(`stat``,`out_trade_no`(191)))ENGINE=InnoDBAUTO_INCREMENT=114DEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_unicode_ci;order_detailorderdetailsCREATETABLE`order_detail`(`id`int(10)unsignedNOTNULLAUTO_INCREMENT,`int(1_id)NOT`NULLCOMMENT'ordercode',`product_id`int(11)NOTNULLCOMMENT'productcode',`product_name`varchar(255)COLLATEutf8mb4_unicode_ciNOTNULLCOMMENT'productname',`product_price`decimal(12,4)NOTNULLCOMMENT'Productprice',`product_sku`int(11)NOTNULLCOMMENT'ProductSKU',`product_picture_url`varchar(255)COLLATEutf8mb4_unicode_ciDEFAULTNULL,`product_mode_desc`varchar(255)COLLATEutf8mb4_unicode_ciNOTNULL产品型号'COMMENT,`product_mode_params`int(11)DEFAULTNULLCOMMENT'产品型号参数',`discount_rate`tinyint(4)NOTNULLDEFAULT'0'COMMENT'折扣率',`discount_amount`decimal(12,4)NOTNULLDEFAULT'0.0000'COMMENT'discountratio',`number`int(11)NOTNULLDEFAULT'1'COMMENT'采购数量',`subtotal`decimal(12,4)NOTNULLCOMMENT'小计金额',`is_product_exists`enum('0','1')COLLATEutf8mb4_unicode_ciNOTNULLDEFAULT'0'COMMENT'产品是否有效',`remark`textCOLLATEutf8mb4_unicode_ciCOMMENT'客户产品备注',`created_at`timestampNULLDEFAULTNULL,`updated_at`timestampNULLDEFAULTNULL,PRIMARYKEY(`id`),KEY`order_detail_order_id_index`(`order_id`))ENGINE=InnoDBAUTO_INCREMENT=118DEFAULTCHARSET=utf8mb4COLLATE=utf8dermb4_unicode_ci;order_logisticsTid`int(10)unsignedNOTNULLAUTO_INCREMENT,`order_id`int(11)NOTNULLCOMMENT'ordercode',`express_no`varchar(125)COLLATEutf8mb4_unicode_ciDEFAULTNULLCOMMENT'快递单号',`consignee_realname`varchar(255)COLLATEutf8mb4_unicode_ciNOTNULLCOMMENT'Consignee'sname',`consignee_telphone`varchar(255)COLLATEutf8mb4_unicode_ciNOTNULLCOMMENT'Contactnumber',`consignee_telphone2`varchar(255)COLLATEutf8mb4_unicode_ciDEFAULTN'Backup'`consignee_address`varchar(255)COLLATEutf8mb4_unicode_ciNOTNULLCOMMENT'ReceiptAddress',`consignee_zip`int(11)NOTNULLCOMMENT'ZipCode',`logistics_type`varchar(255)COLLATEutf8mb4_unicode_ciDEFAULTNULLCOMMENT'LogisticsMethod',`logistics_fee`decimal(12,2)NOTNULLDEFAULT'0.00'COMMENT'物流发货运费',`order_logistics_status`int(11)NOTNULLDEFAULT'0'COMMENT'物流状态',`logistics_settlement_status`int(11)NOTNULLDEFAULT'0'COMMENT'物流结算状态',`logistics_result_last`varchar(255)COLLATEutf8mb4_unicode_ciDEFAULTNULLCOMMENT'物流最后状态描述',`logistics_result`varchar(255)COLLATEutf8mb4_unicode_ciDEFAULTNULLCOMMENT'物流描述',`0DULL_time`int(11)EFNOTNOT'COMMENT'shipmenttime',`logistics_update_time`int(11)NOTNULLDEFAULT'0'COMMENT'物流更新时间',`logistics_settlement_time`int(11)NOTNULLDEFAULT'0'COMMENT'物流结算时间',PRIMARYKEY(`id`))引擎=InnoDBAUTO_INCREMENT=114默认字符集=utf8mb4COLLATE=utf8mb4_unicode_ci;order_returns创建表`order_returns`(`id`int(10)unsignedNO??TNULLAUTO_INCREMENT,`returns_no`varchar(255)COLLATEutf8mb4_unicode_ciNOTNULLCOMMENT'客户查询返回号码',`order_id`int(11)NOTNULLCOMMENT'订单号',`express_no`varchar(255)COLLATEutf8mb4_unicode_ciDEFAUNULLCOMMENT'Logisticnumber',`consignee_realname`varchar(255)COLLATEutf8mb4_unicode_ciNOTNULLCOMMENT'Consigneename',`consignee_telphone`varchar(255)COLLATEutf8mb4_unicode_ciNOTNULLCOMMENT'联系电话',`consignee_telcharphone(25`)COLLATEutf8mb4_unicode_ciNOTNULLCOMMENT'Alternatecontactnumber',`consignee_address`varchar(255)COLLATEutf8mb4_unicode_ciNOTNULLCOMMENT'收货地址',`consignee_zip`varchar(255)COLLATEutf8mb4_unicode_ciNOTNULLCOMMENT`icslog'varchar(255)COLLATEutf8mb4_unicode_ciNOTNULLCOMMENT'物流方式',`logistics_fee`decimal(12,2)NOTNULLCOMMENT'物流运费',`order_logistics_status`int(11)DEFAULTNULLCOMMENT'物流状态',`logistics_settlement_status`int(11)DEFAULTNULLCOMMENT'物流结算状态',`logistics_result_last`varchar(255)COLLATEutf8mb4_unicode_ciDEFAULTNULLCOMMENT'物流最后状态描述',`logistics_result`varchar(255)COLLATEutf8mb4_unicode_ciDEFAULTNULLCOMMENT'物流描述',`logistics_create_time`int(11)DEFAULTNULLCOMMENT'交货时间',`logistics_update_time`int(11)DEFAULTNULLCOMMENT'物流更新时间',`logistics_settlement_time`int(11)DEFAULTNULLCOMMENT'物流结算时间',`returns_type`tinyint(4)NOTNULLDEFAULT'0'COMMENT'0allRefund1partialrefund',`handling_way`varchar(255)COLLATEutf8mb4_unicode_ciNOTNULLCOMMENT'PUPAWAY:退货入库;REDELIVERY:重新发货;RECLAIM-REDELIVERY:不要求退货再发货;REFUND:退款;COMPENSATION:Noreturnandcompensation',`returns_amount`decimal(8,2)NOTNULLCOMMENT'退款金额',`return_submit_time`int(11)NOTNULLCOMMENT'退货申请时间',`handling_time`int(11)NOTNULLCOMMENT'退货处理时间',`remark`textCOLLATEutf8mb4_unicode_ciNOTNULLCOMMENT'Reasonforreturn',PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_unicode_ci;order_returns_apply售后申请退货申请CREATETABLE`order_returns_apply`(`id`int(10)unsignedNOTNULLAUTO_INCREMENT,`order_no`varchar(255)COLLATEutf8mb4_unicode_ciNOTNULLCOMMENT'ordernumber',`order_detail_id`varchar(255)COLLATEutf8mb4_unicode_cisub'encoding',`return_no`varchar(255)COLLATEutf8mb4_unicode_ciNOTNULLCOMMENT'售后订单号',`member_id`int(11)NOTNULLCOMMENT'用户代码',`state`tinyint(4)NOTNULLCOMMENT'type0onlyRefund1returnrefund',`product_status`tinyint(4)NOTNULLDEFAULT'0'COMMENT'Status0:received1:notreceived',`why`varchar(255)COLLATEutf8mb4_unicode_ciDEFAULTNULLCOMMENT'ReasonforReturn',`status`tinyint(4)NOTNULLDEFAULT'0'COMMENT'AuditStatus-1Rejected0NotAudited1Approved',`audit_time`int(11)NOTNULLDEFAULT'0'COMMENT'审计时间',`audit_why`varchar(255)COLLATEutf8mb4_unicode_ciDEFAULTNULLCOMMENT'审计原因',`note`textCOLLATEutf8mb4_unicode_ciCOMMENT'Note',`created_at`timestampNULLDEFAULTNULL,`updated_at`timestampNULLDEFAULT,`updated_at`timestampNULLDEFAULT,`updated_at`timestampNULLDEFAULT(`id`))引擎=InnoDBAUTO_INCREMENT=5默认字符集=utf8mb4COLLATE=utf8mb4_unicode_ci;感谢您阅读本文,我会陆续发布一些电子商务相关的文章,比如交易系统的设计,订单系统的设计等,感谢您近期的关注我的童鞋.作为一名程序员,我很荣幸能与大家分享我所知道的。代码千变万化,初心不变