alias('A')->with(['activity' => ['branch', 'image']]) ->join('branch_activity B', 'B.activity_id = A.activity_id') ->field('A.*') ->visible(['activity' => ['name', 'image' => ['file_path'], 'branch' => ['name']]]) ->where('A.user_id', '=', $user_id) ->where('A.status', '=', 1) ->where('A.is_delete', '=', 0) ->order(['A.create_time' => 'desc']); // 查询条件 if (!empty($params['keyword'])) { $model = $model->where('B.name', 'like', '%' . $params['keyword'] . '%'); } if (isset($params['verify_status']) && $params['verify_status'] >= 0) { $model = $model->where('is_verify', '=', $params['verify_status']); } // 获取列表数据 return $model->paginate($params); } /** * 获取报名用户列表 */ public function getListForActivity($params = [], $is_page = true, $limit = false) { // 构建查询规则 $model = $this->alias('auser') ->field('auser.*,user.nickName,user.real_name,user.avatarUrl') ->join('user', 'user.user_id = auser.user_id') ->where('auser.is_delete', '=', 0) ->where('auser.status', '=', 1) ->order(['auser.create_time' => 'desc']); // 查询条件 if (!empty($params['keyword'])) { $model = $model->where('user.nickName|user.real_name|user.mobile', 'like', '%' . $params['keyword'] . '%'); } if (!empty($params['activity_id'])) { $model = $model->where('auser.activity_id', '=', $params['activity_id']); } if (isset($params['verify_status']) && $params['verify_status'] != -1) { $model = $model->where('auser.is_verify', '=', $params['verify_status']); } // 如果不分页 if (!$is_page) { if ($limit) { $model = $model->limit($limit); } return $model->select(); } // 获取列表数据 return $model->paginate($params); } /** * 添加报名用户 */ public function addUser($user, $params) { $detail = ActivityModel::detail($params["activity_id"]); // 如果用户还没加入连盟 if (!$params['is_member']) { $this->addMember($detail, $params, $user); } // 验证数据 if (!$this->validateData($detail, $params, $user)) { return false; } $data = [ 'user_id' => $user['user_id'], 'order_no' => $this->orderNo(), 'activity_id' => $detail['activity_id'], 'total_price' => $detail['fee'], 'pay_price' => $detail['fee'], 'points_num' => $params['points_num'], // 积分抵扣数量 'points_money' => $params['points_money'], // 积分抵扣金额 'balance' => $params['balance'], // 余额 'online_money' => $params['online_money'], // 需在线支付的金额 'status' => $params['online_money'] > 0 ? 0 : 1, //报名状态,如果不需要在线支付则则直接报名成功 'pay_type' => $params['pay_type'], 'in_radius' => $params['in_radius'], 'app_id' => self::$app_id, ]; $data['trade_no'] = $data['order_no']; $this->save($data); // 如果不需要在线支付 if ($data['online_money'] == 0) { $this->onPayOffline($data['order_no']); } return $this; // $order_id = $this['order_id']; // if (!$order_id) { // $this->error = '报名失败'; // return false; // } // // 处理支付 // if ($detail['fee'] > 0) { // // 如果使用了积分 // if ($params['points_num']) { // $describe = "活动报名消费:{$data['order_no']}"; // $user->setIncPoints(-$params['points_num'], $describe); // } // // 如果使用了余额 // if ($params['balance']) { // BalanceLogModel::add(BalanceLogSceneEnum::RECHARGE, [ // 'user_id' => $user['user_id'], // 'money' => $params['balance'], // 'app_id' => self::$app_id // ], ['order_no' => $data['order_no']]); // $user->where('user_id', '=', $user['user_id']) // ->dec('balance', $params['balance']) // ->update(); // } // // 如果还需要在线支付 // if ($params['online_money']) { // $payment = self::onOrderPayment($user, $data['order_no'], $params['pay_type'], $params['pay_source'], $params['online_money']); // } else { // // 报名直接完成 // } // } // return $this['order_id']; } public function addMember($activity, $params, $user) { $data = [ 'user_id' => $user['user_id'], 'branch_id' => $activity['branch_id'], 'real_name' => $params['real_name'], 'mobile' => $params['mobile'], 'company' => $params['company'], 'app_id' => self::$app_id, ]; (new MemberModel())->add($data); } /** * 构建线下支付(积分、余额)请求的参数 */ public function onPayOffline($order_no) { // 获取订单详情 $PaySuccess = new BranchActivityPaySuccessService($order_no); // 发起支付 return $PaySuccess->onPaySuccess(OrderPayTypeEnum::BALANCE); } /** * 构建支付请求的参数 */ public static function onOrderPayment($user, $order_no, $payType, $pay_source, $online_money) { //如果来源是h5,首次不处理,payH5再处理 // if ($pay_source == 'h5') { // return []; // } if ($payType == OrderPayTypeEnum::WECHAT) { return self::onPaymentByWechat($user, $order_no, $pay_source, $online_money); } return []; } /** * 构建微信支付请求 */ protected static function onPaymentByWechat($user, $order_no, $pay_source, $online_money) { return PaymentService::wechat( $user, $order_no, OrderTypeEnum::BRANCHACTIVITY, $pay_source, $online_money ); } /** * 验证报名数据 */ public function validateData($activity, &$params, $user) { if ($activity["status_text"]["reg_status"] == 0){ $this->error = '报名未开始'; return false; } if ($activity["status_text"]["reg_status"] == 2){ $this->error = '报名已结束'; return false; } if ($activity["limit_num"] > 0 && $activity["total"] >= $activity["limit_num"]){ $this->error = '报名名额已满'; return false; } // 如果需要支付报名费 $params['online_money'] = 0; if ($activity['fee'] > 0) { $online_money = $activity['fee']; // 积分设置 $pointsSetting = SettingModel::getItem('points'); if ($params['points_num'] > $user['points']) { $this->error = '可用' . $pointsSetting['points_name'] . '不足'; return false; } // 重新计算积分抵扣金额 $params['points_money'] = bcmul($params['points_num'], $pointsSetting['discount']['discount_ratio']); $online_money -= $params['points_money']; if ($params['is_use_balance']) { $params['balance'] = min($online_money, $user['balance']); } else { $params['balance'] = 0; } $online_money -= $params['balance']; if ($online_money && empty($params['pay_type'])) { $this->error = '请选择支付方式'; return false; } $params['online_money'] = $online_money; } return true; } /** * 检查用户有没有核销权限 */ public static function checkVerifyUser($user_id, $branch_id, $verify_user_ids) { $can_verify = false; if (in_array($user_id, explode(',', $verify_user_ids))) { $can_verify = true; } else { // 检查是不是管理员 if(BranchUserModel::detail(['user_id' => $user_id, 'branch_id' => $branch_id])) { $can_verify = true; } } return $can_verify; } /** * 完成核销 */ public function onVerify($user, $activity_id) { $activity = ActivityModel::detail($activity_id); if ($activity['status_text']['status'] == 2) { $this->error = '活动已经结束了,不能签到啦'; return false; } $detail = ActivityUserModel::detail(['activity_id' => $activity_id, 'user_id' => $user['user_id']]); if($detail['is_verify'] == 1) { $this->error = '您已经签到过啦'; return false; } $detail->save([ 'is_verify' => 1, 'verify_time' => time() ]); // 发放奖励 $setting = BranchSettingModel::getItem('basic'); if ($setting['participate_user'] > 0) { $describe = "活动签到获得奖励[活动ID:{$activity_id}]"; $user->setIncPoints($setting['participate_user'], $describe); } return true; } }