refactor(product-model-params): 优化复制数据逻辑

- 修改ProductModelController中查询逻辑,使用batchNumber代替parentId和name进行过滤
- 移除ProductModelParamsItemMapper中未使用的getForQuotation方法及对应XML配置
- 更新ProductModelParamsMapper的getAllListByLanguage方法SQL,改为多表连接查询,支持语言过滤
- 删除ProductModelParamsMapper的copyItems声明和XML,实现由服务层自定义复制逻辑
- 实现ProductModelParamsServiceImpl中copyItems方法,完整复制旧版本数据和语言表,构建父子节点映射,保证数据一致性
This commit is contained in:
曹鹏飞 2026-05-25 10:27:49 +08:00
parent fa133ab4ce
commit ca727bacb9
6 changed files with 66 additions and 31 deletions

View File

@ -379,6 +379,7 @@ public class ProductModelController extends ControllerBase {
&& productModelParamsDataService.lambdaQuery()
.eq(ProductModelParamsData::getParamsId, request.getModelParamsId())
.eq(ProductModelParamsData::getParentId, 0)
.ne(ProductModelParamsData::getName, request.getIndexName())
.eq(ProductModelParamsData::getName, request.getNewIndexName())
.exists()
).throwMessage("指标名称已存在");
@ -517,11 +518,10 @@ public class ProductModelController extends ControllerBase {
Integer oldId = request.getModelParamsId();
request.setModelParamsId(productModelParamsService.add(info.getModelId(), info.getBatchNumber()));
productModelParamsService.copyItems(oldId, request.getModelParamsId());
// 在新版本中找到对应的数据记录
// 在新版本中通过 batchNumber 找到对应的数据记录
ProductModelParamsData newData = productModelParamsDataService.lambdaQuery()
.eq(ProductModelParamsData::getParamsId, request.getModelParamsId())
.eq(ProductModelParamsData::getParentId, currentData.getParentId())
.eq(ProductModelParamsData::getName, currentData.getName())
.eq(ProductModelParamsData::getBatchNumber, currentData.getBatchNumber())
.one();
VUtils.trueThrowBusinessError(Objects.isNull(newData)).throwMessage("修改失败");
dataId = newData.getId();
@ -604,11 +604,10 @@ public class ProductModelController extends ControllerBase {
Integer oldId = request.getModelParamsId();
request.setModelParamsId(productModelParamsService.add(request.getModelId(), info.getBatchNumber()));
productModelParamsService.copyItems(oldId, request.getModelParamsId());
// 在新版本中找到对应的数据记录
// 在新版本中通过 batchNumber 找到对应的数据记录
ProductModelParamsData newData = productModelParamsDataService.lambdaQuery()
.eq(ProductModelParamsData::getParamsId, request.getModelParamsId())
.eq(ProductModelParamsData::getParentId, currentData.getParentId())
.eq(ProductModelParamsData::getName, currentData.getName())
.eq(ProductModelParamsData::getBatchNumber, currentData.getBatchNumber())
.one();
VUtils.trueThrowBusinessError(Objects.isNull(newData)).throwMessage("删除失败");
dataId = newData.getId();

View File

@ -15,5 +15,4 @@ import java.util.List;
*/
public interface ProductModelParamsItemMapper extends BaseMapper<ProductModelParamsItem> {
List<ProductModelParamsItem> getForQuotation(Long configId);
}

View File

@ -20,8 +20,6 @@ public interface ProductModelParamsMapper extends BaseMapper<ProductModelParams>
List<ProductModelParamVO> getAllListByLanguage(Integer modelId, String language);
void copyItems(Integer oldId, Integer newId);
List<ProductParamsItemVO> getMainListByLanguage(Integer modelId, String language);
List<ParamsSortListVO> getMainListForSort(Integer paramId, String language);

View File

@ -202,7 +202,58 @@ public class ProductModelParamsServiceImpl extends ServiceImpl<ProductModelParam
@Override
public void copyItems(Integer oldId, Integer newId) {
baseMapper.copyItems(oldId,newId);
// 查出旧版本所有数据
List<ProductModelParamsData> allData = productModelParamsDataService.lambdaQuery()
.eq(ProductModelParamsData::getParamsId, oldId)
.list();
if (CollectionUtil.isEmpty(allData)) {
return;
}
// 分离父节点和子节点
List<ProductModelParamsData> parents = allData.stream()
.filter(d -> Objects.equals(d.getParentId(), 0L))
.collect(Collectors.toList());
List<ProductModelParamsData> children = allData.stream()
.filter(d -> !Objects.equals(d.getParentId(), 0L))
.collect(Collectors.toList());
// oldParentId -> newParentId 映射
Map<Long, Long> parentIdMapping = new HashMap<>();
// oldDataId -> newDataId 映射用于语言表
Map<Long, Long> dataIdMapping = new HashMap<>();
// 复制父节点
for (ProductModelParamsData parent : parents) {
Long oldParentDataId = parent.getId();
parent.setId(null);
parent.setParamsId(Long.valueOf(newId));
productModelParamsDataService.save(parent);
parentIdMapping.put(oldParentDataId, parent.getId());
dataIdMapping.put(oldParentDataId, parent.getId());
}
// 复制子节点重映射 parentId
for (ProductModelParamsData child : children) {
Long oldChildDataId = child.getId();
Long newParentId2 = parentIdMapping.get(child.getParentId());
child.setId(null);
child.setParamsId(Long.valueOf(newId));
child.setParentId(newParentId2 != null ? newParentId2 : child.getParentId());
productModelParamsDataService.save(child);
dataIdMapping.put(oldChildDataId, child.getId());
}
// 复制语言表数据
List<Long> oldDataIds = new ArrayList<>(dataIdMapping.keySet());
if (CollectionUtil.isNotEmpty(oldDataIds)) {
List<ProductModelParamsDataLanguage> langList = productModelParamsDataLanguageService.lambdaQuery()
.in(ProductModelParamsDataLanguage::getParamsDataId, oldDataIds)
.list();
if (CollectionUtil.isNotEmpty(langList)) {
langList.forEach(lang -> {
lang.setId(null);
lang.setParamsId(Long.valueOf(newId));
lang.setParamsDataId(dataIdMapping.get(lang.getParamsDataId()));
});
productModelParamsDataLanguageService.saveBatch(langList);
}
}
}
@Override

View File

@ -2,12 +2,4 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.nflg.mobilebroken.repository.mapper.ProductModelParamsItemMapper">
<select id="getForQuotation" resultType="com.nflg.mobilebroken.repository.entity.ProductModelParamsItem">
SELECT pmpi.batch_number,pmpi.language_code,pmpi.index_name,pmpi.`name`,pmpi.`value`
FROM quotation_model_config qmc
INNER JOIN product_model pm ON qmc.model_id=pm.batch_number AND pm.state=1
INNER JOIN product_model_params pmp ON pm.id=pmp.model_id AND pmp.state=1
INNER JOIN product_model_params_item pmpi ON pmp.id=pmpi.model_params_id
WHERE qmc.id=#{configId}
</select>
</mapper>

View File

@ -3,20 +3,16 @@
<mapper namespace="com.nflg.mobilebroken.repository.mapper.ProductModelParamsMapper">
<select id="getAllListByLanguage" resultType="com.nflg.mobilebroken.common.pojo.vo.ProductModelParamVO">
SELECT pmpi.index_name, pmpi.`name`, pmpi.`value`
SELECT pmpd1.name as index_name, pmpd2.`name`, pmpd2.`value`
FROM product_model_params pmp
INNER JOIN product_model_params_item pmpi ON pmp.id = pmpi.model_params_id
WHERE pmp.model_id = #{modelId}
AND pmp.state = 1
AND pmpi.language_code = #{language}
ORDER BY pmp.id DESC
</select>
<select id="copyItems">
INSERT INTO product_model_params_item(model_params_id,language_code,index_name,batch_number,`name`,`value`,main,compare,create_by,create_time,update_by,update_time)
SELECT #{newId},language_code,index_name,batch_number,`name`,`value`,main,compare,create_by,create_time,update_by,update_time
FROM product_model_params_item
WHERE model_params_id=#{oldId}
INNER JOIN product_model_params_data pmpd1 ON pmp.id = pmpd1.params_id
INNER JOIN product_model_params_data pmpd2 ON pmpd1.id = pmpd2.parent_id
INNER JOIN product_model_params_data_language pmpdl1 ON pmpd1.id = pmpdl1.params_data_id
INNER JOIN product_model_params_data_language pmpdl2 ON pmpd2.id = pmpdl2.params_data_id
INNER JOIN language l1 ON pmpdl1.language_id = l1.id
INNER JOIN language l2 ON pmpdl2.language_id = l2.id
WHERE pmp.model_id = #{modelId} AND pmp.state = 1 AND l1.code = #{language} AND l2.code = #{language}
ORDER BY pmpd1.id,pmpd2.id
</select>
<select id="getMainListByLanguage" resultType="com.nflg.mobilebroken.common.pojo.vo.ProductParamsItemVO">