|
|
@@ -24,6 +24,9 @@ use app\common\repositories\store\order\StoreGroupOrderRepository;
|
|
24
|
24
|
use app\common\repositories\store\order\StoreOrderRepository;
|
|
25
|
25
|
use crmeb\services\ExpressService;
|
|
26
|
26
|
use think\App;
|
|
|
27
|
+use think\db\exception\DataNotFoundException;
|
|
|
28
|
+use think\db\exception\DbException;
|
|
|
29
|
+use think\db\exception\ModelNotFoundException;
|
|
27
|
30
|
use think\facade\Cache;
|
|
28
|
31
|
use think\facade\Db;
|
|
29
|
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
|
1012
|
* @remarks 年费订单创建
|
|
694
|
1013
|
* @author Tang
|