| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457 |
- <?php
- namespace addons\CloudStockTwo\api\modules\v1\controllers;
- use addons\CloudStockTwo\common\enums\CloudStockTwoEnum;
- use addons\CloudStockTwo\common\models\CloudStockTwoAgent;
- use addons\CloudStockTwo\common\models\CloudStockTwoAgentGoods;
- use addons\CloudStockTwo\common\models\CloudStockTwoAgentOrder;
- use addons\CloudStockTwo\common\models\CloudStockTwoDeductionDetail;
- use addons\CloudStockTwo\common\models\CloudStockTwoGoods;
- use addons\CloudStockTwo\common\models\CloudStockTwoGoodsStockLog;
- use addons\CloudStockTwo\common\models\CloudStockTwoIncreaseDetail;
- use common\enums\StatusEnum;
- use common\enums\AddonsEnum;
- use common\helpers\ArrayHelper;
- use common\models\goods\Goods;
- use common\models\user\User;
- use common\models\user\UserPartitionRelationship;
- class CsGoodsController extends BaseController
- {
- public $modelClass = '';
- /**
- * 不用进行登录验证的方法
- *
- * 例如: ['index', 'update', 'create', 'view', 'delete']
- * 默认全部需要验证
- *
- * @var array
- */
- protected $authOptional = [];
- /**
- * @name:
- * @msg: 我的库存列表
- * @param {*}
- * @return {*}
- */
- public function actionList()
- {
- if (!\Yii::$app->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('提货成功');
- }
- }
|