request->isGet) { return $this->error('请求方式错误'); } $page = \Yii::$app->request->get('page', 1); $limit = \Yii::$app->request->get('limit', $this->pageSize); $wheres[] = ['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED]; $get = \Yii::$app->request->get(); if(!empty($get['type']) && $get['type']==2){ //升级礼包商品 $wheres[] = ['goods_id' => CloudStockUpgradeBag::getGoodsIds($this->mall_id)]; } else { $configs = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_CLOUD_STOCK, 'basic'); if (!empty($configs['is_show_cloud_stock_partition'])) { $wheres[] = ['not in', 'goods_id', CloudStockUpgradeBag::getGoodsIds($this->mall_id)]; } } $params = [ 'select' => 'id,mall_id,goods_id,agent_price,created_at,agent_price,sort,min_replenish,restrict_permissions', 'where' => $wheres, 'order' => 'sort asc,created_at desc', 'page' => 1, 'limit' => 1000, ]; $list = CloudStockGoods::listPage($params); if (empty($list['list'])) { if (!is_array($list['list'])) return $this->error(CloudStockAgentGoods::getStaticError()); } $cloud_stock_agent = CloudStockAgent::find()->where(['user_id'=>$this->user_id,'status'=>StatusEnum::ENABLED,'mall_id'=>$this->mall_id])->one(); $good_ids = array_column($list['list'], 'goods_id'); $agent_goods = CloudStockAgentGoods::find() ->select('user_id,goods_id,num as agent_stock') ->where(['mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'status' => StatusEnum::ENABLED, 'goods_id' => $good_ids]) ->asArray() ->indexBy('goods_id') ->all(); $mall_goods = Goods::find() ->select('id,goods_name,price,cover_pic') ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'id' => $good_ids, 'is_on_sale' => 1, 'is_attr' => 0]) ->asArray() ->indexBy('id') ->all(); $goodsWeight = GoodsAttr::find() ->select('weight') ->where(['status' => StatusEnum::ENABLED, 'goods_id' => $good_ids]) ->asArray() ->indexBy('goods_id') ->column(); // dd($list['list'], $mall_goods); $limit_data = RestrictPurchases::getLimitData($this->mall_id,$this->user_id,$good_ids); $cloud_stock_agent_guota_list = \addons\CloudStock\common\models\CloudStockAgentGuota::find() ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'goods_id' => $good_ids,'user_id'=>$this->user_id]) ->indexBy('goods_id') ->all(); foreach ($list['list'] as $index => &$lv) { if (!empty($mall_goods[$lv['goods_id']])) { $mall_good = $mall_goods[$lv['goods_id']]; } else { unset($list['list'][$index]); continue; } $restrict_permissions = json_decode($lv['restrict_permissions'],true); if(empty($restrict_permissions)){ $restrict_permissions = []; } if(in_array($cloud_stock_agent['level'],$restrict_permissions) && isset($list['list'][$index])){ unset($list['list'][$index]); continue; } // 当前会员是否可以补货当前商品 $rr = CloudStockGoods::canFillGood($this->mall_id, $lv['goods_id'], $this->stock_agent->level, $this->user_id); if (false === $rr) { unset($list['list'][$index]); continue; } $price = $mall_good['price'] ?? 0; $agent_price = json_decode($lv['agent_price'],true); $agent_price = array_column($agent_price,null,'level'); $replenish_price = 0; if(!empty($agent_price[$this->stock_agent->level])){ $replenish_price = $agent_price[$this->stock_agent->level]['price']; } // 如果补货价格为0,前端不显示,不可以补货 if ($replenish_price <= 0) { unset($list['list'][$index]); continue; } $lv['replenish_price'] = $replenish_price; $lv['goods_name'] = $mall_good['goods_name'] ?? ''; $lv['cover_pic'] = $mall_good['cover_pic'] ?? ''; // 平台价格,零售价 $lv['pirce'] = $price; $lv['profit'] = bcsub($price, $replenish_price, 2); $lv['user_id'] = $this->user_id; if (!empty($agent_goods[$lv['goods_id']])) { $lv = array_merge($lv, $agent_goods[$lv['goods_id']]); } $lv['is_mine'] = 0; $lv['agent_stock'] = 0; if (isset($agent_goods[$lv['goods_id']])) { $lv['agent_stock'] = $agent_goods[$lv['goods_id']]['agent_stock']; if ($lv['agent_stock'] > 0) $lv['is_mine'] = 1; } unset($lv['agent_price']); //todo $lv['month_quota'] = null; $lv['remaining_quantity'] = null; $lv['pre_sale_quantity'] = null; if(isset($limit_data[$lv['goods_id']])){ $lv['month_quota'] = $limit_data[$lv['goods_id']]['month_quota']; $lv['remaining_quantity'] = $limit_data[$lv['goods_id']]['remaining_quantity']; } if(isset($cloud_stock_agent_guota_list[$lv['goods_id']])){ $lv['pre_sale_quantity'] = $cloud_stock_agent_guota_list[$lv['goods_id']]['pre_sale_quantity']; } $lv['weight'] = bcdiv($goodsWeight[$lv['goods_id']] ?? 0, 1000, 3); // 转为kg } $list['count'] = count($list['list']); $list['list'] = array_values($list['list']); $cloudStockGoodsList = CloudStockGoods::lists(['where'=>[['mall_id'=>$this->mall_id],['status'=>StatusEnum::ENABLED]]]); $goods_ids = array_column($cloudStockGoodsList,'goods_id'); $total_num = CloudStockAgentGoods::find()->where(['mall_id' => $this->mall_id, 'user_id' => $this->user_id,'goods_id'=>$goods_ids, 'status' => StatusEnum::ENABLED])->sum('num'); $all_stock = $total_num??0; $is_stock_assignment = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_CLOUD_STOCK, 'basic')['is_stock_assignment'] ?? 1; return $this->success('success', compact('list', 'all_stock', 'is_stock_assignment')); } /** * @name: * @msg: 库存明细 * @param {integer} $goods_id 商品id * @param {string} $date 搜索日期 * @param {string} $record_type 搜索的记录类型,add:库存增加明细;sub:库存减少明细 * @return {*} */ public function actionStockDetails() { if (!\Yii::$app->request->isGet) { return $this->error('请求方式错误'); } $page = \Yii::$app->request->get('page', 1); $limit = \Yii::$app->request->get('limit', $this->pageSize); $goods_id = \Yii::$app->request->get('goods_id'); $date = \Yii::$app->request->get('date'); // 记录类型,add:库存增加;sub:库存减少 $record_type = \Yii::$app->request->get('record_type'); if (empty($record_type) || !in_array($record_type, ['add', 'sub'])) return $this->error('参数错误'); $wheres[] = ['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED]; if (!empty($good_ids)) { $wheres[] = ['goods_id' => $goods_id]; $goods = Goods::find() ->select('id,goods_name,price,cover_pic') ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'id' => $good_ids, 'is_on_sale' => 1, 'is_attr' => 0]) ->asArray() ->indexBy('id') ->all(); } if (!empty($date)) { $start_time = strtotime($date . ' 00:00:00'); $end_time = strtotime($date . ' 23:59:59'); $wheres[] = ['and', ['>=', 'created_at', $start_time], ['<=', 'created_at', $end_time]]; } if ('add' == $record_type) { $details = CloudStockIncreaseDetail::find() ->select('stock_log_id,num') ->where(['user_id' => $this->user_id, 'status' => StatusEnum::ENABLED]) ->asArray() ->indexBy('stock_log_id') ->all(); $log_ids = array_column($details, 'stock_log_id'); } else { $details = CloudStockDeductionDetail::find() ->select('stock_log_id,num') ->where(['user_id' => $this->user_id, 'status' => StatusEnum::ENABLED]) ->asArray() ->indexBy('stock_log_id') ->all(); $log_ids = array_column($details, 'stock_log_id'); } $wheres[] = ['id' => $log_ids]; $params = [ 'select' => 'id,mall_id,goods_id,changes_dir,order_id,order_type,changes_type,num,created_at', 'where' => $wheres, 'order' => 'created_at desc', 'page' => $page, 'limit' => $limit ]; $detail_list = CloudStockGoodsStockLog::listPage($params); if (empty($detail_list['list'])) { if (!is_array($detail_list['list'])) return $this->error(CloudStockAgentGoods::getStaticError()); return $this->success('success', $detail_list); } if (empty($goods)) { $good_ids = array_column($detail_list['list'], 'goods_id'); $goods = Goods::find() ->select('id,goods_name,price,cover_pic') ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'id' => $good_ids, 'is_on_sale' => 1, 'is_attr' => 0]) ->asArray() ->indexBy('id') ->all(); } foreach ($detail_list['list'] as &$list) { $good = $goods[$list['goods_id']] ?? []; $detail = $details[$list['id']] ?? []; $list['goods_name'] = $good['goods_name'] ?? ''; $list['cover_pic'] = $good['cover_pic'] ?? ''; $list['price'] = $good['price'] ?? 0; switch ($list['changes_type']) { // 上级补货数量 case CloudStockEnum::STOCK_CHANGE_TYPE100: if (!isset($list['replenish_num'])) $list['replenish_num'] = 0; $list['replenish_num'] += $detail['num'] ?? 0; break; // 上级配货数量 case CloudStockEnum::STOCK_CHANGE_TYPE101: if (!isset($list['prepare_num'])) $list['prepare_num'] = 0; $list['prepare_num'] += $detail['num'] ?? 0; break; // 退货退库存数量 case CloudStockEnum::STOCK_CHANGE_TYPE102: if (!isset($list['refund_num'])) $list['refund_num'] = 0; $list['refund_num'] += $detail['num'] ?? 0; break; // 系统添加数量 case CloudStockEnum::STOCK_CHANGE_TYPE103: if (!isset($list['sys_add_num'])) $list['sys_add_num'] = 0; $list['sys_add_num'] += $detail['num'] ?? 0; break; // 平台补货赠送数量 case CloudStockEnum::STOCK_CHANGE_TYPE104: if (!isset($list['platfrom_give_num'])) $list['platfrom_give_num'] = 0; $list['platfrom_give_num'] += $detail['num'] ?? 0; break; // 购买礼包赠送数量 case CloudStockEnum::STOCK_CHANGE_TYPE105: if (!isset($list['buy_gift_give_num'])) $list['buy_gift_give_num'] = 0; $list['buy_gift_give_num'] += $detail['num'] ?? 0; break; // 会员买货数量 case CloudStockEnum::STOCK_CHANGE_TYPE200: if (!isset($list['member_buy_num'])) $list['member_buy_num'] = 0; $list['member_buy_num'] += $detail['num'] ?? 0; break; // 给下级配货数量 case CloudStockEnum::STOCK_CHANGE_TYPE201: if (!isset($list['issue_num'])) $list['issue_num'] = 0; $list['issue_num'] += $detail['num'] ?? 0; break; // 下级向自己补货数量 case CloudStockEnum::STOCK_CHANGE_TYPE202: if (!isset($list['sub_user_replenish_num'])) $list['sub_user_replenish_num'] = 0; $list['sub_user_replenish_num'] += $detail['num'] ?? 0; break; // 自提货到线下数量 case CloudStockEnum::STOCK_CHANGE_TYPE203: if (!isset($list['pick_to_offline_num'])) $list['pick_to_offline_num'] = 0; $list['pick_to_offline_num'] += $detail['num'] ?? 0; break; // 系统扣减数量 case CloudStockEnum::STOCK_CHANGE_TYPE204: if (!isset($list['sys_sub_num'])) $list['sys_sub_num'] = 0; $list['sys_sub_num'] += $detail['num'] ?? 0; break; default: break; } } $user = ArrayHelper::toArray($this->stock_agent->user); $stock_change_type_map = CloudStockEnum::getStockChangeTypeMap(); $stock_change_dir_map = CloudStockEnum::getStockChangeDirMap(); return $this->success('success', compact('detail_list', 'user', 'stock_change_type_map', 'stock_change_dir_map')); } public function actionStockDetail() { if (!\Yii::$app->request->isGet) { return $this->error('请求方式错误'); } $page = \Yii::$app->request->get('page', 1); $limit = \Yii::$app->request->get('limit', $this->pageSize); $date = \Yii::$app->request->get('date'); $goods_id = \Yii::$app->request->get('goods_id'); // 记录类型,add:库存增加;sub:库存减少 $record_type = \Yii::$app->request->get('record_type'); if (empty($record_type) || !in_array($record_type, ['add', 'sub'])) return $this->error('参数错误'); $wheres[] = ['user_id' => $this->user_id]; $wheres[] = ['user_id' => $this->user_id]; if (!empty($date)) { $date = date($date . '-01'); } else { $date = date('Y-m-01'); } $start_time = strtotime($date); $end_time = strtotime($date . '+1 month -1 day 23:59:59'); $wheres[] = ['and', ['>=', 'created_at', $start_time], ['<=', 'created_at', $end_time]]; !empty($goods_id) && $wheres[] = ['goods_id' => $goods_id]; if ('add' == $record_type) { $params = [ 'where' => $wheres, 'order' => 'created_at desc', 'page' => $page, 'limit' => $limit ]; $detail_list = CloudStockIncreaseDetail::listPage($params); } else { $params = [ 'where' => $wheres, 'order' => 'created_at desc', 'page' => $page, 'limit' => $limit ]; $detail_list = CloudStockDeductionDetail::listPage($params); } if (!empty($detail_list['list'])) { $goods_id_arr = array_column($detail_list['list'], 'goods_id'); $goods_list = Goods::find() ->select('id,goods_name,price,cover_pic') ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'id' => $goods_id_arr]) ->asArray() ->indexBy('id') ->all(); foreach ($detail_list['list'] as &$item) { $item['goods_name'] = $item['cover_pic'] = ''; $item['price'] = 0; $item['changes_dir'] = 'add' == $record_type ? 1 : 2; if (isset($goods_list[$item['goods_id']])) { $item['goods_name'] = $goods_list[$item['goods_id']]['goods_name']; $item['cover_pic'] = $goods_list[$item['goods_id']]['cover_pic']; $item['price'] = $goods_list[$item['goods_id']]['price']; } } } $user = ArrayHelper::toArray($this->stock_agent->user); $stock_change_type_map = CloudStockEnum::getStockChangeTypeMap(); $stock_change_dir_map = CloudStockEnum::getStockChangeDirMap(); return $this->success('success', compact('detail_list', 'user', 'stock_change_type_map', 'stock_change_dir_map')); } /** * @name: * @msg: 给下级配货 * @param {*} * @return {*} */ public function actionIssueGive() { try { if (!\Yii::$app->request->isPost) { return $this->error('请求方式错误'); } $post = \Yii::$app->request->post(); $rules = [ [['goods_id', 'number', 'target_user_id'], 'required'], [['goods_id', 'number', 'target_user_id'], 'integer'], ]; $res = \Yii::$app->services->validate->validate($post, $rules); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $post['user_id'] = $this->user_id; $post['type'] = 1; $post['mall_id'] = $this->mall_id; $model = CloudStockDispenseOrder::addData($post); $res = CloudStockGoodsStockLog::stockHandle($this->mall_id, $post, CloudStockEnum::STOCK_CHANGE_TYPE201); if (false === $res) return $this->error(CloudStockGoodsStockLog::getStaticError()); $data = []; $event = new DispenseEvent($model['mall_id']); $data['id'] = $model['id']; \Yii::$app->services->events->dispatch($event, $data, $event->listeners); return $this->success('操作成功'); } catch (\Exception $e) { return $this->error($e->getMessage()); } } /** * @name: * @msg: 提货到线下 * @param {integer} $goods_id 商品id * @return {*} */ public function actionGoodDetail() { if (!\Yii::$app->request->isGet) { return $this->error('请求方式错误'); } $goods_id = \Yii::$app->request->get('goods_id'); if (empty($goods_id)) return $this->error('参数错误'); $good = Goods::find() ->select('id,mall_id,goods_name,cover_pic,price,stock') ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'id' => $goods_id, 'is_on_sale' => 1, 'is_attr' => 0]) ->limit(1) ->asArray() ->one(); $stock_good = CloudStockGoods::findOne(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'goods_id' => $goods_id]); if (empty($good)) return $this->error('商品数据异常'); $good['weight'] = bcdiv(GoodsAttr::find() ->where([ 'goods_id' => $goods_id, 'status' => StatusEnum::ENABLED, ]) ->select('weight') ->scalar() ?: 0, 1000, 3); $configs = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_CLOUD_STOCK, 'basic'); $unitArr = [1 => 'kg', 2 => '件']; $good['config'] = [ 'is_enable_order_num_limit' => $configs['is_enable_order_num_limit'] ?? 0, 'unit' => $configs['order_limit_type'] ?? 2, 'limit_num' => $configs['order_limit_num'] ?? 0, ]; $good['config']['unit_text'] = $unitArr[$good['config']['unit']] ?? '-'; $agent_price = json_decode($stock_good['agent_price'],true); $agent_price = array_column($agent_price,null,'level'); $replenish_price = 0; $replenish_price_list = []; if(!empty($agent_price[$this->stock_agent->level])){ $replenish_price = $agent_price[$this->stock_agent->level]['price']; $replenish_price_list = $agent_price[$this->stock_agent->level]['price_list']; } $all_stocks = CloudStockGoods::allPerantAgentGoodStocks($goods_id, $this->user_id, $this->mall_id); if (false === $all_stocks) { return $this->error(CloudStockGoods::getStaticError()); } $good['replenish_price'] = $replenish_price; $good['profit'] = bcsub($good['price'], $replenish_price, 2); $good['pick_number_limit'] = $all_stocks; $good['is_allow_fill'] = $stock_good->is_allow_fill; $good['remind_text'] = ''; $cloud_stock_level = CloudStockLevel::findOne(['mall_id'=>$this->mall_id,'status'=>StatusEnum::ENABLED,'level'=>$this->stock_agent->level]); if(!empty($cloud_stock_level) && !empty($cloud_stock_level['is_open_fill_min_once'])){ $good['remind_text'] = '一次性提货最低需提'.$cloud_stock_level['fill_min_once'].'件,最高可提'.$cloud_stock_level['fill_max_once'].'件'; } $good['is_take_by_range'] = $stock_good['is_take_by_range']; $good['replenish_price_list'] = $replenish_price_list; // 获取设置 $configs = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_CLOUD_STOCK, 'basic'); $good['is_enable_rand_fee'] = $configs['is_enable_rand_fee'] ?? 0; $good['condition'] = json_decode($configs['rand_condition'],true); $good['is_enable_freight_charges'] = $configs['is_enable_freight_charges'] ?? 0; $good['min_replenish'] = $stock_good['min_replenish']; $good['give_text'] = ''; if(isset($stock_good['is_buhuo']) && $stock_good['is_buhuo'] == 1){ $coupon = CouponSetting::getGiveCoupon($this->mall_id,[['goods_id'=>$good['id'],'num'=>0]],$this->stock_agent->level); if(empty($coupon) == false){ $good['give_text'] = '当前商品一次性补货每满'.$coupon[$good['id']]['rule_num'].'件('.$coupon[$good['id']]['rule_num'].'的整数倍),可获得'; $coupon_text = []; foreach ($coupon[$good['id']]['coupon_arr'] as $arr){ $coupon_text[] = $arr['num'].'张“'.$arr['name'].'”'; } $good['give_text'] .= implode('、',$coupon_text).'优惠券'; } } return $this->success('success', $good); } /** * @name: * @msg: 提货到线下 * @param {integer} addr_id 地址 id * @param {integer} goods_id 商品 id * @param {integer} number 提货数量 * @param {string} password 交易密码 * @return {*} */ public function actionPickOffline() { if (!\Yii::$app->request->isPost) { return $this->error('请求方式错误'); } $post = \Yii::$app->request->post(); $rules = [ [['addr_id'], 'required'], [['addr_id', 'goods_id', 'number'], 'integer'], [['password','remark'], 'string'], [['pay_money'], 'number'], ]; $res = \Yii::$app->services->validate->validate($post, $rules); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $balance_pay_setting = json_decode(\Yii::$app->services->setting->mall->get($this->mall_id, 'pay.balance'), 'true'); if (!empty($balance_pay_setting['pay_password_status'])) { $user = User::findOne(['id' => $this->user_id]); if (empty($user->transaction_password)) { return $this->error('您未设置支付密码'); } if (empty($post['password'])) { return $this->error('请输入交易密码'); } if (!\Yii::$app->security->validatePassword(trim($post['password']), $user->transaction_password)) { return $this->error('支付密码错误'); } } $post['user_id'] = $this->user_id; $post['mall_id'] = $this->mall_id; $post['stock_agent'] = $this->stock_agent; // dd($post); // 提货到线下 $res = CloudStockAgentOrder::pickOffline($this->mall_id, $post); if (false === $res) return $this->error('提货失败:' . CloudStockAgentOrder::getStaticError()); //生成运费订单流水 if($res->send_status == CloudStockEnum::PICK_ORDER_STATUS3){ //生成支付流水 $order_trade_info[] = [ 'order_no' => $res->order_no, 'amount' => $res->pay_money, 'title' => '云库存自提订单', 'notify_class' => PickOfflinePayNotify::class, 'order_type' => AddonsEnum::ADDONS_NAME_CLOUD_STOCK, ]; $res_trade = \Yii::$app->services->pay->createTrade($this->mall_id, $this->user_id, $order_trade_info); if ($res_trade == false) return $this->error('生成支付流水失败'); $res->trade_id = $res_trade['trade_id']; $res->trade_no = $res_trade['trade_no']; if(!$res->save()) return $this->error('数据保存失败'); return $this->success('提货成功',['trade_no' => $res_trade['trade_no'], 'trade_id' => $res_trade['trade_id'], 'order_ids' => $res->id]); } return $this->success('提货成功'); } /** * 重新支付 * * @return void */ public function actionRePay() { $params = \Yii::$app->request->post(); $res = \Yii::$app->services->validate->validate($params, [ [['order_id'], 'required'], [['order_id'], 'integer'], ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $res = CloudStockAgentOrder::getOne( [ [ 'id' => $params['order_id'], 'mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'send_status' => CloudStockEnum::PICK_ORDER_STATUS3, ] ] ); if (empty($res)) { return $this->error('未查询到待支付订单'); } //生成支付流水 $order_trade_info[] = [ 'order_no' => $res->order_no, 'amount' => $res->pay_money, 'title' => '云库存自提订单', 'notify_class' => PickOfflinePayNotify::class, 'order_type' => AddonsEnum::ADDONS_NAME_CLOUD_STOCK, ]; $res_trade = \Yii::$app->services->pay->createTrade($this->mall_id, $this->user_id, $order_trade_info); if ($res_trade == false) return $this->error('生成支付流水失败'); $res->trade_id = $res_trade['trade_id']; $res->trade_no = $res_trade['trade_no']; if(!$res->save()) return $this->error('数据保存失败'); return $this->success('success', ['trade_no' => $res_trade['trade_no'], 'trade_id' => $res_trade['trade_id'], 'order_ids' => $res->id]); } public function actionUpgradeGoodsList(){ $params = \Yii::$app->request->get(); $res = \Yii::$app->services->validate->validate($params, [ [['limit', 'page','keyword'], 'safe'] ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $where[] = ['g.mall_id' => $this->mall_id]; $where[] = ['g.status' => [StatusEnum::ENABLED]]; $where[] = ['g.is_on_sale' => 1]; $where[] = ['g.is_show' => 1]; if (isset($params['keyword'])) { $where[] = ['like', 'g.goods_name', trim($params['keyword'])]; } $goods_ids = []; $level_list = CloudStockLevel::lists(['where'=>[['mall_id'=>$this->mall_id],['status'=>StatusEnum::ENABLED],['upgrade_type_condition'=>1]]]); if(!empty($level_list)){ foreach($level_list as $level){ $checked_condition_values = json_decode($level['checked_condition_values'], true); $checked_condition_keys = json_decode($level['checked_condition_keys'], true); if(in_array(0,$checked_condition_keys) && !empty($checked_condition_values)){ if(isset($checked_condition_values[0]['value'])){ $goods_ids = array_merge($goods_ids,array_column($checked_condition_values[0]['value'],'goods_id')); } } } } $where[] = ['g.id'=>$goods_ids]; $params['where'] = $where; $params['alias'] = 'g'; $params['select'] = 'g.id,g.goods_name,g.cover_pic,g.price,g.original_price'; $goods_list = Goods::listPage($params); return $this->success('操作成功', $goods_list); } /** * 订单预览 * @Author bing * @DateTime 2021-09-24 19:46:46 * @return void * @copyright: Copyright (c) 2020 广东七件事集团 */ public function actionPreview() { try { if (!\Yii::$app->request->isPost) { return $this->error('请求方式错误'); } $post = \Yii::$app->request->post(); $rules = [ [['addr_id'], 'required'], [['addr_id', 'goods_id', 'number'], 'integer'], ]; $res = \Yii::$app->services->validate->validate($post, $rules); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); // 获取收货地址 $address_info = UserAddress::getUserAddress($this->user_id, $post['addr_id']); if (empty($address_info)) { $this->error('收货地址不存在'); return; } $baseParams = ['mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'stock_agent' => $this->stock_agent]; $goodsService = new CloudStockAgentGoodsService($baseParams); $orderService = new CloudStockAgentOrderService($baseParams); $cartService = new CloudStockAgentCartService($baseParams); if (!empty($post['goods_id']) && !empty($post['number'])) { $freightAttr[] = ['goods_id' => $post['goods_id'], 'num' => $post['number']]; } else { $cartList = $cartService->getCartList(); // 购物车 foreach ($cartList as $cartItem) { if (empty($cartItem['goods_id']) || empty($cartItem['num'])) { continue; } $freightAttr[] = [ 'goods_id' => $cartItem['goods_id'], 'num' => $cartItem['num'] ]; } } if (empty($freightAttr)) { $this->error('未选择提货商品'); return; } $form = $orderService->getForm($goodsService, $this->mall_id, $this->user_id, $post['addr_id'], $freightAttr); $form->attributes = [ 'type' => PreviewTypeEnum::FREIGHT, 'data' => [ 'shipping_type' => ShippingTypeEnum::LOGISTICS, 'freight_attr' => $freightAttr, 'address_id' => $post['addr_id'] ] ]; $group_order_goods = $form['group_order_goods']; $group_order_goods_list = []; foreach ($group_order_goods as $val){ $group_order_goods_list[]=$val; } $marketing = $form['marketing']??[]; $pay_type_list = \Yii::$app->services->pay->getEnablePayment($this->mall_id, $this->platform); if($form['total_pay_money']<=0){ $tmp = []; foreach ($pay_type_list as $item){ if($item['trade_type']=='default'){ $tmp[]=$item; break; } } $pay_type_list = $tmp; } $shipping_type_list = $form->type == PreviewTypeEnum::RESERVE_NOW ? ShippingTypeEnum::getReserveMap() : ShippingTypeEnum::getMap(); $option_list = []; $group_order_goods = $group_order_goods_list; $extends_fields = []; $info = compact('group_order_goods', 'marketing', 'address_info', 'pay_type_list', 'shipping_type_list', 'option_list', 'extends_fields'); if($form['total_pay_money'] < 0) $form['total_pay_money'] = 0; $info['total_pay_money'] = '¥' . $form['total_pay_money']; $info['is_address'] = $form['is_address'] ?? 0; $info['is_virtual'] = $form['is_virtual'] ?? 0; $info['is_sign_agreement'] = $form['is_sign_agreement'] ?? 0; $info['shipping_type'] = $form->data['shipping_type'] ?? null; $info['pay_money'] = 0; if(!empty($info['marketing']['deduct'])){ foreach($info['marketing']['deduct'] as $key => $item){ if($key != 'shipping_fee'){ unset($info['marketing']['deduct'][$key]); }else{ $info['total_pay_money'] = '¥' . $item['money']; $info['pay_money'] = $item['money']; } } } return $this->success('操作成功', $info); }catch (\Exception $e){ return $this->error($e->getMessage()); } } public function actionAgentStock(){ $is_mycat = \Yii::$app->params['is_mycat']; $params = \Yii::$app->request->get(); if(isset($is_mycat)&&$is_mycat==true){ $child_user_ids = UserPartitionRelationship::getChildIdArr($this->user_id); $where[] = ['=', 'mall_id', $this->mall_id]; $where[] = ['in', 'status', [StatusEnum::DISABLED, StatusEnum::ENABLED]]; $where[] = ['in', 'user_id', $child_user_ids]; $params['order'] = 'stock desc'; $params['where'] = $where; $params['select'] = 'id,user_id,stock,level'; $params['with'] = 'user'; $page_data = CloudStockAgent::listPage($params, false); }else{ // 联表查询 $joins = [ ['LEFT JOIN', UserPartitionRelationship::tableName() . 'upr', 'upr.user_id = csa.user_id'], ]; $user_ship = UserPartitionRelationship::findOne(['user_id'=>$this->user_id]); $tree = $user_ship['tree']; $where[] = ['<>', 'upr.user_id', $this->user_id]; $where[] = ['like', 'upr.tree', "{$tree},%", false]; $where[] = ['in', 'csa.status', [StatusEnum::DISABLED, StatusEnum::ENABLED]]; $select = 'csa.id,csa.user_id,csa.stock,csa.level'; $order = 'csa.stock desc'; $params['alias'] = 'csa'; $params['select'] = $select; $params['where'] = $where; $params['with'] = 'user'; $params['join'] = $joins; $params['order'] = $order; $page_data = CloudStockAgent::listPage($params, false, true); } if (!empty($page_data['list'])) { $level_arr = array_column($page_data['list'], 'level'); $user_ids = array_column($page_data['list'], 'user_id'); $level_list = CloudStockLevel::lists(['where' => [['mall_id' => $this->mall_id], ['level' => $level_arr], ['status' => StatusEnum::ENABLED]], 'index' => 'level']); $cloudStockGoodsList = CloudStockGoods::lists(['where'=>[['mall_id'=>$this->mall_id],['status'=>StatusEnum::ENABLED]]]); $goods_ids = array_column($cloudStockGoodsList,'goods_id'); $agent_goods_list = CloudStockAgentGoods::lists(['where' => [['user_id' => $user_ids],['goods_id'=>$goods_ids],['status'=>StatusEnum::ENABLED]], 'select' => 'sum(num) num ,user_id', 'group' => 'user_id', 'index' => 'user_id']); foreach ($page_data['list'] as &$item) { $item['level_name'] = $level_list[$item['level']]['name'] ?? ''; $item['total_stock_num'] = 0; if (isset($agent_goods_list[$item['user_id']])) $item['total_stock_num'] = $agent_goods_list[$item['user_id']]['num']; unset($item['stock']); } } return $this->success('操作成功', $page_data); } public function actionAgentStockSum(){ $is_mycat = \Yii::$app->params['is_mycat']; $cloudStockGoodsList = CloudStockGoods::lists(['where'=>[['mall_id'=>$this->mall_id],['status'=>StatusEnum::ENABLED]]]); $goods_ids = array_column($cloudStockGoodsList,'goods_id'); if(isset($is_mycat)&&$is_mycat==true){ $child_user_ids = UserPartitionRelationship::getChildIdArr($this->user_id); $stock = CloudStockAgentGoods::find()->where(['mall_id'=> $this->mall_id,'user_id'=>$child_user_ids,'goods_id'=>$goods_ids,'status'=>StatusEnum::ENABLED])->sum('num'); }else{ $user_ship = UserPartitionRelationship::findOne(['user_id'=>$this->user_id]); $tree = $user_ship['tree']; $stock = CloudStockAgentGoods::find()->alias('csa') ->leftJoin( UserPartitionRelationship::tableName() . 'upr','upr.user_id = csa.user_id') ->where(['csa.mall_id'=> $this->mall_id,'csa.goods_id'=>$goods_ids,'csa.status'=>StatusEnum::ENABLED]) ->andWhere(['<>', 'upr.user_id', $this->user_id]) ->andWhere(['like', 'upr.tree', "{$tree},%", false]) ->sum('csa.num'); } return $this->success('操作成功', ['stock'=>$stock??0,'goods_num'=>count($goods_ids)]); } public function actionAgentStockDetail(){ $params = \Yii::$app->request->get(); $rules = [ [['user_id',], 'required'], ]; $res = \Yii::$app->services->validate->validate($params, $rules); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $user_id = $params['user_id']; $parent_user_ids = UserPartitionRelationship::getParentIdArr($user_id); if(!in_array($this->user_id,$parent_user_ids)) return $this->error('该会员不属于你的团队'); $params['where'] = [['mall_id'=>$this->mall_id],['status'=>StatusEnum::ENABLED]]; $params['select'] = 'goods_id'; $cloudStockGoodsList = CloudStockGoods::listPage($params); if (!empty($cloudStockGoodsList['list'])) { $goods_ids = array_column($cloudStockGoodsList['list'],'goods_id'); $agent_goods_list = CloudStockAgentGoods::lists([ 'where'=>[['user_id' => $user_id],['goods_id'=>$goods_ids],['status'=>StatusEnum::ENABLED]], 'select'=>'goods_id,num as stock', 'index'=>'goods_id' ]); $goods_list = Goods::lists(['where' => [['id'=>$goods_ids],['status'=>StatusEnum::ENABLED]],'index'=>'id']); foreach ($cloudStockGoodsList['list'] as &$item) { $item['goods_name'] = ''; $item['cover_pic'] = ''; $item['stock'] = 0; if (isset($goods_list[$item['goods_id']])) { $item['goods_name'] = $goods_list[$item['goods_id']]['goods_name']; $item['cover_pic'] = $goods_list[$item['goods_id']]['cover_pic']; } if (isset($agent_goods_list[$item['goods_id']])) { $item['stock'] = $agent_goods_list[$item['goods_id']]['stock']; } } } return $this->success('操作成功',$cloudStockGoodsList); } public function actionAgentStockDetailSum(){ $params = \Yii::$app->request->get(); $rules = [ [['user_id',], 'required'], ]; $res = \Yii::$app->services->validate->validate($params, $rules); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $user_id = $params['user_id']; $parent_user_ids = UserPartitionRelationship::getParentIdArr($user_id); if(!in_array($this->user_id,$parent_user_ids)) return $this->error('该会员不属于你的团队'); $cloud_stock_agent = CloudStockAgent::findOne(['user_id'=>$user_id,'status'=>StatusEnum::ENABLED]); if(empty($cloud_stock_agent)) return $this->error('代理部存在'); $cloudStockGoodsList = CloudStockGoods::lists(['where'=>[['mall_id'=>$this->mall_id],['status'=>StatusEnum::ENABLED]]]); $goods_ids = array_column($cloudStockGoodsList,'goods_id'); $stock = CloudStockAgentGoods::find()->where(['mall_id'=> $this->mall_id,'user_id'=>$user_id,'goods_id'=>$goods_ids,'status'=>StatusEnum::ENABLED])->sum('num'); $user = User::getOne([['id' =>$user_id]],true,[],false,['id', 'nickname', 'avatar_url', 'mobile', 'parent_id']); $level_arr = CloudStockLevel::getOne( [['mall_id' => $this->mall_id], ['level' => $cloud_stock_agent['level']], ['status' => StatusEnum::ENABLED]]); $user['level'] = $cloud_stock_agent['level']??''; $user['level_name'] = $level_arr['name']??''; return $this->success('操作成功', ['stock'=>$stock??0,'goods_num'=>count($goods_ids),'user'=>$user]); } }