Răsfoiți Sursa

Merge remote-tracking branch 'origin/master'

林海涛 1 an în urmă
părinte
comite
a72b5579df

+ 15 - 0
app/workerapi/controller/shops/OrderController.php

@@ -11,6 +11,21 @@ use app\workerapi\validate\shops\ShopOrderValidate;
  */
 class OrderController extends BaseApiController
 {
+
+    public function submitOrder()
+    {
+        $params = (new ShopOrderValidate())->post()->goCheck('submit', [
+            'user_id' => $this->userId,
+            'terminal' => $this->userInfo['terminal'],
+            'user_info' => $this->userInfo
+        ]);
+        $result = ShopOrderLogic::submitOrder($params);
+        if (false === $result) {
+            return $this->fail(ShopOrderLogic::getError());
+        }
+        return $this->data($result);
+    }
+
     public function lists()
     {
         return $this->dataLists(new ShopOrderLists());

+ 89 - 0
app/workerapi/logic/shops/ShopOrderLogic.php

@@ -6,11 +6,16 @@ use app\common\model\decorate\DecoratePage;
 use app\common\model\decorate\DecorateTabbar;
 use app\common\model\setting\PostageRegion;
 use app\common\model\shops\ShopAddress;
+use app\common\model\shops\ShopCart;
+use app\common\model\shops\ShopGoods;
+use app\common\model\shops\ShopGoodSpecsInventory;
+use app\common\model\shops\ShopOrderGoods;
 use app\common\model\shops\ShopOrders;
 use app\common\model\user\UserAddress;
 use app\common\service\ConfigService;
 use app\common\service\FileService;
 use think\db\Query;
+use think\Exception;
 use think\facade\Db;
 
 
@@ -19,8 +24,92 @@ use think\facade\Db;
  */
 class ShopOrderLogic extends BaseLogic
 {
+    /**
+     * 提交订单
+     * @param array $params
+     * @return array|false
+     */
+    public static function submitOrder($params)
+    {
+        Db::startTrans();
+        try {
+            //获取购物车商品
+            $shop_carts = ShopCart::whereIn('id',$params['shop_cart_id'])->where('worker_id',$params['user_id'])->select()->toArray();
+            if(empty($shop_carts)){
+                throw new Exception('购物车商品不存在');
+            }
+
+            //生成订单编号
+            $sn = generate_sn(ShopOrders::class, 'sn');
+            $shop_order_goods = array();
+
+            $amount_total = 0;//总价
+            $amount = 0;//应支付价格
+            //验证商品库存是否存在
+            foreach ($shop_carts as $v){
+                $inventory = ShopGoodSpecsInventory::where('id',$v['goods_specs_inventory_id'])->findOrEmpty();
+                $shop_good = ShopGoods::where('id',$v['shop_goods_id'])->findOrEmpty()->toArray();
+                if($inventory->remaining_inventory<$v['number']){
+                    throw new Exception($shop_good['goods_name'].'库存不足');
+                }
+                //新增订单商品镜像
+                $shop_order_goods[] = [
+                    'sn'=>$sn,
+                    'shop_goods_id'=>$shop_good['id'],
+                    'goods_category_ids' => $shop_good['goods_category_ids'],
+                    'goods_category_id' => $shop_good['goods_category_id'],
+                    'goods_name' => $shop_good['goods_name'],
+                    'goods_image' => $shop_good['goods_image'],
+                    'goods_banners' => $shop_good['goods_banners'],
+                    'description' => $shop_good['description'],
+                    'specs_type' => $shop_good['specs_type'],
+                    'custom_attribute_items'=>json_encode($shop_good['custom_attribute_items'],JSON_UNESCAPED_UNICODE),
+                    'goods_specs_inventory_id'=>$v['goods_specs_inventory_id'],
+                    'specs'=>json_encode($inventory->specs,JSON_UNESCAPED_UNICODE),
+                    'number'=>$v['number'],
+                    'service_total'=>$inventory->service_total,
+                    'service_fee'=>$inventory->service_fee
+                ];
+
+                //减少商品库存
+                $inventory->remaining_inventory = $inventory->remaining_inventory-1;
+                $inventory->save();
 
+                $amount_total += $inventory['service_total'];
+                $amount += $inventory['service_fee'];
+            }
+
+            //生成订单
+            $order = ShopOrders::create([
+                'shop_order_type' => 1,
+                'worker_id' => $params['user_id'],
+                'sn' => $sn,
+                'real_name' => $params['real_name'],
+                'mobile' => $params['mobile'],
+                'address' => $params['address'],
+                'pay_status' => 0,
+                'paw_way' => 2,
+                'order_terminal' => $params['terminal'],
+                'amount_total' => $amount_total,
+                'amount' => $amount,
+            ]);
 
+            //生成订单商品镜像
+            $ShopOrderGoods = new ShopOrderGoods();
+            $ShopOrderGoods->saveAll($shop_order_goods);
+            //清除购物车商品
+            ShopCart::whereIn('id',$params['shop_cart_id'])->delete();
+
+            Db::commit();
+        } catch (\Exception $e) {
+            self::setError($e->getMessage());
+            return false;
+        }
+
+        return [
+            'order_id' => (int)$order['id'],
+        ];
+    }
 
     /**
      * @notes 获取详情

+ 13 - 1
app/workerapi/validate/shops/ShopOrderValidate.php

@@ -14,6 +14,7 @@ class ShopOrderValidate  extends BaseValidate
         'goods_specs_inventory_ids' => 'require|array',
         'pay_way' => 'require',
         'mobile' => 'require',
+        'shop_cart_id'=>'require'
     ];
 
 
@@ -24,6 +25,7 @@ class ShopOrderValidate  extends BaseValidate
         'mobile.require' => '联系电话不存在',
         'real_name.require' => '联系人不存在',
         'address.require' => '请填写地址',
+        'shop_cart_id.require' => '请选择商品',
     ];
 
 
@@ -35,7 +37,7 @@ class ShopOrderValidate  extends BaseValidate
 
     /**
      * @notes 删除场景
-     * @return ShopGoodsValidate
+     * @return ShopGoodsValidate|ShopOrderValidate
      * @author likeadmin
      * @date 2024/08/04 11:07
      */
@@ -48,4 +50,14 @@ class ShopOrderValidate  extends BaseValidate
     {
         return $this->only(['id', 'number']);
     }
+
+    /**
+     * @notes 订单提交场景
+     * @return ShopGoodsValidate|ShopOrderValidate
+     * @date 2024/08/04 11:07
+     */
+    public function sceneSubmit()
+    {
+        return $this->only(['shop_cart_id','mobile','real_name','address']);
+    }
 }