model = new \app\admin\model\lottery\DrawRecord; // 获取枚举值列表 $this->view->assign([ "triggerTypeList" => $this->model->getTriggerTypeList(), "statusList" => StatusEnum::getMap(), "isWinList" => LotteryEnum::getIsWinMap(), "deliverStatusList" => LotteryEnum::getDeliverStatusMap(), ]); $this->assignconfig("triggerTypeList", json_encode($this->model->getTriggerTypeList())); $this->assignconfig("statusList", json_encode(StatusEnum::getMap())); $this->assignconfig("isWinList", json_encode(LotteryEnum::getIsWinMap())); $this->assignconfig("deliverStatusList", json_encode(LotteryEnum::getDeliverStatusMap())); // 参与状态 $this->assignconfig("drawStatusList", json_encode(LotteryEnum::getDrawStatusMap())); // 奖品类型配置 $this->view->assign("prizeTypeList", LotteryEnum::getPrizeTypeMap()); $this->assignconfig("prizeTypeList", json_encode(LotteryEnum::getPrizeTypeMap())); $this->assignconfig("prizeTypeList", json_encode(LotteryEnum::getPrizeTypeMap())); // 发放状态 $this->view->assign("deliverStatusList", LotteryEnum::getDeliverStatusMap()); $this->assignconfig("deliverStatusList", json_encode(LotteryEnum::getDeliverStatusMap())); // 抽奖类型 $this->view->assign("lotteryTypeList", LotteryEnum::getLotteryTypeMap()); $this->assignconfig("lotteryTypeList", json_encode(LotteryEnum::getLotteryTypeMap())); // 抽奖方式 $this->view->assign("lotteryTypeList", LotteryEnum::getLotteryTypeMap()); $this->assignconfig("lotteryTypeList", json_encode(LotteryEnum::getLotteryTypeMap())); } /** * 查看 */ public function index() { //当前是否为关联查询 $this->relationSearch = true; //设置过滤方法 $this->request->filter(['strip_tags', 'trim']); if ($this->request->isAjax()) { //如果发送的来源是Selectpage,则转发到Selectpage if ($this->request->request('keyField')) { return $this->selectpage(); } list($where, $sort, $order, $offset, $limit) = $this->buildparams(); $list = $this->model ->with(['activity', 'user', 'prize']) ->where($where) ->order($sort, $order) ->paginate($limit); // where in 查询 中奖记录 $drawRecordIds = $list->column('id'); $winRecord = new \app\admin\model\lottery\WinRecord; $objWinRecord = $winRecord->where('draw_record_id', 'in', $drawRecordIds) ->select(); $winRecordList = collection($objWinRecord)->toArray(); $winRecordMap = []; foreach ($winRecordList as $item) { $winRecordMap[$item['draw_record_id']] = $item; } $list->each(function($row) use ($winRecordMap) { $row->win_record_id = 0; $row->deliver_status = 0; $row->deliver_time = 0; if (isset($winRecordMap[$row->id])) { $row->win_record_id = $winRecordMap[$row->id]['id'] ?? 0; $row->deliver_status = $winRecordMap[$row->id]['deliver_status'] ?? 0; $row->deliver_time = $winRecordMap[$row->id]['deliver_time'] ?? 0; } }); foreach ($list as $row) { $row->visible([ 'id', 'activity_id', 'user_id', 'prize_id', 'is_win', 'trigger_type', 'trigger_order_id', 'trigger_amount', 'draw_ip', 'draw_time', 'device_info', 'status', 'createtime','win_record_id','deliver_status','deliver_time' ]); $row->visible(['activity', 'user', 'prize', 'winRecord']); // 处理关联数据 if ($row->getRelation('activity')) { $row->getRelation('activity')->visible(['id', 'name', 'type','lottery_type','lottery_time']); } if ($row->getRelation('user')) { $row->getRelation('user')->visible(['id', 'username', 'mobile','avatar']); } if ($row->getRelation('prize')) { $row->getRelation('prize')->visible(['id', 'name', 'type', 'image']); } $row->win_record_id = 0; $row->deliver_status = 0; $row->deliver_time = 0; if (isset($winRecordMap[$row->id])) { $row->win_record_id = $winRecordMap[$row->id]['id'] ?? 0; $row->deliver_status = $winRecordMap[$row->id]['deliver_status'] ?? 0; $row->deliver_time = $winRecordMap[$row->id]['deliver_time'] ?? 0; } } $result = array("total" => $list->total(), "rows" => $list->items()); return json($result); } return $this->view->fetch(); } /** * 详情 */ public function detail($ids = null) { $row = $this->model->with(['activity', 'user', 'prize', 'winRecord'])->find($ids); if (!$row) { $this->error(__('No Results were found')); } // 解析win_info JSON数据 if ($row->win_info) { $row->win_info_data = json_decode($row->win_info, true); } // 解析设备信息 if ($row->device_info) { $row->device_info_data = json_decode($row->device_info, true); } $this->view->assign("row", $row); return $this->view->fetch(); } /** * 统计数据 */ public function statistics() { $stats = []; // 总抽奖次数 $stats['total_draws'] = $this->model->count(); // 中奖次数 $stats['total_wins'] = $this->model->where('is_win', 1)->count(); // 中奖率 $stats['win_rate'] = $stats['total_draws'] > 0 ? round($stats['total_wins'] / $stats['total_draws'] * 100, 2) : 0; // 按触发类型统计 $stats['by_trigger_type'] = $this->model ->field('trigger_type, COUNT(*) as count') ->group('trigger_type') ->select() ->toArray(); // 按奖品类型统计中奖情况 $stats['by_prize_type'] = $this->model ->alias('dr') ->join('shop_lottery_prize p', 'dr.prize_id = p.id') ->field('p.type, COUNT(*) as total_count, SUM(dr.is_win) as win_count') ->group('p.type') ->select() ->toArray(); // 最近7天抽奖趋势 $stats['recent_trend'] = []; for ($i = 6; $i >= 0; $i--) { $date = date('Y-m-d', strtotime("-{$i} days")); $start_time = strtotime($date); $end_time = strtotime($date . ' 23:59:59'); $daily_draws = $this->model ->where('draw_time', 'between', [$start_time, $end_time]) ->count(); $daily_wins = $this->model ->where('draw_time', 'between', [$start_time, $end_time]) ->where('is_win', 1) ->count(); $stats['recent_trend'][] = [ 'date' => $date, 'draws' => $daily_draws, 'wins' => $daily_wins, 'rate' => $daily_draws > 0 ? round($daily_wins / $daily_draws * 100, 2) : 0 ]; } return json(['code' => 1, 'data' => $stats]); } /** * 导出记录 */ public function export() { // 获取导出参数 $filter = $this->request->get('filter', ''); $where = []; if ($filter) { $where = json_decode($filter, true); } $list = $this->model->with(['activity', 'user', 'prize', 'winRecord']) ->where($where) ->order('createtime', 'desc') ->select(); $header = [ 'ID', '活动名称', '用户昵称', '用户手机', '奖品名称', '奖品类型', '是否中奖', '触发类型', '触发金额', '抽奖IP', '抽奖时间', '发放状态', '收货人', '快递单号', '创建时间' ]; $data = []; foreach ($list as $item) { $data[] = [ $item->id, $item->activity->name ?? '', $item->user->nickname ?? '', $item->user->mobile ?? '', $item->prize->name ?? '', $item->prize->type_text ?? '', $item->is_win ? '是' : '否', $item->trigger_type_text, $item->trigger_amount ?? '', $item->draw_ip ?? '', date('Y-m-d H:i:s', $item->draw_time), $item->winRecord->deliver_status_text ?? '', $item->winRecord->receiver_name ?? '', $item->winRecord->express_number ?? '', date('Y-m-d H:i:s', $item->createtime) ]; } // 这里可以集成Excel导出功能 $this->success('导出成功', '', ['header' => $header, 'data' => $data]); } /** * 批量处理中奖发放 */ public function batchDeliver() { $ids = $this->request->post('ids'); if (!$ids) { $this->error('请选择要处理的记录'); } $count = 0; foreach ($ids as $id) { $record = $this->model->with('winRecord')->get($id); if ($record && $record->is_win && $record->winRecord) { // 这里可以调用具体的发放逻辑 $count++; } } $this->success("成功处理 {$count} 条记录"); } /** * 发货 */ public function deliver($ids = null) { $winRecordId = $this->request->param('win_record_id'); $winRecord = \app\admin\model\lottery\WinRecord::get($winRecordId); if (!$winRecord) { $this->error('未找到中奖记录'); } if ($this->request->isPost()) { $params = $this->request->post('row/a'); if (!$params['express_company'] || !$params['express_number']) { $this->error('快递公司和快递单号不能为空'); } $winRecord->express_company = $params['express_company']; $winRecord->express_number = $params['express_number']; $winRecord->deliver_status = LotteryEnum::DELIVER_STATUS_SUCCESS; // 假设1为已发货 $winRecord->deliver_time = time(); $winRecord->save(); $this->success('发货成功'); } $this->view->assign('row', $winRecord); return $this->view->fetch(); } }