From b9db1083464617c429826bbd792ee75f08ec9836 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Fri, 15 May 2026 17:19:05 +0800 Subject: [PATCH] =?UTF-8?q?feat(migration):=20=E8=BF=81=E7=A7=BB=E4=BA=A7?= =?UTF-8?q?=E5=93=81=E4=B8=AD=E5=BF=83=E6=9C=BA=E5=9E=8B=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=88=B0=E6=96=B0=E8=A1=A8=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增ProductModelParamsData和ProductModelParamsDataLanguage实体及相关Mapper和Service - 在TestController中添加migrationProductModelParamsItems接口以实现数据迁移 - 迁移逻辑根据语言和批次编码分组转换旧表数据到新表数据结构 - 支持多语言参数数据的生成和批量保存 - 使用Spring事务保证迁移操作原子性 - 引入Hutool转换工具及雪花算法生成唯一ID --- .../quotation/controller/TestController.java | 112 +++++++++++++++ .../entity/ProductModelParamsData.java | 127 ++++++++++++++++++ .../ProductModelParamsDataLanguage.java | 79 +++++++++++ .../ProductModelParamsDataLanguageMapper.java | 16 +++ .../mapper/ProductModelParamsDataMapper.java | 16 +++ ...ProductModelParamsDataLanguageService.java | 16 +++ .../IProductModelParamsDataService.java | 16 +++ ...uctModelParamsDataLanguageServiceImpl.java | 20 +++ .../ProductModelParamsDataServiceImpl.java | 20 +++ 9 files changed, 422 insertions(+) create mode 100644 nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/ProductModelParamsData.java create mode 100644 nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/ProductModelParamsDataLanguage.java create mode 100644 nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/ProductModelParamsDataLanguageMapper.java create mode 100644 nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/ProductModelParamsDataMapper.java create mode 100644 nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IProductModelParamsDataLanguageService.java create mode 100644 nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IProductModelParamsDataService.java create mode 100644 nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/ProductModelParamsDataLanguageServiceImpl.java create mode 100644 nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/ProductModelParamsDataServiceImpl.java diff --git a/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/controller/TestController.java b/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/controller/TestController.java index 0136ad5f..9decb222 100644 --- a/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/controller/TestController.java +++ b/nflg-mobilebroken-quotation/src/main/java/com/nflg/mobilebroken/quotation/controller/TestController.java @@ -1,6 +1,7 @@ package com.nflg.mobilebroken.quotation.controller; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import com.nflg.mobilebroken.common.pojo.ApiResult; @@ -8,6 +9,7 @@ import com.nflg.mobilebroken.common.util.VUtils; import com.nflg.mobilebroken.repository.entity.*; import com.nflg.mobilebroken.repository.service.*; import lombok.extern.slf4j.Slf4j; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -48,6 +50,18 @@ public class TestController extends ControllerBase { @Resource private ITBaseCustomerService customerService; + @Resource + private IProductModelParamsItemService productModelParamsItemService; + + @Resource + private IProductModelParamsDataService productModelParamsDataService; + + @Resource + private IProductModelParamsDataLanguageService productModelParamsDataLanguageService; + + @Resource + private ILanguageService languageService; + /** * 初始化机型表的BatchNumber字段数据 */ @@ -183,4 +197,102 @@ public class TestController extends ControllerBase { } return ApiResult.success(); } + + /** + * 将产品中心机型参数迁移到新表中 + */ + @Transactional + @GetMapping("migrationProductModelParamsItems") + public ApiResult migrationProductModelParamsItems() { + List languages = languageService.list(); + List items = productModelParamsItemService.list(); + List datas = new ArrayList<>(); + List dataLanguages = new ArrayList<>(); + Map> itemMap = items.stream().collect(Collectors.groupingBy(ProductModelParamsItem::getBatchNumber)); + itemMap.forEach((batchNumber, its) -> { + ProductModelParamsItem cnItem = its.stream() + .filter(it -> StrUtil.equals(it.getLanguageCode(), "cn")) + .findFirst() + .get(); + ProductModelParamsData pData = datas.stream() + .filter(d -> Objects.equals(d.getParamsId(), Long.valueOf(cnItem.getModelParamsId())) + && Objects.equals(d.getParentId(), 0L) && StrUtil.equals(d.getName(), cnItem.getIndexName()) + ) + .findFirst() + .orElse(null); + if (Objects.isNull(pData)) { + pData = Convert.convert(ProductModelParamsData.class, cnItem); + pData.setId(IdUtil.getSnowflakeNextId()); + pData.setParamsId(Long.valueOf(cnItem.getModelParamsId())); + pData.setParentId(0L); + pData.setName(cnItem.getIndexName()); + pData.setType(1); + pData.setValue(null); + datas.add(pData); + } + ProductModelParamsData finalPData = pData; + ProductModelParamsData cData=datas.stream() + .filter(d -> Objects.equals(d.getParamsId(), finalPData.getParamsId()) + && Objects.equals(d.getParentId(), finalPData.getId()) + && StrUtil.equals(d.getName(), cnItem.getName()) + ) + .findFirst() + .orElse(null); + if (Objects.isNull(cData)){ + cData = Convert.convert(ProductModelParamsData.class, cnItem); + cData.setId(IdUtil.getSnowflakeNextId()); + cData.setParamsId(pData.getParamsId()); + cData.setParentId(pData.getId()); + cData.setType(1); + cData.setValue(null); + datas.add(cData); + } + ProductModelParamsData finalCData = cData; + its.stream() + .sorted(Comparator.comparing(ProductModelParamsItem::getId)) + .forEach(it -> { + Language language = languages.stream() + .filter(l -> StrUtil.equals(l.getCode(), it.getLanguageCode())) + .findFirst() + .get(); + ProductModelParamsDataLanguage pDataLanguage = dataLanguages.stream() + .filter(d -> Objects.equals(d.getParamsId(), finalPData.getParamsId()) + && Objects.equals(d.getParamsDataId(), finalPData.getId()) + && Objects.equals(d.getName(), it.getIndexName()) + && Objects.equals(d.getLanguageId(), language.getId() + )) + .findFirst() + .orElse(null); + if (Objects.isNull(pDataLanguage)){ + pDataLanguage = Convert.convert(ProductModelParamsDataLanguage.class, it); + pDataLanguage.setId(IdUtil.getSnowflakeNextId()); + pDataLanguage.setParamsId(finalPData.getParamsId()); + pDataLanguage.setParamsDataId(finalPData.getId()); + pDataLanguage.setName(it.getIndexName()); + pDataLanguage.setLanguageId(language.getId()); + pDataLanguage.setValue(null); + dataLanguages.add(pDataLanguage); + } + ProductModelParamsDataLanguage cDataLanguage = dataLanguages.stream() + .filter(d -> Objects.equals(d.getParamsId(), finalCData.getParamsId()) + && Objects.equals(d.getParamsDataId(), finalCData.getId()) + && Objects.equals(d.getName(), it.getName()) + && Objects.equals(d.getLanguageId(), language.getId() + )) + .findFirst() + .orElse(null); + if (Objects.isNull(cDataLanguage)) { + cDataLanguage = Convert.convert(ProductModelParamsDataLanguage.class, it); + cDataLanguage.setId(IdUtil.getSnowflakeNextId()); + cDataLanguage.setParamsId(finalCData.getParamsId()); + cDataLanguage.setParamsDataId(finalCData.getId()); + cDataLanguage.setLanguageId(language.getId()); + dataLanguages.add(cDataLanguage); + } + }); + }); + productModelParamsDataService.saveBatch(datas); + productModelParamsDataLanguageService.saveBatch(dataLanguages); + return ApiResult.success(); + } } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/ProductModelParamsData.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/ProductModelParamsData.java new file mode 100644 index 00000000..a8202e88 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/ProductModelParamsData.java @@ -0,0 +1,127 @@ +package com.nflg.mobilebroken.repository.entity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 产品中心-机型-参数数据 + *

+ * + * @author 代码生成器生成 + * @since 2026 + */ +@Getter +@Setter +@Accessors(chain = true) +@TableName("product_model_params_data") +public class ProductModelParamsData implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.ASSIGN_ID) + private Long id; + + /** + * 机型参数id + */ + private Long paramsId; + + /** + * 上级id + */ + private Long parentId; + + /** + * 名称 + */ + private String name; + + /** + * 参数值 + */ + private String value; + + /** + * 是否主要参数 + */ + private Boolean main; + + /** + * 主要参数排序号 + */ + private Integer mainSort; + + /** + * 是否重要参数 + */ + private Boolean important; + + /** + * 重要参数排序号 + */ + private Integer importantSort; + + /** + * 是否参与比较 + */ + private Boolean compare; + + /** + * 图标 + */ + private String ico; + + /** + * 描述 + */ + private String remark; + + /** + * 类别,0:可选配置;1:标准配置 + */ + private Integer type; + + /** + * 选配类别,0:新增可选;1:替换可选 + */ + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private Integer optionalType; + + /** + * 图片 + */ + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String imageUrl; + + /** + * 分组名称,同组的可选配置替换 + */ + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String groupName; + + /** + * 创建人 + */ + private String createBy; + + /** + * 创建时间 + */ + private LocalDateTime createTime; + + /** + * 更新人 + */ + private String updateBy; + + /** + * 更新时间 + */ + private LocalDateTime updateTime; +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/ProductModelParamsDataLanguage.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/ProductModelParamsDataLanguage.java new file mode 100644 index 00000000..fb970332 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/ProductModelParamsDataLanguage.java @@ -0,0 +1,79 @@ +package com.nflg.mobilebroken.repository.entity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 产品中心-机型-参数数据-多语言 + *

+ * + * @author 代码生成器生成 + * @since 2026 + */ +@Getter +@Setter +@Accessors(chain = true) +@TableName("product_model_params_data_language") +public class ProductModelParamsDataLanguage implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.ASSIGN_ID) + private Long id; + + /** + * 机型参数id + */ + private Long paramsId; + + /** + * 机型参数数据id + */ + private Long paramsDataId; + + /** + * 语言id + */ + private Long languageId; + + /** + * 名称 + */ + private String name; + + /** + * 参数值 + */ + private String value; + + /** + * 描述 + */ + private String remark; + + /** + * 创建人 + */ + private String createBy; + + /** + * 创建时间 + */ + private LocalDateTime createTime; + + /** + * 更新人 + */ + private String updateBy; + + /** + * 更新时间 + */ + private LocalDateTime updateTime; +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/ProductModelParamsDataLanguageMapper.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/ProductModelParamsDataLanguageMapper.java new file mode 100644 index 00000000..75f16fc3 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/ProductModelParamsDataLanguageMapper.java @@ -0,0 +1,16 @@ +package com.nflg.mobilebroken.repository.mapper; + +import com.nflg.mobilebroken.repository.entity.ProductModelParamsDataLanguage; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 产品中心-机型-参数数据-多语言 Mapper 接口 + *

+ * + * @author 代码生成器生成 + * @since 2026 + */ +public interface ProductModelParamsDataLanguageMapper extends BaseMapper { + +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/ProductModelParamsDataMapper.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/ProductModelParamsDataMapper.java new file mode 100644 index 00000000..3bb5734d --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/ProductModelParamsDataMapper.java @@ -0,0 +1,16 @@ +package com.nflg.mobilebroken.repository.mapper; + +import com.nflg.mobilebroken.repository.entity.ProductModelParamsData; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 产品中心-机型-参数数据 Mapper 接口 + *

+ * + * @author 代码生成器生成 + * @since 2026 + */ +public interface ProductModelParamsDataMapper extends BaseMapper { + +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IProductModelParamsDataLanguageService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IProductModelParamsDataLanguageService.java new file mode 100644 index 00000000..74ab4344 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IProductModelParamsDataLanguageService.java @@ -0,0 +1,16 @@ +package com.nflg.mobilebroken.repository.service; + +import com.nflg.mobilebroken.repository.entity.ProductModelParamsDataLanguage; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 产品中心-机型-参数数据-多语言 服务类 + *

+ * + * @author 代码生成器生成 + * @since 2026 + */ +public interface IProductModelParamsDataLanguageService extends IService { + +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IProductModelParamsDataService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IProductModelParamsDataService.java new file mode 100644 index 00000000..c1e5149b --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IProductModelParamsDataService.java @@ -0,0 +1,16 @@ +package com.nflg.mobilebroken.repository.service; + +import com.nflg.mobilebroken.repository.entity.ProductModelParamsData; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 产品中心-机型-参数数据 服务类 + *

+ * + * @author 代码生成器生成 + * @since 2026 + */ +public interface IProductModelParamsDataService extends IService { + +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/ProductModelParamsDataLanguageServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/ProductModelParamsDataLanguageServiceImpl.java new file mode 100644 index 00000000..7208fb1d --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/ProductModelParamsDataLanguageServiceImpl.java @@ -0,0 +1,20 @@ +package com.nflg.mobilebroken.repository.service.impl; + +import com.nflg.mobilebroken.repository.entity.ProductModelParamsDataLanguage; +import com.nflg.mobilebroken.repository.mapper.ProductModelParamsDataLanguageMapper; +import com.nflg.mobilebroken.repository.service.IProductModelParamsDataLanguageService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 产品中心-机型-参数数据-多语言 服务实现类 + *

+ * + * @author 代码生成器生成 + * @since 2026 + */ +@Service +public class ProductModelParamsDataLanguageServiceImpl extends ServiceImpl implements IProductModelParamsDataLanguageService { + +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/ProductModelParamsDataServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/ProductModelParamsDataServiceImpl.java new file mode 100644 index 00000000..84fa4069 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/ProductModelParamsDataServiceImpl.java @@ -0,0 +1,20 @@ +package com.nflg.mobilebroken.repository.service.impl; + +import com.nflg.mobilebroken.repository.entity.ProductModelParamsData; +import com.nflg.mobilebroken.repository.mapper.ProductModelParamsDataMapper; +import com.nflg.mobilebroken.repository.service.IProductModelParamsDataService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 产品中心-机型-参数数据 服务实现类 + *

+ * + * @author 代码生成器生成 + * @since 2026 + */ +@Service +public class ProductModelParamsDataServiceImpl extends ServiceImpl implements IProductModelParamsDataService { + +}