commit
This commit is contained in:
+148
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user