diff --git a/application/admin/lang/zh-cn/wdsxh/activity/activity.php b/application/admin/lang/zh-cn/wdsxh/activity/activity.php index 1098675..2e6d2ed 100644 --- a/application/admin/lang/zh-cn/wdsxh/activity/activity.php +++ b/application/admin/lang/zh-cn/wdsxh/activity/activity.php @@ -1,6 +1,6 @@ '自助签到(范围1000米)', 'Verification_method 2' => '管理员核销', 'Applet_activity_qrcode_path' => '活动小程序码', + 'Checked_in_qrcode' => '签到二维码', 'Points_status' => '设置是否获得积分', 'Points_status 1' => '是', 'Points_status 2' => '否', diff --git a/application/admin/lang/zh-cn/wdsxh/activity/activity_apply.php b/application/admin/lang/zh-cn/wdsxh/activity/activity_apply.php index 9c27a2e..6aac613 100644 --- a/application/admin/lang/zh-cn/wdsxh/activity/activity_apply.php +++ b/application/admin/lang/zh-cn/wdsxh/activity/activity_apply.php @@ -1,6 +1,6 @@ '退款中', 'State 4' => '已退款', 'State 5' => '已驳回', + 'check_in_status' => '签到状态', + 'checked_in' => '已签到', + 'unchecked_in' => '未签到', 'Is_sign_in' => '核销状态', 'Is_sign_in 1' => '已核销', 'Is_sign_in 2' => '未核销', diff --git a/application/admin/model/wdsxh/activity/Activity.php b/application/admin/model/wdsxh/activity/Activity.php index a9931a0..225be5f 100644 --- a/application/admin/model/wdsxh/activity/Activity.php +++ b/application/admin/model/wdsxh/activity/Activity.php @@ -1,6 +1,6 @@ app_code->getUnlimit($ids, [ 'page' => $path, 'check_path' => false, + 'env_version' => 'trial', // 正式版为 "release",体验版为 "trial",开发版为 "develop"。默认是正式版 ]); if ($response instanceof \EasyWeChat\Kernel\Http\StreamResponse) { @@ -202,6 +204,48 @@ class Activity extends Model return $value; } + public function getCheckedInQrcodeAttr($value, $data) + { + $row = $data; + $row['createtime'] = self::where('id',$row['id'])->value('createtime'); + $save_path = '/uploads/wdsxh/check_in_qrcode/'.$row['id'].'/'.$row['createtime'].'.png'; + if (is_file(ROOT_PATH."public".$save_path)) { + $value = $save_path; + } else { + if(isset($row['id'])) { + $configObj = (new \app\admin\model\wdsxh\Config())->where('id',1)->find(); + if (!empty($configObj['applet_appid']) && !empty($configObj['applet_secret'])) { + $path = 'pagesActivity/index/details'; + $config = [ + 'app_id' => $configObj['applet_appid'], + 'secret' => $configObj['applet_secret'], + 'response_type' => 'array', + 'log' => [ + 'level' => 'debug', + ], + ]; + + $app = Factory::miniProgram($config); + $scene = http_build_query(['id' => $row['id'], 'op' => 'checked_in']); + $response = $app->app_code->getUnlimit($scene, [ + 'page' => $path, + 'check_path' => false, + 'env_version' => 'trial', // 正式版为 "release",体验版为 "trial",开发版为 "develop"。默认是正式版 + ]); + + if ($response instanceof \EasyWeChat\Kernel\Http\StreamResponse) { + $response->saveAs('uploads/wdsxh/check_in_qrcode/'.$row['id'], $row['createtime'].'.png'); + $value = $save_path; + } + } + } + } + if (!empty($value)) { + $value = request()->domain().$value; + } + return $value; + } + public function getPointsStatusList() { return ['2' => __('Points_status 2'), '1' => __('Points_status 1')]; @@ -216,6 +260,4 @@ class Activity extends Model { return ['1' => __('启用单独证书'), '2' => __('使用统一证书')]; } - - } diff --git a/application/admin/view/wdsxh/activity/activity_apply/index.html b/application/admin/view/wdsxh/activity/activity_apply/index.html index 34fb651..2142942 100644 --- a/application/admin/view/wdsxh/activity/activity_apply/index.html +++ b/application/admin/view/wdsxh/activity/activity_apply/index.html @@ -9,11 +9,6 @@ {:__('Add')} - - - - - request->isGet()) { $this->error('请求类型错误'); } - $id = $this->request->get('id'); - $data = $this->model + $id = $this->request->get('id'); + $activity = $this->model ->where('id',$id) - ->field('id,images,start_time,end_time,name,fees,state activity_state, - contacts,mobile, - organizing_method,url,address,longitude,latitude,content, - is_verifying,refund, - apply_time, - activity_auth, - points_status,points, - apply_field_state, - apply_limit_number, - non_member_registration_status') + ->field([ + 'id', 'images', 'start_time', 'end_time', 'name', 'fees', + 'state' => 'activity_state', 'contacts', 'mobile', + 'organizing_method', 'url', 'address', 'longitude', + 'latitude', 'content', 'is_verifying', 'refund', + 'apply_time', 'activity_auth', 'points_status', 'points', + 'apply_field_state', 'apply_limit_number', 'non_member_registration_status' + ]) ->find(); - if (!$data) { + if (!$activity) { $this->error('活动不存在'); } + + $data = $activity->toArray(); + // 如果活动未结束,则根据当前时间校验活动状态并更新状态 + if ($data['activity_state'] < 3) { + $now = time(); + // 当前时间小于报名截止时间,状态流转处于:报名中 + if ($now < $data['apply_time']) $data['actitity_state_trans'] = 1; + // 当前时间大于等于报名截止时间小于开始时间,状态流转处于:未开始 + if ($now >= $data['apply_time'] && $now < $data['start_time']) $data['actitity_state_trans'] = 2; + // 当前时间大于等于开始时间小于等于结束时间,状态流转处于:进行中 + if ($now >= $data['start_time'] && $now <= $data['end_time']) { + $data['actitity_state_trans'] = 3; + // 如果活动未结束,则根据当前时间校验活动状态并更新状态 + $activity->state = $data['activity_state'] = 2; + $activity->save(); + } + // 当前时间大于结束时间,状态流转处于:已结束 + if ($now > $data['end_time']) { + $data['actitity_state_trans'] = 4; + // 如果活动已结束,则根据当前时间更新状态 + $activity->state = $data['activity_state'] = 3; + $activity->save(); + } + } else { + // 活动结束,状态流转就一直处理:已结束 + $data['actitity_state_trans'] = 4; + } + if ($this->auth->isLogin()) { $wechat_id = (new UserWechat())->where('user_id',$this->auth->id)->value('id'); $activityApplyObj = (new \app\api\model\wdsxh\activity\ActivityApply()) @@ -123,6 +149,7 @@ class Activity extends Api $data['apply_id'] = ''; $data['reject'] = ''; } else { + $data['check_in_status'] = $activityApplyObj['check_in_status']; $data['pay_state'] = $activityApplyObj['state']; $data['apply_id'] = $activityApplyObj['id']; $activityRefundObj = (new Refund()) @@ -490,7 +517,3 @@ class Activity extends Api $this->success('请求成功',['show_status'=>$is_status]); } } - - - - \ No newline at end of file diff --git a/application/api/controller/wdsxh/activity/ActivityApply.php b/application/api/controller/wdsxh/activity/ActivityApply.php index 041277a..a811bbd 100644 --- a/application/api/controller/wdsxh/activity/ActivityApply.php +++ b/application/api/controller/wdsxh/activity/ActivityApply.php @@ -1,6 +1,6 @@ request->get('id'); $apply_id = $this->request->get('apply_id'); - $data = (new \app\api\model\wdsxh\activity\Activity()) + $activity = (new \app\api\model\wdsxh\activity\Activity()) ->where('id',$id) - ->field('id,images,start_time,end_time,name,fees,state activity_state, - contacts,mobile, - organizing_method,url,address,longitude,latitude,content, - refund, - apply_time, - activity_auth,is_verifying,verification_method,points_status,points') + ->field(['id', 'images', 'start_time', 'end_time', 'name', 'fees', + 'state' => 'activity_state', 'contacts', 'mobile', 'organizing_method', + 'url', 'address', 'longitude', 'latitude', 'content', 'refund', + 'apply_time', 'activity_auth', 'is_verifying', 'verification_method', + 'points_status', 'points' + ]) ->find(); - if (!$data) { + if (!$activity) { $this->error('活动不存在'); } + + $data = $activity->toArray(); + // 如果活动未结束,则根据当前时间校验活动状态并更新状态 + if ($data['activity_state'] < 3) { + $now = time(); + // 当前时间小于报名截止时间,状态流转处于:报名中 + if ($now < $data['apply_time']) $data['actitity_state_trans'] = 1; + // 当前时间大于等于报名截止时间小于开始时间,状态流转处于:未开始 + if ($now >= $data['apply_time'] && $now < $data['start_time']) $data['actitity_state_trans'] = 2; + // 当前时间大于等于开始时间小于等于结束时间,状态流转处于:进行中 + if ($now >= $data['start_time'] && $now <= $data['end_time']) { + $data['actitity_state_trans'] = 3; + // 如果活动未结束,则根据当前时间校验活动状态并更新状态 + $activity->state = $data['activity_state'] = 2; + $activity->save(); + } + // 当前时间大于结束时间,状态流转处于:已结束 + if ($now > $data['end_time']) { + $data['actitity_state_trans'] = 4; + // 如果活动已结束,则根据当前时间更新状态 + $activity->state = $data['activity_state'] = 3; + $activity->save(); + } + } else { + // 活动结束,状态流转就一直处理:已结束 + $data['actitity_state_trans'] = 4; + } if ($data['points_status'] == 2) { unset($data['points']); } @@ -470,6 +497,7 @@ class ActivityApply extends Api if (!$activityApplyObj) { $this->error('报名信息不存在'); } + $data['check_in_status'] = $activityApplyObj['check_in_status']; $data['pay_state'] = $activityApplyObj['state']; $data['apply_id'] = $apply_id; $activityRefundObj = (new Refund()) @@ -516,6 +544,55 @@ class ActivityApply extends Api } + /** + * Desc 签到(单纯签到功能不涉核销) + * + * @param type $param + * @return type + * Created by jsasg + */ + public function checked_in() + { + if(!$this->request->isGet()) { + $this->error('请求类型错误'); + } + + if (!$this->auth->isLogin()) { + $this->error('请先登录'); + } + + // 活动id + $id = $this->request->get('id'); + $activity = (new \app\api\model\wdsxh\activity\Activity())->where('id',$id)->find(); + if (empty($activity)) { + $this->error('活动不存在'); + } + if (3 == $activity['state'] || time() > $activity['end_time']) { + $this->error('活动已结束'); + } + + + $wechat_id = (new UserWechat())->where('user_id',$this->auth->id)->value('id'); + $activity_apply = $this->model->where('activity_id',$id)->where('wechat_id',$wechat_id)->find(); + // 如果用户未报名,不能签到 + if(empty($activity_apply)) { + $this->error('您还未报名该活动'); + } + // 如果已签到,不能再次签到 + if ('checked_in' == $activity_apply['check_in_status']) { + $this->error('您已签到'); + } + + // 设置已签到 + $activity_apply->check_in_status = 'checked_in'; + $activity_apply->checked_in_at = time(); + if ($activity_apply->save()) { + $this->success('签到成功'); + } + + $this->error('签到失败'); + } + private function handle_custom_data($data) { $custom_field = array('name','mobile'); @@ -530,7 +607,3 @@ class ActivityApply extends Api return $result; } } - - - - \ No newline at end of file diff --git a/application/api/model/wdsxh/activity/Activity.php b/application/api/model/wdsxh/activity/Activity.php index 87363c8..390d499 100644 --- a/application/api/model/wdsxh/activity/Activity.php +++ b/application/api/model/wdsxh/activity/Activity.php @@ -1,6 +1,6 @@