This commit is contained in:
=
2026-05-20 14:56:34 +08:00
parent 5e4ebfda32
commit 0f2d89e42d
@@ -3,7 +3,9 @@ package com.budwk.app.zhgh.activity.culture.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.exception.BaseException;
import com.budwk.app.base.page.Pagination;
@@ -25,7 +27,9 @@ import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
@@ -122,6 +126,7 @@ public class ActivityCultureApplyUserServiceImpl extends BaseServiceImpl<Activit
@Override
public void signUp(String activityId, List<String> personIds, JSONObject dynamicFormParam) {
ActivityTissue tissue = dao().fetch(ActivityTissue.class, activityId);
validateRequiredDynamicForm(tissue, dynamicFormParam);
//通用限制
// 判断是否有权限报名
@@ -258,6 +263,149 @@ public class ActivityCultureApplyUserServiceImpl extends BaseServiceImpl<Activit
}
}
/**
* 校验动态报名表单中已勾选的必填项,防止绕过前端直接提交空值。
*
* @param tissue 活动信息
* @param dynamicFormParam 动态报名表单提交数据
*/
private void validateRequiredDynamicForm(ActivityTissue tissue, JSONObject dynamicFormParam) {
if (ObjectUtil.isNull(tissue) || ObjectUtil.isEmpty(tissue.getFormConfig())) {
return;
}
Object rule = tissue.getFormConfig().get("rule");
if (ObjectUtil.isEmpty(rule)) {
return;
}
validateRequiredDynamicFormItems(parseRuleArray(rule), dynamicFormParam);
}
/**
* form-create 的 rule 可能是 JSON 字符串,也可能已经是数组对象,这里统一转成 JSONArray。
*
* @param rule 表单规则
* @return 规则数组
*/
private JSONArray parseRuleArray(Object rule) {
if (rule instanceof JSONArray array) {
return array;
}
return JSONUtil.parseArray(rule);
}
/**
* 递归校验表单设计器中配置为必填的字段,兼容行列布局和表格表单列配置。
*
* @param items 表单字段配置
* @param dynamicFormParam 动态报名表单提交数据
*/
private void validateRequiredDynamicFormItems(JSONArray items, JSONObject dynamicFormParam) {
if (ObjectUtil.isEmpty(items)) {
return;
}
for (Object object : items) {
JSONObject item = JSONUtil.parseObj(object);
if (item.containsKey("children")) {
validateRequiredDynamicFormItems(item.getJSONArray("children"), dynamicFormParam);
}
JSONObject props = item.getJSONObject("props");
if (ObjectUtil.isNotNull(props) && props.containsKey("columns")) {
validateTableFormRequiredColumns(item, props.getJSONArray("columns"), dynamicFormParam);
}
if (Boolean.TRUE.equals(item.getBool("$required"))) {
String field = item.getStr("field");
if (StrUtil.isNotBlank(field) && isEmptyDynamicFormValue(dynamicFormParam, field)) {
throw new BaseException("请填写" + item.getStr("title", "必填项"));
}
}
}
}
/**
* 校验表格表单列中的必填字段,每一行都需要填写已勾选必填的列。
*
* @param tableItem 表格表单配置
* @param columns 表格列配置
* @param dynamicFormParam 动态报名表单提交数据
*/
private void validateTableFormRequiredColumns(JSONObject tableItem, JSONArray columns, JSONObject dynamicFormParam) {
if (ObjectUtil.isEmpty(columns) || ObjectUtil.isNull(dynamicFormParam)) {
return;
}
Object tableValue = dynamicFormParam.get(tableItem.getStr("field"));
if (isEmptyDynamicFormRawValue(tableValue)) {
return;
}
JSONArray rows = JSONUtil.parseArray(tableValue);
for (Object rowObject : rows) {
JSONObject row = JSONUtil.parseObj(rowObject);
validateTableFormRequiredColumnRules(columns, row);
}
}
/**
* 校验单行表格数据中的必填列规则。
*
* @param columns 表格列配置
* @param row 表格单行数据
*/
private void validateTableFormRequiredColumnRules(JSONArray columns, JSONObject row) {
if (ObjectUtil.isEmpty(columns) || ObjectUtil.isNull(row)) {
return;
}
for (Object object : columns) {
JSONObject column = JSONUtil.parseObj(object);
JSONArray columnRules = column.getJSONArray("rule");
if (ObjectUtil.isEmpty(columnRules)) {
continue;
}
validateRequiredDynamicFormItems(columnRules, row);
}
}
/**
* 判断动态表单字段值是否为空。
*
* @param dynamicFormParam 动态报名表单提交数据
* @param field 表单字段名
* @return true 表示未填写
*/
private boolean isEmptyDynamicFormValue(JSONObject dynamicFormParam, String field) {
if (ObjectUtil.isNull(dynamicFormParam) || !dynamicFormParam.containsKey(field)) {
return true;
}
Object value = dynamicFormParam.get(field);
return isEmptyDynamicFormRawValue(value);
}
/**
* 判断动态表单原始值是否为空。
*
* @param value 字段原始值
* @return true 表示未填写
*/
private boolean isEmptyDynamicFormRawValue(Object value) {
if (ObjectUtil.isNull(value)) {
return true;
}
if (value instanceof CharSequence charSequence) {
return StrUtil.isBlank(charSequence);
}
if (value instanceof Collection<?> collection) {
return collection.isEmpty();
}
if (value instanceof Map<?, ?> map) {
return map.isEmpty();
}
if (value instanceof JSONArray array) {
return array.isEmpty();
}
if (value instanceof JSONObject object) {
return object.isEmpty();
}
return false;
}
@Override
public void cancelSignUp(String activityId) {
dao().clear(ActivityTissuePerson.class, Cnd.where(ActivityTissuePerson::getTissueId, "=", activityId)