From e179abf716cc62cb81763966e264f868d8095ace Mon Sep 17 00:00:00 2001 From: zhouhefeng Date: Fri, 3 Apr 2026 10:33:55 +0800 Subject: [PATCH] commit --- ...rainSignUpAnnualLimitConfigController.java | 76 ++++++++++++++++ .../models/TrainSignUpAnnualLimitConfig.java | 49 ++++++++++ .../TrainSignUpAnnualLimitConfigService.java | 40 +++++++++ ...ainSignUpAnnualLimitConfigServiceImpl.java | 80 +++++++++++++++++ .../trainSignUp/annualLimit/index.html | 90 +++++++++++++++++++ 5 files changed, 335 insertions(+) create mode 100644 src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpAnnualLimitConfigController.java create mode 100644 src/main/java/com/budwk/app/zhgh/activity/trainSignUp/models/TrainSignUpAnnualLimitConfig.java create mode 100644 src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/TrainSignUpAnnualLimitConfigService.java create mode 100644 src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/impl/TrainSignUpAnnualLimitConfigServiceImpl.java create mode 100644 src/main/resources/views/platform/zhgh/activity/trainSignUp/annualLimit/index.html diff --git a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpAnnualLimitConfigController.java b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpAnnualLimitConfigController.java new file mode 100644 index 00000000..ff8daf10 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpAnnualLimitConfigController.java @@ -0,0 +1,76 @@ +package com.budwk.app.zhgh.activity.trainSignUp.controller.manage; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.budwk.app.base.annotation.SLog; +import com.budwk.app.base.result.Result; +import com.budwk.app.zhgh.activity.trainSignUp.models.TrainSignUpAnnualLimitConfig; +import com.budwk.app.zhgh.activity.trainSignUp.service.TrainSignUpAnnualLimitConfigService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.json.Json; +import org.nutz.lang.Lang; +import org.nutz.lang.util.NutMap; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; + +import java.util.ArrayList; +import java.util.List; + +@IocBean +@Ok("json:full") +@Api(tags = "活动类型年度报名次数配置") +@At("/platform/trainSignUp/annualLimit") +public class TrainSignUpAnnualLimitConfigController { + + @Inject + private TrainSignUpAnnualLimitConfigService annualLimitConfigService; + + @At("") + @SaCheckPermission("trainSignUp.type") + @Ok("beetl:/platform/zhgh/activity/trainSignUp/annualLimit/index.html") + public void index() { + } + + @At + @ApiOperation("查询活动类型年度报名次数配置") + @SaCheckPermission("trainSignUp.type") + public Result listData() { + return Result.success(annualLimitConfigService.listAnnualLimitConfig()); + } + + @At + @ApiOperation("保存活动类型年度报名次数配置") + @SaCheckPermission("trainSignUp.type") + @SLog(tag = "品牌活动-活动类型年度报名次数配置", msg = "保存活动类型年度报名次数配置") + public Result save(@Param("configList") String configListJson) { + List configMapList = Json.fromJsonAsList(NutMap.class, configListJson); + if (Lang.isEmpty(configMapList)) { + return Result.error("配置信息不能为空"); + } + List configList = new ArrayList<>(); + // 保存时只提取配置真正需要的字段,避免页面展示字段变化影响后端解析。 + for (NutMap configMap : configMapList) { + TrainSignUpAnnualLimitConfig config = new TrainSignUpAnnualLimitConfig(); + config.setId(configMap.getString("id")); + config.setTrainType(configMap.getString("trainType")); + config.setAnnualLimitCount(configMap.getInt("annualLimitCount")); + configList.add(config); + } + for (TrainSignUpAnnualLimitConfig config : configList) { + if (config == null || Lang.isEmpty(config.getTrainType())) { + return Result.error("活动类型不能为空"); + } + if (config == null || config.getAnnualLimitCount() == null) { + return Result.error("每年报名次数不能为空"); + } + if (config.getAnnualLimitCount() <= 0) { + return Result.error("每年报名次数必须大于0"); + } + } + annualLimitConfigService.saveAnnualLimitConfig(configList); + return Result.success("保存成功"); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/models/TrainSignUpAnnualLimitConfig.java b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/models/TrainSignUpAnnualLimitConfig.java new file mode 100644 index 00000000..0e4b5b72 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/models/TrainSignUpAnnualLimitConfig.java @@ -0,0 +1,49 @@ +package com.budwk.app.zhgh.activity.trainSignUp.models; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +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.Index; +import org.nutz.dao.entity.annotation.Name; +import org.nutz.dao.entity.annotation.Table; +import org.nutz.dao.entity.annotation.TableIndexes; +import org.nutz.dao.interceptor.annotation.PrevInsert; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 活动类型年度报名次数配置。 + * 一条配置对应一个活动类型编码,用于控制当前年度该活动类型可报名的活动次数。 + */ +@Data +@Accessors(chain = true) +@Comment("品牌活动活动类型年度报名次数配置") +@Table("train_sign_up_annual_limit_config") +@TableIndexes({@Index(name = "INDEX_TRAIN_SIGN_UP_ANNUAL_LIMIT_CONFIG_TYPE", fields = {"trainType"}, unique = true)}) +@EqualsAndHashCode(callSuper = false) +public class TrainSignUpAnnualLimitConfig implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Name + @Comment("id") + @ColDefine(type = ColType.VARCHAR, width = 32) + @PrevInsert(uu32 = true) + private String id; + + @Column + @Comment("活动类型编码") + @ColDefine(type = ColType.VARCHAR, width = 100) + private String trainType; + + @Column + @Comment("每年可报名次数") + @ColDefine(type = ColType.INT, width = 10) + private Integer annualLimitCount; +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/TrainSignUpAnnualLimitConfigService.java b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/TrainSignUpAnnualLimitConfigService.java new file mode 100644 index 00000000..ed86d785 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/TrainSignUpAnnualLimitConfigService.java @@ -0,0 +1,40 @@ +package com.budwk.app.zhgh.activity.trainSignUp.service; + +import com.budwk.app.base.service.BaseService; +import com.budwk.app.zhgh.activity.trainSignUp.models.TrainSignUpAnnualLimitConfig; +import org.nutz.lang.util.NutMap; + +import java.util.List; + +public interface TrainSignUpAnnualLimitConfigService extends BaseService { + + /** + * 默认年度报名次数。 + * 当活动类型尚未配置次数时,沿用当前系统原有默认行为,避免未配置时直接放开限制。 + */ + int DEFAULT_ANNUAL_LIMIT_COUNT = 2; + + /** + * 查询活动类型年度报名次数配置列表。 + * 页面展示时需要把活动类型字典与已保存配置合并,所以返回带名称的结构化数据。 + * + * @return 活动类型与年度报名次数配置列表 + */ + List listAnnualLimitConfig(); + + /** + * 保存活动类型年度报名次数配置。 + * 这里按活动类型编码逐条更新,不存在则新增,保证页面整表提交时可以直接落库。 + * + * @param configList 配置列表 + */ + void saveAnnualLimitConfig(List configList); + + /** + * 获取指定活动类型的年度报名次数限制。 + * + * @param trainType 活动类型编码 + * @return 配置值;若未配置,则返回默认值 + */ + int getAnnualLimitCount(String trainType); +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/impl/TrainSignUpAnnualLimitConfigServiceImpl.java b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/impl/TrainSignUpAnnualLimitConfigServiceImpl.java new file mode 100644 index 00000000..303b01d6 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/impl/TrainSignUpAnnualLimitConfigServiceImpl.java @@ -0,0 +1,80 @@ +package com.budwk.app.zhgh.activity.trainSignUp.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.sys.models.Sys_dict; +import com.budwk.app.sys.services.SysDictService; +import com.budwk.app.zhgh.activity.trainSignUp.models.TrainSignUpAnnualLimitConfig; +import com.budwk.app.zhgh.activity.trainSignUp.service.TrainSignUpAnnualLimitConfigService; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; +import org.nutz.lang.util.NutMap; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@IocBean(args = {"refer:dao"}) +public class TrainSignUpAnnualLimitConfigServiceImpl extends BaseServiceImpl implements TrainSignUpAnnualLimitConfigService { + + @Inject + private SysDictService dictService; + + public TrainSignUpAnnualLimitConfigServiceImpl(Dao dao) { + super(dao); + } + + @Override + public List listAnnualLimitConfig() { + List trainTypeList = dictService.getSubListByCode("TRAIN_SIGNUP_TYPE"); + List configList = query(Cnd.NEW()); + Map configMap = configList.stream() + .collect(Collectors.toMap(TrainSignUpAnnualLimitConfig::getTrainType, item -> item, (left, right) -> left)); + + // 页面需要展示全部活动类型,所以以字典为准进行补齐;未配置时回落到默认值。 + return trainTypeList.stream().map(item -> { + TrainSignUpAnnualLimitConfig config = configMap.get(item.getCode()); + return NutMap.NEW() + .addv("id", config != null ? config.getId() : null) + .addv("trainType", item.getCode()) + .addv("trainTypeName", item.getName()) + .addv("annualLimitCount", config != null && config.getAnnualLimitCount() != null ? config.getAnnualLimitCount() : DEFAULT_ANNUAL_LIMIT_COUNT); + }).toList(); + } + + @Override + public void saveAnnualLimitConfig(List configList) { + if (Lang.isEmpty(configList)) { + return; + } + List dbConfigList = query(Cnd.NEW()); + Map dbConfigMap = dbConfigList.stream() + .collect(Collectors.toMap(TrainSignUpAnnualLimitConfig::getTrainType, item -> item, (left, right) -> left)); + + for (TrainSignUpAnnualLimitConfig config : configList) { + if (config == null || StrUtil.isBlank(config.getTrainType())) { + continue; + } + TrainSignUpAnnualLimitConfig dbConfig = dbConfigMap.get(config.getTrainType()); + if (dbConfig != null) { + config.setId(dbConfig.getId()); + } + insertOrUpdate(config); + } + } + + @Override + public int getAnnualLimitCount(String trainType) { + if (StrUtil.isBlank(trainType)) { + return DEFAULT_ANNUAL_LIMIT_COUNT; + } + TrainSignUpAnnualLimitConfig config = fetch(Cnd.where("trainType", "=", trainType)); + if (config == null || config.getAnnualLimitCount() == null || config.getAnnualLimitCount() <= 0) { + return DEFAULT_ANNUAL_LIMIT_COUNT; + } + return config.getAnnualLimitCount(); + } +} diff --git a/src/main/resources/views/platform/zhgh/activity/trainSignUp/annualLimit/index.html b/src/main/resources/views/platform/zhgh/activity/trainSignUp/annualLimit/index.html new file mode 100644 index 00000000..ae7dfb9e --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/trainSignUp/annualLimit/index.html @@ -0,0 +1,90 @@ + + + + +
+ +
活动类型年度报名次数配置
+
+ 注:这里配置的是“同一活动类型在同一年度内最多可报名多少次”。未单独配置过的活动类型默认按 2 次处理。 +
+
+ + + + + + + + + + + + + + +
+ 保 存 +
+
+
+ + + +