增加活动表单设计的功能

This commit is contained in:
Wang 2026-01-15 09:43:18 +08:00
parent e9616a69c5
commit 6ce00db8fc
10 changed files with 40 additions and 46 deletions

View File

@ -16,6 +16,7 @@ import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -40,7 +41,7 @@ public class AdminActivityFormController {
private final IAdminActivityFormService adminActivityFormService; private final IAdminActivityFormService adminActivityFormService;
@Operation(summary = "创建表单") @Operation(summary = "创建表单")
@PostMapping("/save") @PostMapping
@SaCheckPermission("mp:admin:activity:form:save") @SaCheckPermission("mp:admin:activity:form:save")
public ResultBean<Boolean> save(@Valid @RequestBody ActivityFormReq request) { public ResultBean<Boolean> save(@Valid @RequestBody ActivityFormReq request) {
Boolean result = adminActivityFormService.save(request); Boolean result = adminActivityFormService.save(request);
@ -48,7 +49,7 @@ public class AdminActivityFormController {
} }
@Operation(summary = "更新表单") @Operation(summary = "更新表单")
@PostMapping("/update") @PutMapping
@SaCheckPermission("mp:admin:activity:form:update") @SaCheckPermission("mp:admin:activity:form:update")
public ResultBean<Boolean> update(@Valid @RequestBody ActivityFormReq request) { public ResultBean<Boolean> update(@Valid @RequestBody ActivityFormReq request) {
Boolean result = adminActivityFormService.update(request); Boolean result = adminActivityFormService.update(request);

View File

@ -15,12 +15,6 @@ public class AdminActivityFormResp {
@Schema(description = "表单ID") @Schema(description = "表单ID")
private Integer id; private Integer id;
/**
* 活动ID
*/
@Schema(description = "活动ID")
private Integer activityId;
/** /**
* 表单名称 * 表单名称
*/ */
@ -31,7 +25,13 @@ public class AdminActivityFormResp {
* 表单描述 * 表单描述
*/ */
@Schema(description = "表单描述") @Schema(description = "表单描述")
private String fromDescription; private String formDescription;
/**
* 表单配置
*/
@Schema(description = "表单配置")
private String config;
/** /**
* 表单字段 * 表单字段

View File

@ -13,7 +13,6 @@ public interface AdminActivityFormConvert {
AdminActivityFormResp convertToResp(MpActivityFormEntity entity); AdminActivityFormResp convertToResp(MpActivityFormEntity entity);
AdminActivityFormRelationResp convertToRelationResp(MpActivityFormEntity entity); AdminActivityFormRelationResp convertToRelationResp(MpActivityFormEntity entity);
MpActivityFormEntity convertToEntity(ActivityFormReq request); MpActivityFormEntity convertToEntity(ActivityFormReq request);

View File

@ -11,7 +11,7 @@ import com.seer.teach.mp.app.controller.req.ActivityFormSubmitReq;
import com.seer.teach.mp.app.controller.req.AppActivityFormExecutionQueryReq; import com.seer.teach.mp.app.controller.req.AppActivityFormExecutionQueryReq;
import com.seer.teach.mp.app.controller.resp.AppActivityFormExecutionResp; import com.seer.teach.mp.app.controller.resp.AppActivityFormExecutionResp;
import com.seer.teach.mp.app.controller.resp.AppActivityFormFieldResp; import com.seer.teach.mp.app.controller.resp.AppActivityFormFieldResp;
import com.seer.teach.mp.app.controller.resp.AppActivityFormTemplateResp; import com.seer.teach.mp.app.controller.resp.AppActivityFormResp;
import com.seer.teach.mp.app.service.IAppActivityFormService; import com.seer.teach.mp.app.service.IAppActivityFormService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
@ -48,10 +48,10 @@ public class AppActivityFormController {
private final IAppActivityFormService appActivityFormService; private final IAppActivityFormService appActivityFormService;
@Operation(summary = "获取活动可用的表单") @Operation(summary = "获取活动可用的表单")
@GetMapping("/template/{activityId}") @GetMapping("/{activityId}")
@SaCheckLogin @SaCheckLogin
public ResultBean<AppActivityFormTemplateResp> getTemplateByActivity(@PathVariable Integer activityId) { public ResultBean<AppActivityFormResp> getFormByActivity(@PathVariable Integer activityId) {
AppActivityFormTemplateResp result = appActivityFormService.getTemplateByActivity(activityId); AppActivityFormResp result = appActivityFormService.getFormByActivity(activityId);
return ResultBean.success(result); return ResultBean.success(result);
} }

View File

@ -5,9 +5,9 @@ import lombok.Data;
import java.util.List; import java.util.List;
@Schema(name = "AppActivityFormTemplateResp", description = "APP端活动表单模板响应参数") @Schema(name = "AppActivityFormResp", description = "APP端活动表单模板响应参数")
@Data @Data
public class AppActivityFormTemplateResp { public class AppActivityFormResp {
private Integer id; private Integer id;

View File

@ -2,7 +2,7 @@ package com.seer.teach.mp.app.convert;
import com.seer.teach.mp.app.controller.resp.AppActivityFormExecutionResp; import com.seer.teach.mp.app.controller.resp.AppActivityFormExecutionResp;
import com.seer.teach.mp.app.controller.resp.AppActivityFormFieldResp; import com.seer.teach.mp.app.controller.resp.AppActivityFormFieldResp;
import com.seer.teach.mp.app.controller.resp.AppActivityFormTemplateResp; import com.seer.teach.mp.app.controller.resp.AppActivityFormResp;
import com.seer.teach.mp.entity.MpActivityFormExecutionEntity; import com.seer.teach.mp.entity.MpActivityFormExecutionEntity;
import com.seer.teach.mp.entity.MpActivityFormFieldEntity; import com.seer.teach.mp.entity.MpActivityFormFieldEntity;
import com.seer.teach.mp.entity.MpActivityFormEntity; import com.seer.teach.mp.entity.MpActivityFormEntity;
@ -14,7 +14,8 @@ import org.mapstruct.factory.Mappers;
public interface AppActivityFormConvert { public interface AppActivityFormConvert {
AppActivityFormConvert INSTANCE = Mappers.getMapper(AppActivityFormConvert.class); AppActivityFormConvert INSTANCE = Mappers.getMapper(AppActivityFormConvert.class);
AppActivityFormTemplateResp convertToAppTemplateResp(MpActivityFormEntity entity); @Mapping(source = "fields", target = "fields", ignore = true)
AppActivityFormResp convertToAppTemplateResp(MpActivityFormEntity entity);
AppActivityFormFieldResp convertToAppFieldResp(MpActivityFormFieldEntity entity); AppActivityFormFieldResp convertToAppFieldResp(MpActivityFormFieldEntity entity);

View File

@ -4,7 +4,7 @@ import com.seer.teach.common.PageListBean;
import com.seer.teach.mp.app.controller.req.ActivityFormSubmitReq; import com.seer.teach.mp.app.controller.req.ActivityFormSubmitReq;
import com.seer.teach.mp.app.controller.req.AppActivityFormExecutionQueryReq; import com.seer.teach.mp.app.controller.req.AppActivityFormExecutionQueryReq;
import com.seer.teach.mp.app.controller.resp.AppActivityFormExecutionResp; import com.seer.teach.mp.app.controller.resp.AppActivityFormExecutionResp;
import com.seer.teach.mp.app.controller.resp.AppActivityFormTemplateResp; import com.seer.teach.mp.app.controller.resp.AppActivityFormResp;
import com.seer.teach.mp.app.controller.resp.AppActivityFormFieldResp; import com.seer.teach.mp.app.controller.resp.AppActivityFormFieldResp;
import java.util.List; import java.util.List;
@ -25,7 +25,7 @@ public interface IAppActivityFormService {
* @param activityId 活动ID * @param activityId 活动ID
* @return 表单模板响应对象 * @return 表单模板响应对象
*/ */
AppActivityFormTemplateResp getTemplateByActivity(Integer activityId); AppActivityFormResp getFormByActivity(Integer activityId);
/** /**
* 根据模板ID获取字段列表 * 根据模板ID获取字段列表

View File

@ -8,7 +8,7 @@ import com.seer.teach.common.utils.PageConverterUtils;
import com.seer.teach.mp.app.controller.req.ActivityFormSubmitReq; import com.seer.teach.mp.app.controller.req.ActivityFormSubmitReq;
import com.seer.teach.mp.app.controller.req.AppActivityFormExecutionQueryReq; import com.seer.teach.mp.app.controller.req.AppActivityFormExecutionQueryReq;
import com.seer.teach.mp.app.controller.resp.AppActivityFormExecutionResp; import com.seer.teach.mp.app.controller.resp.AppActivityFormExecutionResp;
import com.seer.teach.mp.app.controller.resp.AppActivityFormTemplateResp; import com.seer.teach.mp.app.controller.resp.AppActivityFormResp;
import com.seer.teach.mp.app.controller.resp.AppActivityFormFieldResp; import com.seer.teach.mp.app.controller.resp.AppActivityFormFieldResp;
import com.seer.teach.mp.app.convert.AppActivityFormConvert; import com.seer.teach.mp.app.convert.AppActivityFormConvert;
import com.seer.teach.mp.app.service.IAppActivityFormService; import com.seer.teach.mp.app.service.IAppActivityFormService;
@ -23,6 +23,7 @@ import java.time.LocalDateTime;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -46,7 +47,7 @@ public class AppActivityFormServiceImpl implements IAppActivityFormService {
private final IMpActivityFormRelationService activityFormTemplateRelationService; private final IMpActivityFormRelationService activityFormTemplateRelationService;
@Override @Override
public AppActivityFormTemplateResp getTemplateByActivity(Integer activityId) { public AppActivityFormResp getFormByActivity(Integer activityId) {
// 首先检查活动是否存在 // 首先检查活动是否存在
MpActivityEntity activity = mpActivityService.getById(activityId); MpActivityEntity activity = mpActivityService.getById(activityId);
if (activity == null) { if (activity == null) {
@ -55,19 +56,17 @@ public class AppActivityFormServiceImpl implements IAppActivityFormService {
} }
// 从关联表中获取与活动关联的表单ID // 从关联表中获取与活动关联的表单ID
Integer templateId = activityFormTemplateRelationService.getPrimaryTemplateIdByActivityId(activityId); Integer formId = activityFormTemplateRelationService.getPrimaryFormIdByActivityId(activityId);
if (templateId != null) { if (formId != null) {
MpActivityFormEntity template = activityFormTemplateService.getById(templateId); MpActivityFormEntity template = activityFormTemplateService.getById(formId);
if (template != null) { if (template != null) {
AppActivityFormTemplateResp resp = AppActivityFormConvert.INSTANCE.convertToAppTemplateResp(template); AppActivityFormResp resp = AppActivityFormConvert.INSTANCE.convertToAppTemplateResp(template);
// 获取该表单的所有字段 // 获取该表单的所有字段
List<MpActivityFormFieldEntity> fields = activityFormFieldService.list( List<MpActivityFormFieldEntity> fields = activityFormFieldService.list(
new LambdaQueryWrapper<MpActivityFormFieldEntity>() new LambdaQueryWrapper<MpActivityFormFieldEntity>()
.eq(MpActivityFormFieldEntity::getFormId, templateId) .eq(MpActivityFormFieldEntity::getFormId, formId)
.orderByAsc(MpActivityFormFieldEntity::getSortOrder)
.orderByDesc(MpActivityFormFieldEntity::getId)
); );
List<AppActivityFormFieldResp> fieldResps = fields.stream() List<AppActivityFormFieldResp> fieldResps = fields.stream()
@ -78,26 +77,19 @@ public class AppActivityFormServiceImpl implements IAppActivityFormService {
return resp; return resp;
} }
} }
List<MpActivityFormRelationEntity> relations = activityFormTemplateRelationService.list( Optional<MpActivityFormRelationEntity> relation = activityFormTemplateRelationService.getLatestVersionByActivityId(activityId);
new LambdaQueryWrapper<MpActivityFormRelationEntity>()
.eq(MpActivityFormRelationEntity::getActivityId, activityId)
.last("LIMIT 1")
);
if (!relations.isEmpty()) { if (relation.isPresent()) {
templateId = relations.get(0).getFormId(); formId = relation.get().getFormId();
MpActivityFormEntity template = activityFormTemplateService.getById(templateId); MpActivityFormEntity template = activityFormTemplateService.getById(formId);
if (template != null) { if (template != null) {
AppActivityFormTemplateResp resp = AppActivityFormConvert.INSTANCE.convertToAppTemplateResp(template); AppActivityFormResp resp = AppActivityFormConvert.INSTANCE.convertToAppTemplateResp(template);
// 获取该表单的所有字段 // 获取该表单的所有字段
List<MpActivityFormFieldEntity> fields = activityFormFieldService.list( List<MpActivityFormFieldEntity> fields = activityFormFieldService.list(
new LambdaQueryWrapper<MpActivityFormFieldEntity>() new LambdaQueryWrapper<MpActivityFormFieldEntity>()
.eq(MpActivityFormFieldEntity::getFormId, templateId) .eq(MpActivityFormFieldEntity::getFormId, formId)
.orderByAsc(MpActivityFormFieldEntity::getSortOrder)
.orderByDesc(MpActivityFormFieldEntity::getId)
); );
List<AppActivityFormFieldResp> fieldResps = fields.stream() List<AppActivityFormFieldResp> fieldResps = fields.stream()
.map(AppActivityFormConvert.INSTANCE::convertToAppFieldResp) .map(AppActivityFormConvert.INSTANCE::convertToAppFieldResp)
.collect(Collectors.toList()); .collect(Collectors.toList());
@ -106,7 +98,6 @@ public class AppActivityFormServiceImpl implements IAppActivityFormService {
return resp; return resp;
} }
} }
log.warn("未找到活动 {} 关联的表单表单", activityId); log.warn("未找到活动 {} 关联的表单表单", activityId);
return null; return null;
} }

View File

@ -16,12 +16,12 @@ import java.util.Optional;
public interface IMpActivityFormRelationService extends IService<MpActivityFormRelationEntity> { public interface IMpActivityFormRelationService extends IService<MpActivityFormRelationEntity> {
/** /**
* 根据活动ID获取关联的主要表单模板ID * 根据活动ID获取关联的主要表单ID
* *
* @param activityId 活动ID * @param activityId 活动ID
* @return 表单模板ID如果不存在则返回null * @return 表单模板ID如果不存在则返回null
*/ */
Integer getPrimaryTemplateIdByActivityId(Integer activityId); Integer getPrimaryFormIdByActivityId(Integer activityId);
/** /**
* 根据活动ID获取关联的表单模板数量 * 根据活动ID获取关联的表单模板数量

View File

@ -2,6 +2,7 @@ package com.seer.teach.mp.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.seer.teach.common.constants.CommonConstant;
import com.seer.teach.mp.entity.MpActivityFormRelationEntity; import com.seer.teach.mp.entity.MpActivityFormRelationEntity;
import com.seer.teach.mp.mapper.MpActivityFormRelationMapper; import com.seer.teach.mp.mapper.MpActivityFormRelationMapper;
import com.seer.teach.mp.service.IMpActivityFormRelationService; import com.seer.teach.mp.service.IMpActivityFormRelationService;
@ -25,10 +26,11 @@ import java.util.Optional;
public class MpActivityFormRelationServiceImpl extends ServiceImpl<MpActivityFormRelationMapper, MpActivityFormRelationEntity> implements IMpActivityFormRelationService { public class MpActivityFormRelationServiceImpl extends ServiceImpl<MpActivityFormRelationMapper, MpActivityFormRelationEntity> implements IMpActivityFormRelationService {
@Override @Override
public Integer getPrimaryTemplateIdByActivityId(Integer activityId) { public Integer getPrimaryFormIdByActivityId(Integer activityId) {
MpActivityFormRelationEntity relation = this.getOne( MpActivityFormRelationEntity relation = this.getOne(
new LambdaQueryWrapper<MpActivityFormRelationEntity>() new LambdaQueryWrapper<MpActivityFormRelationEntity>()
.eq(MpActivityFormRelationEntity::getActivityId, activityId) .eq(MpActivityFormRelationEntity::getActivityId, activityId)
.eq(MpActivityFormRelationEntity::getIsPrimary, CommonConstant.ENABLE)
); );
return relation != null ? relation.getFormId() : null; return relation != null ? relation.getFormId() : null;
} }