diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/coffeeTicket/controller/CoffeeTicketActivityController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/coffeeTicket/controller/CoffeeTicketActivityController.java index 969f430..eceeaba 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/coffeeTicket/controller/CoffeeTicketActivityController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/coffeeTicket/controller/CoffeeTicketActivityController.java @@ -15,6 +15,7 @@ import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; import javax.validation.Valid; @@ -49,6 +50,7 @@ public class CoffeeTicketActivityController { if (StrUtil.isNotBlank(title)) { cnd.and(Cnd.likeEX("title", title)); } + cnd.desc("createdAt"); Pagination pagination = coffeeTicketActivityService.listPage(pageForm.getPageNumber(), pageForm.getPageSize(), cnd); return Result.success(pagination); } @@ -67,4 +69,23 @@ public class CoffeeTicketActivityController { coffeeTicketActivityService.deleteActivity(id); return Result.success(); } + + /** + * 开启或关闭咖啡抢票活动。 + * + * @param id 活动ID,传 coffee_ticket_activity 表主键 + * @param enabled true 表示开启报名并推送首页,false 表示关闭报名并移除首页入口 + * @return Result,成功后前端刷新列表即可看到最新状态 + */ + @At + @SaCheckPermission("coffeeTicket.activity") + @Aop(TransAop.READ_COMMITTED) + public Result updateEnabled(@Param("id") @Valid String id, @Param("enabled") Boolean enabled) { + try { + coffeeTicketActivityService.updateEnabled(id, enabled); + return Result.success(Boolean.TRUE.equals(enabled) ? "开启成功" : "关闭成功"); + } catch (IllegalStateException e) { + return Result.error(e.getMessage()); + } + } } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/coffeeTicket/controller/CoffeeTicketNewController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/coffeeTicket/controller/CoffeeTicketNewController.java index 15f2786..1bcb518 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/coffeeTicket/controller/CoffeeTicketNewController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/coffeeTicket/controller/CoffeeTicketNewController.java @@ -35,7 +35,7 @@ public class CoffeeTicketNewController { /** * 保存咖啡抢票活动。 * - * @param activity 页面提交的活动配置,包含标题、封面、描述、活动开始/结束日期、可预约星期、票数、每日预约时间段、预约方式、活动地点和参与须知 + * @param activity 页面提交的活动配置,包含标题、封面、描述、活动开始/结束日期、可预约星期、票数、每日预约时间段、可报名人员范围、预约方式、活动地点和参与须知 * @return Result,成功时 data 为 CoffeeTicketActivity,可通过 data.id 获取活动ID */ @At @@ -46,8 +46,12 @@ public class CoffeeTicketNewController { if (validateResult != null) { return validateResult; } - CoffeeTicketActivity savedActivity = coffeeTicketActivityService.saveActivity(activity); - return Result.success(savedActivity); + try { + CoffeeTicketActivity savedActivity = coffeeTicketActivityService.saveActivity(activity); + return Result.success(savedActivity); + } catch (IllegalStateException e) { + return Result.error(e.getMessage()); + } } /** @@ -87,6 +91,9 @@ public class CoffeeTicketNewController { if (StrUtil.isBlank(activity.getReserveMode())) { return Result.error("请选择预约方式"); } + if (activity.getActivityGroupId() == null) { + return Result.error("请选择可报名人员范围"); + } return null; } } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/coffeeTicket/h5controller/H5CoffeeTicketDetailController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/coffeeTicket/h5controller/H5CoffeeTicketDetailController.java index 55c1ee3..139434f 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/coffeeTicket/h5controller/H5CoffeeTicketDetailController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/coffeeTicket/h5controller/H5CoffeeTicketDetailController.java @@ -45,6 +45,13 @@ public class H5CoffeeTicketDetailController { if (activity == null) { return Result.error("活动不存在"); } + if (!Boolean.TRUE.equals(activity.getEnabled())) { + return Result.error("活动未开启"); + } + String scopeMsg = coffeeTicketActivityService.checkH5ActivityUserScope(activity, SecurityUtil.getUserId()); + if (scopeMsg != null) { + return Result.error(scopeMsg); + } CoffeeTicketActivityH5DetailVO detailVO = BeanUtil.copyProperties(activity, CoffeeTicketActivityH5DetailVO.class); CoffeeTicketRecord userRecord = coffeeTicketRecordService.fetchLatestUserRecord(id, SecurityUtil.getUserId()); detailVO.setHasGrabbed(userRecord != null); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/coffeeTicket/models/CoffeeTicketActivity.java b/src/main/java/com/budwk/app/zhgh/dayofficework/coffeeTicket/models/CoffeeTicketActivity.java index 0480559..68db856 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/coffeeTicket/models/CoffeeTicketActivity.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/coffeeTicket/models/CoffeeTicketActivity.java @@ -1,12 +1,15 @@ package com.budwk.app.zhgh.dayofficework.coffeeTicket.models; import com.budwk.app.base.model.BaseModel; +import com.budwk.app.sys.models.Sys_home_activity; +import com.budwk.app.sys.services.SysHomeConvert; import lombok.Data; import lombok.EqualsAndHashCode; import org.nutz.dao.entity.annotation.ColDefine; import org.nutz.dao.entity.annotation.ColType; import org.nutz.dao.entity.annotation.Column; import org.nutz.dao.entity.annotation.Comment; +import org.nutz.dao.entity.annotation.Default; import org.nutz.dao.entity.annotation.Name; import org.nutz.dao.entity.annotation.Table; import org.nutz.dao.entity.annotation.TableMeta; @@ -21,7 +24,7 @@ import java.util.List; @Table("coffee_ticket_activity") @TableMeta("{'mysql-charset':'utf8mb4'}") @Comment("咖啡抢票活动表") -public class CoffeeTicketActivity extends BaseModel implements Serializable { +public class CoffeeTicketActivity extends BaseModel implements Serializable, SysHomeConvert { @Name @Comment("ID") @ColDefine(type = ColType.VARCHAR, width = 32) @@ -78,6 +81,17 @@ public class CoffeeTicketActivity extends BaseModel implements Serializable { @ColDefine(type = ColType.VARCHAR, width = 20) private String reserveMode; + @Column + @Comment("可报名人员范围分组ID,对应 activity_user_scope.groupId") + @ColDefine(type = ColType.INT, width = 32) + private Integer activityGroupId; + + @Column + @Comment("是否开启,开启后手机端可报名并推送首页") + @ColDefine(type = ColType.BOOLEAN) + @Default("0") + private Boolean enabled; + @Column @Comment("活动地点") @ColDefine(type = ColType.VARCHAR, width = 100) @@ -87,4 +101,21 @@ public class CoffeeTicketActivity extends BaseModel implements Serializable { @Comment("参与须知") @ColDefine(type = ColType.TEXT) private String notice; + + @Override + public Sys_home_activity covertToSysHomeActivity() { + Sys_home_activity sysHomeActivity = new Sys_home_activity(); + sysHomeActivity.setId(this.getId()); + sysHomeActivity.setName(this.getTitle()); + sysHomeActivity.setCover(this.getCover()); + sysHomeActivity.setContent(this.getDescription()); + sysHomeActivity.setUrl("/platform/coffeeTicket/activity"); + sysHomeActivity.setH5Url("/platform/h5/coffeeTicket/detail?id=" + this.getId()); + sysHomeActivity.setStartDate(this.getActivityStartDate()); + sysHomeActivity.setEndDate(this.getActivityEndDate()); + sysHomeActivity.setAllowUserGroupId(this.getActivityGroupId()); + sysHomeActivity.setEnable(Boolean.TRUE.equals(this.getEnabled())); + sysHomeActivity.setClassPath(this.getClass().getPackageName() + this.getClass().getName()); + return sysHomeActivity; + } } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/coffeeTicket/service/CoffeeTicketActivityService.java b/src/main/java/com/budwk/app/zhgh/dayofficework/coffeeTicket/service/CoffeeTicketActivityService.java index bb85e37..631213b 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/coffeeTicket/service/CoffeeTicketActivityService.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/coffeeTicket/service/CoffeeTicketActivityService.java @@ -25,6 +25,14 @@ public interface CoffeeTicketActivityService extends BaseService visibleGroupIds = buildCurrentUserVisibleGroupIds(cnd); + if (visibleGroupIds.isEmpty()) { + cnd.and("id", "=", "__none__"); + } else { + cnd.and("activityGroupId", "in", visibleGroupIds); + } cnd.desc("activityStartDate"); Pagination pagination = listPage(pageForm.getPageNumber(), pageForm.getPageSize(), cnd); List activityList = pagination.getList(CoffeeTicketActivity.class); @@ -93,6 +125,13 @@ public class CoffeeTicketActivityServiceImpl extends BaseServiceImpl,当前登录用户在人员范围内的活动分组ID列表 + */ + private List buildCurrentUserVisibleGroupIds(Cnd cnd) { + List groupIds = dao().query(CoffeeTicketActivity.class, cnd) + .stream() + .map(CoffeeTicketActivity::getActivityGroupId) + .filter(groupId -> groupId != null) + .distinct() + .toList(); + return activityBasicScopeService.filterGroupIdsByUser(groupIds, SecurityUtil.getUserId()); + } + + /** + * 同步移动端首页入口。活动开启时写入首页,关闭时删除首页入口。 + * + * @param activity 咖啡抢票活动,包含首页展示和跳转所需字段 + */ + private void syncHomeActivity(CoffeeTicketActivity activity) { + if (Boolean.TRUE.equals(activity.getEnabled())) { + dao().insertOrUpdate(activity.covertToSysHomeActivity()); + return; + } + dao().delete(Sys_home_activity.class, activity.getId()); + } + /** * 将 Java 星期值转换为页面保存的 1-7 格式,其中 1 表示周一、7 表示周日。 * diff --git a/src/main/resources/views/platform/zhgh/dayofficework/coffeeTicket/activity/index.html b/src/main/resources/views/platform/zhgh/dayofficework/coffeeTicket/activity/index.html index 60887cd..03f69db 100644 --- a/src/main/resources/views/platform/zhgh/dayofficework/coffeeTicket/activity/index.html +++ b/src/main/resources/views/platform/zhgh/dayofficework/coffeeTicket/activity/index.html @@ -32,6 +32,11 @@ layout("/layouts/platform.html"){ + + + - + - + + + + @@ -79,7 +92,8 @@ layout("/layouts/platform.html"){ "5": "周五", "6": "周六", "7": "周日" - } + }, + groupList: [] } }, methods: { @@ -101,6 +115,21 @@ layout("/layouts/platform.html"){ } return weekDays.map(item => this.weekMap[item] || item).join("、") }, + formatActivityGroup(activityGroupId) { + if (!activityGroupId) { + return "--" + } + const group = this.groupList.find(item => String(item.groupId) === String(activityGroupId)) + return group ? group.groupName : "--" + }, + loadGroupList() { + this.$axios.post("/platform/activity/basic/scope/getActivityUserScopeGroup", {}) + .then((res) => { + if (res.code === 0) { + this.groupList = res.data || [] + } + }) + }, pageData() { this.$axios.post(loc() + "/pageData", this.pageForm) .then((res) => { @@ -110,6 +139,27 @@ layout("/layouts/platform.html"){ } }) }, + updateEnabled(row, enabled) { + const actionText = enabled ? "开启" : "关闭" + this.$confirm("确定" + actionText + "该活动吗?", "提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning" + }).then(() => { + this.$axios.post("/platform/coffeeTicket/activity/updateEnabled", { + id: row.id, + enabled: enabled + }) + .then((res) => { + if (res.code === 0) { + this.$message.success(res.msg || actionText + "成功") + this.pageData() + } else { + this.$message.warning(res.msg) + } + }) + }).catch(() => {}) + }, onDelete(id) { this.$confirm("删除后该活动配置不可恢复,确定删除吗?", "提示", { confirmButtonText: "确定", @@ -129,6 +179,7 @@ layout("/layouts/platform.html"){ } }, created() { + this.loadGroupList() this.pageData() } }) diff --git a/src/main/resources/views/platform/zhgh/dayofficework/coffeeTicket/new/index.html b/src/main/resources/views/platform/zhgh/dayofficework/coffeeTicket/new/index.html index b527e38..86e2c8f 100644 --- a/src/main/resources/views/platform/zhgh/dayofficework/coffeeTicket/new/index.html +++ b/src/main/resources/views/platform/zhgh/dayofficework/coffeeTicket/new/index.html @@ -110,7 +110,8 @@ layout("/layouts/platform.html"){

创建咖啡抢票活动