diff --git a/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/good/controller/AppCategoryController.java b/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/good/controller/AppCategoryController.java index 89688a3..ecd1589 100644 --- a/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/good/controller/AppCategoryController.java +++ b/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/good/controller/AppCategoryController.java @@ -17,7 +17,7 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -@RequestMapping("/app/user/category") +@RequestMapping("/app/category") @RestController @Tag(name = "APP - 商品类型") @Validated diff --git a/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/good/controller/AppCollectController.java b/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/good/controller/AppCollectController.java index 70ca0ed..6a4d69c 100644 --- a/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/good/controller/AppCollectController.java +++ b/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/good/controller/AppCollectController.java @@ -25,7 +25,7 @@ import java.util.List; * @Data: 2025-06-16 20:50 */ @RestController -@RequestMapping("/app/user/collect") +@RequestMapping("/app/collect") @Tag(name = "APP - 商品收藏管理") @Validated @SaCheckLogin(type = StpUtil.TYPE) diff --git a/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/good/controller/AppGoodsController.java b/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/good/controller/AppGoodsController.java index 3303094..c90eaab 100644 --- a/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/good/controller/AppGoodsController.java +++ b/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/good/controller/AppGoodsController.java @@ -28,7 +28,7 @@ import org.springframework.web.bind.annotation.RestController; import java.util.List; -@RequestMapping("/app/user/goods") +@RequestMapping("/app/goods") @RestController @Tag(name = "APP - 商品") @Validated diff --git a/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/order/controller/AppAddressController.java b/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/order/controller/AppAddressController.java index efa7d3f..d65578c 100644 --- a/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/order/controller/AppAddressController.java +++ b/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/order/controller/AppAddressController.java @@ -33,7 +33,7 @@ import java.util.List; @DecryptionAnnotation @EncryptionAnnotation @RestController -@RequestMapping("/app/user/address") +@RequestMapping("/app/address") @Tag(name = "APP - 收货地址管理") @Validated @RequiredArgsConstructor diff --git a/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/order/controller/AppAfterSaleController.java b/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/order/controller/AppAfterSaleController.java index ad89e75..4796bfd 100644 --- a/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/order/controller/AppAfterSaleController.java +++ b/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/order/controller/AppAfterSaleController.java @@ -25,7 +25,7 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController -@RequestMapping("/app/user/after-sale") +@RequestMapping("/app/after-sale") @Tag(name = "APP - 交易售后") @Validated @RequiredArgsConstructor diff --git a/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/order/controller/AppCartController.java b/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/order/controller/AppCartController.java index afc0da4..097e7b7 100644 --- a/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/order/controller/AppCartController.java +++ b/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/order/controller/AppCartController.java @@ -22,7 +22,7 @@ import org.springframework.web.bind.annotation.*; import java.util.List; -@RequestMapping("/app/user/mall/cart") +@RequestMapping("/app/mall/cart") @RestController @Tag(name = "APP - 购物车") @Validated diff --git a/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/order/controller/AppLogisticsController.java b/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/order/controller/AppLogisticsController.java index 3d5483b..8bf8706 100644 --- a/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/order/controller/AppLogisticsController.java +++ b/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/order/controller/AppLogisticsController.java @@ -32,7 +32,7 @@ import java.util.List; @Tag(name = "APP - 物流") @Validated @RestController -@RequestMapping("/app/user/logistics") +@RequestMapping("/app/logistics") @RequiredArgsConstructor public class AppLogisticsController { diff --git a/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/order/controller/AppOrderController.java b/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/order/controller/AppOrderController.java index a54a3ba..85ffd9a 100644 --- a/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/order/controller/AppOrderController.java +++ b/seer-mall/seer-mall-service-app/src/main/java/com/seer/teach/mall/app/order/controller/AppOrderController.java @@ -45,7 +45,7 @@ import org.springframework.web.bind.annotation.RestController; @Tag(name = "APP - 用户订单") @Validated @RestController -@RequestMapping("/app/user/order") +@RequestMapping("/app/order") @RequiredArgsConstructor @DecryptionAnnotation @EncryptionAnnotation diff --git a/seer-mp/seer-mp-data-module/src/main/java/com/seer/teach/mp/mapper/MpActivityFormFieldMapper.java b/seer-mp/seer-mp-data-module/src/main/java/com/seer/teach/mp/mapper/MpActivityFormFieldMapper.java index 2b40d69..cf98e96 100644 --- a/seer-mp/seer-mp-data-module/src/main/java/com/seer/teach/mp/mapper/MpActivityFormFieldMapper.java +++ b/seer-mp/seer-mp-data-module/src/main/java/com/seer/teach/mp/mapper/MpActivityFormFieldMapper.java @@ -2,6 +2,7 @@ package com.seer.teach.mp.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.seer.teach.mp.entity.MpActivityFormFieldEntity; +import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Mapper; /** @@ -15,4 +16,6 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface MpActivityFormFieldMapper extends BaseMapper { + @Delete("DELETE FROM mp_activity_form_field WHERE form_id = #{formId}") + int deleteByFormId(Integer formId); } \ No newline at end of file diff --git a/seer-mp/seer-mp-service-admin/src/main/java/com/seer/teach/mp/admin/service/impl/AdminActivityFormServiceImpl.java b/seer-mp/seer-mp-service-admin/src/main/java/com/seer/teach/mp/admin/service/impl/AdminActivityFormServiceImpl.java index 0c8e9b6..aea0745 100644 --- a/seer-mp/seer-mp-service-admin/src/main/java/com/seer/teach/mp/admin/service/impl/AdminActivityFormServiceImpl.java +++ b/seer-mp/seer-mp-service-admin/src/main/java/com/seer/teach/mp/admin/service/impl/AdminActivityFormServiceImpl.java @@ -1,5 +1,7 @@ package com.seer.teach.mp.admin.service.impl; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.json.JSONUtil; import com.seer.teach.common.constants.CommonConstant; import com.seer.teach.common.utils.CommonUtils; import com.seer.teach.mp.admin.controller.req.ActivityFormReq; @@ -7,13 +9,19 @@ import com.seer.teach.mp.admin.controller.resp.AdminActivityFormResp; import com.seer.teach.mp.admin.convert.AdminActivityFormConvert; import com.seer.teach.mp.admin.service.IAdminActivityFormService; import com.seer.teach.mp.entity.MpActivityFormEntity; +import com.seer.teach.mp.entity.MpActivityFormFieldEntity; import com.seer.teach.mp.entity.MpActivityFormRelationEntity; +import com.seer.teach.mp.service.IMpActivityFormFieldService; import com.seer.teach.mp.service.IMpActivityFormRelationService; import com.seer.teach.mp.service.IMpActivityFormService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; import java.util.Optional; /** @@ -33,12 +41,17 @@ public class AdminActivityFormServiceImpl implements IAdminActivityFormService { private final IMpActivityFormRelationService activityFormRelationService; + private final IMpActivityFormFieldService activityFormFieldService; + @Override public Boolean save(ActivityFormReq request) { MpActivityFormEntity form = AdminActivityFormConvert.INSTANCE.convertToEntity(request); boolean saveResult = activityFormService.save(form); if (saveResult) { + // 保存表单字段 + saveOrUpdateFormFields(form.getId(), request.getFields()); + MpActivityFormRelationEntity relation = new MpActivityFormRelationEntity(); relation.setActivityId(request.getActivityId()); relation.setFormId(form.getId()); @@ -71,12 +84,19 @@ public class AdminActivityFormServiceImpl implements IAdminActivityFormService { } @Override + @Transactional public Boolean update(ActivityFormReq request) { if (request.getId() == null) { return false; } MpActivityFormEntity form = AdminActivityFormConvert.INSTANCE.convertToEntity(request); - return activityFormService.updateById(form); + boolean updateResult = activityFormService.updateById(form); + + if (updateResult) { + // 更新表单字段 + saveOrUpdateFormFields(form.getId(), request.getFields()); + } + return updateResult; } @Override @@ -106,4 +126,96 @@ public class AdminActivityFormServiceImpl implements IAdminActivityFormService { newRelation.setVersion(CommonUtils.generateVersionNumber(latestRelation.getVersion())); return activityFormRelationService.save(newRelation); } + + /** + * 更新表单字段 + * + * @param formId 表单ID + * @param fields 字段列表JSON字符串 + */ + private void saveOrUpdateFormFields(Integer formId, List fields) { + if (CollectionUtil.isEmpty(fields)) { + return; + } + // 如果字段列表为空,删除所有现有字段 + activityFormFieldService.deleteByFormId(formId); + // 保存新的字段 + int sortOrder = 0; + List fieldEntities = buildActivityFormFieldList(formId, fields, sortOrder); + if (CollectionUtil.isNotEmpty(fieldEntities)) { + boolean savedBatch = activityFormFieldService.saveBatch(fieldEntities); + log.info("保存字段到字段表的结果:{}", savedBatch); + + }else{ + log.info("没有字段需要保存到字段表"); + } + } + + private List buildActivityFormFieldList(Integer formId, List fields, int sortOrder) { + List fieldEntities = new ArrayList<>(); + for (String fieldJson : fields) { + try { + // 解析字段JSON + Map fieldMap = JSONUtil.toBean(fieldJson, Map.class); + Map config = (Map) fieldMap.get("__config__"); + + MpActivityFormFieldEntity fieldEntity = new MpActivityFormFieldEntity(); + fieldEntity.setFormId(formId); + + // 设置字段名称 + fieldEntity.setFieldName((String) config.get("label")); + + String fieldCode = (String) fieldMap.get("__vModel__"); + if (fieldCode == null || fieldCode.trim().isEmpty()) { + fieldCode = generateFieldCode((String) config.get("label"), formId, sortOrder); + } + fieldEntity.setFieldCode(fieldCode); + + // 设置字段类型 + String fieldType = (String) fieldMap.get("tag"); + if (fieldType == null) { + fieldType = (String) config.get("tag"); + } + fieldEntity.setFieldType(fieldType); + + // 设置占位符 + fieldEntity.setPlaceholder((String) fieldMap.get("placeholder")); + + // 设置是否必填 + Boolean required = (Boolean) config.get("required"); + fieldEntity.setIsRequired(required != null && required ? 1 : 0); + + // 设置排序 + fieldEntity.setSortOrder(sortOrder++); + + // 设置字段描述 + fieldEntity.setDescription((String) config.get("label")); + + if(fieldMap.containsKey("options")){ + fieldEntity.setFieldOptions(fieldMap.get("options").toString()); + } + + fieldEntities.add(fieldEntity); + } catch (Exception e) { + log.error("解析字段JSON失败: {}", fieldJson, e); + } + } + return fieldEntities; + } + + /** + * 生成字段代码 + * + * @param label 字段标签 + * @param formId 表单ID + * @param index 索引 + * @return 字段代码 + */ + private String generateFieldCode(String label, Integer formId, int index) { + if (label == null) { + return "field_" + formId + "_" + index; + } + // 将标签转换为合适的字段代码格式 + return label.replaceAll("[^a-zA-Z0-9\\u4e00-\\u9fa5]", "_").toLowerCase() + "_" + formId + "_" + index; + } } \ No newline at end of file diff --git a/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/resp/AppActivityFormResp.java b/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/resp/AppActivityFormResp.java index c8185b4..fad8337 100644 --- a/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/resp/AppActivityFormResp.java +++ b/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/resp/AppActivityFormResp.java @@ -11,13 +11,26 @@ public class AppActivityFormResp { private Integer id; - @Schema(description = "表单模板名称") - private String templateName; + /** + * 表单名称 + */ + @Schema(description = "表单名称") + private String formName; + + /** + * 表单描述 + */ + @Schema(description = "表单描述") + private String formDescription; + + /** + * 配置 + */ + @Schema(description = "配置") + private String config; - @Schema(description = "表单模板描述") - private String templateDescription; @Schema(description = "表单字段列表") - private List fields; + private List fields; } \ No newline at end of file diff --git a/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/convert/AppActivityFormConvert.java b/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/convert/AppActivityFormConvert.java index c5a7375..51a91ae 100644 --- a/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/convert/AppActivityFormConvert.java +++ b/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/convert/AppActivityFormConvert.java @@ -3,18 +3,16 @@ package com.seer.teach.mp.app.convert; 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.AppActivityFormResp; +import com.seer.teach.mp.entity.MpActivityFormEntity; import com.seer.teach.mp.entity.MpActivityFormExecutionEntity; import com.seer.teach.mp.entity.MpActivityFormFieldEntity; -import com.seer.teach.mp.entity.MpActivityFormEntity; import org.mapstruct.Mapper; -import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; @Mapper public interface AppActivityFormConvert { AppActivityFormConvert INSTANCE = Mappers.getMapper(AppActivityFormConvert.class); - @Mapping(source = "fields", target = "fields", ignore = true) AppActivityFormResp convertToAppTemplateResp(MpActivityFormEntity entity); AppActivityFormFieldResp convertToAppFieldResp(MpActivityFormFieldEntity entity); diff --git a/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/service/impl/AppActivityFormServiceImpl.java b/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/service/impl/AppActivityFormServiceImpl.java index 3e9c668..677bf0c 100644 --- a/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/service/impl/AppActivityFormServiceImpl.java +++ b/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/service/impl/AppActivityFormServiceImpl.java @@ -62,18 +62,6 @@ public class AppActivityFormServiceImpl implements IAppActivityFormService { MpActivityFormEntity template = activityFormTemplateService.getById(formId); if (template != null) { AppActivityFormResp resp = AppActivityFormConvert.INSTANCE.convertToAppTemplateResp(template); - - // 获取该表单的所有字段 - List fields = activityFormFieldService.list( - new LambdaQueryWrapper() - .eq(MpActivityFormFieldEntity::getFormId, formId) - ); - - List fieldResps = fields.stream() - .map(AppActivityFormConvert.INSTANCE::convertToAppFieldResp) - .collect(Collectors.toList()); - - resp.setFields(fieldResps); return resp; } } @@ -84,17 +72,6 @@ public class AppActivityFormServiceImpl implements IAppActivityFormService { MpActivityFormEntity template = activityFormTemplateService.getById(formId); if (template != null) { AppActivityFormResp resp = AppActivityFormConvert.INSTANCE.convertToAppTemplateResp(template); - - // 获取该表单的所有字段 - List fields = activityFormFieldService.list( - new LambdaQueryWrapper() - .eq(MpActivityFormFieldEntity::getFormId, formId) - ); - List fieldResps = fields.stream() - .map(AppActivityFormConvert.INSTANCE::convertToAppFieldResp) - .collect(Collectors.toList()); - - resp.setFields(fieldResps); return resp; } } diff --git a/seer-mp/seer-mp-service/src/main/java/com/seer/teach/mp/service/IMpActivityFormFieldService.java b/seer-mp/seer-mp-service/src/main/java/com/seer/teach/mp/service/IMpActivityFormFieldService.java index bbcf27f..1b4e4f6 100644 --- a/seer-mp/seer-mp-service/src/main/java/com/seer/teach/mp/service/IMpActivityFormFieldService.java +++ b/seer-mp/seer-mp-service/src/main/java/com/seer/teach/mp/service/IMpActivityFormFieldService.java @@ -13,4 +13,12 @@ import com.seer.teach.mp.entity.MpActivityFormFieldEntity; */ public interface IMpActivityFormFieldService extends IService { + /** + * 根据表单ID删除表单字段定义 + * + * @param formId + * @return 删除结果 + */ + boolean deleteByFormId(Integer formId); + } \ No newline at end of file diff --git a/seer-mp/seer-mp-service/src/main/java/com/seer/teach/mp/service/impl/MpActivityFormFieldServiceImpl.java b/seer-mp/seer-mp-service/src/main/java/com/seer/teach/mp/service/impl/MpActivityFormFieldServiceImpl.java index 9367704..43ee5ac 100644 --- a/seer-mp/seer-mp-service/src/main/java/com/seer/teach/mp/service/impl/MpActivityFormFieldServiceImpl.java +++ b/seer-mp/seer-mp-service/src/main/java/com/seer/teach/mp/service/impl/MpActivityFormFieldServiceImpl.java @@ -8,6 +8,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.Objects; + /** *

* 活动表单字段定义表 服务实现类 @@ -21,4 +23,11 @@ import org.springframework.stereotype.Service; @RequiredArgsConstructor public class MpActivityFormFieldServiceImpl extends ServiceImpl implements IMpActivityFormFieldService { + @Override + public boolean deleteByFormId(Integer formId) { + if (Objects.isNull(formId) || formId == 0) { + return false; + } + return super.getBaseMapper().deleteByFormId(formId) > 0; + } } \ No newline at end of file