$mall_id], ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]] ]; // 买家 if (!empty($params['user_id'])) { $where[] = ['user_id' => $params['user_id']]; } if (!empty($params['user'])) { $uids = User::find() ->where(['mall_id' => $mall_id]) ->andWhere(['status' => StatusEnum::ENABLED]) ->andWhere(['or', ['like', 'username', $params['user']], ['like', 'nickname', $params['user']], ['like', 'mobile', $params['user']]]) ->select('id') ->column(); if (empty($uids)) return []; $where[] = ['user_id' => $uids]; } if (isset($params['buy_user_id']) && $params['buy_user_id'] !== '') { $where[] = ['buy_user_id' => intval($params['buy_user_id'])]; } if (!empty($params['buy_user'])) { $uids = User::find() ->where(['mall_id' => $mall_id]) ->andWhere(['status' => StatusEnum::ENABLED]) ->andWhere(['or', ['like', 'username', $params['buy_user']], ['like', 'nickname', $params['buy_user']], ['like', 'mobile', $params['buy_user']]]) ->select('id') ->column(); if (empty($uids)) return []; $where[] = ['buy_user_id' => $uids]; } if (!empty($params['start_date'])) $where[] = ['>=', 'created_at', strtotime($params['start_date'])]; if (!empty($params['end_date'])) $where[] = ['<=', 'created_at', strtotime($params['end_date'])]; if (!empty($params['goods_name'])) $where[] = ['like', 'order_goods_names', $params['goods_name']]; $ret = ValetOrder::listPage([ 'where' => $where, 'order' => 'id desc', 'limit' => $params['limit'] ?? 10, 'with' => ['user', 'buyUser', 'order' => function($query) { $query->with(['detail']); }] ]); if (!empty(ValetOrder::getStaticError())) return ValetOrder::getStaticError(); if (!empty($ret['list'])) { foreach ($ret['list'] as &$item) { if (empty($item['buyUser'])) { $item['buyUser'] = [ 'id' => 0, 'nickname' => '平台', 'avatar_url'=> '', 'mobile' => '', ]; } } } array_unshift($where, 'AND'); $ret['total_amount'] = ValetOrder::find()->where($where)->sum("order_amount"); return $ret; } public function frontPage(int $mall_id, int $user_id, array $data, array $mall, string $platform) { // 通过用户ID去取数据 $head_where = [ ['mall_id' => $mall_id], ['buy_user_id' => $user_id], ['status' => StatusEnum::ENABLED] ]; if (isset($data['order_status']) && $data['order_status'] != 999) { if ($data['order_status'] == OrderStatusEnum::SING) { // 如果筛选的是已收货的订单那么就将已提货的订单一起取出来 $data['order_status'] = [OrderStatusEnum::SING, OrderStatusEnum::TAKE_FINISH]; } $head_where[] = ['order_status' => $data['order_status']]; } else { if (!empty($data['wait_pending'])) { $head_where[] = ['not in', 'order_status', [OrderStatusEnum::ACCOMPLISH, OrderStatusEnum::REPEAL, OrderStatusEnum::TAKE_FINISH, OrderStatusEnum::SING]]; // 排除 已完成, 已关闭, 已自提, 已签收 } } if (!empty($data['keyword'])) { $u_ids = User::find()->where(['mall_id' => $mall_id]) ->andWhere(['or', ['like', 'mobile', $data['keyword']], ['like', 'nickname', $data['keyword']]]) ->select('id') ->column(); if (!empty($u_ids)) { $head_where[] = ['user_id' => $u_ids]; } else { $head_where[] = ['user_id' => 0]; } } $map['where'] = $head_where; $map['select'] = 'id, order_id'; $map['limit'] = $data['limit'] ?? 5; // $map['page'] = $params['page'] ?? 1; $map['order'] = 'id desc'; $ret = ValetOrder::listPage($map); if (!empty($ret['list'])) { $order_ids = array_column($ret['list'], 'order_id'); $where[] = ['in', 'id', $order_ids]; $where[] = ['is_feedback' => OrderStatusEnum::NOT_FEEDBACK]; $where[] = ['!=', 'order_source', OrderSourceEnum::SOURCE_SELF_MALL]; $select = 'id,pay_money,order_status,shipping_type,is_recycle,marketing_type,extra_info,order_source,store_id,mch_id,receiver_name,mobile, consign_time, mall_id, order_no, created_at'; $params['order'] = 'pay_time desc'; $params['select'] = $select; $params['where'] = $where; $params['with'] = ['detail' => function ($query) { $query->select('id,order_id,goods_id,goods_name,pic_url,goods_attr_id,num,price,is_feedback,sign_id,goods_attr_name,extra_info,adjust_money'); }]; $order_list = Order::lists($params); $ret['mall_logo'] = Yii::$app->services->setting->mall->get($mall_id, 'basic.logo'); if (!empty($order_list)) { foreach ($order_list as $key => $val) { array_map(function ($arg) use (&$val) { if (!isset($val['num'])) $val['num'] = 0; $val['num'] += $arg['num']; }, $val['detail']); // 剩余库存 $stock = []; if($val['detail']){ foreach ($val['detail'] as $k => $v){ $order_list[$key]['detail'][$k]['price'] = $order_list[$key]['detail'][$k]['price'] + $order_list[$key]['detail'][$k]['adjust_money']; $order_list[$key]['detail'][$k]['price'] = round($order_list[$key]['detail'][$k]['price'],2); $goods_unit = Goods::getOne([['=','id',$v['goods_id']]],false,'','','unit')['unit']; $val['detail'][$k]['unit'] = $goods_unit; // 当订单关闭时可以直接再次购买 if ($val['order_status'] == OrderStatusEnum::REPEAL) { // 查询商品是否有货 $stock[] = [ 'num' => $v['num'], 'store_id' => $v['store_id']??0, 'goods_id' => $v['goods_id'], 'attr_id' => $v['goods_attr_id'], 'stock' => GoodsAttr::find()->where(['id' => $v['goods_attr_id']])->select('stock')->scalar(), ]; } } } // 获取支付金额 $order_list[$key] = GlobalInvoke::exec(GlobalInvoke::ORDER_DETAIL, $mall_id, [ 'order' => $val, 'mall_id' => $mall_id, ]) ?: $val; $order_list[$key]['mall_name'] = $mall['name']; $order_list[$key]['mall_logo'] = Yii::$app->services->setting->mall->get($mall_id, 'basic.logo'); // 判断是否可以再次购买 $is_agent = empty($stock) ? 0 : 1; foreach ($stock as $v) { // 当库存小于购买数量 不可再次购买 if ($v['stock'] < $v['num']) { $is_agent = 0; } } $order_list[$key]['is_agent'] = $is_agent; $order_list[$key]['extra_info'] = Json::decode($order_list[$key]['extra_info']); $order_list[$key]['is_agent_data'] = $is_agent ? $stock : []; $order_list[$key]['created_at'] = date('Y-m-d H:i:s', $order_list[$key]['created_at']); } $order_list = GlobalInvoke::exec(GlobalFuncEnum::ORDER_LIST, $mall_id, [ 'order' => $order_list, 'mall_id' => $mall_id ]) ?: $order_list; $ret['shipping_type_text'] = ShippingTypeEnum::getMap(); $ret['order_status_text'] = OrderStatusEnum::getMap(); $ret['order_status_text'][OrderStatusEnum::SHIPMENTS] = '待取货'; $ret['is_feedback_text'] = OrderStatusEnum::getFeedbackMap(); } $ret['pay_type_list'] = \Yii::$app->services->pay->getEnablePayment($mall_id, $platform); $ret['marketing_type_map'] = MarketingTypeEnum::getMap(); $ret['list'] = $order_list; } return $ret; } /** * @param array $orders * @param array $ext * @return true * @throws \Exception */ public function create(array $orders, array $ext) { $t = \Yii::$app->db->beginTransaction(); try { // 获取上级且注册账号 $users = []; // 新增用户列表 $add_new_users = []; foreach ($ext as $order_id => $info) { $parent_id = $orders[0]['buy_user_id']; // 默认上级 if (!empty($info['parent'])) { $pid = User::find()->where(['mall_id' => $orders[0]['mall_id']]) ->andWhere(['mobile' => $info['parent']])->select('id')->scalar(); if (!empty($pid)) $parent_id = $pid; } // 判断当前用户是否存在 if (empty($users[$info['mobile']])) { $user = User::getOne([ ['mall_id' => $orders[0]['mall_id']], ['mobile' => $info['mobile']], ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]] ]); if (empty($user)) { // 实施注册 $user = User::setData([ 'parent_id' => $parent_id, 'nickname' => '代客下单用户', 'mobile' => $info['mobile'], 'mall_id' => $orders[0]['mall_id'], 'username' => "{$info['mobile']}", 'source' => User::SOURCE_VALET_ORDER, 'platform' => User::PLATFORM_H5, 'password' => Yii::$app->getSecurity()->generatePasswordHash(substr($info['mobile'],-6,6)) ]); if ($user) { $add_new_users[] = $user; } } else { // 判断当前老用户是否没有上级,如果没有的话那么就需要指定上级 if (empty($user->parent_id) && !empty($parent_id)) { // 考虑代下单的对象是自己团队的上级并且浏览路径是平台 $parentIds = UserPartitionRelationship::getParentIdArr($parent_id); if (!in_array($user->id, $parentIds)) { // 给其更改上级 $flag = UserPartitionRelationship::changeRelationship([ 'user_id' => $user->id, 'parent_id' => $parent_id, 'operator_user_id' => $orders[0]['buy_user_id'] ]); if ($flag === false) throw new \Exception("修改关系链失败"); } } } if (!$user) throw new \Exception(User::getStaticError()); // 注册失败 $users[$info['mobile']] = $user; } } // 创建订单 foreach ($orders as &$order) { $uid = $users[$ext[$order['order_id']]['mobile']]->id; $order['user_id'] = $uid; // 修改订单所属人 Order::updateAll(['user_id' => $uid, 'marketing_type' => ValetOrderEnum::ADDONS_NAME], ['id' => $order['order_id']]); OrderDetail::updateAll(['user_id' => $uid], ['order_id' => $order['order_id']]); } // 执行 \Yii::$app->db->createCommand()->batchInsert(ValetOrder::tableName(), array_keys($orders[0]), $orders)->execute(); $t->commit(); if (!empty($add_new_users)) { foreach ($add_new_users as $user) { // 触发注册成功事件,事务提交完成后触发 $event = new UserRegisterEvent($user->mall_id); $data = ['user_id' => $user->id, 'platform' => 'h5']; Yii::$app->services->events->dispatch($event, $data, $event->listeners); } } } catch (\Exception $e) { $t->rollBack(); var_dump($e->getMessage(), $e->getFile(), $e->getLine()); \Yii::error(FormatHelper::exception($e, __METHOD__)); throw new \Exception($e->getMessage()); } // 执行写入 return true; } /** * @param int $order_id * @param int $status * @return true * @throws \Exception */ public function update(int $order_id, int $status) { $order = ValetOrder::getOne([ ['order_id' => $order_id] ]); if (empty($order)) return true; // 判断有没有开启插件 $config = (new SettingService())->get($order->mall_id); if (empty($config['is_enable'])) return true; $order->order_status = $status; if (!$order->save()) throw new \Exception($order->getErrorMessage()); return true; } /** * 确认订单 * @param array $params * @return mixed */ public function preview(array $params) { $input = $params['params']; $response = $params['data']; // 只能是一件商品 if (count($response['group_order_goods']) > 1) return $response; $response[ValetOrderEnum::ORDER_EXT_KEY][ValetOrderEnum::ORDER_IS_VALET_KEY] = StatusEnum::DISABLED; $response[ValetOrderEnum::ORDER_EXT_KEY][ValetOrderEnum::ORDER_VALET_SMS_CODE] = StatusEnum::DISABLED; foreach ($response['group_order_goods'] as $goods) { if (count($goods['goods']) > 1) return $response; // 判断当前商品是否能够参与代客下单 $gids = array_keys($goods['goods']); $valet = ValetOrderGoods::getOne([ ['mall_id' => $params['mall_id']], ['goods_id' => $gids[0]], ['status' => StatusEnum::ENABLED], ], true, [], null, 'id'); if (!empty($valet)) { $response[ValetOrderEnum::ORDER_EXT_KEY][ValetOrderEnum::ORDER_IS_VALET_KEY] = StatusEnum::ENABLED; } } if (!empty($response[ValetOrderEnum::ORDER_EXT_KEY][ValetOrderEnum::ORDER_IS_VALET_KEY])) { // 需要验证码 $config = (new SettingService())->get($params['mall_id']); $response[ValetOrderEnum::ORDER_EXT_KEY][ValetOrderEnum::ORDER_VALET_SMS_CODE] = $config['is_enable_sms_code'] ?? StatusEnum::DISABLED; } // 是否需要校验短信验证码 return $response; } /** * 公共调用订单详情 * @param $params * @return mixed */ public function globalDetail($params) { // $params['order'] // 订单主体信息 // 判断是否为代客下单 $params['order'][ValetOrderEnum::ORDER_IS_VALET_KEY] = StatusEnum::DISABLED; if (!empty($params['order']['extra_info']) && $params['order']['marketing_type'] == ValetOrderEnum::ADDONS_NAME) { try { $ext = Json::decode($params['order']['extra_info']); if (!empty($ext[ValetOrderEnum::ORDER_EXT_KEY])) { // 需要取出下单人 $valetOrder = ValetOrder::getOne([ ['order_id' => $params['order']['id']], ['mall_id' => $params['order']['mall_id']] ], true, ['buyUser']); if (!empty($valetOrder['buyUser'])) { $config = (new SettingService())->get($params['mall_id']); $params['order'][ValetOrderEnum::ORDER_IS_VALET_KEY] = StatusEnum::ENABLED; $params['order'][ValetOrderEnum::ORDER_VALET_CAN_REFUND] = $config['is_enable_order_refund']; $params['order'][ValetOrderEnum::ORDER_VALET_BUYER_KEY] = $valetOrder['buyUser']; } } } catch (\Exception $e) {} } return $params['order']; } /** * 公共调用 - 订单列表 * @param $params * @return mixed */ public function globalList($params) { if (!empty($params['order'])) { foreach ($params['order'] as &$item) { $item[ValetOrderEnum::ORDER_IS_VALET_KEY] = StatusEnum::DISABLED; if (!empty($item['extra_info']) && $item['marketing_type'] == ValetOrderEnum::ADDONS_NAME) { try { $ext = Json::decode($item['extra_info']); if (!empty($ext[ValetOrderEnum::ORDER_EXT_KEY])) { // 需要取出下单人 $valetOrder = ValetOrder::getOne([ ['order_id' => $item['id']], ['mall_id' => $params['mall_id']] ], true, ['buyUser']); if (!empty($valetOrder['buyUser'])) { $item[ValetOrderEnum::ORDER_IS_VALET_KEY] = StatusEnum::ENABLED; $item[ValetOrderEnum::ORDER_VALET_BUYER_KEY] = $valetOrder['buyUser']; } } } catch (\Exception $e) {} } } } return $params['order']; } /** * 公共调用 - 总后台订单列表 * @param $params * @return mixed */ public function globalBackendLists($params) { foreach ($params['order'] as &$item) { $item[ValetOrderEnum::ORDER_IS_VALET_KEY] = StatusEnum::DISABLED; if (!empty($item['extra_info']) && $item['marketing_type'] == ValetOrderEnum::ADDONS_NAME) { try { $ext = Json::decode($item['extra_info']); if (!empty($ext[ValetOrderEnum::ORDER_EXT_KEY])) { // 需要取出下单人 $valetOrder = ValetOrder::getOne([ ['order_id' => $params['order']['id']], ['mall_id' => $params['order']['mall_id']] ], true, ['buyUser']); if (!empty($valetOrder['buyUser'])) { $item[ValetOrderEnum::ORDER_IS_VALET_KEY] = StatusEnum::ENABLED; $item[ValetOrderEnum::ORDER_VALET_BUYER_KEY] = $valetOrder['buyUser']; } } } catch (\Exception $e) {} } } return $params['order']; } /** * @param $order_id * @return bool */ public function refund($order_id) { $order = ValetOrder::getOne([['order_id' => $order_id]], true, [], null, 'id'); if (empty($order)) return false; return true; } /** * @param $order_id * @return bool */ public function getValetOrderByOrderId($order_id) { return ValetOrder::getOne([['order_id' => $order_id]], true, [], null); } /** * 营销减免,决定使用哪个用户 * * @param BaseOrderForm $form * * @return false|mixed|object */ public function orderMarketing(BaseOrderForm $form) { $settingService = new SettingService; $originUserId = $form->user_id; $originUser = $form->user; $form->process_extra_data['valet_order_origin_user_id'] = $originUserId; if (!empty($settingService->get($form->mall_id)['is_enable_other_identity_price'])) { // 输入了手机号并且用户存在 if ( !empty($form->attributes['data']['extra_info']['valet_order']['mobile']) && $valetOrderUser = User::getUser([ [ 'mall_id' => $form->mall_id, 'mobile' => $form->attributes['data']['extra_info']['valet_order']['mobile'], 'status' => StatusEnum::ENABLED ] ]) ) { $form->user_id = $valetOrderUser->id; $form->user = $valetOrderUser; } else { $form->user_id = $settingService->getValetOrderDefaultUser($form->mall_id); if (empty($form->user_id)) { throw new RuntimeException('系统异常'); } $form->user = User::getOne([['id' => $form->user_id, 'mall_id' => $form->mall_id]]); if (empty($form->user)) { throw new RuntimeException('系统异常'); } } } $orderMarketingLogic = new OrderMarketingLogicV2(); $form = $orderMarketingLogic->run($form); if ($form === false) { throw new RuntimeException($orderMarketingLogic->getError()); } $form->user_id = $originUserId; $form->user = $originUser; unset($form->process_extra_data['valet_order_origin_user_id']); return $form; } }