From ba94ceae1315174798ae1967ef62268c6d16cd5b Mon Sep 17 00:00:00 2001 From: Codex Assistant <codex@example.com> Date: 星期一, 06 十月 2025 22:07:06 +0800 Subject: [PATCH] feat: 评审与活动相关改动 - backend(GraphQL): Activity schema 增加 updateActivityState(id, state);实现 resolver/service 仅更新 state=2 作为逻辑删除 - backend(GraphQL): region.graphqls 新增 Query leafRegions - backend(GraphQL): player.graphqls 的 projectReviewApplications 增加可选参数 regionId - backend(Service): listProjectReviewApplications 绑定 regionId 参数,修复 QueryParameterException - frontend(web): 新增 api/activity.js 的 updateActivityState 并接入 activity-list 删除逻辑 - frontend(web): review-list.vue 权限仅校验登录,移除角色限制;查询参数修正为 name/regionId - frontend(web): 删除未引用的 ActivityList.vue - frontend(web): projectReviewNew.js GraphQL 查询增加 name 参数 --- backend/src/main/java/com/rongyichuang/activity/service/ActivityService.java | 147 +++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 117 insertions(+), 30 deletions(-) diff --git a/backend/src/main/java/com/rongyichuang/activity/service/ActivityService.java b/backend/src/main/java/com/rongyichuang/activity/service/ActivityService.java index a0ad78b..845d515 100644 --- a/backend/src/main/java/com/rongyichuang/activity/service/ActivityService.java +++ b/backend/src/main/java/com/rongyichuang/activity/service/ActivityService.java @@ -16,6 +16,8 @@ import com.rongyichuang.common.dto.PageResponse; import com.rongyichuang.rating.entity.RatingScheme; import com.rongyichuang.rating.repository.RatingSchemeRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Example; import org.springframework.data.domain.ExampleMatcher; @@ -38,6 +40,8 @@ @Transactional public class ActivityService { + private static final Logger log = LoggerFactory.getLogger(ActivityService.class); + @Autowired private ActivityRepository activityRepository; @@ -56,11 +60,18 @@ /** * 鍒嗛〉鏌ヨ姣旇禌鍒楄〃 */ - public PageResponse<ActivityResponse> findActivities(PageRequest pageRequest, String name) { + public PageResponse<ActivityResponse> findActivities(PageRequest pageRequest, String name, Integer state) { Pageable pageable = pageRequest.toPageable(); Page<Activity> page; - if (StringUtils.hasText(name)) { + boolean hasName = StringUtils.hasText(name); + if (state != null) { + if (hasName) { + page = activityRepository.findByPidAndStateAndNameContainingOrderByCreateTimeDesc(0L, state, name, pageable); + } else { + page = activityRepository.findByPidAndStateOrderByCreateTimeDesc(0L, state, pageable); + } + } else if (hasName) { page = activityRepository.findByPidAndNameContainingOrderByCreateTimeDesc(0L, name, pageable); } else { // 鏌ヨ鎵�鏈変富娲诲姩锛坧id = 0锛� @@ -70,13 +81,31 @@ List<ActivityResponse> content = page.getContent().stream() .map(activity -> { ActivityResponse response = new ActivityResponse(activity); - // 璁剧疆鍙傝禌浜烘暟锛堝鏍搁�氳繃鐨勬姤鍚嶆暟閲忥級 - Long playerCountLong = activityPlayerRepository.countByActivityId(activity.getId()); - int playerCount = playerCountLong != null ? playerCountLong.intValue() : 0; + // 璁剧疆鍙傝禌浜烘暟锛堝彧缁熻绗竴闃舵鐨勫鏍搁�氳繃瀛﹀憳浜烘暟锛� + int playerCount = 0; + Activity firstStage = activityRepository.findFirstStageByActivityId(activity.getId()); + if (firstStage != null) { + // 濡傛灉鏈夌涓�闃舵锛岀粺璁$涓�闃舵鐨勫鏍搁�氳繃浜烘暟 + Long playerCountLong = activityPlayerRepository.countByStageIdAndState(firstStage.getId(), 1); + playerCount = playerCountLong != null ? playerCountLong.intValue() : 0; + } else { + // 濡傛灉娌℃湁闃舵锛岀粺璁℃椿鍔ㄦ湰韬殑瀹℃牳閫氳繃浜烘暟 + Long playerCountLong = activityPlayerRepository.countByActivityIdAndState(activity.getId(), 1); + playerCount = playerCountLong != null ? playerCountLong.intValue() : 0; + } response.setPlayerCount(playerCount); return response; }) .collect(Collectors.toList()); + + // 璋冭瘯锛氭墦鍗拌繑鍥炵粰鍓嶇鐨勫搷搴斿璞′腑鐨勬姤鍚嶆埅姝� + try { + content.stream().limit(10).forEach(r -> + log.info("Response(id={}, name={}) signupDeadline={}, matchTime={}", r.getId(), r.getName(), r.getSignupDeadline(), r.getMatchTime()) + ); + } catch (Exception e) { + log.warn("鎵撳嵃ActivityResponse鏃ュ織澶辫触: {}", e.getMessage()); + } return new PageResponse<>(content, page.getTotalElements(), page.getNumber(), page.getSize()); } @@ -176,6 +205,9 @@ // 淇濆瓨姣旇禌 activity = activityRepository.save(activity); + // 璁板綍鏃ュ織浠ヤ究璋冭瘯 + log.info("淇濆瓨姣旇禌鎴愬姛锛屾瘮璧汭D: {}, 姣旇禌鍚嶇О: {}", activity.getId(), activity.getName()); + // 濡傛灉鏄瘮璧涗笖鏈夐樁娈典俊鎭紝淇濆瓨闃舵 if (input.isMainActivity() && input.getStages() != null && !input.getStages().isEmpty()) { saveActivityStages(activity.getId(), input.getStages()); @@ -255,7 +287,11 @@ stage.setRatingSchemeId(activity.getRatingSchemeId()); } - activityRepository.save(stage); + // 淇濆瓨闃舵骞惰幏鍙栬嚜澧濱D + stage = activityRepository.save(stage); + + // 璁板綍鏃ュ織浠ヤ究璋冭瘯 + log.info("淇濆瓨闃舵鎴愬姛锛岄樁娈礗D: {}, 闃舵鍚嶇О: {}", stage.getId(), stage.getName()); } } @@ -264,14 +300,20 @@ */ private void saveActivityJudges(Long activityId, List<ActivityJudgeInput> judgeInputs) { if (judgeInputs == null || judgeInputs.isEmpty()) { + log.info("娌℃湁璇勫闇�瑕佷繚瀛橈紝姣旇禌ID: {}", activityId); return; } + + log.info("寮�濮嬩繚瀛樿瘎濮旓紝姣旇禌ID: {}, 璇勫鏁伴噺: {}", activityId, judgeInputs.size()); // 鑾峰彇姣旇禌鐨勬墍鏈夐樁娈碉紙濡傛灉鏈夌殑璇濓級 List<Activity> stages = activityRepository.findByPidAndStateOrderByCreateTimeAsc(activityId, 1); // 淇濆瓨璇勫鍏宠仈 for (ActivityJudgeInput judgeInput : judgeInputs) { + log.info("澶勭悊璇勫: ID={}, 濮撳悕={}, 闃舵IDs={}", + judgeInput.getJudgeId(), judgeInput.getJudgeName(), judgeInput.getStageIds()); + // 鍏堝垹闄よ璇勫鐨勭幇鏈夊叧鑱� activityJudgeRepository.deleteByActivityIdAndJudgeId(activityId, judgeInput.getJudgeId()); @@ -280,12 +322,14 @@ if (stages.isEmpty()) { // 姣旇禌娌℃湁闃舵锛岀洿鎺ュ叧鑱斿埌姣旇禌锛坰tage_id涓簄ull琛ㄧず鎵�鏈夐樁娈碉級 ActivityJudge activityJudge = new ActivityJudge(activityId, judgeInput.getJudgeId(), null); - activityJudgeRepository.save(activityJudge); + activityJudge = activityJudgeRepository.save(activityJudge); + log.info("淇濆瓨璇勫鍏宠仈鎴愬姛: 姣旇禌ID={}, 璇勫ID={}, 闃舵ID=null", activityId, judgeInput.getJudgeId()); } else { // 涓烘瘡涓樁娈靛垱寤哄叧鑱� for (Activity stage : stages) { ActivityJudge activityJudge = new ActivityJudge(activityId, judgeInput.getJudgeId(), stage.getId()); - activityJudgeRepository.save(activityJudge); + activityJudge = activityJudgeRepository.save(activityJudge); + log.info("淇濆瓨璇勫鍏宠仈鎴愬姛: 姣旇禌ID={}, 璇勫ID={}, 闃舵ID={}", activityId, judgeInput.getJudgeId(), stage.getId()); } } } else { @@ -294,7 +338,8 @@ // 濡傛灉stageId绛変簬褰撳墠姣旇禌ID锛岃〃绀鸿瘎濮旇礋璐f暣涓瘮璧涳紝stage_id璁句负null Long actualStageId = stageId.equals(activityId) ? null : stageId; ActivityJudge activityJudge = new ActivityJudge(activityId, judgeInput.getJudgeId(), actualStageId); - activityJudgeRepository.save(activityJudge); + activityJudge = activityJudgeRepository.save(activityJudge); + log.info("淇濆瓨璇勫鍏宠仈鎴愬姛: 姣旇禌ID={}, 璇勫ID={}, 闃舵ID={}", activityId, judgeInput.getJudgeId(), actualStageId); } } } @@ -324,6 +369,17 @@ } return false; } + + public boolean updateActivityState(Long id, Integer state) { + Optional<Activity> activityOpt = activityRepository.findById(id); + if (activityOpt.isPresent()) { + Activity activity = activityOpt.get(); + activity.setState(state); + activityRepository.save(activity); + return true; + } + return false; + } /** * 鑾峰彇鎵�鏈夋湁鏁堜富姣旇禌锛堢敤浜庝笅鎷夐�夋嫨锛� @@ -332,39 +388,23 @@ // 鑾峰彇鎵�鏈夌姸鎬佷负1鐨勬椿鍔� List<Activity> allActivities = activityRepository.findByStateOrderByPidAscNameAsc(1); - // 杩囨护锛氬彧淇濈暀姣旇禌闃舵锛坧id>0锛� + // 杩囨护锛氬彧淇濈暀涓绘瘮璧涳紙pid=0锛� List<Activity> filteredActivities = allActivities.stream() - .filter(activity -> activity.getPid() > 0) + .filter(activity -> activity.getPid() == 0) .collect(Collectors.toList()); - // 杞崲涓篈ctivityResponse锛屽寘鍚埗姣旇禌淇℃伅 + // 杞崲涓篈ctivityResponse List<ActivityResponse> result = filteredActivities.stream() .map(activity -> { ActivityResponse response = new ActivityResponse(activity); - // 璁剧疆鍙傝禌浜烘暟锛堝鏍搁�氳繃鐨勬姤鍚嶆暟閲忥級 + // 璁剧疆鍙傝禌浜烘暟锛堟墍鏈夐樁娈电殑鎶ュ悕鏁伴噺鎬诲拰锛� Long playerCountLong = activityPlayerRepository.countByActivityId(activity.getId()); int playerCount = playerCountLong != null ? playerCountLong.intValue() : 0; response.setPlayerCount(playerCount); - // 璁剧疆鐖舵瘮璧涗俊鎭� - Optional<Activity> parentOpt = activityRepository.findById(activity.getPid()); - if (parentOpt.isPresent()) { - Activity parent = parentOpt.get(); - response.setParent(new ActivityResponse(parent)); - } - return response; }) - .sorted((a, b) -> { - // 鍏堟寜鐖舵瘮璧涘悕绉版帓搴忥紝鍐嶆寜闃舵鍚嶇О鎺掑簭 - if (a.getParent() != null && b.getParent() != null) { - int parentCompare = a.getParent().getName().compareTo(b.getParent().getName()); - if (parentCompare != 0) { - return parentCompare; - } - } - return a.getName().compareTo(b.getName()); - }) + .sorted((a, b) -> a.getName().compareTo(b.getName())) .collect(Collectors.toList()); return result; @@ -388,6 +428,53 @@ } /** + * 鑾峰彇鎵�鏈夋瘮璧涢樁娈碉紙鐢ㄤ簬璇勫椤甸潰涓嬫媺閫夋嫨锛� + * 杩斿洖鎵�鏈夌姸鎬佷负1涓攑id>0鐨勬瘮璧涢樁娈� + */ + public List<ActivityResponse> findAllStagesForSelection() { + // 鑾峰彇鎵�鏈夌姸鎬佷负1鐨勬椿鍔� + List<Activity> allActivities = activityRepository.findByStateOrderByPidAscNameAsc(1); + + // 鍒嗙涓绘瘮璧涘拰闃舵 + Map<Long, Activity> parentActivitiesMap = allActivities.stream() + .filter(activity -> activity.getPid() == 0) + .collect(Collectors.toMap(Activity::getId, activity -> activity)); + + // 杩囨护锛氬彧淇濈暀姣旇禌闃舵锛坧id>0锛� + List<Activity> filteredStages = allActivities.stream() + .filter(activity -> activity.getPid() > 0) + .collect(Collectors.toList()); + + // 杞崲涓篈ctivityResponse + List<ActivityResponse> result = filteredStages.stream() + .map(activity -> { + ActivityResponse response = new ActivityResponse(activity); + // 璁剧疆鍙傝禌浜烘暟锛堝鏍搁�氳繃鐨勬姤鍚嶆暟閲忥級 + Long playerCountLong = activityPlayerRepository.countByActivityId(activity.getId()); + int playerCount = playerCountLong != null ? playerCountLong.intValue() : 0; + response.setPlayerCount(playerCount); + + // 鎵嬪姩璁剧疆parent淇℃伅 + Activity parentActivity = parentActivitiesMap.get(activity.getPid()); + if (parentActivity != null) { + ActivityResponse parentResponse = new ActivityResponse(parentActivity); + response.setParent(parentResponse); + } + + return response; + }) + .sorted((a, b) -> { + // 鍏堟寜鐖舵瘮璧汭D鎺掑簭锛屽啀鎸夐樁娈靛悕绉版帓搴� + int pidCompare = Long.compare(a.getPid(), b.getPid()); + if (pidCompare != 0) return pidCompare; + return a.getName().compareTo(b.getName()); + }) + .collect(Collectors.toList()); + + return result; + } + + /** * 缁熻姣旇禌鏁伴噺 */ public long countActiveActivities() { -- Gitblit v1.8.0