data = $data = is_array($form->data)?$form->data:Json::decode($form->data,true); $user = User::getOne([['id'=>$form->user_id,'mall_id'=>$form->mall_id]]); if(empty($user)) throw new Exception('下单用户不存在'); $carts = $data['freight_attr']; $attr_id_arr = array_column($carts,'attr_id'); if(empty($attr_id_arr)) throw new Exception('订单错误'); $num_arr = array_column($carts,'num','attr_id'); $params['where'] = [['=','status',StatusEnum::ENABLED],['id'=>$attr_id_arr]]; $params['with'] = ['goods','goods.extra']; $sku_arr = GoodsAttr::lists($params,true); $goods_type = []; foreach ($sku_arr as $sku){ if(!in_array($sku['goods']['goods_type'],$goods_type)) $goods_type[] =$sku['goods']['goods_type']; } if(count($goods_type)>1) throw new Exception('不同类型的商品不能一起下单'); if(!empty($goods_type)&&in_array($goods_type[0],[GoodsTypeEnum::GoodsTypePhysical])) { $data['mall_id'] = $form->mall_id; $this->checkAddress($form['action'],$data,$form->user_id); $form['is_address'] = 1; } $form['is_virtual'] = 0; if(!empty($goods_type)&&in_array($goods_type[0],[GoodsTypeEnum::GoodsTypeVirtual])) { $form['is_virtual'] = 1; } $tmp_order_goods = []; foreach ($sku_arr as $sku){ if(empty($sku) || empty($sku['goods'])) throw new Exception('该下单的产品不存在或者已经删除'); if(empty($num_arr[$sku['id']])) throw new Exception('请设置正确的下单数量'); $buy_num = $num_arr[$sku['id']]; $mch_id = $sku['goods']['mch_id']; // if ($form->action == AppEnum::ACTION_PREVIEW) { // 记录所属供应链 // TODO 因为如果是供应链商品就不能用购物车,但是运费计算要考虑多商品的情况,所以默认所有商品都是普通商品,(当前只会涉及计算,而不会涉及数据写入) /*if (empty($form->process_extra_data['supply_chain'][$sku['goods_id']])) { $form->process_extra_data['supply_chain'][$sku['goods_id']] = $sku['goods']['goods_source']; }*/ if (!empty($sku['goods']['goods_source'])) $mch_id = $sku['goods']['goods_source']; // } $order_goods = new OrderDetail(); $order_goods = $order_goods->loadDefaultValues(); $order_goods->goods_id = $sku['goods_id']; $order_goods->goods_name = $sku['goods']['goods_name']; $order_goods->goods_attr_id = $sku['id']; $order_goods->sign_id = $sku['sign_id']; $order_goods->goods_attr_name = $sku['name']; $order_goods->num = $buy_num; $order_goods->cost_price = $sku['cost_price']; $order_goods->price = $sku['price']; $order_goods->goods_price = BcHelper::mul($order_goods->num, $order_goods->price); $order_goods->original_goods_price = $order_goods->goods_price; $order_goods->pic_url = !empty($sku['pic_url']) ? $sku['pic_url'] : $sku['goods']['cover_pic']; $order_goods->user_id = $form->user_id; $order_goods->mch_id = $mch_id; $order_goods->mall_id = $form->mall_id; $order_goods->is_virtual = $form->is_virtual; // 默认数据带下单数量方便计算 $goods = $sku['goods']; $goods['number'] = $buy_num; $form->order_goods[] = $tmp_order_goods =ArrayHelper::toArray($order_goods); $form->sku[$sku['goods_id']] = $sku; $form->user = $user; } if (!empty($form->process_extra_data['supply_chain'])) { $t_supply_chain = array_unique(array_values($form->process_extra_data['supply_chain'])); if (count($t_supply_chain) > 2) throw new Exception("单次只能选择一个供应链的商品"); } // 签署升级协判断 0不需要签署,1需要签署 $is_sign_agreement = UserSignAgreement::checkIsNeedSign($user['level'], array_column($tmp_order_goods, 'goods_id'), $form->mall_id, $form->user_id); $form->is_sign_agreement = $is_sign_agreement; return $form; } /** * 获取下单类型 * @Author bing * @DateTime 2021-09-23 09:48:45 * @copyright: Copyright (c) 2020 广东七件事集团 * @return string */ public static function getType(): string{ return 'freight'; } }