基础资料改造批量触发值更新原创
金蝶云社区-qsmy
qsmy
4人赞赏了该文章 944次浏览 未经作者许可,禁止转载编辑于2023年03月31日 18:11:25

基础资料选择多条返回后,会多次触发propertyChange值改变事件,这时如果有比较耗时的逻辑就会需要很长时间。

/**
 * 基础资料字段,支持批量触发值更新事件,提升F7批量选择返回性能
 * 
 * @remark
 * 因为历史版本没有支持批量触发值更新事件,F7批量返回大量基础资料时,都是单条赋值,性能非常慢;
 * 为优化性能,平台对F7批量返回基础资料做了优化,支持批量赋值、批量触发值更新事件,允许插件在值更新事件中,也可以批量处理;
 * 但已有的插件普遍是写死只处理了e.getChangedSet()[0],即第一行的值,
 * 如果贸然把原来的单行赋值、触发值更新事件模式,改为批量赋值、批量触发值更新事件,会导致插件漏处理数据行;
 * 为保持兼容,只能是由插件主动调整propertyChanged事件处理代码,支持批量处理,并重写isSupportBatchPropChanged
 */
public class BasedataFieldPropChangedSample extends AbstractFormPlugin {

	private static final Log log = LogFactory.getLog(BasedataFieldPropChangedSample.class);
	
	@Override
	public void initialize() {
		// 设置基础资料字段,支持F7批量返回时,批量触发值更新事件,提示效率,优化性能
		BasedataEdit edit = this.getView().getControl("materiel");
		edit.setBatchFirePropChanged(true);
	}
	
	@Override
	public boolean isSupportBatchPropChanged() {
		//return false;
		// 申明本插件已经改造了propertyChanged事件处理代码,已处理批量传入的数据行
		return true;
	}

	@Override
	public void propertyChanged(PropertyChangedArgs e) {
		
		log.info(String.format("%s changed: %s row.", e.getProperty().getName(), e.getChangeSet().length));
		
		if (StringUtils.equals(e.getProperty().getName(), "materiel")) {
			for(ChangeData row : e.getChangeSet()) {
				// 循环处理批量传入的所有行
				this.getModel().setValue("qty", 2, row.getRowIndex());
			}
		}
		else if (StringUtils.equals(e.getProperty().getName(), "qty")) {
			for(ChangeData row : e.getChangeSet()) {
				this.getModel().setValue("price", 2, row.getRowIndex());
			}
		}
	}
}


赞 4