feat(migration): 迁移产品中心机型参数数据到新表结构
- 新增ProductModelParamsData和ProductModelParamsDataLanguage实体及相关Mapper和Service - 在TestController中添加migrationProductModelParamsItems接口以实现数据迁移 - 迁移逻辑根据语言和批次编码分组转换旧表数据到新表数据结构 - 支持多语言参数数据的生成和批量保存 - 使用Spring事务保证迁移操作原子性 - 引入Hutool转换工具及雪花算法生成唯一ID
This commit is contained in:
parent
f3306d713e
commit
b9db108346
|
|
@ -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<Void> migrationProductModelParamsItems() {
|
||||
List<Language> languages = languageService.list();
|
||||
List<ProductModelParamsItem> items = productModelParamsItemService.list();
|
||||
List<ProductModelParamsData> datas = new ArrayList<>();
|
||||
List<ProductModelParamsDataLanguage> dataLanguages = new ArrayList<>();
|
||||
Map<String, List<ProductModelParamsItem>> 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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 产品中心-机型-参数数据
|
||||
* </p>
|
||||
*
|
||||
* @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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 产品中心-机型-参数数据-多语言
|
||||
* </p>
|
||||
*
|
||||
* @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;
|
||||
}
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
package com.nflg.mobilebroken.repository.mapper;
|
||||
|
||||
import com.nflg.mobilebroken.repository.entity.ProductModelParamsDataLanguage;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 产品中心-机型-参数数据-多语言 Mapper 接口
|
||||
* </p>
|
||||
*
|
||||
* @author 代码生成器生成
|
||||
* @since 2026
|
||||
*/
|
||||
public interface ProductModelParamsDataLanguageMapper extends BaseMapper<ProductModelParamsDataLanguage> {
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
package com.nflg.mobilebroken.repository.mapper;
|
||||
|
||||
import com.nflg.mobilebroken.repository.entity.ProductModelParamsData;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 产品中心-机型-参数数据 Mapper 接口
|
||||
* </p>
|
||||
*
|
||||
* @author 代码生成器生成
|
||||
* @since 2026
|
||||
*/
|
||||
public interface ProductModelParamsDataMapper extends BaseMapper<ProductModelParamsData> {
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
package com.nflg.mobilebroken.repository.service;
|
||||
|
||||
import com.nflg.mobilebroken.repository.entity.ProductModelParamsDataLanguage;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 产品中心-机型-参数数据-多语言 服务类
|
||||
* </p>
|
||||
*
|
||||
* @author 代码生成器生成
|
||||
* @since 2026
|
||||
*/
|
||||
public interface IProductModelParamsDataLanguageService extends IService<ProductModelParamsDataLanguage> {
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
package com.nflg.mobilebroken.repository.service;
|
||||
|
||||
import com.nflg.mobilebroken.repository.entity.ProductModelParamsData;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 产品中心-机型-参数数据 服务类
|
||||
* </p>
|
||||
*
|
||||
* @author 代码生成器生成
|
||||
* @since 2026
|
||||
*/
|
||||
public interface IProductModelParamsDataService extends IService<ProductModelParamsData> {
|
||||
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 产品中心-机型-参数数据-多语言 服务实现类
|
||||
* </p>
|
||||
*
|
||||
* @author 代码生成器生成
|
||||
* @since 2026
|
||||
*/
|
||||
@Service
|
||||
public class ProductModelParamsDataLanguageServiceImpl extends ServiceImpl<ProductModelParamsDataLanguageMapper, ProductModelParamsDataLanguage> implements IProductModelParamsDataLanguageService {
|
||||
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 产品中心-机型-参数数据 服务实现类
|
||||
* </p>
|
||||
*
|
||||
* @author 代码生成器生成
|
||||
* @since 2026
|
||||
*/
|
||||
@Service
|
||||
public class ProductModelParamsDataServiceImpl extends ServiceImpl<ProductModelParamsDataMapper, ProductModelParamsData> implements IProductModelParamsDataService {
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue