# M18 ERP 装饰器 (前端接口)

Version: 1.1 | Release Date: 7/12/2018

# AccountEditorDecorator

# 接口定义

此装饰器用于处理[科目]模块界面中的字段更改操作。

public interface AccountEditorDecorator extends ViewDecorator {

	public default void afterUpdateAccountSetting(String triggerFieldName) {
	}
}

# 应用

在[帐户]模块界面中,当字段更新时(如更改<商机科目>或<银行帐户>的值),M18将调用AccountEditorDecorator接口中的afterUpdateAccountSetting函数。

	private void updateAcccountSetting(String triggerFieldName) {
		...
		
		controller.notifyDecorator(AccountEditorDecorator.class, (decorator, params) -> decorator.afterUpdateAccountSetting((String) params[0]), new Object[] { triggerFieldName });

		WebUtil.update(getMTName() + "_bankAcc", getMTName() + "_cashAcc", getMTName() + "_adjExAcc", ...);
	}

在3PD的App中,您可以设置backingBeanviewListener实现AccountEditorDecorator接口,并重写afterUpdateAccountSetting函数。

public class AccountListener implements AccountEditorDecorator {
	
	@Override
	public void afterUpdateAccountSetting(String triggerFieldName) {
		// do something, like "WebUtil.setDisabled(true, field);
	}
    
	...
}	

# 详细说明

# 更新科目栏位

	public default void afterUpdateAccountSetting(String triggerFieldName) {
	}

说明

在[科目]模块界面中字段更新时会触发以上函数。

参数

名称 类型 说明
triggerFieldName String 触发函数时更改的栏位名称

# BatchGenDataDecorator

# 接口定义

此装饰器用于处理[自动文件中心]模块中的下款表数据。

public interface BatchGenDataDecorator extends ViewDecorator {
	public void afterLoadData(SqlTable sourceTable);
}

# 应用

在[自动文件中心]中,当加载数据到目标模块时,M18将调用BatchGenDataDecorator接口的AfterLoadData函数。

	public void loadBatchGenData(SqlTable sourceTable, JSONObject extraParam) {
    	...
		getController().notifyDecorator(BatchGenDataDecorator.class,
			(decorator, params) -> decorator.afterLoadData((SqlTable) params[0]), 
            	new Object[] { sourceTable });
	}

在3PD的App中,您可以设置backingBeanviewListener实现BatchGenDataDecorator接口,并重写afterLoadData函数。

public class XxxListener implements BatchGenDataDecorator {

	@Override
	public void afterLoadData(SqlTable sourceTable) {
		//do something data loaded
	}
	...
}

# 详细说明

# 读取生成单据的数据

	public default void afterLoadData(SqlTable sourceTable) {

	}

说明

函数在[自动文件中心]下款表数据被加载到目标模块后触发。

参数

名称 类型 说明
sourceTable SqlTable 被选择的数据

# ITradingCalcDecorator

# 接口定义

此装饰器用于处理交易模块中常见字段的更改操作。

public interface ITradingCalcDecorator extends ViewDecorator {

	public default void before_update_adisc(IMacCalculateHelper calcHelper) {

	}

	public default void after_update_adisc(IMacCalculateHelper calcHelper) {

	}
	...
}	

# 应用

在交易模块中,当更新公共字段时,M18将调用ItradingCalcDecorator接口的before_update_xxx函数和after_update_xxx函数。

	public void calc_update_adisc() {
		controller.notifyDecorator(ITradingCalcDecorator.class, (decorator, params) -> decorator.before_update_adisc((IMacCalculateHelper) params[0]), new Object[] { calcHelper });

		efe_calc_update_adisc();

		controller.notifyDecorator(ITradingCalcDecorator.class, (decorator, params) -> decorator.after_update_adisc((IMacCalculateHelper) params[0]), new Object[] { calcHelper });
	}

在3PD的App中,您可以设置backingBeanviewListener实现ItradingCalcDecorator接口,并重写before_update_xxxafter_update_xxx函数。

public class TrdgVatTradeMainFooterListener implements ITradingCalcDecorator {

	@Override
	public void before_update_xxx(IMacCalculateHelper calcHelper) {
		//do something
	}

	@Override
	public void after_update_xxx(IMacCalculateHelper calcHelper) {
		//do something
	}
	...
}

# 详细说明

# 下款产品表的<报价>栏位

	public default void before_update_qup(IMacCalculateHelper calcHelper, int rec, SqlTable srcTable, boolean must_update) {

	}

	public default void after_update_qup(IMacCalculateHelper calcHelper, int rec, SqlTable srcTable, boolean must_update) {

	}

说明

在交易单据的产品表加载<报价>字段的值时触发以上函数。

参数

名称 类型 说明
calcHelper IMacCalculateHelper MacCalculateHelper
rec int 当前下款表的行次
srcTable SqlTable 价格来源数据表
must_update boolean 如果是reload_price_one_promust_update为 true; 其他情况 must_update为 false.

# 下款产品表的<折扣>栏位

	public default void before_a_mainfooter_disc(IMacCalculateHelper calcHelper, int rec, double inOldValue) {

	}

	public default void after_a_mainfooter_disc(IMacCalculateHelper calcHelper, int rec, double inOldValue) {

	}

说明

当交易单据下款产品表的<折扣(%)>栏位更新时,会触发以上函数。

参数

名称 类型 说明
calcHelper IMacCalculateHelper MacCalculateHelper
rec int 当前下款表的行次
inOldValue double <折扣(%)>修改前的值

# 下款产品表的<金额>栏位

	public default void before_a_mainfooter_amt(IMacCalculateHelper calcHelper, int rowIndex) {

	}

	public default void after_a_mainfooter_amt(IMacCalculateHelper calcHelper, int rowIndex) {

	}

说明

当交易单据下款产品表的<金额>栏位更新时,会触发以上函数。

参数

名称 类型 说明
calcHelper IMacCalculateHelper MacCalculateHelper
rowIndex int 当前下款表的行次

# 下款产品表的<单位订价>栏位

	public default void before_mainfooter_up(IMacCalculateHelper calcHelper, int rowIndex, SqlTable srcTable, boolean fromUc) {

	}

	public default void after_mainfooter_up(IMacCalculateHelper calcHelper, int rowIndex, SqlTable srcTable, boolean fromUc) {

	}

说明

当交易单据下款产品表加载<单位定价>时,会触发以上函数。例如,当从产品来源加载数据到单位定价时,会触发以上函数。

参数

名称 类型 说明
calcHelper IMacCalculateHelper MacCalculateHelper
rowIndex int 当前下款表的行次
srcTable SqlTable 价格来源数据表
fromUc boolean 用来决定使用价格来源数据表的UP栏位还是UC栏位

# 下款产品表的<单位订价>栏位(在<单位定价>读取后)

	public default void before_a_mainfooter_up(IMacCalculateHelper calcHelper, int rec) {

	}

	public default void after_a_mainfooter_up(IMacCalculateHelper calcHelper, int rec) {

	}

说明

当交易单据下款产品表<单位定价>更改时,会触发以上函数。

参数

名称 类型 说明
calcHelper IMacCalculateHelper MacCalculateHelper
rec int 当前下款表的行次

# 下款产品表的<说明>栏位

	public default void before_mainfooter_desc(IMacCalculateHelper calcHelper, int rowIndex, SqlTable srcTable) {

	}

	public default void after_mainfooter_desc(IMacCalculateHelper calcHelper, int rowIndex, SqlTable srcTable) {

	}

说明

当交易单据下款产品表加载<说明>栏位时,会触发以上函数。例如,当从产品说明来源加载说明数据时,会触发以上函数。

参数

名称 类型 说明
calcHelper IMacCalculateHelper MacCalculateHelper
rowIndex int 当前下款表的行次
srcTable SqlTable 说明来源数据表

# 下款产品表的<数量>栏位

	public default void before_a_mainfooter_qty(IMacCalculateHelper calcHelper, int rowIndex) {

	}

	public default void after_a_mainfooter_qty(IMacCalculateHelper calcHelper, int rowIndex) {

	}

说明

当交易单据下款产品表<数量>栏位更改时,会触发以上函数。

参数

名称 类型 说明
calcHelper IMacCalculateHelper MacCalculateHelper
rowIndex int 当前下款表的行次

# 下款产品表的<数量 (没有批号)>栏位

	public default void before_a_mainfooter_lotnoOutQty(IMacCalculateHelper calcHelper, int rowIndex) {

	}

	public default void after_a_mainfooter_lotnoOutQty(IMacCalculateHelper calcHelper, int rowIndex) {

	}

说明

当交易单据下款产品表<数量 (没有批号)>栏位更新时,会触发以上函数。

参数

名称 类型 说明
calcHelper IMacCalculateHelper MacCalculateHelper
rowIndex int 当前下款表的行次

# 下款产品表的<单位>栏位

	public default void before_up_byUnit(IMacCalculateHelper calcHelper, int rowIndex, long oldUnitId) {

	}

	public default void after_up_byUnit(IMacCalculateHelper calcHelper, int rowIndex, long oldUnitId) {

	}

说明

当交易单据下款产品表<单位>栏位更改时,会触发以上函数。

参数

名称 类型 说明
calcHelper IMacCalculateHelper MacCalculateHelper
rowIndex int 当前下款表的行次
oldUnitId long <单位>修改前的值

# 总附加折扣收费

	public default void before_update_adisc(IMacCalculateHelper calcHelper) {

	}

	public default void after_update_adisc(IMacCalculateHelper calcHelper) {

	}

说明

当上款的<总附加收费>/<总附加折扣>重新计算时,会触发以上函数。

参数

名称 类型 说明
calcHelper IMacCalculateHelper MacCalculateHelper

# 附加折扣/收费下款表的<金额>栏位

	public default void before_a_adisc_amt(IMacCalculateHelper calcHelper, int rec) {

	}

	public default void after_a_adisc_amt(IMacCalculateHelper calcHelper, int rec) {

	}

说明

当[附加折扣/收费]表的<金额>栏位更改时,会触发以上函数。

参数

名称 类型 说明
calcHelper IMacCalculateHelper MacCalculateHelper
rec int 当前[附加折扣/收费]表的行次

# 附加折扣/收费表的<收费/折扣率>栏位

	public default void before_a_adisc_discrate(IMacCalculateHelper calcHelper, int rec) {

	}

	public default void after_a_adisc_discrate(IMacCalculateHelper calcHelper, int rec) {

	}

说明

当[附加折扣/收费]表的<收费/折扣率>栏位更改时,会触发以上函数。

参数

名称 类型 说明
calcHelper IMacCalculateHelper MacCalculateHelper
rec int 当前[附加折扣/收费]表的行次

# ITransactionDecorator

# 接口定义

这个渲染器是用于处理交易单据从来源单据加载附加折扣/收费数据。

public interface ITransactionDecorator extends ViewDecorator {

	public void beforeAssignDisc(SqlTable lookupTable);

	public void afterAssignDisc();
}

# 应用

在交易应用程序中,当加载来源单据的附加折扣/费用数据时,它将调用ITransactionDecoratorAssignDisc函数和afterAssignDisc函数。

	private void assign_so_disc(SqlTable sodisc) {
		if (sodisc != null && sodisc.size() > 0) {
			controller.notifyDecorator(ITransactionDecorator.class,
					(decorator, params) -> decorator.beforeAssignDisc((SqlTable) params[0]), new Object[] { sodisc });
			...
			controller.notifyDecorator(ITransactionDecorator.class,
					(decorator, params) -> decorator.afterAssignDisc(), null);
		}
	}

在3PD的App中,您可以设置backingBeanviewListener实现ITransactionDecorator接口,并重写beforeAssignDisc函数和afterAssignDisc函数。

public class TrdgVatTradeMainFooterListener extends TransactionDecorator
		implements ModuleViewListener, ITradingCalcDecorator {
	@Override
	public void beforeAssignDisc(SqlTable lookupTable) {
		if (VatUtil.isVatPerItem(getBeId())) {
			if (lookupTable != null && lookupTable.size() > 0) {
				// handler vat fields (like taxAmt preTaxAmt)
			}
		}
	}
	
	@Override
	public void afterAssignDisc() {
		if (VatUtil.isVatEnabled(getBeId())) {
			updateVatCalFields();
		}
	}
}

# 详细说明

# 附加折扣/收费加载

	public void beforeAssignDisc(SqlTable lookupTable);

	public void afterAssignDisc();

说明

当交易单据加载来源单据的附加折扣/收费数据时,会触发以上函数。

参数

名称 类型 说明
lookupTable SqlTable 从来源单据中读取的附加折扣/收费的数据

# PrqGenDecorator

# 接口定义

此渲染器是用来扩展[生成MRP单据]模块。

public interface PrqGenDecorator extends ViewDecorator {

	public default List<String> getMoreFields() {
		return null;
	}

	public default List<FormatCond> getMoreConds() {
		return null;
	}
  	...
}

# 应用

在[生成MRP单据]模块中,当读取数据,加载数据或者生成单据的操作中,会调用PrqGenDecorator渲染器的相关函数。

	public void refreshData() {
		// Fields
		List<String> fieldList = Arrays.asList("tranType", "tranId", "pproId", "proId", "bDesc", 
                                               "lot", "qty", "unitId", "dDate");

		DecorateVisitCallback<PrqGenDecorator> fieldsCallBack = new 
          DecorateVisitCallback<PrqGenDecorator>() {
			@Override
			public boolean visited(PrqGenDecorator decorator, Object returnObject) {
				if (returnObject != null) {
					@SuppressWarnings("unchecked")
					List<String> addFields = (List<String>) returnObject;
					if (addFields != null) {
						for (String field : addFields) {
							if (!fieldList.contains(field)) {
								fieldList.add(field);
							}
						}
					}
				}
				return true;
			}
		};
      	controller.visitDecorator(PrqGenDecorator.class, (decorator, params) -> 
                                  decorator.getMoreFields(), new Object[] {}, fieldsCallBack);
	}

在3PD的App中,您可以设置viewListener实现PrqGenDecorator接口,并重写里面的函数。

public class XxxListener implements PrqGenDecorator {
	@Override
	public List<String> getMoreFields() {
		// Get more fields when loading data
	}
  	...
}

# 详细说明

# 读取数据

	public List<String> getMoreFields() {
        // Define the list of extra fields 
    }

	public List<FormatCond> getMoreConds() {
        // Define the extra conditions to loading data
    }

	public void beforeAssignedData(long beId, SqlTable searchTable) {
        // Do something before system assigning data
    }

	public void assignedShowField(SqlTable showTable, int rec, SqlTable searchTable, int index)
    {
        // Do something after system assigned data to one row
    }

说明

在读取数据的时候,包括PrqGenBean.java中的refreshData() 函数运行时,都会触发以上函数。

参数

名称 类型 说明
beId long 当前企业法人ID
searchTable SqlTable 读取的数据
rec int [生成MRP单据]模块下款表的行次
showTable SqlTable [生成MRP单据]模块下款表
index int 读取的数据的行次

# 生成单据

	public default CheckMsg validTableData(SqlTable showTable) {
		// Add checking before generating transactions
	}

	public default List<String> getRequiredFields(String moduleName) {
		// Define extra compulsory fields
	}

	public default void beforeSeparateRecored(SqlTable showTable) {
		// Do something before separating records
	}

说明

在生成单据的时候,包括PrqGenBean.java中的batchGenData(ViewActionEvent vae) 函数运行时,都会触发以上函数。

参数

名称 类型 说明
showTable SqlTable [生成MRP单据]模块下款表
moduleName Sting 生成单据的类型

# UpdatePriceListDecorator

# 接口定义

此渲染器用来扩展[价目表(产品)]模块。

public interface UpdatePriceListDecorator extends ViewDecorator {

	public default void afterLoadProductList(SqlTable priceList) {
	}

	public default void beforeSavePriceList(SqlEntity entity, int entityFooterRowIndex, SqlTable priceList, int priceListRowIndex) {
	}

	public default void afterUplBEChanged(long beId) {
	}
}

# 应用

在[价目表(产品)]模块中,当执行读取、保存操作或者修改模块的<企业法人>下拉列表时,会调用以上函数。

	@Override
	public void valueChange(ValueChangeEvent vce) {
		super.valueChange(vce);
		String compId = vce.getComponent().getId();
		if (compId.equals("beList")) {
				...
				controller.notifyDecorator(UpdatePriceListDecorator.class, (decorator, params) -> decorator.afterUplBEChanged((long) params[0]), new Object[] { beId });
				...
			}
		}
	}

在3PD的App中,您可以设置backingBean或者viewListener实现UpdatePriceListDecorator接口,并重写里面相关的函数。

public class TrdgVatUpdatePriceListListener implements ViewListener, UpdatePriceListDecorator {
	
	@Override
	public void afterUplBEChanged(long beId) {
		// handler vat fields
		controller.setVariable("vatEnabled", VatUtil.isVatEnabled(beId));
		controller.setVariable("vatPerItemEnabled", VatUtil.isVatPerItem(beId));
		controller.setVariable("beId", beId);
		WebUtil.update("priceList");
	}
	
	...
}	

# 详细说明

# 读取产品价目表

	public default void afterLoadProductList(SqlTable priceList) {
	}

说明

当在[价目表(产品)]中读取产品价目表时,会触发以上函数。

参数

名称 类型 说明
priceList SqlTable 产品价目表数据

# 保存价目表

	public default void beforeSavePriceList(SqlEntity entity, int entityFooterRowIndex, SqlTable priceList, int priceListRowIndex) {
	}

说明

当在[价目表(产品)]中保存产品价目表时,会触发以上函数。

参数

名称 类型 说明
entity SqlEntity 保存的价目表entity
entityFooterRowIndex int 当前entity下款表的行次
priceList SqlTable 价目表数据
priceListRowIndex int 价目表数据的行次

# 修改BE

	public default void afterUplBEChanged(long beId) {
	}

说明

当在[价目表(产品)]中选择BE下拉列表时,会触发以上函数。

参数

名称 类型 说明
beId long 企业法人ID

# EcnpDecorator

# 接口定义

此装饰器用于扩展[工程变更单 (工艺)]的前端操作。

public interface EcnpDecorator extends ViewDecorator {
	public default void afterClearMainFooterInfo(int rowIndex) {
	}
}

# 应用

在[工程变更单 (工艺)]中,当清除下款表数据后,M18将调用EcnpDecorator接口的afterClearMainFooterInfo函数。

	public void clearMainFooterInfo(int rowIndex) {
		...
		controller.notifyDecorator(EcnpDecorator.class,
				(decorator, params) -> decorator.afterClearMainFooterInfo((int) params[0]),
				new Object[] { rowIndex });
		...
	}

在3PD的App中,您可以设置backingBeanviewListener实现EcnpDecorator接口,并重写afterClearMainFooterInfo函数。

public class XxxListener implements EcnpDecorator {

	@Override
	public void afterClearMainFooterInfo(int rowIndex) {
		
	}
	...
}

# 详细说明

# 清除下款栏位数据

	public void afterClearMainFooterInfo(int rowIndex) {
	}

说明

函数在[工程变更单 (工艺)]模块中清除下款数据后被调用。

参数

名称 类型 说明
rowIndex int 下款表的行次

# EcnmDecorator

# 接口定义

此装饰器用于扩展[工程变更单 (物料)]的前端操作。

public interface EcnmDecorator extends ViewDecorator {
	public default void afterClearMainFooterInfo(int rowIndex) {
	}
}

# 应用

在[工程变更单 (物料)]中,当清除下款表数据后,M18将调用EcnmDecorator接口的afterClearMainFooterInfo函数。

	public void clearMainFooterInfo(int rowIndex) {
		...
		controller.notifyDecorator(EcnmDecorator.class,
				(decorator, params) -> decorator.afterClearMainFooterInfo((int) params[0]),
				new Object[] { rowIndex });
		...
	}

在3PD的App中,您可以设置backingBeanviewListener实现EcnmDecorator接口,并重写afterClearMainFooterInfo函数。

public class XxxListener implements EcnmDecorator {

	@Override
	public void afterClearMainFooterInfo(int rowIndex) {
	}
	...
}

# 详细说明

# 清除下款栏位数据

	public void afterClearMainFooterInfo(int rowIndex) {
	}

说明

函数在[工程变更单 (物料)]模块中清除下款数据后被调用。

参数

名称 类型 说明
rowIndex int 下款表的行次

# ERPViewDecorator

# 接口定义

此装饰器用于自定义单据“另存为”操作时,新单据数据的变更。

public interface ERPViewDecorator extends ViewDecorator {
	public void handlerSaveAsAction();
}

# 应用

在将单据另存为新的单据时,M18将调用ERPViewDecorator接口的handlerSaveAsAction函数。

	@Override
	public void beforeSave(ModuleAction action) {
		...
		if (saveas) {
			controller.notifyDecorator(ERPViewDecorator.class,
				(decorator, params) -> decorator.handlerSaveAsAction(), new Object[] {});
		}
	}

在3PD的App中,您可以设置backingBeanviewListener实现ERPViewDecorator接口,并重写handlerSaveAsAction函数。

public class XxxListener implements ERPViewDecorator {

	@Override
	public void handlerSaveAsAction() {
		super.handlerSaveAsAction();
	}
	...
}

# 详细说明

# 处理“另存为”新单据的数据

public void handlerSaveAsAction() {
}

说明

函数在“另存为”新单据保存之前被调用。