业务场景: 有一个基础数据,员工考核方案. 有一个岗位实例数据: 岗位考核方案. 岗位的数据可以通过一个按钮从基础数据中进行同步数据过来.如考核项, 考核满分,最低分等,而且考核方案数据是树结构的.用字段parentId标记.
在同步逻辑中,就要做区分哪些数据之前是同步过的,就做更新操作.没有同步过的, 就进行新增操作.故示例数据需要用baseDataId字段标记该实例数据是同步自哪条基础数据的
下面直接上代码
public void sync(String stationId){
List<BaseData> baseDatas = baseDataService.list(stationId);//查询该岗位的基础数据
List<KPI> currDatas = kpiService.list(stationId);//查询该岗位的实例数据
Map<String,KPI> bd2cdMap = new HashMap<>();
for (KPI : currDatas) {
if (StringUtils.isMeaningFul(vo.getBaseDataId())) {
//记录基础数据id和示例数据的对应关系
bd2cdMap.put(vo.getBaseDataId(), vo);
}
}
while (!baseDatas.isEmpty()){ //baseDatas是树结构的话,则用该方式遍历.如果是List结构,直接for即可
BaseData remove = baseDatas.remove(0);
baseDatas.addAll(remove.getChildren());
KPI vo= bd2cdMap.get(remove.getId());
if(vo== null){
//不存在的.进行新增
KPI newData = new KPI();
newData.setStaffId(staffId);
newData.setBaseDataId(remove.getId());
newData.setFullScore(remove.getFullScore());
if(StringUtils.isMeaningFul(remove.getParentId()) ){
//查询对应的父节点,记录parentId
KPI parentVo = bd2cdMap.get(remove.getParentId());
if(parentAsVo != null){
newData.setParentId(parentVo.getId());
}
}
kpiService.insert(newData);
bd2cdMap.put(newData.getBaseDataId(),newData);//新增完要放回map
}else{
//存在的,进行更新字段
vo.setFullScore(remove.getFullScore());
kpiService.update(vo);
}
}
}
本文到此结束