原始需求:
1)有一个两级级联的表格:分组与规则,一个分组下可以有多个规则;
2)保存时要统一保存,也就是不能添加一个分组或规则就保存一下,而要到最后点击保存按钮时,把本次所有的修改一次性的提交了。
分析:
1) 保存时分组与规则必须关联起来。否则,如果新加两个或多个分组时,新加分组下的规则,因新加分组都没有Id,这些规则会没有办法区分自己属于哪个分组。如新增分组:[{id:’’,name:’分组1’},{id:’’,name:’分组2’}],它们下级的规则就无法通过分组id区分分组。
2) 为了解决上面新加多个分组时,区分规则与分组的对应,我把规则直接处理分组的下一级进行提交。再后台解析时,因规则直接与分组对应,也不会造成分组与规则的对应混乱。
实现:
Js关键代码:
var alarmGroups = alarmGroupStore.getRange();//.getModifiedRecords(); 因为规则有变动时,分组可能没有修改,所以必须用全部分组,而且我知道分组的数量不会大,无须优化
var alarmFormulaStore = this.getStore('alarm.AlarmFormula');
var alarmFormul_modified = alarmFormulaStore.getModifiedRecords();
for(idx=0;idx<alarmGroups.length;idx++){
rec=[];arrFormula=[];
groupId = alarmGroups[idx].get('id');
rec.push(groupId);
rec.push(alarmGroups[idx].get('name'));
rec.push(alarmGroups[idx].get('isDefault'));
// 报警规则,这个地方只处理变动的规则就可以了,不变的不管了,删除的单独处理
Ext.Array.each(alarmFormul_modified, function(formula){
if(formula.get('alarmGroupId')==groupId){
recFormula=[];
recFormula.push(formula.get('id'));
recFormula.push(formula.get('name'));
recFormula.push(formula.get('content'));
recFormula.push(formula.get('background'));
recFormula.push(formula.get('foreground'));
recFormula.push(Ext.isNumeric(formula.get('serial'))?formula.get('serial'):1);
recFormula.push(formula.get('isValid')=="1"?true:false);
recFormula.push(formula.get('alarmMode'));
recFormula.push(formula.get('alarmColumn'));
arrFormula.push(Ext.encode(recFormula));
}
});
rec.push(Ext.encode(arrFormula));
arr.push(Ext.encode(rec));
}
list.push(Ext.encode(arr));
java处理关键代码:
// 报警分组
JSONArray jsonAlarmGroups = JSONArray.fromObject(jsonAlarm.getString(1));
for(int i=0;i<jsonAlarmGroups.size();i++){
JSONArray jaAlarmGroup = JSONArray.fromObject(jsonAlarmGroups.get(i));
String alarmGroupId = jaAlarmGroup.getString(0);
AlarmGroup alarmGroup = alarmGroupDomainService.getAlarmGroup(alarmGroupId);
boolean isNew = false;
if(alarmGroup==null){
alarmGroup = new AlarmGroup();
isNew = true;
}
alarmGroup.setName(jaAlarmGroup.getString(1));
alarmGroup.setFtype(queryType);
alarmGroup.setListQuery(query);
alarmGroup.setSubject(subject);
if(isNew)
alarmGroupDomainService.addAlarmGroup(alarmGroup);
else
alarmGroupDomainService.editAlarmGroup(alarmGroup);
// 报警规则,规则在分组下,处理起来很简单
JSONArray jaAlarmFormulas = JSONArray.fromObject( jaAlarmGroup.getString(3));
for(int m = 0;m<jaAlarmFormulas.size();m++){
JSONArray jaAlarmFormula = JSONArray.fromObject( jaAlarmFormulas.getString(m));
String alarmFormlulaId = jaAlarmFormula.getString(0);
AlarmFormulas formula = alarmDomainService.getAlarmFormulaByAlarmId(alarmFormlulaId);
if(formula == null){
formula = new AlarmFormulas();
//formula.setId(alarmFormlulaId);
}
formula.setName(jaAlarmFormula.getString(1).replaceFirst("^null$", ""));
formula.setContent(jaAlarmFormula.getString(2).replaceFirst("^null$", ""));
formula.setAlarmGroup(alarmGroup);
formula.setBackground(jaAlarmFormula.getString(3).replaceFirst("^null$", ""));
formula.setForeground(jaAlarmFormula.getString(4).replaceFirst("^null$", ""));
formula.setSerial(jaAlarmFormula.getInt(5));
formula.setIsvalid(jaAlarmFormula.getBoolean(6));
formula.setAlarmMode(AlarmModeType.valueOf(jaAlarmFormula.getString(7)));
formula.setAlarmColumn(jaAlarmFormula.getString(8).replaceFirst("^null$", ""));
alarmDomainService.saveOrUpdateAlarmFormula(formula);
}
}
说明:
1) 我这里前台js是使用Ext的grid进行级联;
2) 需求总共只有两级级联;
3) 简单起见,这里没有加规则验证逻辑;