feat: 新增初始化材料数据脚本

This commit is contained in:
han0
2025-02-21 11:05:15 +08:00
parent 7185a57e51
commit cd93bf8e7a
3 changed files with 182 additions and 0 deletions

View File

@@ -0,0 +1,93 @@
package mjkf.xinke;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import mjkf.xinke.main.model.db.Material;
import mjkf.xinke.main.model.db.PriceResult;
import mjkf.xinke.main.service.MaterialService;
import mjkf.xinke.main.service.PriceResultService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@SpringBootTest(classes = Application.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class MaterialDataMigration {
@Resource
private PriceResultService priceResultService;
@Resource
private MaterialService materialService;
@Test
public void migrateMaterialData() {
// 1. 获取趋势表数据,按材料编号去重
var query = new LambdaQueryWrapper<PriceResult>();
query.select(PriceResult::getMaterialId, PriceResult::getName, PriceResult::getSpec, PriceResult::getUnit);
query.groupBy(PriceResult::getMaterialId, PriceResult::getName, PriceResult::getSpec, PriceResult::getUnit);
List<PriceResult> priceResults = priceResultService.list(query);
// 2. 获取已存在的材料数据
List<String> materialIds = priceResults.stream().map(PriceResult::getMaterialId).collect(Collectors.toList());
var materialQuery = new LambdaQueryWrapper<Material>();
materialQuery.in(Material::getId, materialIds);
Map<String, Material> existingMaterials = materialService.list(materialQuery)
.stream()
.collect(Collectors.toMap(Material::getId, m -> m));
// 3. 转换为材料数据,只处理不存在的材料
List<Material> materialsToSave = priceResults.stream()
.filter(pr -> !existingMaterials.containsKey(pr.getMaterialId()))
.map(pr -> {
Material material = new Material();
material.setId(pr.getMaterialId());
material.setName(pr.getName());
material.setSpec(pr.getSpec());
material.setUnit(pr.getUnit());
material.setIsBuiltin(1); // 设置为内建类型
material.setCreateTime(LocalDateTime.now());
// 根据材料ID解析分类信息
String id = pr.getMaterialId();
if (id != null && id.length() >= 7) {
material.setCategory1(id.substring(0, 2));
material.setCategory2(id.substring(2, 4));
material.setCategory3(id.substring(4, 7));
if (id.length() >= 10) {
material.setCategory4(id.substring(7, 10));
}
// 设置父ID
material.setParentId(id.length() >= 10 ? id.substring(0, 7) : id.substring(0, 4));
}
// 设置材料编码
material.setCode(id);
return material;
}).collect(Collectors.toList());
// 4. 批量保存新增的材料数据
for (var materialToSave: materialsToSave) {
var result = materialService.getBykey(materialToSave.getCode());
if (ObjectUtil.isEmpty(result)) {
materialService.save(materialToSave);
} else {
BeanUtil.copyProperties(materialToSave, result, "id");
materialService.updateById(result);
}
}
System.out.println("迁移完成,新增 " + materialsToSave.size() + " 条数据");
System.out.println("现有材料总数:" + (existingMaterials.size() + materialsToSave.size()));
}
}