diff --git a/.gitignore b/.gitignore
index 9193b5f3..7fbc1b8a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -324,4 +324,5 @@ docs/变更管理/
移动端违纪记录模块开发规范.md
.playwright-mcp/
查找界面中涉及到的权限字符.md
-docs/部署文档/nginx配置/hzdyjsweb.camasort.com.conf
\ No newline at end of file
+docs/部署文档/nginx配置/hzdyjsweb.camasort.com.conf
+首页完善的提示词.md
\ No newline at end of file
diff --git a/backend/pom.xml b/backend/pom.xml
index c5e7d7cf..3f903412 100644
--- a/backend/pom.xml
+++ b/backend/pom.xml
@@ -31,7 +31,7 @@
2.2.7
4.3.1
1.5.0
- 1.4.8
+ 1.5.0
0.2.0
1.18.36
1.80
diff --git a/backend/ruoyi-admin/pom.xml b/backend/ruoyi-admin/pom.xml
index 2e838024..e8ab5226 100644
--- a/backend/ruoyi-admin/pom.xml
+++ b/backend/ruoyi-admin/pom.xml
@@ -157,11 +157,11 @@
-
+
de.codecentric
diff --git a/backend/ruoyi-modules/pom.xml b/backend/ruoyi-modules/pom.xml
index 17b30897..c999a351 100644
--- a/backend/ruoyi-modules/pom.xml
+++ b/backend/ruoyi-modules/pom.xml
@@ -25,7 +25,7 @@
ruoyi-jcbt
ruoyi-bzrkh
ruoyi-xskh
-
+ ruoyi-stgl
ruoyi-modules
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglActivityAttendanceController.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglActivityAttendanceController.java
index 8fa069e1..6fba17bc 100644
--- a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglActivityAttendanceController.java
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglActivityAttendanceController.java
@@ -22,6 +22,7 @@ import org.dromara.stgl.domain.bo.StglActivityAttendanceBo;
import org.dromara.stgl.service.IStglActivityAttendanceService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper;
+import org.apache.commons.lang3.StringUtils;
/**
* 活动考勤签到
@@ -120,6 +121,28 @@ public class StglActivityAttendanceController extends BaseController {
return R.ok(stglActivityAttendanceService.queryByActivityAndUser(activityId, userId));
}
+ /**
+ * 根据活动ID和用户ID查询所有签到记录(支持多次签到)
+ */
+ @SaCheckPermission("stgl:activityAttendance:query")
+ @GetMapping("/getAllByActivityAndUser")
+ public R> getAllByActivityAndUser(
+ @RequestParam("activityId") Long activityId,
+ @RequestParam(value = "userId", required = false) Long userId,
+ @RequestParam(value = "studentNo", required = false) String studentNo) {
+
+ List list;
+ if (userId != null) {
+ list = stglActivityAttendanceService.queryAllByActivityAndUser(activityId, userId);
+ } else if (StringUtils.isNotBlank(studentNo)) {
+ list = stglActivityAttendanceService.queryAllByActivityAndStudentNo(activityId, studentNo);
+ } else {
+ return R.fail("请提供用户ID或学号");
+ }
+
+ return R.ok(list);
+ }
+
/**
* 用户签到
*/
@@ -128,8 +151,7 @@ public class StglActivityAttendanceController extends BaseController {
@RepeatSubmit()
@PostMapping("/signIn")
public R signIn(@Validated @RequestBody StglActivityAttendanceBo bo) {
- // 设置当前登录用户ID
- bo.setUserId(LoginHelper.getUserId());
+ // 移除重复设置userId,让Service层通过学号查找用户ID
return toAjax(stglActivityAttendanceService.signIn(bo));
}
@@ -141,8 +163,7 @@ public class StglActivityAttendanceController extends BaseController {
@RepeatSubmit()
@PostMapping("/signOut")
public R signOut(@Validated @RequestBody StglActivityAttendanceBo bo) {
- // 设置当前登录用户ID
- bo.setUserId(LoginHelper.getUserId());
+ // 移除重复设置userId,让Service层通过学号查找用户ID
return toAjax(stglActivityAttendanceService.signOut(bo));
}
}
\ No newline at end of file
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglActivityRegisterController.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglActivityRegisterController.java
index 73380af9..e8f65219 100644
--- a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglActivityRegisterController.java
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglActivityRegisterController.java
@@ -15,7 +15,7 @@ import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.web.core.BaseController;
-import org.dromara.stgl.domain.bo.BatchApprovalBo;
+import org.dromara.stgl.domain.bo.StglBatchApprovalBo;
import org.dromara.stgl.domain.bo.StglActivityRegistrationBo;
import org.dromara.stgl.domain.vo.StglActivityRegistrationVo;
import org.dromara.stgl.service.IStglActivityRegistrationService;
@@ -120,7 +120,7 @@ public class StglActivityRegisterController extends BaseController {
@SaCheckPermission("stgl:activityRegister:approve")
@Log(title = "活动报名批量审核", businessType = BusinessType.UPDATE)
@PostMapping("/batchApprove")
- public R batchApprove(@Validated @RequestBody BatchApprovalBo batchApprovalBo) {
+ public R batchApprove(@Validated @RequestBody StglBatchApprovalBo batchApprovalBo) {
return toAjax(stglActivityRegistrationService.batchApprove(batchApprovalBo.getIds(), batchApprovalBo.getApprovalStatus(), batchApprovalBo.getApprovalRemark(), LoginHelper.getUserId()));
}
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglClubController.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglClubController.java
index f0bed731..da516a50 100644
--- a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglClubController.java
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglClubController.java
@@ -228,6 +228,21 @@ public class StglClubController extends BaseController {
return toAjax(stglClubService.changeStatus(id, status));
}
+ /**
+ * 修改社团报名开启状态
+ */
+ @Operation(summary = "修改社团报名开启状态")
+ @SaCheckPermission("stgl:club:edit")
+ @Log(title = "社团信息", businessType = BusinessType.UPDATE)
+ @PutMapping("/changeSighOpenStatus")
+ @Parameters({
+ @Parameter(name = "id", description = "社团ID", required = true),
+ @Parameter(name = "sighOpen", description = "报名开启状态(Y/N)", required = true)
+ })
+ public R changeSighOpenStatus(@RequestParam Long id, @RequestParam String sighOpen) {
+ return toAjax(stglClubService.changeSighOpenStatus(id, sighOpen));
+ }
+
/**
* 修复已存在社团的成员记录
* 为缺失社长、副社长成员记录的社团补充相应记录
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglVolunteerMemberController.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglVolunteerMemberController.java
index 1c05da0f..aef0ef40 100644
--- a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglVolunteerMemberController.java
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglVolunteerMemberController.java
@@ -92,7 +92,7 @@ public class StglVolunteerMemberController extends BaseController {
bo.setMemberType(2); // 志愿者成员
// 如果前端没有传递roleType,设置默认值为1(队员)
if (bo.getRoleType() == null) {
- bo.setRoleType(1);
+ bo.setRoleType("1");
}
return toAjax(stglMemberService.insertByBo(bo));
}
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglVolunteerTeamController.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglVolunteerTeamController.java
index 5ba798d2..0ec9dc78 100644
--- a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglVolunteerTeamController.java
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/controller/StglVolunteerTeamController.java
@@ -302,4 +302,14 @@ public class StglVolunteerTeamController extends BaseController {
return toAjax(stglVolunteerTeamService.transferVolunteerTeam(id, newLeaderUserId));
}
+
+ /**
+ * 修改志愿者团队报名开启状态
+ */
+ @SaCheckPermission("stgl:volunteerTeam:edit")
+ @Log(title = "志愿者团队报名状态变更", businessType = BusinessType.UPDATE)
+ @PutMapping("/changeSighOpenStatus")
+ public R changeSighOpenStatus(@RequestParam Long id, @RequestParam String sighOpen) {
+ return toAjax(stglVolunteerTeamService.changeSighOpenStatus(id, sighOpen));
+ }
}
\ No newline at end of file
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/StglActivityAttendance.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/StglActivityAttendance.java
index 97a72de4..35267d56 100644
--- a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/StglActivityAttendance.java
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/StglActivityAttendance.java
@@ -126,4 +126,10 @@ public class StglActivityAttendance extends TenantEntity {
* 签到状态(0-未签到 1-已签到 2-已签退)
*/
private Integer overallStatus;
+
+ /**
+ * 删除标志(0代表存在 1代表删除)
+ */
+ @TableLogic(value = "0", delval = "1")
+ private Integer deleted;
}
\ No newline at end of file
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/StglClub.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/StglClub.java
index a366a298..a6d3b4e9 100644
--- a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/StglClub.java
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/StglClub.java
@@ -192,6 +192,11 @@ public class StglClub extends TenantEntity {
*/
private Integer status;
+ /**
+ * 开启报名(Y是 N否)
+ */
+ private String sighOpen;
+
/**
* 备注
*/
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/StglMember.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/StglMember.java
index 910d625f..a3b38636 100644
--- a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/StglMember.java
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/StglMember.java
@@ -53,9 +53,9 @@ public class StglMember extends TenantEntity {
private String studentName;
/**
- * 角色类型(1-社长 2-副社长 3-部长 4-普通成员)
+ * 角色类型(社长、副社长、部长、普通成员)
*/
- private Integer roleType;
+ private String roleType;
/**
* 加入时间
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/StglVolunteerTeam.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/StglVolunteerTeam.java
index 92ae8960..52004aa2 100644
--- a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/StglVolunteerTeam.java
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/StglVolunteerTeam.java
@@ -127,4 +127,9 @@ public class StglVolunteerTeam extends TenantEntity {
*/
private Integer status;
+ /**
+ * 报名开启状态(Y-开启 N-关闭)
+ */
+ private String sighOpen;
+
}
\ No newline at end of file
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/bo/BatchApprovalBo.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/bo/BatchApprovalBo.java
deleted file mode 100644
index 594236f1..00000000
--- a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/bo/BatchApprovalBo.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.dromara.stgl.domain.bo;
-
-import lombok.Data;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
-import jakarta.validation.constraints.Min;
-import jakarta.validation.constraints.Max;
-import jakarta.validation.constraints.Size;
-
-import java.util.List;
-
-/**
- * 批量审核请求对象
- *
- * @author ruoyi
- * @date 2025-01-31
- */
-@Data
-public class BatchApprovalBo {
-
- /**
- * 报名ID数组
- */
- @NotEmpty(message = "审核ID列表不能为空")
- private List ids;
-
- /**
- * 审核状态 1-通过 2-驳回
- */
- @NotNull(message = "审核状态不能为空")
- @Min(value = 1, message = "审核状态值无效")
- @Max(value = 2, message = "审核状态值无效")
- private Integer approvalStatus;
-
- /**
- * 审核意见
- */
- @Size(max = 500, message = "审核意见不能超过500个字符")
- private String approvalRemark;
-}
\ No newline at end of file
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/bo/StglClubBo.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/bo/StglClubBo.java
index 12792990..87540776 100644
--- a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/bo/StglClubBo.java
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/bo/StglClubBo.java
@@ -230,6 +230,11 @@ public class StglClubBo extends BaseEntity {
*/
private Integer status;
+ /**
+ * 开启报名(Y是 N否)
+ */
+ private String sighOpen;
+
/**
* 备注
*/
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/bo/StglMemberBo.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/bo/StglMemberBo.java
index 8799e672..6c63606d 100644
--- a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/bo/StglMemberBo.java
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/bo/StglMemberBo.java
@@ -64,9 +64,7 @@ public class StglMemberBo extends BaseEntity {
/**
* 角色类型(社团:1-社长 2-副社长 3-部长 4-普通成员;志愿者:0-队长 1-队员)
*/
- @Min(value = 0, message = "角色类型值无效")
- @Max(value = 4, message = "角色类型值无效")
- private Integer roleType;
+ private String roleType;
/**
* 加入时间
@@ -76,7 +74,7 @@ public class StglMemberBo extends BaseEntity {
/**
* 状态(0-正常 1-停用)
*/
- private Integer status;
+ private String status;
/**
* 备注
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/bo/StglVolunteerTeamBo.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/bo/StglVolunteerTeamBo.java
index c4e348de..83d66b1c 100644
--- a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/bo/StglVolunteerTeamBo.java
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/bo/StglVolunteerTeamBo.java
@@ -150,4 +150,10 @@ public class StglVolunteerTeamBo extends BaseEntity {
*/
private Integer status;
+ /**
+ * 报名开启状态(Y-开启 N-关闭)
+ */
+ @Pattern(regexp = "^[YN]$", message = "报名开启状态只能为Y或N")
+ private String sighOpen;
+
}
\ No newline at end of file
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/vo/StglClubRegisterVo.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/vo/StglClubRegisterVo.java
index cb94fcb1..01cf1ee3 100644
--- a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/vo/StglClubRegisterVo.java
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/vo/StglClubRegisterVo.java
@@ -238,4 +238,9 @@ public class StglClubRegisterVo implements Serializable {
*/
private String remark;
+ /**
+ * 开启报名(Y是 N否)
+ */
+ private String sighOpen;
+
}
\ No newline at end of file
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/vo/StglClubVo.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/vo/StglClubVo.java
index 1af9f43e..40650f20 100644
--- a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/vo/StglClubVo.java
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/vo/StglClubVo.java
@@ -226,6 +226,12 @@ public class StglClubVo implements Serializable {
@ExcelProperty(value = "状态")
private Integer status;
+ /**
+ * 开启报名(Y是 N否)
+ */
+ @ExcelProperty(value = "开启报名")
+ private String sighOpen;
+
/**
* 备注
*/
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/vo/StglMemberVo.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/vo/StglMemberVo.java
index 89ace271..ea54f2b5 100644
--- a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/vo/StglMemberVo.java
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/vo/StglMemberVo.java
@@ -112,7 +112,7 @@ public class StglMemberVo implements Serializable {
/**
* 角色类型(1-社长 2-副社长 3-成员)
*/
- private Integer roleType;
+ private String roleType;
/**
* 角色类型名称
@@ -130,7 +130,7 @@ public class StglMemberVo implements Serializable {
/**
* 状态(0-正常 1-停用)
*/
- private Integer status;
+ private String status;
/**
* 状态名称
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/vo/StglVolunteerTeamVo.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/vo/StglVolunteerTeamVo.java
index 0db73c57..77126384 100644
--- a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/vo/StglVolunteerTeamVo.java
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/domain/vo/StglVolunteerTeamVo.java
@@ -149,6 +149,12 @@ public class StglVolunteerTeamVo implements Serializable {
@ExcelProperty(value = "状态")
private Integer status;
+ /**
+ * 报名开启状态(Y-开启 N-关闭)
+ */
+ @ExcelProperty(value = "报名开启状态")
+ private String sighOpen;
+
/**
* 创建者
*/
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/listener/StglMemberImportListener.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/listener/StglMemberImportListener.java
index a49c672c..0cb27563 100644
--- a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/listener/StglMemberImportListener.java
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/listener/StglMemberImportListener.java
@@ -273,10 +273,10 @@ public class StglMemberImportListener extends AnalysisEventListener selectAllByActivityAndUser(@Param("activityId") Long activityId, @Param("userId") Long userId);
+
/**
* 根据ID查询活动考勤签到详情(关联查询活动信息)
*
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/mapper/StglMemberMapper.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/mapper/StglMemberMapper.java
index fcb1ccac..7deb36ce 100644
--- a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/mapper/StglMemberMapper.java
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/mapper/StglMemberMapper.java
@@ -36,17 +36,19 @@ public interface StglMemberMapper extends BaseMapperPlus selectMemberWithUserInfo(@Param("memberType") Integer memberType,
@Param("relationId") Long relationId,
@Param("studentNo") String studentNo,
@Param("studentName") String studentName,
- @Param("roleType") Integer roleType,
- @Param("status") Integer status,
+ @Param("roleType") String roleType,
+ @Param("status") String status,
@Param("clubName") String clubName,
@Param("teamName") String teamName,
- @Param("userId") Long userId);
+ @Param("userId") Long userId,
+ @Param("params") java.util.Map params);
/**
* 检查用户是否已加入某个社团/志愿者队伍
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/service/IStglActivityAttendanceService.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/service/IStglActivityAttendanceService.java
index cf500bce..bd437768 100644
--- a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/service/IStglActivityAttendanceService.java
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/service/IStglActivityAttendanceService.java
@@ -56,6 +56,16 @@ public interface IStglActivityAttendanceService {
*/
StglActivityAttendanceVo queryByActivityAndUser(Long activityId, Long userId);
+ /**
+ * 根据活动ID和用户ID查询所有签到记录(支持多次签到)
+ */
+ List queryAllByActivityAndUser(Long activityId, Long userId);
+
+ /**
+ * 根据活动ID和学号查询所有签到记录(支持多次签到)
+ */
+ List queryAllByActivityAndStudentNo(Long activityId, String studentNo);
+
/**
* 用户签到
*/
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/service/IStglClubService.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/service/IStglClubService.java
index 02397e69..ef0e6cb8 100644
--- a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/service/IStglClubService.java
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/service/IStglClubService.java
@@ -106,6 +106,15 @@ public interface IStglClubService {
*/
Boolean changeStatus(Long id, Integer status);
+ /**
+ * 修改社团报名开启状态
+ *
+ * @param id 社团ID
+ * @param sighOpen 报名开启状态(Y/N)
+ * @return 是否操作成功
+ */
+ Boolean changeSighOpenStatus(Long id, String sighOpen);
+
/**
* 修复所有已存在社团的成员记录
* 为那些没有对应成员记录的社长和副社长补充成员记录
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/service/IStglVolunteerTeamService.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/service/IStglVolunteerTeamService.java
index 63e35e46..92954480 100644
--- a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/service/IStglVolunteerTeamService.java
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/service/IStglVolunteerTeamService.java
@@ -130,4 +130,13 @@ public interface IStglVolunteerTeamService {
*/
Integer fixExistingTeamLeaderRecords();
+ /**
+ * 修改志愿者团队报名开启状态
+ *
+ * @param id 团队ID
+ * @param sighOpen 报名开启状态(Y/N)
+ * @return 是否修改成功
+ */
+ Boolean changeSighOpenStatus(Long id, String sighOpen);
+
}
\ No newline at end of file
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/service/impl/StglActivityAttendanceServiceImpl.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/service/impl/StglActivityAttendanceServiceImpl.java
index 1fc0408a..266badf7 100644
--- a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/service/impl/StglActivityAttendanceServiceImpl.java
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/service/impl/StglActivityAttendanceServiceImpl.java
@@ -15,11 +15,14 @@ import org.dromara.stgl.domain.vo.StglActivityAttendanceVo;
import org.dromara.stgl.domain.StglActivityAttendance;
import org.dromara.stgl.mapper.StglActivityAttendanceMapper;
import org.dromara.stgl.service.IStglActivityAttendanceService;
+import org.dromara.system.domain.SysUser;
+import org.dromara.system.mapper.SysUserMapper;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.Date;
+import java.util.ArrayList;
/**
* 活动考勤签到Service业务层处理
@@ -32,6 +35,7 @@ import java.util.Date;
public class StglActivityAttendanceServiceImpl implements IStglActivityAttendanceService {
private final StglActivityAttendanceMapper baseMapper;
+ private final SysUserMapper sysUserMapper;
/**
* 查询活动考勤签到
@@ -141,29 +145,51 @@ public class StglActivityAttendanceServiceImpl implements IStglActivityAttendanc
return baseMapper.selectByActivityAndUser(activityId, userId);
}
+ /**
+ * 根据活动ID和用户ID查询所有签到记录(支持多次签到)
+ */
+ @Override
+ public List queryAllByActivityAndUser(Long activityId, Long userId) {
+ return baseMapper.selectAllByActivityAndUser(activityId, userId);
+ }
+
+ /**
+ * 根据活动ID和学号查询所有签到记录(支持多次签到)
+ */
+ @Override
+ public List queryAllByActivityAndStudentNo(Long activityId, String studentNo) {
+ // 先通过学号获取用户ID
+ Long userId = getUserIdByStudentNo(studentNo);
+ if (userId == null) {
+ return new ArrayList<>();
+ }
+ return baseMapper.selectAllByActivityAndUser(activityId, userId);
+ }
+
/**
* 用户签到
*/
@Override
public Boolean signIn(StglActivityAttendanceBo bo) {
- // 检查是否已存在签到记录
- StglActivityAttendanceVo existingRecord = queryByActivityAndUser(bo.getActivityId(), bo.getUserId());
-
- if (existingRecord != null) {
- // 如果已存在记录,更新签到信息
- bo.setId(existingRecord.getId());
- bo.setSignInTime(new Date());
- bo.setSignInStatus(1);
- bo.setOverallStatus(1); // 已签到
- return updateByBo(bo);
- } else {
- // 如果不存在记录,新增签到记录
- bo.setSignInTime(new Date());
- bo.setSignInStatus(1);
- bo.setSignOutStatus(0);
- bo.setOverallStatus(1); // 已签到
- return insertByBo(bo);
+ // 通过学号查找用户ID
+ Long userId = getUserIdByStudentNo(bo.getStudentNo());
+ if (userId == null) {
+ throw new RuntimeException("未找到对应的用户信息");
}
+
+ // 移除重复签到检查,允许每次签到都生成新记录
+ // 无论之前是否有签到记录,都创建新的签到记录
+ bo.setUserId(userId);
+ bo.setSignInTime(new Date());
+ bo.setSignInStatus(1);
+ bo.setSignOutStatus(0);
+ bo.setOverallStatus(1); // 已签到
+
+ // 设置基础字段
+ bo.setCreateTime(new Date());
+ bo.setUpdateTime(new Date());
+
+ return insertByBo(bo);
}
/**
@@ -171,18 +197,82 @@ public class StglActivityAttendanceServiceImpl implements IStglActivityAttendanc
*/
@Override
public Boolean signOut(StglActivityAttendanceBo bo) {
- // 必须先签到才能签退
- StglActivityAttendanceVo existingRecord = queryByActivityAndUser(bo.getActivityId(), bo.getUserId());
-
- if (existingRecord == null || existingRecord.getSignInStatus() != 1) {
- throw new RuntimeException("请先完成签到");
+ // 通过学号查找用户ID
+ Long userId = getUserIdByStudentNo(bo.getStudentNo());
+ if (userId == null) {
+ throw new RuntimeException("未找到对应的用户信息");
}
- // 更新签退信息
- bo.setId(existingRecord.getId());
- bo.setSignOutTime(new Date());
- bo.setSignOutStatus(1);
- bo.setOverallStatus(2); // 已签退
- return updateByBo(bo);
+ // 如果提供了记录ID,直接更新该记录
+ if (bo.getId() != null) {
+ StglActivityAttendance record = baseMapper.selectById(bo.getId());
+ if (record == null) {
+ throw new RuntimeException("没有找到指定的签到记录");
+ }
+
+ // 检查是否可以签退
+ if (record.getSignInStatus() != 1) {
+ throw new RuntimeException("您还未完成签到,不能签退");
+ }
+
+ if (record.getSignOutStatus() == 1) {
+ throw new RuntimeException("您已经完成签退,无需重复签退");
+ }
+
+ // 更新签退信息
+ bo.setUserId(userId);
+ bo.setSignOutTime(new Date());
+ bo.setSignOutStatus(1);
+ bo.setOverallStatus(2); // 已签退
+ return updateByBo(bo);
+ } else {
+ // 如果没有提供记录ID,查找最新的未完成签到记录
+ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
+ queryWrapper.eq(StglActivityAttendance::getActivityId, bo.getActivityId());
+ queryWrapper.eq(StglActivityAttendance::getUserId, userId);
+ queryWrapper.orderByDesc(StglActivityAttendance::getCreateTime);
+ queryWrapper.last("LIMIT 1");
+
+ StglActivityAttendance record = baseMapper.selectOne(queryWrapper);
+
+ if (record == null) {
+ throw new RuntimeException("没有找到签到记录,请先完成签到");
+ }
+
+ // 检查是否可以签退
+ if (record.getSignInStatus() != 1) {
+ throw new RuntimeException("您还未完成签到,不能签退");
+ }
+
+ if (record.getSignOutStatus() == 1) {
+ throw new RuntimeException("您已经完成签退,无需重复签退");
+ }
+
+ // 更新签退信息
+ bo.setId(record.getId());
+ bo.setUserId(userId);
+ bo.setSignOutTime(new Date());
+ bo.setSignOutStatus(1);
+ bo.setOverallStatus(2); // 已签退
+ return updateByBo(bo);
+ }
+ }
+
+ /**
+ * 根据学号获取用户ID
+ */
+ private Long getUserIdByStudentNo(String studentNo) {
+ if (StringUtils.isBlank(studentNo)) {
+ return null;
+ }
+
+ // 这里需要根据实际的用户表结构来查询
+ // 假设用户表是sys_user,学号字段是user_name
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
+ wrapper.eq(SysUser::getUserName, studentNo);
+ wrapper.eq(SysUser::getDelFlag, "0");
+
+ SysUser user = sysUserMapper.selectOne(wrapper);
+ return user != null ? user.getUserId() : null;
}
}
\ No newline at end of file
diff --git a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/service/impl/StglActivityServiceImpl.java b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/service/impl/StglActivityServiceImpl.java
index 1347b651..b242ec9e 100644
--- a/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/service/impl/StglActivityServiceImpl.java
+++ b/backend/ruoyi-modules/ruoyi-stgl/src/main/java/org/dromara/stgl/service/impl/StglActivityServiceImpl.java
@@ -21,16 +21,27 @@ import org.dromara.stgl.domain.bo.StglActivityBo;
import org.dromara.stgl.domain.vo.StglActivityVo;
import org.dromara.stgl.mapper.StglActivityMapper;
import org.dromara.stgl.service.IStglActivityService;
+import org.dromara.stgl.utils.AdvisorRoleAssigner;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
+import lombok.extern.slf4j.Slf4j;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+import org.dromara.common.json.utils.JsonUtils;
+import com.fasterxml.jackson.core.type.TypeReference;
+import org.dromara.stgl.domain.StglClub;
+import org.dromara.stgl.domain.StglVolunteerTeam;
+import org.dromara.stgl.mapper.StglClubMapper;
+import org.dromara.stgl.mapper.StglVolunteerTeamMapper;
/**
* 活动信息Service业务层处理
@@ -38,11 +49,15 @@ import java.util.concurrent.atomic.AtomicInteger;
* @author ruoyi
* @date 2025-01-07
*/
+@Slf4j
@RequiredArgsConstructor
@Service
public class StglActivityServiceImpl extends ServiceImpl implements IStglActivityService {
private final StglActivityMapper baseMapper;
+ private final AdvisorRoleAssigner advisorRoleAssigner;
+ private final StglClubMapper stglClubMapper;
+ private final StglVolunteerTeamMapper stglVolunteerTeamMapper;
/**
* 查询活动信息
@@ -57,6 +72,9 @@ public class StglActivityServiceImpl extends ServiceImpl queryPageList(StglActivityBo bo, PageQuery pageQuery) {
+ // 应用数据权限控制
+ applyDataScope(bo);
+
// 转换为实体对象,使用自定义SQL查询(包含关联信息)
StglActivity activity = BeanUtil.toBean(bo, StglActivity.class);
Page result = baseMapper.selectVoPage(pageQuery.build(), activity);
@@ -68,6 +86,9 @@ public class StglActivityServiceImpl extends ServiceImpl queryList(StglActivityBo bo) {
+ // 应用数据权限控制
+ applyDataScope(bo);
+
// 转换为实体对象,使用自定义SQL查询(包含关联信息)
StglActivity activity = BeanUtil.toBean(bo, StglActivity.class);
List list = baseMapper.selectVoList(activity);
@@ -215,6 +236,8 @@ public class StglActivityServiceImpl extends ServiceImpl 0;
if (flag) {
bo.setId(add.getId());
+ // 为指导老师分配角色
+ assignAdvisorRoles(add);
}
return flag;
}
@@ -227,7 +250,21 @@ public class StglActivityServiceImpl extends ServiceImpl 0;
+
+ // 获取更新前的活动信息,用于比较指导老师变化
+ StglActivity oldActivity = null;
+ if (update.getId() != null) {
+ oldActivity = baseMapper.selectById(update.getId());
+ }
+
+ boolean updateResult = baseMapper.updateById(update) > 0;
+
+ if (updateResult) {
+ // 处理指导老师角色分配
+ handleAdvisorRoleAssignment(oldActivity, update);
+ }
+
+ return updateResult;
}
/**
@@ -382,4 +419,219 @@ public class StglActivityServiceImpl extends ServiceImpl 0;
}
+ /**
+ * 为指导老师分配角色
+ *
+ * @param activity 活动信息
+ */
+ private void assignAdvisorRoles(StglActivity activity) {
+ try {
+ List advisorUserIds = extractAdvisorUserIds(activity);
+ if (!advisorUserIds.isEmpty()) {
+ advisorRoleAssigner.assignAdvisorRole(advisorUserIds);
+ log.info("成功为活动 {} 的指导老师分配角色,指导老师数量: {}", activity.getActivityName(), advisorUserIds.size());
+ }
+ } catch (Exception e) {
+ log.error("为活动 {} 的指导老师分配角色时发生异常: {}", activity.getActivityName(), e.getMessage());
+ // 不抛出异常,避免影响主业务流程
+ }
+ }
+
+ /**
+ * 处理指导老师角色分配(更新时使用)
+ *
+ * @param oldActivity 更新前的活动信息
+ * @param newActivity 更新后的活动信息
+ */
+ private void handleAdvisorRoleAssignment(StglActivity oldActivity, StglActivity newActivity) {
+ try {
+ // 获取更新前后的指导老师用户ID列表
+ List oldAdvisorUserIds = oldActivity != null ? extractAdvisorUserIds(oldActivity) : new ArrayList<>();
+ List newAdvisorUserIds = extractAdvisorUserIds(newActivity);
+
+ // 找出新增的指导老师
+ List addedAdvisorUserIds = newAdvisorUserIds.stream()
+ .filter(id -> !oldAdvisorUserIds.contains(id))
+ .collect(Collectors.toList());
+
+ // 找出移除的指导老师
+ List removedAdvisorUserIds = oldAdvisorUserIds.stream()
+ .filter(id -> !newAdvisorUserIds.contains(id))
+ .collect(Collectors.toList());
+
+ // 为新指导老师分配角色
+ if (!addedAdvisorUserIds.isEmpty()) {
+ advisorRoleAssigner.assignAdvisorRole(addedAdvisorUserIds);
+ log.info("活动 {} 新增指导老师,成功分配角色,数量: {}", newActivity.getActivityName(), addedAdvisorUserIds.size());
+ }
+
+ // 移除旧指导老师的角色
+ if (!removedAdvisorUserIds.isEmpty()) {
+ advisorRoleAssigner.removeAdvisorRoles(removedAdvisorUserIds);
+ log.info("活动 {} 移除指导老师,成功移除角色,数量: {}", newActivity.getActivityName(), removedAdvisorUserIds.size());
+ }
+ } catch (Exception e) {
+ log.error("处理活动 {} 的指导老师角色分配时发生异常: {}", newActivity.getActivityName(), e.getMessage());
+ // 不抛出异常,避免影响主业务流程
+ }
+ }
+
+ /**
+ * 从活动信息中提取指导老师用户ID列表
+ *
+ * @param activity 活动信息
+ * @return 指导老师用户ID列表
+ */
+ private List extractAdvisorUserIds(StglActivity activity) {
+ List advisorUserIds = new ArrayList<>();
+
+ try {
+ // 从JSON字段读取指导老师数据
+ if (StringUtils.isNotBlank(activity.getInstructors())) {
+ List