1:前期依赖AI生成方案,生成的流程图相对于之前自己画的更加美观,填充的内容更全面;布局更美观;这是以后自己画图的时候需要改进的;
2:依赖AI生成文档,但是会造成token消耗超额,浪费了不少时间;
3.1:需求理解有问题,前期提的方案队列,其实是不需要的;
3.2:前期对于人天的评估过于乐观了,解析excel表格只评估了0.5人天,下载excel表格也评估了0.5人天;实际开发过程中发现复制的部件/文档解析以及导入的功能并不可用;
3.3:最大的问题在于对于数据结构的误解导致了需求人天评估的不准确;误以为的数据结构是行是一样的,每一行是一个对象,其实行是动态的,每一列也是动态的;页面的数据是类型-属性-各个工具的配置信息,而不是类型-属性-属性值,这一点是最大的区别以及整个开发的难点,相当于数据要以工具维度分成不同的sheet,同时行是类型,列是类型的属性,cell是该类型对应的属性配置的工具的值;
3.4:我们获取类型->属性->工具配置;要换换成工具sheet页,行是不同的类型,列是属性,cell是值;
如何实现呢?
先以工具维度分组,再以类型分组,最后的值就是该类型在此工具下不同的属性配置的值;该值的维度是三维的,
下面是借助AI生成的伪代码;
// ========== 核心分组逻辑 ==========
public class ExportCADGrouper {
/**
* 按 tool 分组,相同 tool + type 的记录合并为一个 GroupedCAD
*
* @param exportCADList 原始列表
* @return Map<tool, List<GroupedCAD>>
*/
public static Map<String, List<GroupedCAD>> groupByTool(List<ExportCAD> exportCADList) {
if (exportCADList == null || exportCADList.isEmpty()) {
return Collections.emptyMap();
}
// 中间结构:tool -> (type -> GroupedCAD)
// 用 LinkedHashMap 保持插入顺序
Map<String, Map<String, GroupedCAD>> intermediateMap = new LinkedHashMap<>();
for (ExportCAD item : exportCADList) {
String tool = item.getTool();
String type = item.getType();
// 获取或创建该 tool 下的 type -> GroupedCAD 映射
intermediateMap.computeIfAbsent(tool, k -> new LinkedHashMap<>());
Map<String, GroupedCAD> typeMap = intermediateMap.get(tool);
// 获取或创建该 type 对应的 GroupedCAD
typeMap.computeIfAbsent(type, k -> {
GroupedCAD grouped = new GroupedCAD();
grouped.setType(type);
grouped.setTool(tool);
grouped.setName(item.getName());
grouped.setNumber(item.getNumber());
return grouped;
});
// 将动态字段追加到已有对象
GroupedCAD grouped = typeMap.get(type);
if (item.getPlmAttrCode() != null || item.getPlmAttrName() != null) {
DynamicAttr attr = new DynamicAttr(
item.getPlmAttrName(),
item.getPlmAttrCode(),
item.getCadValue()
);
grouped.getDynamicAttrs().add(attr);
}
}
// 将中间结构转换为最终结果:tool -> List<GroupedCAD>
Map<String, List<GroupedCAD>> result = new LinkedHashMap<>();
intermediateMap.forEach((tool, typeMap) ->
result.put(tool, new ArrayList<>(typeMap.values()))
);
return result;
}
}
当然还有如何把这些数据转换成POI使用的数据也是有技巧的;此功能试错以及开发用了两个人天,刚开始就思考错了,代码也是不断尝试;
下面讲导入的总结
导入功能采用的是easyexcel,所以就需要在表格里面设置字段跟服务器的字段的注解能够匹配上;
大致思路
//1.0 先获取每一个sheet
ExcelReader reader = EasyExcel.read(multipartFile.getInputSream.build).build;
List<ReadSheet> sheetList = reader.excelExecuror().sheetList();
//2.0 再解析每一个sheet转成我们需要的数据
EasyExcel.readSheet(i).headRowNumber(0).registerReadListener(new CusterAnalysisEventListener()).build;
// 2.1 写一个类继承AnalysisEventListener然后实现invoke方法;
需要对easyExcel熟悉;
//3.0 按照系统需要的数据反向组装回去
以类型/属性分组处理数据;