Browse Source

优化用户下单方法-进行中

sunxbiao 1 year ago
parent
commit
c7f31c00c7
1 changed files with 319 additions and 0 deletions
  1. 319 0
      app/controller/api/store/order/StoreOrder.php

+ 319 - 0
app/controller/api/store/order/StoreOrder.php

@@ -24,6 +24,9 @@ use app\common\repositories\store\order\StoreGroupOrderRepository;
24
 use app\common\repositories\store\order\StoreOrderRepository;
24
 use app\common\repositories\store\order\StoreOrderRepository;
25
 use crmeb\services\ExpressService;
25
 use crmeb\services\ExpressService;
26
 use think\App;
26
 use think\App;
27
+use think\db\exception\DataNotFoundException;
28
+use think\db\exception\DbException;
29
+use think\db\exception\ModelNotFoundException;
27
 use think\facade\Cache;
30
 use think\facade\Cache;
28
 use think\facade\Db;
31
 use think\facade\Db;
29
 use think\facade\Request;
32
 use think\facade\Request;
@@ -689,6 +692,322 @@ class StoreOrder extends BaseController
689
     }
692
     }
690
 
693
 
691
     /**
694
     /**
695
+     * @param StoreCartRepository $cartRepository
696
+     * @return mixed
697
+     * @author xaboy
698
+     * @day 2020/6/10
699
+     */
700
+    public function createOrderNew(StoreCartRepository $cartRepository)
701
+    {
702
+        // 1、接收参数
703
+        $allParams = input();
704
+        \think\facade\Log::info("createOrder params" . json_encode($allParams));
705
+        $cartId = $allParams['cart_id'] ?? null;
706
+        if (is_null($cartId)) {
707
+            return app('json')->fail("缺少购物车ID参数!");
708
+        }
709
+        $fzonePayType = $allParams['fzone_paytype'] ?? '[]';
710
+        if (is_null($fzonePayType) || strstr($fzonePayType, "type") === false) {
711
+            return app('json')->fail("请选择支付方式!");
712
+        }
713
+        $fzonePayTypeMap = json_decode($fzonePayType, true);
714
+        $addressId = (int)($allParams['address_id'] ?? 0); // 地址ID
715
+
716
+        $payType = $this->request->param('pay_type');// 5积分 6京豆
717
+        $share_id = $this->request->param('share_id', '');//分享id
718
+        $mer_id = $this->request->param('mer_id', '');//分享id
719
+        $uid = $this->request->uid();
720
+
721
+
722
+        // 2、加锁,他之前加的锁好像在锁狗屎,毛线都没锁住, 而且为什么要锁用户
723
+        // 增加锁,防止同一用户重读点击
724
+        $redisHandler = Cache::store('redis')->handler();
725
+        $isSet = $redisHandler->set('createOrder' . $uid . '-' . $cartId, 1, ['nx', 'ex' => 30]);
726
+        if ($isSet) {
727
+            return app('json')->fail('请勿重复下单');
728
+        }
729
+
730
+        // 3、验证购物车内商品 是否已下架,是否无货,是否支持发货 是否满足数量
731
+        // 处理购物车 按照之前需求的意思,应该 每次下单 只能购买 一个SPU 的 一个SKU,而且只能买一件
732
+        //在提交订单之前会产出购物车cartid,其中会产生购买的数量,现在默认会员专区是只让购买一个商品,需要修改值为1
733
+        try {
734
+            $storeCartDataList = Db::name('store_cart')
735
+                ->where('cart_id', $cartId)
736
+                ->select()
737
+                ->toArray();
738
+        } catch (\Exception $e) {
739
+            return app('json')->fail('获取购物车内容失败');
740
+        }
741
+        // 这块 限制还 欠完善考虑
742
+        if (count($storeCartDataList) > 1 || $storeCartDataList[0]['cart_num'] > 1) {
743
+            return app('json')->fail('购买数量默认为一件,请修改购买数量!');
744
+        }
745
+        // 确认购物车内 微唯宝 的商品 是否满足发货
746
+        /** @var ProductAttrValueRepository $productAttrValueRepository */
747
+        $productAttrValueRepository = app()->make(ProductAttrValueRepository::class);
748
+        foreach ($storeCartDataList as $k => $item) {
749
+            // 检查库存 查看 此商品已下架 此商品规格无货 此商品不支持该地区
750
+            // (按照代码中所写的逻辑来推理:从微唯宝拉取过来,从而上架到商品表的商品,都有SPUId,所以去走微唯宝提供的接口验证,而会员专区和商贸区的商品可能是商户自己加的,没有SPUId,所以也就不用走微唯宝的验证)
751
+            $checkGong = $productAttrValueRepository->checkGong($item['product_id'], $item['product_attr_unique'], $item['cart_num'], $uid, $addressId);
752
+            if (isset($checkGong['code']) && $checkGong['code'] == -1){
753
+                return app('json')->fail($checkGong['message']);
754
+            }
755
+        }
756
+
757
+        // 获取 用户收货地址
758
+        /** @var UserAddressRepository $userAddressRepository */
759
+        $userAddressRepository = app()->make(UserAddressRepository::class);
760
+        try {
761
+            $addressData = $userAddressRepository->getWhere(['uid' => $uid, 'address_id' => $addressId]);
762
+        } catch (\Exception $e) {
763
+            return app('json')->fail('获取用户收货地址失败');
764
+        }
765
+        // 如果不是会员专区的商品,则一定要用户完善的收货地址
766
+        if ($mer_id != 496) {
767
+            if (!$addressData['city_id']) {
768
+                return app('json')->fail('请选择正确的收货地址');
769
+            }
770
+            if ($addressData['code_list'] == '') {
771
+                return app('json')->fail('地址需要选择4级地址!请修改地址!');
772
+            }
773
+        }
774
+
775
+        // 判断组合支付逻辑,积分、VR、京豆
776
+        try {
777
+            $userData = Db::name("user")
778
+                ->where("uid", $uid)
779
+                ->find();
780
+        } catch (\Exception $e) {
781
+            return app('json')->fail('获取当前用户信息失败');
782
+        }
783
+        $array_fzone_paytype_all = [
784
+            'fzone_pay_jingdou' => 0,
785
+            'fzone_pay_vr' => 0,
786
+            'fzone_pay_jifen' => 0,
787
+            'fzone_pay_price' => 0,
788
+            'fzone_pay_other' => $fzonePayTypeMap['other'],
789
+            'fzone_pay_note' => $fzonePayTypeMap['note'],
790
+            'fzone_pay_type' => $fzonePayTypeMap['type'],
791
+        ];
792
+
793
+        //会员专区升级产生的user_of_goods订单ID赋值
794
+        $getuserofgoodsid = 1;
795
+
796
+        if (!empty($fzonePayTypeMap['type'])) {
797
+            if (!empty($fzonePayTypeMap['type'] == 'b1')) {
798
+                //精彩生活VR+积分
799
+                //vr+积分
800
+                $vrpri = $userData['vr'] - $fzonePayTypeMap['price'];
801
+                $pricepri = $userData['score'] - $fzonePayTypeMap['other'];
802
+                //vr+积分
803
+                if ($vrpri < 0 || $pricepri < 0) {
804
+                    return app('json')->fail("支付失败,VR或积分不足!");
805
+                }
806
+                $array_fzone_paytype_all['fzone_pay_vr'] = $fzonePayTypeMap['price'];
807
+                $array_fzone_paytype_all['fzone_pay_jifen'] = $fzonePayTypeMap['other'];
808
+
809
+            } else if (!empty($fzonePayTypeMap['type'] == 'b2')) {
810
+                //精彩生活现金+积分
811
+                //商贸区:现金+积分
812
+
813
+                $vrpri = $userData['score'] - $fzonePayTypeMap['other'];
814
+
815
+                // //现金+积分
816
+                if ($vrpri < 0) {
817
+                    return app('json')->fail("支付失败,积分不足!");
818
+                }
819
+                $array_fzone_paytype_all['fzone_pay_price'] = $fzonePayTypeMap['price'];
820
+                $array_fzone_paytype_all['fzone_pay_jifen'] = $fzonePayTypeMap['other'];
821
+
822
+            } else if (!empty($fzonePayTypeMap['type'] == 'b3')) {
823
+                //精彩生活区 VR+京豆
824
+                $vrpri = $userData['vr'] - $fzonePayTypeMap['price'];
825
+                $pricepri = $userData['jingdou'] - $fzonePayTypeMap['other'];
826
+                //vr+积分
827
+                if ($vrpri < 0 || $pricepri < 0) {
828
+                    return app('json')->fail("支付失败,VR或京豆不足!");
829
+                }
830
+                $array_fzone_paytype_all['fzone_pay_vr'] = $fzonePayTypeMap['price'];
831
+                $array_fzone_paytype_all['fzone_pay_jingdou'] = $fzonePayTypeMap['other'];
832
+            } else if (!empty($fzonePayTypeMap['type'] == 'b4')) {
833
+                //精彩生活区 现金+京豆
834
+                $pricepri = $userData['jingdou'] - $fzonePayTypeMap['other'];
835
+
836
+                // //现金+积分
837
+                if ($pricepri < 0) {
838
+                    return app('json')->fail("支付失败,京豆不足!");
839
+                }
840
+                $array_fzone_paytype_all['fzone_pay_price'] = $fzonePayTypeMap['price'];
841
+                $array_fzone_paytype_all['fzone_pay_jingdou'] = $fzonePayTypeMap['other'];
842
+                //                return app('json')->fail("开发中升级中!");
843
+
844
+            } else if (!empty($fzonePayTypeMap['type'] == 'b5')) {
845
+                //精彩生活 VR支付
846
+
847
+                $vrpri = $userData['vr'] - $fzonePayTypeMap['price'];
848
+
849
+                if ($vrpri < 0) {
850
+                    return app('json')->fail("支付失败,VR不足!");
851
+                }
852
+                $array_fzone_paytype_all['fzone_pay_vr'] = $fzonePayTypeMap['price'];
853
+            } else if (!empty($fzonePayTypeMap['type'] == 'a1')) {
854
+                //生活 VR支付
855
+
856
+                $vrpri = $userData['vr'] - $fzonePayTypeMap['price'];
857
+
858
+
859
+                if ($vrpri < 0) {
860
+                    return app('json')->fail("支付失败,VR不足!");
861
+                }
862
+                $array_fzone_paytype_all['fzone_pay_vr'] = $fzonePayTypeMap['price'];
863
+                // return app('json')->fail($userdatas['spread_old']);
864
+                //检查在旧表中是否有上级
865
+                if ($userData['spread_old'] != 0) {
866
+
867
+
868
+                    //查询当前用户的上级在1.0中是有数据的,那么老用户介绍新用户。
869
+                    $sf = Db::name('old_user_jbp')->where('id', $userData['uid'])->find();//父级在旧表有注册
870
+
871
+                    // $sf1 = Db::name('old_user_jbp')->where('id',$userdatas['id'])->find();
872
+
873
+                    // 当前用户是在2.0注册的新用户,父级是在1.0
874
+
875
+                    //当前用户在1.0中没有注册,但是父级在1.0系统中注册过。
876
+                    if (!empty($sf)) {
877
+
878
+                        //检查用户在旧表中是否与上级,有的话就是升级权限,要新增一个user_of_goods的表
879
+                        $data1['user_id'] = $uid;
880
+                        $data1['goods_list_id'] = 0;
881
+                        $data1['status'] = 0;
882
+                        $data1['spread_id'] = $sf['invite_id'];
883
+                        $data1['node_id'] = $sf['spread'];
884
+                        $data1['money'] = $fzonePayTypeMap['price'];
885
+                        $data1['order_id'] = 10;
886
+                        $data1['server_id'] = $userData['server_id_old'];
887
+                        $data1['pay_gb'] = 0;
888
+                        $data1['pay_vr'] = $fzonePayTypeMap['price'];
889
+                        $data1['pay_bt'] = 0;
890
+
891
+                        //return app('json')->fail("333");
892
+
893
+                        $sfe = Db::name('old_user_of_goods')->insertGetId($data1);
894
+
895
+                        if ($sfe) {
896
+                            $getuserofgoodsid = $sfe;
897
+                        }
898
+                    }
899
+
900
+
901
+                }
902
+
903
+
904
+                //Db::getLastInsID();
905
+
906
+            } else if (!empty($fzonePayTypeMap['type'] == 'a3')) {
907
+                //生活 现金 + VR支付
908
+
909
+
910
+                //检查在旧表中是否有上级
911
+                if ($userData['spread_old'] != 0) {
912
+
913
+
914
+                    //查询当前用户的上级在1.0中是有数据的,那么老用户介绍新用户。
915
+                    $sf = Db::name('old_user_jbp')->where('id', $userData['uid'])->find();//父级在旧表有注册
916
+                    //如果组合支付中,没有现金,只是用VR支付的情况下
917
+
918
+                    if ($fzonePayTypeMap['price'] <= 0.01) {
919
+                        return app('json')->fail("现金不足");
920
+                    }
921
+
922
+                    // 当前用户是在2.0注册的新用户,父级是在1.0
923
+
924
+                    //当前用户在1.0中没有注册,但是父级在1.0系统中注册过。
925
+                    if (!empty($sf)) {
926
+
927
+                        //检查用户在旧表中是否与上级,有的话就是升级权限,要新增一个user_of_goods的表
928
+                        $data1['user_id'] = $uid;
929
+                        $data1['goods_list_id'] = 0;
930
+                        $data1['status'] = 0;
931
+                        $data1['spread_id'] = $sf['invite_id'];
932
+                        $data1['node_id'] = $sf['spread'];
933
+                        $data1['money'] = $fzonePayTypeMap['price'];
934
+                        $data1['order_id'] = 10;
935
+                        $data1['server_id'] = $userData['server_id_old'];
936
+                        $data1['pay_gb'] = 0;
937
+                        $data1['pay_vr'] = $fzonePayTypeMap['price'];
938
+                        $data1['pay_bt'] = 0;
939
+
940
+                        //return app('json')->fail("333");
941
+
942
+                        $sfe = Db::name('old_user_of_goods')->insertGetId($data1);
943
+
944
+                        if ($sfe) {
945
+                            $getuserofgoodsid = $sfe;
946
+                        }
947
+                    }
948
+
949
+
950
+                }
951
+                $array_fzone_paytype_all['fzone_pay_price'] = $fzonePayTypeMap['price'];
952
+                $array_fzone_paytype_all['fzone_pay_vr'] = $fzonePayTypeMap['other'];
953
+
954
+            } else if (!empty($fzonePayTypeMap['type'] == 'c1')) {
955
+                //复购区 复购金支付
956
+                $fugoupri = $userData['fugou'] - $fzonePayTypeMap['price'];
957
+
958
+                if ($fugoupri < 0) {
959
+                    return app('json')->fail("支付失败,复购金不足!");
960
+                }
961
+                $array_fzone_paytype_all['fzone_pay_other'] = $fzonePayTypeMap['price'];
962
+            } else {
963
+                $array_fzone_paytype_all['fzone_pay_price'] = $fzonePayTypeMap['price'];
964
+            }
965
+        }
966
+
967
+
968
+        //end
969
+        //$getuserofgoodsid= 1;
970
+
971
+        makeLock()->lock();
972
+        try {
973
+            $groupOrder = $this->repository->createOrder($this->request->userInfo(), $payType, [$cartId], $addressId, 0, 0, 0, 0, 0, $share_id, 0, $mer_id, 0, 0, 0, 0, 0, 0, $fzonePayType, $getuserofgoodsid, $array_fzone_paytype_all);
974
+            //var_dump($groupOrder);
975
+        } catch (\Throwable $e) {
976
+            makeLock()->unlock();
977
+            throw $e;
978
+        }
979
+        makeLock()->unlock();
980
+
981
+
982
+        //删除缓存的优惠价格
983
+        // Cache::delete($uid.'_youhui_price_'.$product_type_id);
984
+
985
+        //return app('json')->status('success', '支付成功1', ['order_id' => $groupOrder['group_order_id']]);
986
+        //利润
987
+
988
+
989
+        if ($groupOrder['pay_price'] == 0) {
990
+            $this->repository->paySuccess($groupOrder);
991
+            return app('json')->status('success', '支付成功2', ['order_id' => $groupOrder['group_order_id']]);
992
+        }
993
+        try {
994
+            $groupOrder['pay_price'] = set_price_rtrim($groupOrder['pay_price']);
995
+            //
996
+            if ($groupOrder['er'] == 0) {
997
+
998
+                return app('json')->success(['order_id' => $groupOrder->group_order_id, "groupOrder" => $groupOrder]);
999
+            } else {
1000
+                return json_encode(array("status" => 400, "message" => $groupOrder['er1']));
1001
+            }
1002
+
1003
+
1004
+            //            return $this->repository->pay($payType, $this->request->userInfo(), $groupOrder);
1005
+        } catch (\Exception $e) {
1006
+            return app('json')->status('error', $e->getMessage(), ['order_id' => $groupOrder->group_order_id]);
1007
+        }
1008
+    }
1009
+
1010
+    /**
692
      *
1011
      *
693
      * @remarks 年费订单创建
1012
      * @remarks 年费订单创建
694
      * @author Tang
1013
      * @author Tang