xieruidong 2 years ago
parent
commit
71f01eb2a8

+ 7 - 44
application/api/controller/mall/GoodsCart.php

@@ -7,6 +7,7 @@ use app\common\model\Coupon;
 use app\common\model\GoodsSku;
 use app\common\service\CouponService;
 use app\common\service\InstallService;
+use app\common\service\OrderService;
 use think\Db;
 
 /**
@@ -110,50 +111,12 @@ class GoodsCart extends Api
             'coupon_id|优惠券'=>['integer','requireIf:coupon_use,1'],
         ]);
         $user=$this->auth->getUser();
-        $info=[
-            'amount_total'=>0,
-            'amount_coupon'=>0,
-            'amount_install'=>0,
-            'num'=>0,
-            'num_install'=>0,
-            'goods'=>[]
-        ];
-
-        $info['goods']=$user->cart()
-            ->with(['goods','sku'])
-            ->select()->toArray();
-        $info['num']=array_sum(array_column($info['goods'],'num'));
-        $info['num_install']=array_sum(array_column($info['goods'],'num_install'));
-
-        foreach ($info['goods'] as $goods){
-            $amount=bcmul($goods['sku']['amount'],$goods['num']);
-            $info['amount_total']=bcadd($info['amount_total'],$amount);
-        }
-
-        #安装费
-        $info['amount_install']=InstallService::getFee(array_column($info['goods'],null,'goods_sku_id'),'num_install');
-        $info['amount_total']=bcadd($info['amount_total'],$info['amount_install']);
-
-        #优惠券
-        $couponAmount=0;
-        if(!empty($data['coupon_use'])){
-            $use=false;
-            $coupon=$user->coupon()->findOrFail($data['coupon_id']);
-            foreach ($info['goods'] as $goods){
-                $amount=bcmul($goods['sku']['amount'],$goods['num']);
-                if($coupon->canUse($amount,$goods['goods_id'])){
-                    $use=true;
-                    $couponAmount=$coupon['amount'];
-                    break;
-                }
-            }
-
-            if(!$use){
-                $this->error('优惠券不符合使用规则');
-            }
-            $info['amount_coupon']=$couponAmount;
-        }
-        $info['amount_total']=bcsub($info['amount_total'],$couponAmount);
+        $service=new OrderService();
+        $service->setUser($user);
+        $service->setCouponUse($data['coupon_use']??false);
+        $service->setCouponId($data['coupon_id']??0);
+        $service->setFrm(2);
+        $info=$service->calculate();
 
         $this->success('',$info);
     }

+ 16 - 1
application/api/controller/mall/Orders.php

@@ -3,6 +3,7 @@
 namespace app\api\controller\mall;
 
 use app\common\controller\Api;
+use app\common\service\OrderService;
 
 /**
  * 商城订单接口
@@ -15,12 +16,26 @@ class Orders extends Api
     /**
      * 预下单
      * @ApiMethod (POST)
-     * @ApiParams (name=frm,description="1直接下单2来自购物车")
      * @ApiParams (name=form,description="key为规格id,对象:num购买数量,num_install安装数量")
      * @ApiParams (name=coupon_use,description=是否使用优惠券)
      * @ApiParams (name=coupon_id,description=优惠券id)
      */
     public function preview(){
+        $data=$this->_validate([
+            'coupon_id|优惠券'=>['integer','requireIf:coupon_use,1'],
+            'form|商品'=>['require','array','min:1'],
+            'frm|来源'=>['require','in:1,2'],
+        ]);
+        $user=$this->auth->getUser();
+        $goods=$data['form'];
+        $service=new OrderService();
+        $service->setUser($user);
+        $service->setGoods($goods);
+        $service->setFrm(1);
+        $service->setCouponUse($data['coupon_use']??false);
+        $service->setCouponId($data['coupon_id']??0);
+        $info=$service->calculate();
 
+        $this->success('',$info);
     }
 }

+ 8 - 0
application/common/service/BaseService.php

@@ -0,0 +1,8 @@
+<?php
+namespace app\common\service;
+
+class BaseService{
+    protected function error($msg){
+        throw_user($msg);
+    }
+}

+ 133 - 0
application/common/service/OrderService.php

@@ -0,0 +1,133 @@
+<?php
+namespace app\common\service;
+
+use app\common\model\GoodsSku;
+use app\common\model\User;
+
+class OrderService extends BaseService {
+    /** @var User */
+    protected $user;
+    protected $coupon_use;
+    protected $coupon_id;
+    /** @var 1直接购买2购物车买 */
+    protected $frm;
+    protected $goods=[];
+
+    /**
+     * @param User $user
+     */
+    public function setUser(User $user)
+    {
+        $this->user = $user;
+    }
+
+    /**
+     * @return User
+     */
+    public function getUser(): User
+    {
+        return $this->user;
+    }
+
+    /**
+     * @param array $goods
+     */
+    public function setGoods(array $goods): void
+    {
+        $this->goods = $goods;
+    }
+
+    /**
+     * @param mixed $frm
+     */
+    public function setFrm($frm): void
+    {
+        $this->frm = $frm;
+    }
+    /**
+     * @param mixed $coupon_use
+     */
+    public function setCouponUse($coupon_use): void
+    {
+        $this->coupon_use = $coupon_use;
+    }
+
+    /**
+     * @param mixed $coupon_id
+     */
+    public function setCouponId($coupon_id): void
+    {
+        $this->coupon_id = $coupon_id;
+    }
+
+    /**
+     * @return array
+     */
+    public function getGoods()
+    {
+        if($this->frm==1) {
+            $goods=$this->goods;
+            foreach ($goods as $sku_id=>&$info){
+                $sku=GoodsSku::find($sku_id);
+                if(!$sku){
+                    $this->error('规格不存在');
+                }
+                $info['sku']=$sku;
+                $info['goods']=$sku->goods;
+                $info['goods_id']=$sku['goods_id'];
+            }
+            return $goods;
+        }else{
+            return $this->getUser()->cart()
+                ->with(['goods','sku'])
+                ->select()->toArray();
+        }
+    }
+
+    public function calculate(){
+        $info=[
+            'amount_total'=>0,
+            'amount_coupon'=>0,
+            'amount_install'=>0,
+            'num'=>0,
+            'num_install'=>0,
+            'goods'=>[]
+        ];
+        $user=$this->getUser();
+
+        $info['goods']=$this->getGoods();
+        $info['num']=array_sum(array_column($info['goods'],'num'));
+        $info['num_install']=array_sum(array_column($info['goods'],'num_install'));
+
+        foreach ($info['goods'] as $goods){
+            $amount=bcmul($goods['sku']['amount'],$goods['num']);
+            $info['amount_total']=bcadd($info['amount_total'],$amount);
+        }
+
+        #安装费
+        $info['amount_install']=InstallService::getFee(array_column($info['goods'],null,'goods_sku_id'),'num_install');
+        $info['amount_total']=bcadd($info['amount_total'],$info['amount_install']);
+
+        #优惠券
+        $couponAmount=0;
+        if(!empty($this->coupon_use)){
+            $use=false;
+            $coupon=$user->coupon()->findOrFail($this->coupon_id);
+            foreach ($info['goods'] as $goods){
+                $amount=bcmul($goods['sku']['amount'],$goods['num']);
+                if($coupon->canUse($amount,$goods['goods_id'])){
+                    $use=true;
+                    $couponAmount=$coupon['amount'];
+                    break;
+                }
+            }
+
+            if(!$use){
+                $this->error('优惠券不符合使用规则');
+            }
+            $info['amount_coupon']=$couponAmount;
+        }
+        $info['amount_total']=bcsub($info['amount_total'],$couponAmount);
+        return $info;
+    }
+}

+ 8 - 13
public/api.html

@@ -3248,7 +3248,7 @@
                                                         <td>coupon_use</td>
                                                         <td>string</td>
                                                         <td>是</td>
-                                                        <td>是否使用优惠券</td>
+                                                        <td>是否使用优惠券使用传1</td>
                                                     </tr>
                                                                                                         <tr>
                                                         <td>coupon_id</td>
@@ -3280,7 +3280,7 @@
                                                     <form enctype="application/x-www-form-urlencoded" role="form" action="/api/mall.goods_cart/index" method="get" name="form20" id="form20">
                                                                                                                 <div class="form-group">
                                                             <label class="control-label" for="coupon_use">coupon_use</label>
-                                                            <input type="string" class="form-control input-sm" id="coupon_use" required placeholder="是否使用优惠券" name="coupon_use">
+                                                            <input type="string" class="form-control input-sm" id="coupon_use" required placeholder="是否使用优惠券使用传1" name="coupon_use">
                                                         </div>
                                                                                                                 <div class="form-group">
                                                             <label class="control-label" for="coupon_id">coupon_id</label>
@@ -3327,6 +3327,11 @@
                                                                 <td>优惠券优惠金额</td>
                                                             </tr>
                                                                                                                         <tr>
+                                                                <td>amount_install</td>
+                                                                <td>string</td>
+                                                                <td>安装费</td>
+                                                            </tr>
+                                                                                                                        <tr>
                                                                 <td>num</td>
                                                                 <td>string</td>
                                                                 <td>购买件数</td>
@@ -3934,12 +3939,6 @@
                                                 </thead>
                                                 <tbody>
                                                                                                         <tr>
-                                                        <td>frm</td>
-                                                        <td>string</td>
-                                                        <td>是</td>
-                                                        <td>1直接下单2来自购物车</td>
-                                                    </tr>
-                                                                                                        <tr>
                                                         <td>form</td>
                                                         <td>string</td>
                                                         <td>是</td>
@@ -3980,10 +3979,6 @@
                                                 <div class="panel-body">
                                                     <form enctype="application/x-www-form-urlencoded" role="form" action="/api/mall.orders/preview" method="POST" name="form25" id="form25">
                                                                                                                 <div class="form-group">
-                                                            <label class="control-label" for="frm">frm</label>
-                                                            <input type="string" class="form-control input-sm" id="frm" required placeholder="1直接下单2来自购物车" name="frm">
-                                                        </div>
-                                                                                                                <div class="form-group">
                                                             <label class="control-label" for="form">form</label>
                                                             <input type="string" class="form-control input-sm" id="form" required placeholder="key为规格id,对象:num购买数量,num_install安装数量" name="form">
                                                         </div>
@@ -8376,7 +8371,7 @@
 
                 </div>
                 <div class="col-md-6" align="right">
-                    Generated on 2022-09-22 15:31:04 <a href="./" target="_blank">后台管理</a>
+                    Generated on 2022-09-22 19:43:53 <a href="./" target="_blank">后台管理</a>
                 </div>
             </div>