request->isGet) { return $this->error('请求方式错误'); } // 获取配置 $config = Yii::$app->services->setting->addons->get($this->mall_id, WriteOffEnum::ADDONS_NAME, 'basic'); if(empty($config['is_enable'])){ return $this->error('未开启应用'); } $writeOffMember = WriteOffMember::findOne(['user_id'=>$this->user_id,'status'=>StatusEnum::ENABLED]); if(empty($writeOffMember)){ return $this->error('暂无数据'); } $code = WriteOffMemberCode::find()->where(['user_id'=>$this->user_id,'status'=>StatusEnum::ENABLED,'is_used'=>0])->orderBy('id asc')->select('code')->scalar(); if(!$code){ return $this->error('暂无数据'); } $data = [ 'background_url' => $config['background_url'], 'code' => (string)$code, 'code_url' => $writeOffMember['code_url'], 'num' => $writeOffMember['num'], 'used_num' => $writeOffMember['total_num'] - $writeOffMember['num'], ]; return $this->success('请求成功', $data, ApiStatusEnum::CODE_SUCCESS,JSON_UNESCAPED_UNICODE); } /** * 核销记录 */ public function actionLog(){ if (!\Yii::$app->request->isGet) { return $this->error('请求方式错误'); } $page = \Yii::$app->request->get('page', 1); $limit = \Yii::$app->request->get('limit', $this->pageSize); $start_time = \Yii::$app->request->get('start_time'); $end_time = \Yii::$app->request->get('end_time'); $keyword = \Yii::$app->request->get('keyword'); $wheres = []; $wheres[] = ['mall_id' => $this->mall_id]; $wheres[] = ['user_id'=>$this->user_id]; $wheres[] = ['change_type' =>'sub']; if(!empty($keyword)){ $user_list = User::lists([ 'where'=>[ ['or', ['=', 'id', $keyword], ['like', 'nickname', $keyword], ['like', 'mobile', $keyword] ] ], 'select'=>'id', ]); $user_ids = array_column($user_list,'id'); $param_user = []; if(!empty($user_ids)){ $writeOffUserList = WriteOffUser::find()->where(['user_id' => $user_ids,'status' => StatusEnum::ENABLED])->asArray()->all(); $w_user_ids = array_column($writeOffUserList,'id'); $param_user = ['source_table_id'=>$w_user_ids,'source_table'=>WriteOffUser::tableName()]; } $store_list = Store::lists([ 'where'=>[ ['or', ['=', 'id', $keyword], ['like', 'store_name', $keyword], ] ], 'select'=>'id', ]); $store_ids = array_column($store_list,'id'); $param_store = []; if(!empty($store_ids)){ $param_store = ['store_id'=>$store_ids]; } $wheres[] = [ 'or', $param_user, $param_store, ['=','order_no',$keyword], ]; } if(!empty($start_time)){ $wheres[] = ['>=','created_at',strtotime($start_time)]; } if(!empty($end_time)){ $wheres[] = ['<=','created_at',strtotime($end_time)]; } $params = [ 'select' => 'created_at,order_no,source_table_id,store_id', 'where' =>$wheres, 'order' => 'id desc', 'page' => $page, 'limit' => $limit, ]; $list = WriteOffMemberLog::listPage($params, false, true); if(!empty($list['list'])){ foreach($list['list'] as &$item){ $item['created_at'] = date('Y-m-d H:i:s',$item['created_at']); if(!empty($item['source_table_id'])){ $WriteOffUser = WriteOffUser::findOne($item['source_table_id']); $w_user = User::findOne($WriteOffUser['user_id']); $item['write_off_user'] = $w_user['nickname'] ?? ''; } $item['store_name'] = Store::find()->where(['id'=>$item['store_id']])->select('store_name')->scalar() ?? ''; unset($item['source_table_id'],$item['store_id']); } } return $this->success('success', $list); } /** * 基础设置 */ public function actionSetting(){ if (!\Yii::$app->request->isGet) { return $this->error('请求方式错误'); } $attr_ids = \Yii::$app->request->get('attr_ids'); if(empty($attr_ids)) return $this->error('参数异常'); $attr_ids = explode(",",$attr_ids); $goods_ids = GoodsAttr::find()->where(['id'=>$attr_ids])->select('goods_id')->column(); // 获取配置 $config = Yii::$app->services->setting->addons->get($this->mall_id, WriteOffEnum::ADDONS_NAME, 'basic'); $data['is_enable_promote_reward'] = !empty($config['is_enable']) && !empty($config['is_enable_promote_reward']) ? $config['is_enable_promote_reward'] : 0; $goods_setting = WriteOffSetting::find()->where(['goods_id' => $goods_ids, 'is_enable_promote_reward' => StatusEnum::ENABLED, 'status' => StatusEnum::ENABLED])->indexBy('goods_id')->one(); if(empty($goods_setting)) $data['is_enable_promote_reward'] = 0; return $this->success('请求成功', $data); } /** * 核销员搜索 */ public function actionUserInfo() { if (!\Yii::$app->request->isGet) { return $this->error('请求方式错误'); } $user_keyword = \Yii::$app->request->get('user_keyword'); if (empty($user_keyword)) return $this->error('参数错误'); $write_off_user_ids = WriteOffUser::find()->where(['mall_id'=>$this->mall_id,'status' => StatusEnum::ENABLED])->select('user_id')->column(); $user = User::find() ->select('id,nickname,avatar_url,mobile') ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'id' => $user_keyword]) ->andWhere(['in','id',$write_off_user_ids]) ->asArray() ->one(); return $this->success('success', $user); } /** * 核销员首页 */ public function actionUser(){ if (!\Yii::$app->request->isGet) { return $this->error('请求方式错误'); } $writeOffUser = WriteOffUser::findOne(['user_id' => $this->user_id,'status' => StatusEnum::ENABLED]); if (empty($writeOffUser)) { return $this->error('您还不是核销员'); } $data['user'] = [ 'nickname' => $this->user['nickname'], 'id' => $this->user['id'], 'avatar_url' => $this->user['avatar_url'], 'level_name' => '', 'store_name' => '', ]; $level = WriteOffLevel::findOne(['mall_id'=>$this->mall_id,'level'=>$writeOffUser['level'],'status' => StatusEnum::ENABLED]); if($level){ $data['user']['level_name'] = $level['name']; } $store = Store::findOne($writeOffUser['store_id']); if($store){ $data['user']['store_name'] = $store['store_name']; } $data['total_commission'] = $writeOffUser['total_commission']; $data['today_commission'] = 0; $data['yesterday_commission'] = 0; $data['total_num'] = $writeOffUser['total_num']; $data['today_num'] = 0; CapitalLog::$capitalType = 'commission'; $today_start = strtotime(date('Y-m-d 00:00:00',time())); $yesterday_start = strtotime(date('Y-m-d 00:00:00',strtotime('-1 day'))); $commission_total_today = CapitalLog::find() ->where(['mall_id' => $this->mall_id, 'from_type' => WriteOffEnum::ADDONS_NAME,'change_type'=>'add','user_id'=>$this->user_id]) ->andWhere(['>=','created_at',$today_start]) ->sum('change_num'); if(!empty($commission_total_today)) $data['today_commission'] = $commission_total_today; $commission_total_yesterday = CapitalLog::find() ->where(['mall_id' => $this->mall_id, 'from_type' => WriteOffEnum::ADDONS_NAME,'change_type'=>'add','user_id'=>$this->user_id]) ->andWhere(['>=','created_at',$yesterday_start]) ->andWhere(['<','created_at',$today_start]) ->sum('change_num'); if(!empty($commission_total_yesterday)) $data['yesterday_commission'] = $commission_total_yesterday; $log_today = WriteOffMemberLog::find() ->where(['source_table' => WriteOffUser::tableName(),'source_table_id' => $writeOffUser['id'],'change_type' => 'sub']) ->andWhere(['>=','created_at',$today_start]) ->sum('change_num'); if(!empty($log_today)) $data['today_num'] = $log_today; $data['list'] = []; $commission_list = CapitalLog::find() ->where(['mall_id' => $this->mall_id, 'from_type' => WriteOffEnum::ADDONS_NAME,'change_type'=>'add','user_id'=>$this->user_id]) ->orderBy('created_at desc') ->select('created_at,order_no,capital_type,change_num,from_type,source_table_id') ->limit(10) ->asArray() ->all(); if(!empty($commission_list)){ foreach($commission_list as &$commission){ $commission['created_at'] = date('Y-m-d H:i:s',$commission['created_at']); $commission['extra_user'] = ''; $commission['extra_name'] = ''; //核销 if($commission['capital_type'] == WriteOffEnum::WRITE_OFF_PRIZE){ $writeOffMemberLog = WriteOffMemberLog::findOne($commission['source_table_id']); if($writeOffMemberLog){ $commission['extra_name'] = Store::find()->where(['id'=>$writeOffMemberLog['store_id']])->select('store_name')->scalar() ?? ''; $commission['extra_user'] = User::find()->where(['id'=>$writeOffMemberLog['user_id']])->select('nickname')->scalar() ?? ''; } } //促销 if($commission['capital_type'] == WriteOffEnum::PROMOTE_PRIZE){ $order_detail = OrderDetail::find()->where(['id'=>$commission['source_table_id']])->asArray()->one(); if(!empty($order_detail)){ $commission['extra_name'] = $order_detail['goods_name']; $commission['extra_user'] = User::find()->where(['id'=>$order_detail['user_id']])->select('nickname')->scalar() ?? ''; } } $commission['capital_type_text'] = WriteOffEnum::getTypeMap($commission['capital_type']); unset($commission['from_type'],$commission['source_table_id']); } } $data['list'] = $commission_list; return $this->success('success', $data); } /** * 核销员奖励列表 */ public function actionUserLog(){ if (!\Yii::$app->request->isGet) { return $this->error('请求方式错误'); } $page = \Yii::$app->request->get('page', 1); $limit = \Yii::$app->request->get('limit', $this->pageSize); $start_time = \Yii::$app->request->get('start_time'); $end_time = \Yii::$app->request->get('end_time'); $capital_type = \Yii::$app->request->get('type'); $wheres = []; $wheres[] = ['mall_id' => $this->mall_id,'user_id'=>$this->user_id]; $wheres[] = ['from_type' => WriteOffEnum::ADDONS_NAME]; if(!empty($capital_type)){ $wheres[] = ['capital_type'=>$capital_type]; } if(!empty($start_time)){ $wheres[] = ['>=','created_at',strtotime($start_time)]; } if(!empty($end_time)){ $wheres[] = ['<=','created_at',strtotime($end_time)]; } $params = [ 'select' => 'created_at,order_no,capital_type,change_num,from_type,source_table_id', 'where' =>$wheres, 'order' => 'id desc', 'page' => $page, 'limit' => $limit, ]; CapitalLog::$capitalType = 'commission'; $list = CapitalLog::listPage($params, false, true); if(!empty($list['list'])){ foreach($list['list'] as &$commission){ $commission['created_at'] = date('Y-m-d H:i:s',$commission['created_at']); $commission['extra_user'] = ''; $commission['extra_name'] = ''; //核销 if($commission['capital_type'] == WriteOffEnum::WRITE_OFF_PRIZE){ $writeOffMemberLog = WriteOffMemberLog::findOne($commission['source_table_id']); if($writeOffMemberLog){ $commission['extra_name'] = Store::find()->where(['id'=>$writeOffMemberLog['store_id']])->select('store_name')->scalar() ?? ''; $commission['extra_user'] = User::find()->where(['id'=>$writeOffMemberLog['user_id']])->select('nickname')->scalar() ?? ''; } } //促销 if($commission['capital_type'] == WriteOffEnum::PROMOTE_PRIZE){ $order_detail = OrderDetail::find()->where(['id'=>$commission['source_table_id']])->asArray()->one(); if(!empty($order_detail)){ $commission['extra_name'] = $order_detail['goods_name']; $commission['extra_user'] = User::find()->where(['id'=>$order_detail['user_id']])->select('nickname')->scalar() ?? ''; } } $commission['capital_type_text'] = WriteOffEnum::getTypeMap($commission['capital_type']); unset($commission['from_type'],$commission['source_table_id']); } } $list['capital_type_list'] = WriteOffEnum::getTypeMap(); return $this->success('success', $list); } /** * 核销 */ public function actionDoSubmit(){ if (!\Yii::$app->request->isPost) { return $this->error('请求方式错误'); } $code = \Yii::$app->request->post('code'); if (empty($code)) { return $this->error('参数错误'); } $lock_key = RedisKeyEnum::suffix('lock_write_off_do_submit', $code); $identification = uniqid(); if (!LockHelper::lock($lock_key, $identification, 100, 100)) { return $this->error('网络异常,请稍后重试~'); } $t = \Yii::$app->db->beginTransaction(); try{ $writeOffUser = WriteOffUser::findOne(['user_id' => $this->user_id,'status' => StatusEnum::ENABLED]); if (empty($writeOffUser)) { throw new \Exception('您还不是核销员,无权进行核销操作'); } $level = WriteOffLevel::findOne(['mall_id'=>$this->mall_id,'level'=>$writeOffUser['level'],'status' => StatusEnum::ENABLED]); if(!empty($level['is_enable_promote_limit'])){ $today_start = strtotime(date('Y-m-d 00:00:00',time())); $today_end = strtotime(date('Y-m-d 23:59:59',time())); $log_today = WriteOffMemberLog::find() ->where(['source_table' => WriteOffUser::tableName(),'source_table_id' => $writeOffUser['id'],'change_type' => 'sub']) ->andWhere(['>=','created_at',$today_start]) ->andWhere(['<=','created_at',$today_end]) ->sum('change_num') ?? 0; if($log_today >= $level['promote_time']){ throw new \Exception('您今日核销次数已用完!'); } } $writeOffMemberCode = WriteOffMemberCode::findOne(['mall_id' => $this->mall_id, 'code' => $code, 'status' => StatusEnum::ENABLED]); if (empty($writeOffMemberCode)) { throw new \Exception('核销数据不存在'); } if($writeOffMemberCode->is_used == 1){ throw new \Exception('该核销码已被核销!'); } $writeOffMember = WriteOffMember::findOne(['mall_id' => $this->mall_id, 'user_id' => $writeOffMemberCode['user_id'], 'status' => StatusEnum::ENABLED]); if (empty($writeOffMember)) { throw new \Exception('核销用户不存在'); } if($writeOffMember->num <= 0){ throw new \Exception('该用户核销次数已用完'); } $writeOffMemberCode->is_used = 1; if(!$writeOffMemberCode->save()) throw new \Exception(WriteOffMemberCode::getStaticError()); $writeOffMember->num -= 1; if(!$writeOffMember->save()) throw new \Exception(WriteOffMember::getStaticError()); $writeOffUser->total_num += 1; if(!$writeOffUser->save()) throw new \Exception(WriteOffUser::getStaticError()); $order_no = WriteOffEnum::generateTradeNo('HX'); $params = [ 'user_id' => $writeOffMember['user_id'], 'mall_id' => $this->mall_id, 'change_num' => 1, 'current_num' => $writeOffMember->num, 'order_no' => $order_no, 'source_table' => WriteOffUser::tableName(), 'source_table_id' => $writeOffUser->id, 'store_id' => $writeOffUser->store_id, 'desc' => '线下门店核销', 'change_type' => 'sub', 'code' => $code, ]; $writeOffMemberLog = WriteOffMemberLog::setData($params); if ($writeOffMemberLog === false) throw new \Exception(WriteOffMemberLog::getStaticError()); $t->commit(); LockHelper::uLock($lock_key, $identification); //触发核销奖励 $queue_data = [ 'id' => $writeOffMemberLog->id, ]; TaskHelper::pushTaskQueue(RabbitMqEnum::ORDER_QUEUE, RabbitMqEnum::TASK_QUEUE, $queue_data, RewardLogic::class, 'writeOffReward', function (AMQPMessage $message) { \Yii::error('核销奖励发放异常'.$code); }); return $this->success('核销成功'); }catch(\Exception $e){ $t->rollBack(); LockHelper::uLock($lock_key, $identification); return $this->error('核销失败,'.$e->getMessage()); } } }