feat: 新增初始化材料数据脚本
This commit is contained in:
93
src/test/java/mjkf/xinke/MaterialDataMigration.java
Normal file
93
src/test/java/mjkf/xinke/MaterialDataMigration.java
Normal 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()));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user