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]; $params = [ 'select' => 'id,mall_id,goods_id,agent_price,created_at,agent_price', 'where' => $wheres, 'order' => 'created_at desc', 'page' => $page, 'limit' => $limit, ]; $list = CloudStockTwoGoods::listPage($params); if (empty($list['list'])) { if (!is_array($list['list'])) return $this->error(CloudStockTwoAgentGoods::getStaticError()); } $good_ids = array_column($list['list'], 'goods_id'); $agent_goods = CloudStockTwoAgentGoods::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(); // dd($list['list'], $mall_goods); 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; } // 当前会员是否可以补货当前商品 $rr = CloudStockTwoGoods::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']); } $list['list'] = array_values($list['list']); $total_num = CloudStockTwoAgentGoods::find()->where(['mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'status' => StatusEnum::ENABLED])->sum('num'); $all_stock = $total_num??0; $configs = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_CLOUD_STOCK_TWO, 'basic'); $is_enable_cloud = $configs['is_enable_cloud'] ?? 0; return $this->success('success', compact('list', 'all_stock','is_enable_cloud')); } /** * @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 = CloudStockTwoIncreaseDetail::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 = CloudStockTwoDeductionDetail::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 = CloudStockTwoGoodsStockLog::listPage($params); if (empty($detail_list['list'])) { if (!is_array($detail_list['list'])) return $this->error(CloudStockTwoAgentGoods::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 CloudStockTwoEnum::STOCK_CHANGE_TYPE100: if (!isset($list['replenish_num'])) $list['replenish_num'] = 0; $list['replenish_num'] += $detail['num'] ?? 0; break; // 上级配货数量 case CloudStockTwoEnum::STOCK_CHANGE_TYPE101: if (!isset($list['prepare_num'])) $list['prepare_num'] = 0; $list['prepare_num'] += $detail['num'] ?? 0; break; // 退货退库存数量 case CloudStockTwoEnum::STOCK_CHANGE_TYPE102: if (!isset($list['refund_num'])) $list['refund_num'] = 0; $list['refund_num'] += $detail['num'] ?? 0; break; // 系统添加数量 case CloudStockTwoEnum::STOCK_CHANGE_TYPE103: if (!isset($list['sys_add_num'])) $list['sys_add_num'] = 0; $list['sys_add_num'] += $detail['num'] ?? 0; break; // 平台补货赠送数量 case CloudStockTwoEnum::STOCK_CHANGE_TYPE104: if (!isset($list['platfrom_give_num'])) $list['platfrom_give_num'] = 0; $list['platfrom_give_num'] += $detail['num'] ?? 0; break; // 购买礼包赠送数量 case CloudStockTwoEnum::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 CloudStockTwoEnum::STOCK_CHANGE_TYPE200: if (!isset($list['member_buy_num'])) $list['member_buy_num'] = 0; $list['member_buy_num'] += $detail['num'] ?? 0; break; // 给下级配货数量 case CloudStockTwoEnum::STOCK_CHANGE_TYPE201: if (!isset($list['issue_num'])) $list['issue_num'] = 0; $list['issue_num'] += $detail['num'] ?? 0; break; // 下级向自己补货数量 case CloudStockTwoEnum::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 CloudStockTwoEnum::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 CloudStockTwoEnum::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 = CloudStockTwoEnum::getStockChangeTypeMap(); $stock_change_dir_map = CloudStockTwoEnum::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'); // 记录类型,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]]; if ('add' == $record_type) { $params = [ 'where' => $wheres, 'order' => 'created_at desc', 'page' => $page, 'limit' => $limit ]; $detail_list = CloudStockTwoIncreaseDetail::listPage($params); } else { $params = [ 'where' => $wheres, 'order' => 'created_at desc', 'page' => $page, 'limit' => $limit ]; $detail_list = CloudStockTwoDeductionDetail::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 = CloudStockTwoEnum::getStockChangeTypeMap(); $stock_change_dir_map = CloudStockTwoEnum::getStockChangeDirMap(); return $this->success('success', compact('detail_list', 'user', 'stock_change_type_map', 'stock_change_dir_map')); } /** * @name: * @msg: 给下级配货 * @param {*} * @return {*} */ public function actionIssueGive() { 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; $res = CloudStockTwoGoodsStockLog::stockHandle($this->mall_id, $post, CloudStockTwoEnum::STOCK_CHANGE_TYPE201); if (false === $res) return $this->error(CloudStockTwoGoodsStockLog::getStaticError()); return $this->success('操作成功'); } /** * @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 = CloudStockTwoGoods::findOne(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'goods_id' => $goods_id]); if (empty($good)) return $this->error('商品数据异常'); $agent_price = json_decode($stock_good['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']; } $all_stocks = CloudStockTwoGoods::allPerantAgentGoodStocks($goods_id, $this->user_id, $this->mall_id); if (false === $all_stocks) { return $this->error(CloudStockTwoGoods::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; 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', 'goods_id', 'number'], 'required'], [['addr_id', 'goods_id', 'number'], 'integer'], ['password', 'string'] ]; $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; // dd($post); $stock_good = CloudStockTwoAgentGoods::findOne(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'goods_id' => $post['goods_id'], 'user_id' => $this->user_id]); if ($post['number'] > $stock_good->num) { return $this->error('提货数量超过了商品库存'); } $good = Goods::findOne(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'id' => $post['goods_id'], 'is_on_sale' => 1, 'is_attr' => 0]); if (empty($stock_good) || empty($good)) return $this->error('商品数据异常'); // 提货到线下 $res = CloudStockTwoAgentOrder::pickOffline($this->mall_id, $post); if (false === $res) return $this->error('提货失败:' . CloudStockTwoAgentOrder::getStaticError()); return $this->success('提货成功'); } }