/** * Handler activity by command * * @param $app WechatApp * @param $user User * @return string message */ public static function handle($app, $openId, $replyArr) { $user = UserCache::getByOpenId($app, $openId); $eventCode = Event::getEventCode($replyArr['event_id']); if (!$user) { SysLog::error(__FILE__, __METHOD__, __LINE__, 'user not found by openid'); return false; } if (!$user['mobile']) { return ReplyFormat::replyText(SysParams::sys_error['error_user_not_register']); } switch ($eventCode) { case self::ACTIVITY_INIT: return KshActivity::startKsh($app, $user, $replyArr, $user['time_out']); break; case self::ACTIVITY_CLOSE: return KshActivity::stopKsh($app, $user, $replyArr); break; case self::ACTIVITY_DRAW: return KshActivity::drawKsh($app, $user, $replyArr); break; case self::QUESTION_BROWSE: return KshActivity::browseKshQuestionStore($app, $user, $replyArr); break; case self::PRIZE_BROWSE: return KshActivity::browseKshPrizeStore($app, $user, $replyArr); break; case self::ACTIVITY_JOIN: return KshActivity::joinKsh($app, $user, $replyArr); break; case self::ACTIVITY_ANSWER: return KshActivity::answerKsh($app, $user, $replyArr); break; case self::QUERY_WINNER: return KshActivity::queryWinner($app, $user, $replyArr); break; case self::QUERY_PRIZE: return KshActivity::queryPrize($app, $user, $replyArr); break; // case self::QUESTION_CHOOSE: // return Ksh::setActivityQuestion($app, $user, $replyArr); // break; // case self::PRIZE_CHOOSE: // return Ksh::setActivityPrize($app, $user, $replyArr); // break; // case self::QUESTION_CHOOSE: // return Ksh::setActivityQuestion($app, $user, $replyArr); // break; // case self::PRIZE_CHOOSE: // return Ksh::setActivityPrize($app, $user, $replyArr); // break; default: return false; break; } }
/** * Get reply define by command content. * * @param $cmdType * @param $cmdBody * @return array */ public static function getReplyDefine($app, $cmdType, $cmdBody) { if (isset($app) && isset($cmdType) && isset($cmdBody)) { $cmd = Command::match($cmdBody); if (!$cmd['texts']) { Log::error('invalid command content'); return null; } $reply = self::where(['wechat_id' => $app['id'], 'cmd_type' => $cmdType, 'cmd_content' => $cmd['texts'][0]])->get()->first(); if (!$reply) { Log::error('command content not found' . json_encode($cmd)); return null; } $replyArr = ['event_id' => $reply['event_id'], 'is_prefix' => $reply['is_prefix'], 'reply_type' => $reply['reply_type'], 'event_code' => Event::getEventCode($reply['event_id']), 'is_activity_event' => Event::isActivity($reply['event_id']), 'reply_json' => json_decode(base64_decode($reply['reply_json']), true), 'cmd_original' => $cmdBody]; if ($cmd['texts']) { $replyArr['cmd_text'] = $cmd['texts'][0]; } if ($cmd['numbers']) { $replyArr['cmd_number'] = $cmd['numbers']; } return $replyArr; } return null; }
public static function memberQueryWinner($app, $member, $replyArr) { //活动类型ID $typeId = Event::getActivityTypeId($replyArr['event_id']); $result = BaseActivity::memberGetActivitySession($app['id'], $typeId, $member['id']); switch ($result['status']) { case ErrorCode::err_activity_manager_not_found: return KshNotice::replyText($app, $member, KshParams::ksh_error['error_member_not_in_activity']); break; case ErrorCode::err_activity_not_exist: case ErrorCode::err_activity_session_not_exist: return KshNotice::replyText($app, $member, KshParams::ksh_error['error_activity_not_exist']); break; case ErrorCode::success: $managerId = $result['param']['activity']['activity_manager_id']; $param = BaseActivity::getActivityParam($app['id'], $typeId, $managerId, 'member_id'); $memberIdArr = $param['param']; $param = BaseActivity::getActivityParam($app['id'], $typeId, $managerId, 'member_answers_results'); $memberAnswerArr = $param['param']; $param = BaseActivity::getActivityParam($app['id'], $typeId, $managerId, 'question_count'); $quesCount = $param['param']; $param = BaseActivity::getActivityParam($app['id'], $typeId, $managerId, 'is_draw'); $isDraw = $param['param']; //检查是否加入活动 if (!in_array($member['id'], $memberIdArr)) { return KshNotice::replyText($app, $member, KshParams::ksh_error['error_member_not_in_activity']); } //检查用户是否答过题 if (empty($memberAnswerArr[$member['id']])) { self::addMemberMsgRecord($app['id'], $typeId, $managerId, $member['id'], $replyArr['cmd_original'], 'error_not_answer_question_yet'); return KshNotice::replyText($app, $member, KshParams::ksh_error['error_not_answer_question_yet']); } //检查是否已开奖 if (!$isDraw) { self::addMemberMsgRecord($app['id'], $typeId, $managerId, $member['id'], $replyArr['cmd_original'], 'error_activity_is_not_draw'); return KshNotice::replyText($app, $member, KshParams::ksh_error['error_activity_is_not_draw']); } //查询中奖结果 $rightCount = 0; $rightString = ''; $memberResult = $memberAnswerArr[$member['id']]; foreach ($memberResult as $ques => $answer) { if ($answer) { $rightCount++; $rightString .= $ques . ', '; } } if ($rightCount == $quesCount) { self::addMemberMsgRecord($app['id'], $typeId, $managerId, $member['id'], $replyArr['cmd_original'], 'success_answer_all_right'); return KshNotice::replyText($app, $member, KshParams::ksh_success['success_answer_all_right']); } if ($rightCount > 0 && $rightCount < $quesCount) { self::addMemberMsgRecord($app['id'], $typeId, $managerId, $member['id'], $replyArr['cmd_original'], 'error_member_part_right_answer'); return KshNotice::replyText($app, $member, sprintf(KshParams::ksh_error['error_member_part_right_answer'], $rightString)); } else { self::addMemberMsgRecord($app['id'], $typeId, $managerId, $member['id'], $replyArr['cmd_original'], 'error_member_no_right_answer'); return KshNotice::replyText($app, $member, KshParams::ksh_error['error_member_no_right_answer']); } break; } return false; }
public static function answerKsh($app, $user, $replyArr) { //权限检查 if ($user['type'] != UserOpenid::TYPE_DOCTOR) { return KshNotice::replyText($app, $user, KshParams::ksh_error['error_no_authority_answer_question']); } //答案编号是否为空 if (!array_key_exists('cmd_number', $replyArr)) { return KshNotice::replyText($app, $user, KshParams::ksh_error['error_empty_member_answer_code']); } //因为答案中可能有数字相同的编号, 所以多个题目的答案中间不能有分隔符 $answerString = $replyArr['cmd_number'][0]; $answerArr = []; for ((int) ($i = 0); $i < strlen($answerString); $i++) { $answerArr[] = $answerString[$i]; } //获取当前活动session $typeId = Event::getActivityTypeId($replyArr['event_id']); $result = BaseActivity::memberGetActivitySession($app['id'], $typeId, $user['id']); switch ($result['status']) { case ErrorCode::err_activity_manager_not_found: return KshNotice::replyText($app, $user, KshParams::ksh_error['error_member_not_in_activity']); break; case ErrorCode::err_activity_not_exist: case ErrorCode::err_activity_session_not_exist: return KshNotice::replyText($app, $user, KshParams::ksh_error['error_activity_not_exist']); break; case ErrorCode::success: //答题前检查 $activity = $result['param']['activity']; $checkRes = KshUtils::checkBeforeAnswer($app, $typeId, $activity['activity_manager_id'], $user, $answerArr, $replyArr['cmd_original']); if ($checkRes != 'success') { return $checkRes; } //答题 $answerRes = KshUtils::answer($app['id'], $typeId, $activity['activity_manager_id'], $user['id'], $answerArr); if ($answerRes != 'success') { KshUtils::addMemberMsgRecord($app['id'], $typeId, $activity['activity_manager_id'], $user['id'], $replyArr['cmd_original'], 'error_update_activity_status'); return KshNotice::replyText($app, $user, KshParams::ksh_error['error_update_activity_status']); } else { KshUtils::addMemberMsgRecord($app['id'], $typeId, $activity['activity_manager_id'], $user['id'], $replyArr['cmd_original'], 'success_answer_activity_question'); return KshNotice::replyText($app, $user, KshParams::ksh_success['success_answer_activity_question']); } break; } return false; }
/** * Dispatch command by activity type * * @param $app * @param $user * @param $replyArr * @return bool|mixed */ private static function activityPlugin($app, $openId, $replyArr) { $activityType = Event::getActivityType($replyArr['event_id']); if (!isset($activityType)) { return false; } $key = strtolower($activityType['code']); $config = (require_once __DIR__ . '/../Activities/Config/Main.php'); return call_user_func([$config[$key]['class'], $config[$key]['method']], $app, $openId, $replyArr); }
/** * Run the database seeds. * * @return void */ public function run() { //init wechat_app--------------------------------------- DB::table('wechat_app')->insert(['app_id' => 'wxdc06d6c8ed39889e', 'app_secret' => '5921188a2889d0e7a41a842d0969b6e8', 'token' => 'suffrajetWechatToken', 'aes_key' => 'B3Qv3pjv0NE5ytOmPUZW0oCh1ssdoYLGsla1SD7ezB2', 'original_id' => 'gh_8d23d6695d07', 'name' => 'dll', 'type' => 2, 'is_auth' => 1, 'email' => '*****@*****.**', 'describe' => '个人测试使用', 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); $app = WechatApp::where('app_id', 'wxdc06d6c8ed39889e')->get()->first(); //init table user_type---------------------------------- DB::table('user_type')->insert(['wechat_id' => $app['id'], 'name' => '医生', 'code' => 'doctor', 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); DB::table('user_type')->insert(['wechat_id' => $app['id'], 'name' => '代表', 'code' => 'manager', 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); //init table activity_type------------------------------ DB::table('activity_type')->insert(['name' => '科室会', 'code' => 'ksh', 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); //init manager------------------------------------------ DB::table('activity_manager')->insert(['id' => UUID::v4(), 'name' => 'dll', 'mobile' => '18613860084', 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); //init table user_openid------------------------------- $userType = UserType::where('name', '代表')->get()->first(); $manager = ActivityManager::where('name', 'dll')->get()->first(); DB::table('user_openid')->insert(['wechat_id' => $app['id'], 'user_type_id' => $userType['id'], 'open_id' => 'oCFvTvkmM5joT-h8pr7p-q2F0Dno', 'user_id' => $manager['id'], 'activity_timeout' => 24, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); //init reply------------------------------------------- $replyText = ['content' => '回复文本内容']; $replyNews = [array('title' => '测试标题', 'description' => '描述', 'url' => 'http://www.baidu.com', 'picUrl' => 'http://123.56.69.6/resources/640.jpg'), array('title' => '查看更多帮助', 'description' => '描述', 'url' => 'http://www.baidu.com', 'picUrl' => 'http://123.56.69.6/resources/640.jpg')]; //init public event------------------------------------------ DB::table('event')->insert(['wechat_id' => $app['id'], 'name' => '关注', 'code' => 'subscribe', 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); DB::table('event')->insert(['wechat_id' => $app['id'], 'name' => '取消关注', 'code' => 'unsubscribe', 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); DB::table('event')->insert(['wechat_id' => $app['id'], 'name' => '注册', 'code' => 'register', 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); DB::table('event')->insert(['wechat_id' => $app['id'], 'name' => '验证', 'code' => 'validate', 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); //init activity event----------------------------------------- $actType = ActivityType::where('name', '科室会')->get()->first(); DB::table('event')->insert(['wechat_id' => $app['id'], 'activity_type_id' => $actType['id'], 'name' => '激活活动', 'code' => 'init_activity', 'sort' => 1, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); DB::table('event')->insert(['wechat_id' => $app['id'], 'activity_type_id' => $actType['id'], 'name' => '查看题库', 'code' => 'browse_question', 'sort' => 2, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); DB::table('event')->insert(['wechat_id' => $app['id'], 'activity_type_id' => $actType['id'], 'name' => '查看奖品库', 'code' => 'browse_prize', 'sort' => 3, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); DB::table('event')->insert(['wechat_id' => $app['id'], 'activity_type_id' => $actType['id'], 'name' => '加入活动', 'code' => 'join_activity', 'sort' => 4]); DB::table('event')->insert(['wechat_id' => $app['id'], 'activity_type_id' => $actType['id'], 'name' => '活动答题', 'code' => 'answer', 'sort' => 5, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); DB::table('event')->insert(['wechat_id' => $app['id'], 'activity_type_id' => $actType['id'], 'name' => '开奖', 'code' => 'draw', 'sort' => 6, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); DB::table('event')->insert(['wechat_id' => $app['id'], 'activity_type_id' => $actType['id'], 'name' => '中奖查询', 'code' => 'query_winner', 'sort' => 7, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); DB::table('event')->insert(['wechat_id' => $app['id'], 'activity_type_id' => $actType['id'], 'name' => '奖品查询', 'code' => 'query_prize', 'sort' => 8, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); DB::table('event')->insert(['wechat_id' => $app['id'], 'activity_type_id' => $actType['id'], 'name' => '关闭活动', 'code' => 'close_activity', 'sort' => 9, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); //init table command----------------------------------- $replyNews[0]['title'] = '欢迎关注'; $type = Event::where('code', 'subscribe')->get()->first(); DB::table('command')->insert(['wechat_id' => $app['id'], 'event_id' => $type['id'], 'cmd_type' => 'event', 'cmd_content' => 'subscribe', 'reply_type' => 'news', 'reply_json' => base64_encode(json_encode($replyNews)), 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); $type = Event::where('code', 'unsubscribe')->get()->first(); DB::table('command')->insert(['wechat_id' => $app['id'], 'event_id' => $type['id'], 'cmd_type' => 'event', 'cmd_content' => 'unsubscribe', 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); $type = Event::where('code', 'register')->get()->first(); DB::table('command')->insert(['wechat_id' => $app['id'], 'event_id' => $type['id'], 'cmd_type' => 'text', 'cmd_content' => '注册', 'is_prefix' => 1, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); $replyNews[0]['title'] = '注册成功'; $type = Event::where('code', 'validate')->get()->first(); DB::table('command')->insert(['wechat_id' => $app['id'], 'event_id' => $type['id'], 'cmd_type' => 'text', 'cmd_content' => '验证', 'is_prefix' => 1, 'reply_type' => 'news', 'reply_json' => base64_encode(json_encode($replyNews)), 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); $type = Event::where('code', 'init_activity')->get()->first(); DB::table('command')->insert(['wechat_id' => $app['id'], 'event_id' => $type['id'], 'cmd_type' => 'text', 'cmd_content' => '开会', 'is_prefix' => 1, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); $replyNews[0]['title'] = '题库详情'; $type = Event::where('code', 'browse_question')->get()->first(); DB::table('command')->insert(['wechat_id' => $app['id'], 'event_id' => $type['id'], 'cmd_type' => 'text', 'cmd_content' => '题库', 'is_prefix' => 0, 'reply_type' => 'news', 'reply_json' => base64_encode(json_encode($replyNews)), 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); $replyNews[0]['title'] = '奖品库详情'; $type = Event::where('code', 'browse_prize')->get()->first(); DB::table('command')->insert(['wechat_id' => $app['id'], 'event_id' => $type['id'], 'cmd_type' => 'text', 'cmd_content' => '奖品库', 'is_prefix' => 0, 'reply_type' => 'news', 'reply_json' => base64_encode(json_encode($replyNews)), 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); $type = Event::where('code', 'join_activity')->get()->first(); DB::table('command')->insert(['wechat_id' => $app['id'], 'event_id' => $type['id'], 'cmd_type' => 'text', 'cmd_content' => '加入', 'is_prefix' => 1, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); $type = Event::where('code', 'answer')->get()->first(); DB::table('command')->insert(['wechat_id' => $app['id'], 'event_id' => $type['id'], 'cmd_type' => 'text', 'cmd_content' => '我的答案', 'is_prefix' => 1, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); $type = Event::where('code', 'draw')->get()->first(); DB::table('command')->insert(['wechat_id' => $app['id'], 'event_id' => $type['id'], 'cmd_type' => 'text', 'cmd_content' => '开奖', 'is_prefix' => 0, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); $type = Event::where('code', 'query_winner')->get()->first(); DB::table('command')->insert(['wechat_id' => $app['id'], 'event_id' => $type['id'], 'cmd_type' => 'text', 'cmd_content' => '中奖情况', 'is_prefix' => 0, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); $replyNews[0]['title'] = '奖品展示'; $type = Event::where('code', 'query_prize')->get()->first(); DB::table('command')->insert(['wechat_id' => $app['id'], 'event_id' => $type['id'], 'cmd_type' => 'text', 'cmd_content' => '查看奖品', 'is_prefix' => 0, 'reply_type' => 'news', 'reply_json' => base64_encode(json_encode($replyNews)), 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); $type = Event::where('code', 'close_activity')->get()->first(); DB::table('command')->insert(['wechat_id' => $app['id'], 'event_id' => $type['id'], 'cmd_type' => 'text', 'cmd_content' => '散会', 'is_prefix' => 0, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); //init activity questions------------------------------ $options = ['1' => '选项1', '2' => '选项2', '3' => '选项3', '4' => '选项4']; DB::table('activity_question')->insert(['wechat_id' => $app['id'], 'activity_manager_id' => $manager['id'], 'name' => '问题1', 'content' => '问题1的答案是啥?', 'options_json' => base64_encode(json_encode($options)), 'right_answer' => 1, 'is_default' => 1, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); DB::table('activity_question')->insert(['wechat_id' => $app['id'], 'activity_manager_id' => $manager['id'], 'name' => '问题2', 'content' => '问题2的答案是啥?', 'options_json' => base64_encode(json_encode($options)), 'right_answer' => 2, 'is_default' => 1, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); DB::table('activity_question')->insert(['wechat_id' => $app['id'], 'activity_manager_id' => $manager['id'], 'name' => '问题3', 'content' => '问题3的答案是啥?', 'options_json' => base64_encode(json_encode($options)), 'right_answer' => 3, 'is_default' => 1, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); DB::table('activity_question')->insert(['wechat_id' => $app['id'], 'activity_manager_id' => $manager['id'], 'name' => '问题4', 'content' => '问题4的答案是啥?', 'options_json' => base64_encode(json_encode($options)), 'right_answer' => 1, 'is_default' => 1, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); DB::table('activity_question')->insert(['wechat_id' => $app['id'], 'activity_manager_id' => $manager['id'], 'name' => '问题5', 'content' => '问题5的答案是啥?', 'options_json' => base64_encode(json_encode($options)), 'right_answer' => 3, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); DB::table('activity_question')->insert(['wechat_id' => $app['id'], 'activity_manager_id' => $manager['id'], 'name' => '问题6', 'content' => '问题6的答案是啥?', 'options_json' => base64_encode(json_encode($options)), 'right_answer' => 4, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); //init activity prizes--------------------------------- $prizeDefine = [array('title' => '活动奖品名称', 'description' => '描述描述描述描述描述', 'url' => 'http://www.baidu.com', 'picUrl' => 'http://123.56.69.6/resources/640.jpg')]; DB::table('activity_prize')->insert(['wechat_id' => $app['id'], 'activity_manager_id' => $manager['id'], 'name' => '活动奖品1', 'describe_json' => base64_encode(json_encode($prizeDefine)), 'is_default' => 1, 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); DB::table('activity_prize')->insert(['wechat_id' => $app['id'], 'activity_manager_id' => $manager['id'], 'name' => '活动奖品2', 'describe_json' => base64_encode(json_encode($prizeDefine)), 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); DB::table('activity_prize')->insert(['wechat_id' => $app['id'], 'activity_manager_id' => $manager['id'], 'name' => '活动奖品3', 'describe_json' => base64_encode(json_encode($prizeDefine)), 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); //init notice----------------------------------------- DB::table('notice')->insert(['wechat_id' => $app['id'], 'doctor_mobile' => '18613860084', 'notice_name' => '活动延迟开展1', 'notice_content' => '由于今天临时有事, 活动开展时间推迟到明天上午10:00开始,请各位见谅!', 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); DB::table('notice')->insert(['wechat_id' => $app['id'], 'doctor_mobile' => '18613860084', 'notice_name' => '活动延迟开展2', 'notice_content' => '由于今天临时有事, 活动开展时间推迟到明天上午10:00开始,请各位见谅!', 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); DB::table('notice')->insert(['wechat_id' => $app['id'], 'doctor_mobile' => '18613860084', 'notice_name' => '活动延迟开展3', 'notice_content' => '由于今天临时有事, 活动开展时间推迟到明天上午10:00开始,请各位见谅!', 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]); }