'用户ID', 'nickname' => '用户昵称', 'created_at' => '订单创建时间', 'order_no' => '订单编号', 'goods_name' => '商品名称', 'goods_price' => '价格', 'total_num' => '总数', 'self_pickup_num' => '自提', 'cloud_warehouse_num' => '云仓', 'pay_money' => '实际支付金额(元)', 'shipping_money' => '运费', 'from_user' => '补货上级', 'receiver_name' => '收货人', 'receiver_mobile' => '收货人手机号', 'address' => '收货地址', 'rand_fee' => '随机减金额(元)', 'payment_type' => '支付方式', ]; return $fields; } public function index($params) { $params['where'] = $this->getQueryWhere($params); $params['order'] = 'id desc'; $params['select'] = 'id,user_id,trade_id,address_id,pay_money,shipping_money,payment_type,created_at,address,receiver_name,receiver_mobile,order_no'; $params['with'] = [ 'detail' => function ($q) { $q->select('id,price_difference_order_id,self_pickup_num,cloud_warehouse_num,goods_price'); }, 'fillOrder' => function ($q) { $q->select('id,price_difference_order_id,price_difference_order_detail_id,order_no,goods_id') ->with(['goods' => function ($g) { $g->select('id,goods_name,cover_pic'); }]); }, 'user' => function ($q) { $q->select('id,nickname'); }, 'paymentTrade' => function ($q) { $q->select('id,rand_fee'); } ]; $pageData = CloudStockPriceDifferenceOrder::listPage($params, false); if (!empty($pageData['list'])) { $deduction_user_id_arr = []; $deduction_user_list = $this->getDeductionUserList($pageData, $deduction_user_id_arr); foreach ($pageData['list'] as &$item) { $item['rand_fee'] = $item['paymentTrade']['rand_fee'] ?? 0; $detail_list = array_column($item['detail'], null, 'id'); foreach ($item['fillOrder'] as &$val) { $val['from_user'] = []; $val['self_pickup_num'] = $val['cloud_warehouse_num'] = $val['goods_price'] = 0; if (isset($detail_list[$val['price_difference_order_detail_id']])) { $val['self_pickup_num'] = $detail_list[$val['price_difference_order_detail_id']]['self_pickup_num']; $val['cloud_warehouse_num'] = $detail_list[$val['price_difference_order_detail_id']]['cloud_warehouse_num']; $val['goods_price'] = $detail_list[$val['price_difference_order_detail_id']]['goods_price']; } if (!isset($deduction_user_id_arr[$val['id']])) { continue; } foreach ($deduction_user_id_arr[$val['id']] as $uid) { if (!isset($deduction_user_list[$uid])) { continue; } $val['from_user'][] = [ 'id' => $uid, 'nickname' => $deduction_user_list[$uid]['nickname'], 'mobile' => $deduction_user_list[$uid]['mobile'], 'avatar_url' => $deduction_user_list[$uid]['avatar_url'], ]; } } unset($item['detail']); unset($item['paymentTrade']); } } $pageData['export_list'] = $this->getExportFields(); $pageData['payment_type_list'] = PayTypeEnum::getMap(); return $pageData; } public function getQueryWhere($params) { $where = [ ['mall_id' => $this->mall_id], ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]], ['is_pay' => OrderStatusEnum::PAY], ]; if (!empty($params['keyword'])) { $keyword = trim($params['keyword']); $user_id_arr = User::find()->where(['or', ['id' => $keyword], ['like', 'nickname', $keyword], ['like', 'mobile', $keyword]]) ->select('id')->column(); $where[] = ['user_id' => $user_id_arr]; } if (!empty($params['goods_name'])) { $goods_name = trim($params['goods_name']); $goods_ids = Goods::find()->where(['and', ['mall_id' => $this->mall_id], ['like', 'goods_name', $goods_name]]) ->select('id')->column(); $price_difference_order_ids = CloudStockPriceDifferenceOrderDetail::find()->where(['goods_id' => $goods_ids])->select('price_difference_order_id')->column(); $where[] = ['id' => $price_difference_order_ids]; } if (!empty($params['start'])) { $where[] = ['>=', 'created_at', strtotime($params['start'])]; } if (!empty($params['end'])) { $where[] = ['<=', 'created_at', strtotime($params['end'])]; } if (!empty($params['payment_type'])) { $where[] = ['payment_type' => $params['payment_type']]; } if (!empty($params['order_no'])) { $order_no = trim($params['order_no']); $price_difference_order_id = CloudStockFillOrder::find()->where(['and', ['mall_id' => $this->mall_id], ['like', 'order_no', $order_no]]) ->select('price_difference_order_id')->column(); $where[] = ['id' => $price_difference_order_id]; } return $where; } public function getDeductionUserList($pageData, &$deduction_user_id_arr) { $fill_order_id_arr = []; foreach ($pageData['list'] as $item) { $item['rand_fee'] = $item['paymentTrade']['rand_fee'] ?? 0; foreach ($item['fillOrder'] as $val) { $fill_order_id_arr[] = $val['id']; } } $deduction_list = CloudStockDeductionDetail::lists([ 'where' => [ ['order_id' => $fill_order_id_arr], ['order_type' => CloudStockEnum::STOCK_ORDER_TYPE_REPLENISH], ['changes_type' => [CloudStockEnum::STOCK_CHANGE_TYPE200, CloudStockEnum::STOCK_CHANGE_TYPE202,]], ], 'select' => 'user_id,order_id', ] ); $deduction_user_ids = array_column($deduction_list, 'user_id'); foreach ($deduction_list as $val) { $deduction_user_id_arr[$val['order_id']][] = $val['user_id']; } $deduction_user_list = User::lists([ 'where' => [ ['id' => $deduction_user_ids] ], 'index' => 'id', 'select' => 'id,nickname,mobile,avatar_url', ] ); $deduction_user_list[0] = ['id' => 0, 'nickname' => '平台', 'mobile' => '', 'avatar_url' => '', ]; return $deduction_user_list; } public function addCart($params) { //传入的插件名和识别value $key = $this->getCacheKey($params['price_difference_gift_package_id']); $field = $this->getCacheField($params['type'], $params['goods_id']); if (empty($params['num'])) { $res = \Yii::$app->redis->hdel($key, $field); return true; } \Yii::$app->redis->hset($key, $field, json_encode($params)); \Yii::$app->redis->expire($key, self::$expire_time); return true; } public function delCart($params) { //传入的插件名和识别value foreach ($params['goods_id'] as $goods_id) { $key = $this->getCacheKey($params['price_difference_gift_package_id']); $field = $this->getCacheField(self::$self_pickup, $goods_id); \Yii::$app->redis->hdel($key, $field); $field = $this->getCacheField(self::$cloud_warehouse, $goods_id); \Yii::$app->redis->hdel($key, $field); } return true; } public function indexCart($params) { $cart_list = $this->getCartAll($params['price_difference_gift_package_id']); $goods_ids = array_keys($cart_list); $main_goods_list = Goods::lists(['where' => [['id' => $goods_ids]], 'index' => 'id', 'select' => 'id,goods_name,cover_pic,price']); $list = []; $package = CloudStockPriceDifferenceGiftPackage::findOne(['id' => $params['price_difference_gift_package_id']]); $goods_ids = explode(',', $package['goods_id']); $obj = new CloudStockPriceDifferenceGiftPackageService(['user_id' => $this->user_id, 'mall_id' => $this->mall_id]); foreach ($main_goods_list as $item) { if (!in_array($item['id'], $goods_ids)) { continue; } $price = $item['price']; $obj->getPrice($item['id'], $goods_ids, $price, $package['level']); $list[] = [ 'goods_id' => $item['id'], 'goods_name' => $item['goods_name'], 'price' => $price, 'cover_pic' => $item['cover_pic'], 'self_pickup_num' => $cart_list[$item['id']]['self_pickup'] ?? 0, 'cloud_warehouse_num' => $cart_list[$item['id']]['cloud_warehouse'] ?? 0, ]; } return ['list' => $list]; } public function getCacheKey($price_difference_gift_package_id) { return self::$key . ':' . $this->user_id . ':' . $price_difference_gift_package_id; } public function getCacheField($type, $goods_id) { return self::$field . $type . ':' . $goods_id; } public function orderPreview($params) { try { //传入的插件名和识别value $cart_list = $this->getCartAll($params['price_difference_gift_package_id']); if (empty($params['goods_ids'])) { throw new \Exception('请选择商品'); } if (empty($cart_list)) { throw new \Exception('购物车为空'); } $package = CloudStockPriceDifferenceGiftPackage::find()->where(['id' => $params['price_difference_gift_package_id']])->one();//所选的价差礼包 if (empty($package)) { throw new \Exception('价差礼包不存在'); } $cloud_stock_agent_level = 0; $cloud_stock_agent = CloudStockAgent::findOne(['mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'status' => StatusEnum::ENABLED]); $goods_ids = array_keys($cart_list); $goods_ids = array_intersect($goods_ids, $params['goods_ids']); $main_goods_list = Goods::lists(['where' => [['id' => $goods_ids]], 'with' => ['attr'], 'index' => 'id', 'select' => 'id,goods_name,cover_pic,price']); if (!empty($cloud_stock_agent)) { $cloud_stock_agent_level = $cloud_stock_agent['level']; } $list = []; $is_show_address = 0; $pay_money = 0; $freight_attr = []; $obj = new CloudStockPriceDifferenceGiftPackageService(['user_id' => $this->user_id, 'mall_id' => $this->mall_id]); foreach ($main_goods_list as $item) { $price = $item['price']; $obj->getPrice($item['id'], $goods_ids, $price, $package['level']); $self_pickup_num = $cloud_warehouse_num = 0; if (isset($cart_list[$item['id']])) { $self_pickup_num = $cart_list[$item['id']][self::$self_pickup]; $cloud_warehouse_num = $cart_list[$item['id']][self::$cloud_warehouse]; } if ($self_pickup_num > 0) { $is_show_address = 1; $freight_attr[] = [ 'attr_id' => $item['attr'][0]['id'], 'num' => $self_pickup_num, ]; } $list[] = [ 'goods_id' => $item['id'], 'goods_name' => $item['goods_name'], 'price' => $price, 'cover_pic' => $item['cover_pic'], 'self_pickup_num' => $self_pickup_num, 'cloud_warehouse_num' => $cloud_warehouse_num, ]; $pay_money += $price * ($self_pickup_num + $cloud_warehouse_num); } $this->check($cloud_stock_agent_level, $package, $pay_money); $shipping_fee = 0; $address_info = []; if (!empty($freight_attr)) { $form = $this->getShippingFee($params, $freight_attr);//获取运费 $shipping_fee = $form['marketing']['deduct']['shipping_fee']['money'] ?? 0; $address_info = UserAddress::getUserAddress($this->user_id, $params['address_id'] ?? 0); } return ['list' => $list, 'address_info' => $address_info, 'is_show_address' => $is_show_address, 'shipping_fee' => $shipping_fee, 'pay_money' => bcadd($pay_money, $shipping_fee, 2)]; } catch (Exception $e) { throw new Exception($e->getMessage()); } } /** * 获取价差 * 购买时判断当前等级礼包与所选购礼包的金额价差,满足则可下单成功升级 * ②若当前等级无设置礼包则往上找最近有设置礼包的等级取差价 * ④若是普通用户不是代理商等级则取选购的礼包金额 * @param $level * @param $package_price * @return string */ public function priceDiff($level, $package_price) { $price_diff = $package_price; if ($level == 0) { return $price_diff; } $package_current = CloudStockPriceDifferenceGiftPackage::find()->where([ 'mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, ])->andWhere(['>=', 'level', $level])->orderBy('level asc')->one(); if (!empty($package_current)) { $price_diff = bcsub($price_diff, $package_current['price'], 2); } return $price_diff; } public function orderCreate($params) { $t = Yii::$app->db->beginTransaction(); try { //传入的插件名和识别value if (empty($params['goods_ids'])) { throw new \Exception('请选择商品'); } $cart_list = $this->getCartAll($params['price_difference_gift_package_id']); if (empty($cart_list)) { throw new \Exception('购物车为空'); } $package = CloudStockPriceDifferenceGiftPackage::find()->where(['id' => $params['price_difference_gift_package_id']])->one(); if (empty($package)) { throw new \Exception('礼包不存在'); } $cloud_stock_agent = CloudStockAgent::findOne(['mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'status' => StatusEnum::ENABLED]); $goods_ids = array_keys($cart_list); $goods_ids = array_intersect($goods_ids, $params['goods_ids']); $main_goods_list = Goods::lists(['where' => [['id' => $goods_ids]], 'with' => ['attr'], 'index' => 'id', 'select' => 'id,goods_name,cover_pic,price']); $obj = new CloudStockPriceDifferenceGiftPackageService(['user_id' => $this->user_id, 'mall_id' => $this->mall_id]); $list = []; $pay_money = 0; $freight_attr = []; foreach ($main_goods_list as $item) { $price = $item['price']; $self_pickup_num = $cloud_warehouse_num = 0; $obj->getPrice($item['id'], $goods_ids, $price, $package['level']); if (isset($cart_list[$item['id']])) { $self_pickup_num = $cart_list[$item['id']][self::$self_pickup] ?? 0; $cloud_warehouse_num = $cart_list[$item['id']][self::$cloud_warehouse] ?? 0; } if ($self_pickup_num > 0) { $freight_attr[] = [ 'attr_id' => $item['attr'][0]['id'], 'num' => $self_pickup_num, ]; } $goods_price = $price * ($self_pickup_num + $cloud_warehouse_num); $list[] = [ 'goods_id' => $item['id'], 'goods_name' => $item['goods_name'], 'price' => $price, 'goods_price' => $goods_price, 'cover_pic' => $item['cover_pic'], 'self_pickup_num' => $self_pickup_num, 'cloud_warehouse_num' => $cloud_warehouse_num, ]; $pay_money += $goods_price; } $cloud_stock_agent_level = 0; if (!empty($cloud_stock_agent)) { $cloud_stock_agent_level = $cloud_stock_agent['level']; } $this->check($cloud_stock_agent_level, $package, $pay_money); if (!empty($params['address_id'])) { $user_address = UserAddress::findOne(['id' => $params['address_id'], 'user_id' => $this->user_id]); if (empty($user_address)) { throw new \Exception('地址不存在'); } $params['address'] = $user_address['province'] . $user_address['city'] . $user_address['district'] . $user_address['town'] . $user_address['detail']; } $shipping_money = 0; if (!empty($freight_attr)) { $form = $this->getShippingFee($params, $freight_attr);//获取运费 $shipping_money = $form['marketing']['deduct']['shipping_fee']['money'] ?? 0; } $pay_money = bcadd($pay_money, $shipping_money, 2); if ($pay_money == 0) { throw new \Exception('订单金额不能为0'); } $params['shipping_money'] = $shipping_money; $params['pay_money'] = $pay_money; if (empty($params['address_id'])) { $params['address_id'] = 0; } if (empty($params['remark'])) { $params['remark'] = ''; } else { $params['remark'] = (string)$params['remark']; } $params['receiver_mobile'] = (string)$params['receiver_mobile']; $order = $this->createOrder($params); $goods_name = ''; foreach ($list as $k => $item) { if ($k == 0) { $goods_name = $item['goods_name']; } $add['price_difference_order_id'] = $order['id']; $add['goods_id'] = $item['goods_id']; $add['goods_price'] = $item['goods_price']; $add['self_pickup_num'] = $item['self_pickup_num']; $add['cloud_warehouse_num'] = $item['cloud_warehouse_num']; $this->createOrderDetail($add); } $order_trade_info[] = [ 'order_id' => $order->id, 'order_type' => 'price_diff_order', 'order_no' => $order->order_no, 'amount' => $pay_money, 'title' => $goods_name, 'notify_class' => 'addons\CloudStock\common\logic\notify\CloudStockPriceDifferenceGiftPackageNotify', ]; $res = \Yii::$app->services->pay->createTrade($this->mall_id, $this->user_id, $order_trade_info); if ($res == false) throw new \Exception('生成支付流水失败'); $arr['transaction'] = $res; $t->commit(); return $arr; } catch (Exception $e) { $t->rollBack(); throw new \Exception($e->getMessage()); } } public function getCartAll($price_difference_gift_package_id) { $key = $this->getCacheKey($price_difference_gift_package_id); $data = \Yii::$app->redis->hgetall($key); $list = []; foreach ($data as $item) { $item = json_decode($item, true); if (is_array($item)) { $list[$item['goods_id']][$item['type']] = $item['num']; } } return $list; } public function getCloudStockGoodsList($goods_ids) { $cloud_stock_goods_list = CloudStockGoods::lists([ 'where' => [ ['goods_id' => $goods_ids], ['status' => StatusEnum::ENABLED] ], 'index' => 'goods_id', 'select' => 'goods_id,agent_price' ]); foreach ($cloud_stock_goods_list as &$val) { $agent_price = json_decode($val['agent_price'], true); $val['agent_price'] = array_column($agent_price, null, 'level'); } return $cloud_stock_goods_list; } public function check($cloud_stock_agent_level, $package, $pay_money) { $price_diff = $this->priceDiff($cloud_stock_agent_level, $package['price']); if ($pay_money < $price_diff) { throw new Exception('支付金额不能小于' . $price_diff); } } /** * 获取运费 * @param $params * @param $freight_attr * @return bool|int|object * @throws \Exception */ public function getShippingFee($params, $freight_attr) { if (empty($params['address_id'])) { return 0; } $orderFormLogic = new OrderFormLogic(); $form = $orderFormLogic->getDefaultform($this->mall_id, $this->user_id); $form->attributes = [ 'type' => PreviewTypeEnum::FREIGHT, 'data' => [ 'shipping_type' => \common\enums\ShippingTypeEnum::LOGISTICS, 'freight_attr' => $freight_attr, 'address_id' => $params['address_id'] ] ]; $form['action'] = AppEnum::ACTION_CREATE; $orderInitDataLogic = new OrderInitDataLogic(); $form = $orderInitDataLogic->execute($form, $form->type); if (empty($form['group_order_goods'])) { throw new \Exception('没有商品'); } $group_order_goods = $form['group_order_goods']; $extra = []; foreach ($group_order_goods as &$item) { /** @var BaseMarketing $class */ $item = FreeShippingMarketing::compute($item, $form, $extra); if ($item === false) throw new \Exception(FreeShippingMarketing::getStaticError()); } return $form; } public function createOrder($params) { $params['user_id'] = $this->user_id; $params['mall_id'] = $this->mall_id; $model = new CloudStockPriceDifferenceOrder(); $model->loadDefaultValues(); $model->load($params, ''); $model->is_pay = OrderStatusEnum::NOT_PAY; $model->order_no = StringHelper::generateOrderNo('pdgp'); $res = $model->save(); if ($res == false) { throw new \Exception($model->getErrorMessage()); } return $model; } public function createOrderDetail($params) { $params['user_id'] = $this->user_id; $params['mall_id'] = $this->mall_id; $model = new CloudStockPriceDifferenceOrderDetail(); $model->loadDefaultValues(); $model->load($params, ''); $model->save(); return $model; } public function pay($order_no, $payment_type, $out_trade_no = '') { try { $model = CloudStockPriceDifferenceOrder::findOne(['order_no' => $order_no]); if (empty($model)) throw new \Exception('订单不存在或已删除'); if ($model->is_pay != OrderStatusEnum::NOT_PAY) throw new Exception('订单已经被处理,无法进行支付'); if ($model->is_pay == StatusEnum::ENABLED) throw new Exception('订单已支付,请不要重复支付'); $model->is_pay = OrderStatusEnum::PAY; $model->payment_type = $payment_type; $model->pay_time = time(); $model->trade_no = $out_trade_no ?? ''; $res = $model->save(); if ($res === false) throw new Exception('修改订单失败:' . $model->getErrorMessage()); $event = new PriceDifferenceOrderPaidEvent($model['mall_id']); $order['id'] = $model['id']; Yii::$app->services->events->dispatch($event, $order, $event->listeners); return $model; } catch (Exception $e) { if (isset($trans)) $trans->rollback(); self::$static_error = $e->getMessage(); return false; } } public function createFillOrder($data) { $order_no = StringHelper::generateOrderNo('CSF'); $params = [ 'user_id' => $data['user_id'], 'trade_id' => $data['trade_id'], 'pay_money' => $data['goods_price'], 'order_no' => $order_no, 'trade_no' => $data['trade_no'], 'is_pay' => CloudStockEnum::FILL_STATUS_PAY, 'goods_id' => $data['goods_id'], 'price_difference_order_id' => $data['price_difference_order_id'], 'price_difference_order_detail_id' => $data['price_difference_order_detail_id'], 'num' => $data['self_pickup_num'] + $data['cloud_warehouse_num'], ]; $res_fill_order = CloudStockFillOrder::setData($data['mall_id'], $params); // 触发云库存订单支付事件 $event = new FillOrderPaidEvent($data['mall_id']); $data = ['id' => $res_fill_order['id']]; \Yii::$app->services->events->dispatch($event, $data, $event->listeners); return $res_fill_order; } public function createOrderPick($data) { $data['order_type'] = 2; $res = CloudStockAgentOrder::pickOffline($data['mall_id'], $data); if (false === $res) { throw new \Exception('提货失败:' . CloudStockAgentOrder::getStaticError()); } } /** * @param $fill_order * @param $package * @return array|true * @throws Exception推荐奖励 */ public function recommendReward($fill_order, $package) { if (empty($package)) { return []; } $recommend_reward_setting = json_decode($package['recommend_reward'], true); if (empty($recommend_reward_setting)) { return []; } $recommend_reward_setting = array_column($recommend_reward_setting, null, 'level'); $user_id = $fill_order['user_id']; $mall_id = $fill_order['mall_id']; $parent_id_arr = UserPartitionRelationship::getParentIdArr($user_id); $parent_id_arr = array_reverse($parent_id_arr); $where = ['user_id' => $parent_id_arr, 'mall_id' => $mall_id, 'status' => StatusEnum::ENABLED]; $cloud_agent_list = CloudStockAgent::find()->where($where)->indexBy('user_id')->all(); $agent_list = []; foreach ($parent_id_arr as $parent_id) { if (!empty($cloud_agent_list[$parent_id])) $agent_list[] = $cloud_agent_list[$parent_id];//按照关系排序 } $log_total_price = 0; $insert_wallet = []; $new_agent_list = []; $current_agent_level = 0; foreach ($agent_list as $key => $agent) { if ($agent['level'] > $current_agent_level) { $new_agent_list[$key] = $agent; $current_agent_level = $agent['level']; } } $is_range = 1;//走极差 if (isset($package['is_range']) && $package['is_range'] == 0) { $is_range = 0; //不走极差,只给最近代理发放奖励 } if ($is_range == 0) { $new_agent_list = $agent_list; } foreach ($new_agent_list as $k => $agent) { if ($is_range == 0 && $k > 0) { break; } if (!isset($recommend_reward_setting[$agent['level']])) { continue; } $recommend_reward = $recommend_reward_setting[$agent['level']]['reward_fee'] * $fill_order['pay_money'] / 100; if ($recommend_reward > 0) { $recommend_reward -= $log_total_price; } $log_total_price += $recommend_reward; $this->packData($mall_id, $fill_order['id'], $fill_order['order_no'], $agent['user_id'], $fill_order['user_id'], $recommend_reward, $fill_order['pay_money'], $insert_wallet); } return $insert_wallet; } public function packData($mall_id, $order_id, $order_no, $user_id, $buy_user_id, $price, $pay_money, &$insert_wallet) { if ($price > 0) { $prize_name = '推荐奖励'; $desc = '用户(' . $user_id . '),获得订单(' . $order_no . ')收入,类型:' . $prize_name . ',金额:' . $price; $insert_wallet [] = ['mall_id' => $mall_id, 'user_id' => $user_id, 'is_frozen' => false, 'wallet_type' => 'commission', 'money' => $price, 'desc' => $desc, 'source_table' => CloudStockFillOrder::tableName(), 'source_table_id' => $order_id, 'from_type' => 'CloudStock', 'capital_type' => 'recommend_reward', 'order_no' => $order_no, 'contributor_name' => '', 'contributor_id' => $buy_user_id, 'contributor_money' => $pay_money, ]; } } public function export(array $data) { $download_id = $data['download_id'] ?? 0; $download = Download::findOne(['id' => $download_id]); if ($download) { $this->mall_id = $data['mall_id'] ?? $download->mall_id; try { $params = json_decode($download->params, true); $filename = $download->name; $type = $download->type; $params['where'] = $this->getQueryWhere($params); $params['order'] = 'id desc'; $params['select'] = 'id,user_id,trade_id,address_id,pay_money,shipping_money,payment_type,created_at,address,receiver_name,receiver_mobile'; $params['with'] = [ 'detail' => function ($q) { $q->select('id,price_difference_order_id,self_pickup_num,cloud_warehouse_num,goods_price'); }, 'fillOrder' => function ($q) { $q->select('id,price_difference_order_id,price_difference_order_detail_id,order_no,goods_id') ->with(['goods' => function ($g) { $g->select('id,goods_name,cover_pic'); }]); }, 'user' => function ($q) { $q->select('id,nickname'); }, 'paymentTrade' => function ($q) { $q->select('id,rand_fee'); } ]; $list = CloudStockPriceDifferenceOrder::lists($params, true); $payment_type_list = PayTypeEnum::getMap(); $deduction_user_id_arr = []; $deduction_user_list = $this->getDeductionUserList(['list' => $list], $deduction_user_id_arr); $fields = $params['fields']; $fields_arr = $this->getExportFields(); $have_select_field_arr = []; foreach ($fields as $value) { if (isset($fields_arr[$value])) $have_select_field_arr[] = $fields_arr[$value]; } $csv = new CsvTool(); $csv->filename = $filename; $csv->file_dirname = DownloadEnum::getTypeStorageDirMap($type); $csv->export_mode = CsvTool::EXPORT_MODE_ASYNC; $csv->header = $have_select_field_arr; $rows = []; foreach ($list as $order) { $detail_list = array_column($order['detail'], null, 'id'); foreach ($order['fillOrder'] as $item) { $row = []; foreach ($fields as $field) { switch (true) { case ($field == 'nickname'): $row[] = $order['user'][$field] ?? ''; break; case ($field == 'created_at'): $row[] = !empty($order[$field]) ? date('Y-m-d H:i:s', $order[$field]) : ''; break; case ($field == 'order_no'): $row[] = $item[$field] ?? ''; break; case ($field == 'rand_fee'): $row[] = $order['paymentTrade'][$field] ?? ''; break; case ($field == 'goods_name'): $row[] = $item['goods']['goods_name'] ?? ''; break; case ($field == 'goods_price'): $row[] = $detail_list[$item['price_difference_order_detail_id']]['goods_price'] ?? ''; break; case ($field == 'total_num'): $self_pickup_num = $detail_list[$item['price_difference_order_detail_id']]['self_pickup_num'] ?? ''; $cloud_warehouse_num = $detail_list[$item['price_difference_order_detail_id']]['cloud_warehouse_num'] ?? 0; $total_num = $self_pickup_num + $cloud_warehouse_num; $row[] = !empty($total_num) ? $total_num : ''; break; case ($field == 'self_pickup_num'): $row[] = $detail_list[$item['price_difference_order_detail_id']]['self_pickup_num'] ?? ''; break; case ($field == 'cloud_warehouse_num'): $row[] = $detail_list[$item['price_difference_order_detail_id']]['cloud_warehouse_num'] ?? ''; break; case (in_array($field, ['user_id', 'shipping_money', 'pay_money', 'receiver_name', 'receiver_mobile', 'address'])): $row[] = $order[$field] ?? ''; break; case ($field == 'payment_type'): $row[] = $payment_type_list[$order[$field]] ?? ''; break; case ($field == 'from_user'): // 得到补货上级 $fromUser = []; if (isset($deduction_user_id_arr[$item['id']])) { $deductionUserIds = array_unique($deduction_user_id_arr[$item['id']]); foreach ($deductionUserIds as $uid) { if (!isset($deduction_user_list[$uid])) { continue; } $fromUser[] = sprintf( '补货用户ID:"%s" 补货用户昵称:"%s"', $uid, $deduction_user_list[$uid]['nickname'] ); } } $row[] = implode(' ,', $fromUser); break; } } $rows[] = $row; } } $csv->data = $rows; $csv->export(); $csv->updateDown($download, $params['mall_id']); } catch (\Exception $e) { $download->status = 3; $res = $download->save(); var_dump($e->getMessage() . $e->getFile() . $e->getLine()); self::setStaticError($e->getMessage()); return $e->getMessage(); } } } public function exportOrder(array $data) { $this->export($data); } }