1.元数据设计
因为子表根据其他节点设置的影响因素改变而改变,所以子表的元数据设计比较特殊,元数据设计如下:
2.单据模板设置
具体实现动态子表的方法是在单据模板里新建几个非元数据的字段,如pk_def1,pk_def2...,在其对应的高级属性中的关键字名一项中填入pk_effect1_value,对应上影响因素1主键,然后改字段就是动态子表显示的字段,而数据库保存数据的是对应的pk_effect1_value,对pk_def1的类型根据配置改变是通过后台代码实现,具体后面介绍。
3.单据模板中新增的pk_defn类型的改变,一级节点中数据通过显示模板展示都是通过后台代码实现的,如下展示关键部分代码
public class RightBillFormDemo extends
nc.ui.pubapp.uif2app.view.ShowUpableBillForm {
public void initUI() {
super.initUI();
// 根据管理维度设置的影响因素改变表体的名称和参照
BillModel billmodel = getBillCardPanel().getBillModel();
try {
billmodel = BodyItemChangeUtil.processBillModel(IFcConst.PROVISIONRULE,
billmodel);
} catch (BusinessException e) {
ExceptionUtils.wrappException(e);
}
getBillCardPanel().setBillModel(billmodel);
}
}
public class BodyItemChangeUtil {
public static final String[] item_name = new String[] { "pk_def1", "pk_def2", "pk_def3", "pk_def4", "pk_def5",
"pk_def6", "pk_def7", "pk_def8", "pk_def9", "pk_def10" };
public static BillModel processBillModel(String type, BillModel billmodel) throws BusinessException {
// 根据维度类型查找该类型下的影响因素
EffeRelaVO[] dimsVO = queryByType(type);
rebuildBodyTemplet(billmodel, dimsVO, "0", EffeRelaVO.PK_DIMEFFEDEF, IFcConst.ControlAreaCode);
return billmodel;
}
public static void rebuildBodyTemplet(BillModel billmodel, SuperVO[] effevos, String isNull,
String targetfieldcode, String moduleid) throws BusinessException {
Map<String, RefInfoVO> map = FcDaoUtil.voQueryDimdef(moduleid);
RefInfoVO refinfoVO = null;
// 先隐藏字段
for (String key : item_name) {
if (billmodel.getItemByKey(key) != null) {
billmodel.getItemByKey(key).setShow(false);
billmodel.getItemByKey(key).setNull(false);
}
}
// 根据查出的对应影响因素设置参照再显示
if (effevos != null && effevos.length > 0) {
for (SuperVO dvo : effevos) {
refinfoVO = map.get(dvo.getAttributeValue(targetfieldcode));
// 将83、84行的 item_name[i] 改为
// "pk_def"+dvo.getAttributeValue("order_no").toString()
if (refinfoVO != null
&& billmodel.getItemByKey("pk_def" + dvo.getAttributeValue("order_no").toString()) != null) {
BillItem bi = billmodel.getItemByKey("pk_def" + dvo.getAttributeValue("order_no").toString());
resetBillItem(bi, refinfoVO, null);
// 如果是系数录入节点,传入的isNull为为1,说明显示出来的所有影响因素不能为空,
// 其他节点的(如产品)显示出来的影响因素可以为空,但不能全部为空,这个校验在各个节点自己添加
// if (isNull.equals("0")) {
// bi.setNull(false);
// } else {
// bi.setNull(false);
// }
bi.setNull(false);
}
}
}
}
public static void resetBillItem(BillItem bi, RefInfoVO rivo, String name) {
AbstractRefModel model = null;
bi.setMetaDataProperty(null);
Boolean isref = Boolean.FALSE;
// 添加基础数据类型 20150520
// 字符串
if (rivo.getRefclass().equals("java.lang.String")) {
bi.setDataType(IBillItem.STRING);
// 整数
} else if (rivo.getRefclass().equals("java.lang.Integer")) {
bi.setDataType(IBillItem.INTEGER);
// 数量
} else if (rivo.getRefclass().equals("nc.vo.pub.lang.UFDouble")) {
bi.setDataType(IBillItem.DECIMAL);
// 逻辑
} else if (rivo.getRefclass().equals("nc.vo.pub.lang.UFBoolean")) {
bi.setDataType(IBillItem.BOOLEAN);
// 日期
} else if (rivo.getRefclass().equals("nc.vo.pub.lang.UFDate")) {
bi.setDataType(IBillItem.DATE);
// 时间戳
} else if (rivo.getRefclass().equals("nc.vo.pub.lang.UFDateTime")) {
bi.setDataType(IBillItem.DATETIME);
// 日期(无时区)
} else if (rivo.getRefclass().equals("nc.vo.pub.lang.UFLiteralDate")) {
bi.setDataType(IBillItem.LITERALDATE);
} else {
isref = Boolean.TRUE;
bi.setDataType(IBillItem.UFREF);
bi.setRefType("<" + rivo.getRefclass() + ">");
}
bi.setShow(true);
if (name != null) {
bi.setName(name);
} else {
bi.setName(rivo.getName());
}
try {
if (isref) {
model = (AbstractRefModel) Class.forName(rivo.getRefclass()).newInstance();
}
} catch (Exception e) {
Debug.error("实例化参照类出错" + rivo.getRefclass());
throw new IllegalArgumentException("实例化参照类出错" + rivo.getRefclass());
}
if (rivo.getIsneedpara() != null && rivo.getIsneedpara().booleanValue()) {
// 处理自定义档案参照 wangyea 2013-06-08
model.setPara1(rivo.getPara1());
model.setPara2(rivo.getPara2());
model.setRefNodeName(rivo.getRefclass());
model.reset();// 自定义档案初始化
UIRefPane ref = new UIRefPane();
ref.setRefModel(model);
bi.setComponent(ref);
} else {
// 非自定义档案参照处理 wangyea 2013-06-08
IBillItemEditor itemEditor = BillItemEditorFactory.creatBillItemEditor(bi);
bi.setComponent(itemEditor.getComponent());
}
setShowFormular(bi, model, isref);
}
/**
* setShowFormular:设置BillItem显示公式,从方法rebuildBodyTemplet中抽象出来
*
* @param bi
* 被设置的BillItem
* @param model
* BillItem使用的参照model
* @author fitvincent
*/
private static void setShowFormular(BillItem bi, AbstractRefModel model, Boolean isref) {
// 设置显示公式:pk_def1->getcolvalue( , , , )
StringBuffer showFormula = new StringBuffer();
showFormula.append(bi.getKey());
if (isref) {
showFormula.append("->getcolvalue(");
if (model.getBlurQueryTableName() != null) {
showFormula.append(model.getBlurQueryTableName()).append(",");
} else {
if (model.getTableName().indexOf("fc_map_bankacct") != -1) {
showFormula.append("fc_map_bankacct").append(",");
} else {
showFormula.append(model.getTableName()).append(",");
}
}
// int dotindex = model.getRefCodeField().indexOf(".");
// if (dotindex > 0) {
// showFormula.append(model.getRefCodeField().substring(dotindex + 1)).append(",");
// } else {
// showFormula.append(model.getRefCodeField()).append(",");
// }
int dotindex = model.getRefNameField().indexOf(".");
if (dotindex > 0) {
showFormula.append(model.getRefNameField().substring(dotindex + 1)).append(",");
} else {
showFormula.append(model.getRefNameField()).append(",");
}
dotindex = model.getPkFieldCode().indexOf(".");
if (dotindex > 0) {
showFormula.append(model.getPkFieldCode().substring(dotindex + 1)).append(",");
} else {
showFormula.append(model.getPkFieldCode()).append(",");
}
showFormula.append(bi.getIDColName()).append(")");
} else {
showFormula.append("->").append(bi.getIDColName());
String editFormula = bi.getIDColName() + "->" + bi.getKey();
bi.setEditFormula(new String[] { editFormula });
}
bi.setLoadFormula(new String[] { showFormula.toString() });
}
}
如下代码所示,把获取到的聚合VO设置到界面上,其中editor.setValue(aggVo)中通过调用execLoadFormula()方法来执行之前设置的显示公式。
public class LeftRightMediator implements IAppModelDataManager,
AppEventListener {
/**
* 把获取到的聚合VO设置到界面上
* setRightData
* @param aggVo void
*/
private void setRightData(AggProvisionRuleVO aggVo) {
editor.setValue(aggVo);
this.getRightModel().initModel(aggVo);
}
}