商品订单类1——TP5微信小程序开发日志(一)
本人是小白,参考文章请谨慎。
在本文中,我们将实现获得用户订单,同时根据商品的库存量来判断是否下单成功。
完整版预订单类已更新,请查看最新博客TP5预订单创建——TP5微信小程序开发日志
类变量
protected $oProducts;
protected $products;
protected $uid;
我们需要获得用户的下单的openid即$uid
,同时也要获得用户的下单信息$oProducts
来自于小程序前端。
当然要检测而库存是否足够,也需要读取数据库的数据。
$oProducts
小程序端的提交的订单数据格式如下:
protected $product=[
[
'product_id'=>1,
'count'=>3,
],
[
'product_id'=>1,
'count'=>3,
],
[
'product_id'=>1,
'count'=>3,
],
];
初始化方法(类似于构造方法)
public function place($uid,$oProducts){
$this->oProducts=$oProducts;
$this->products=$this->getProductsByOrder($oProducts);
$this->uid=$uid;
}
我们给内部变量进行赋值。传入的 u i d , uid, uid,oProducts对内部变量进行赋值,而数据库的商品信息$this->products则需要访问数据库的来获得,所以我们得再写一个方法:
private function getProductsByOrder($oProducts)
{
$oPIDs=[];
foreach ($oProducts as $oProduct){
array_push($oPIDs,$oProduct['product_id']);
}
$products=Product::all($oPIDs)
->visible(['id','price','stock','name','main_img_url']);
return $products;
}
1.我们需要根据提交的商品id来访问特定的商品信息,而不是全部将其返回,所以我们需要新建一个数组来保存需要访问商品的id。
2.我们根据包含商品id的数组,来访问数据库,即通过Model类来访问。
3.最后返回结果。
订单状态方法
public function getOrderStatus()
{
$status=[
'pass'=>true,
'orderplace'=>0,
'pStatusArray'=>[]
];
foreach ($this->oProducts as $oProduct){
$pStatus=$this->getProductStatus($oProduct['product_id'],$oProduct['count'],$this->products);
if(!$pStatus['haveStock']){
$status['pass']=false;
}
$status['orderplace']+=$pStatus['totalPrice'];
array_push($status['pStatusArray'],$pStatus);
}
return $status;
}
1.首先,我们需要通过建立一个字典来表示一个订单的信息,需要记录订单状态pass
、订单总计orderplace
、订单包含商品状态pstatusarray
注意:此处订单状态不仅仅指库存是否足够,同时也包含订单总计和商品信息。
因为订单的状态是由每个商品决定的,所以我们再去遍历每个商品的信息,getProductStatus见商品状态方法
2.我们遍历每个商品,执行一次getProductStatus方法,获得每个商品的状态信息,然后根据if(!$pStatus['haveStock'])
是否为假,如果为假的话,订单信息即为假 $status['pass']=false;
所以只要有一个商品库存状态不够,该订单的状态库存即为false,其他的状态信息直接相加即可。
3.最后返回
商品状态方法
public function getProductStatus($oPID,$oCount,$products)
{
$pIndex=-1;
$pStatus=[
'id'=>null,
'name'=>'',
'count'=>0,
'haveStock'=>false,
'totalPrice'=>0,
];
for ($i=0;$i<count($products);$i++){
if($oPID==$products[$i]['id']){
$pIndex=$i;
}
}
if($pIndex==-1){
throw new OrderException([
'msg'=>'id为'.$oPID.'的商品不存在,订单生成失败.'
]);
}else{
$product=$products[$pIndex];
$pStatus['id']=$product['id'];
$pStatus['name']=$product['name'];
$pStatus['count']=$oCount;
$pStatus['totalPrice']=$product['price']*$oCount;
if($product['stock']-$oCount>=0){
$pStatus['haveStock']=true;
}
}
return $pStatus;
}
我们需要给商品状态方法传入商品的id,商品的个数,还有数据库商品的信息
1.我们需要建立个商品字典来存储商品的信息
2.然后需要遍历数据库返回的数据中,是否存在该商品,通过product_id号来比较
3.如果存在那么就记录下该条商品信息在数据库返回数组的位置$pIndex=$i;
,不存在则抛出自定义异常**
4.记录下位置后,对商品字典进行赋值,根据数据库返回的商品信息,库存是否存在需要通过数据库库存减去订 单库存来判断$product['stock']-$oCount>=0
,足够$pStatus['haveStock']=true;