# 全量接口
继承FormFieldCustomCtrl
/**
* 设置控件在表单编辑器的控件页签中的图标样式class或者图标图片路径
* 1、可以指定为系统图标库中存在的图标的class;
* 2、可以是contextpath下,一个固定的图片路径,比如/apps_res/cap/customCtrlResource/xxx/aa.png
*/
public void setIcon(String icon) {
this.icon = icon;
}
/**
* 控件类型名称
*/
public abstract String getKey();
/**
* 控件显示名称
*/
public abstract String getText();
/**
* 控件类别
*/
public abstract InputTypeCategory getCategory();
/**
* 该控件能显示那种类型的数据,可能是多种,所以用数组表示
*/
public abstract Enums.FieldType[] getFieldType();
/**
* 返回控件标准类型
*/
public String mappingStandardCtrlType() {
return FormFieldComEnum.TEXT.getKey();
}
/**
* 初始化,自定义控件使用,这个方法放到全局不合理,应该放到FormFieldCustomCtrl里面去
*/
public abstract void init();
/**
* 控件是否可用
*/
public abstract boolean canUse();
/**
* 自定义控件分是否按钮类,如果是按钮类,则重写此接口返回true
*/
boolean isButton();
/**
* 运行态生成控件的值,比如电子发票等控件在运行的时候需要生成一个uuid
*/
Object genVal(Object oldVal);
/**
* 根据表单类型判断控件是否可用
*/
public abstract boolean canUse(Enums.FormType formType);
/**
* 此控件是否是附件类控件
*
* @return
*/
public abstract boolean isAttachment();
/**
* 初始值生成接口
*/
public abstract String[] getDefaultVal(String defaultValue);
/**
* 定义控件是否能参与明细表,默认支持,如果不支持重写此方法返回false
*/
boolean canInSubTable();
/**
* 定义控件能否拖入table,默认支持,如果不支持重写此方法返回false
*/
boolean canInTable();
/**
* 控件类别
*/
public abstract InputTypeCategory getCategory();
/**
* 获取PC端自定义控件运行态资源注入信息
* jsUri:定义PC端表单运行态加载第三方JavaScript的路径
* cssUri:定义PC端表单运行态加载第三方CSS的路径
* initMethod:定义PC端表单运行态第三方js入口方法名称
* 用于运行态
* @return
*/
public abstract String getPCInjectionInfo();
/**
* 获取移动端自定义控件运行态资源注入信息
* path:'http://'+m3应用包mainifest.json中的urlSchemes的值+'v'+m3应用包mainifest.json中的version的值
* path:'http://'+8.1sp1 以后固定sourceId+'v'+m3应用包mainifest.json中的version的值
* weixinpath: 微信端打开的时候使用的m3/apps/v5/自定义控件移动端资源目录名称/,weixinpath配置的就是此自定义控件移动端资源目录名称
* jsUri:移动端表单运行态加载第三方JavaScript的路径
* initMethod:定义M3端表单运行态第三方js入口方法名称
* * nameSpace:定义M3端表单运行态命名空间
* 用于运行态
* @return
*/
public abstract String getMBInjectionInfo();
/**
* 设置扩展属性
*/
public void addExtAttr(String key, Object value) {
this.extendMap.put(key, value);
}
/**
* 是否能作为查询统计的输出项,默认不支持,如果当前控件需要在查询统计中输出,则需要重写此接口返回true
*用于无流程查询区域和报表查询区域
*/
default FormFieldCustomCtrlReportInfo canShowInReport() {
FormFieldCustomCtrlReportInfo reportInfo = new FormFieldCustomCtrlReportInfo();
reportInfo.setEnableQuery(true);
reportInfo.setEnableDisplayField(true);
reportInfo.setEnableSort(true);
reportInfo.setEnableFilterField(true);
return reportInfo;
}
/**
* 返回用于列表展示的值,过时了,使用key.config 配置文件渲染
*
* @param val 控件原始的值
* @return 控件用于列表展示的值
*/
@Deprecated
Object getValue4ListItem(Object val);
/**
* 返回参与关联/触发映射时候的拷贝值,默认原值拷贝
*
* @param val 控件原始的值
* @return 控件参与映射的值,
*/
Object getValue4FillBack(Object val);
/**
* 表单另存为的时候,如果控件需要单独实现另存的逻辑,需要重写此接口实现控件自身的另存逻辑
*/
void otherSave(FormFieldBean fieldBean, FormBean formBean, FormSaveAsBean mapping);
/**
* 业务包导出的扩展接口,自定义控件用,有需要的重写该方法
*
* @param formBean 当前表单
* @param formFieldBean 当前字段
* @param businessDataBean 导出中间对象,如果有附件,可以放到对象中的unifie{}ExportAttachment中
* @param resultMap 字段json
*/
void getJson4Export(FormBean formBean, FormFieldBean formFieldBean, BusinessDataBean businessDataBean, Map<String, Object> resultMap){
//控件额外信息导出
String customParam = formFieldBean.getCustomParam().isEmpty()?"":formFieldBean.getCustomParam();
resultMap.put(BusinessExportConstant.CUSTOMPARAM, customParam);
//控件枚举信息导出
List<Long> enumIdList=new ArrayList<>();
//将需要导出的枚举Id放入此处即可
resultMap.put(BusinessExportConstant.CUSTOM_CTRL_ENUMS,enumIdList);
}
/**
* 导入的时候处理自定义控件的扩展信息,自行重写接口来实现逻辑
*
* @param formBean 当前表单
* @param formFieldBean 当前字段
* @param businessDataBean 导入中间对象
* @param fieldInfo 字段信息
*/
void importExtInfo(FormBean formBean, FormFieldBean formFieldBean, BusinessDataBean businessDataBean, Map<String, Object> fieldInfo);
/**
* 在业务导入完之后自定义控件的处理接口
*
* @param formBean 当前表单
* @param formFieldBean 当前字段
* @param businessDataBean 导入中间对象
*/
void importInfoAfterBizImport(FormBean formBean, FormFieldBean formFieldBean, BusinessDataBean businessDataBean);
/**
* 数据保存时,自定义控件保存方法,默认空实现,如果有需要,在自身的控件实现类中重写此方法
*
* @param params 参数
*/
void handleSaving(Map<String, Object> params) throws BusinessException;
/**
* 数据保存并复制时,自定义控件接口,如果自定义控件支持保存并复制功能,需要重写此接口
*/
void saveAndCopy(Map<String, Object> params);
/**
* 后台刷新接口,如果自定义控件需要后台刷新自定义控件内容,需要重写此接口
* 供批量刷新、批量修改、触发关系使用
*/
void refresh(Map<String, Object> params) throws BusinessException;
/**
* 检查自定义控件能够参与报表设置的哪些点,未使用
*
* @return 报表设置点的枚举集合
*/
List<String> checkReportEnable();
/**
* 自定义控件参与报表条件设置时候,支持的操作符
* <p>操作符:Equals(=), NotEquals(<>, Greator(>), GreatorEquals(>=), Less(<), LessEquals(<=), Like(like), NotLike(not like), In(in), Include(like)</>)</p>
*
* @return 返回支持的操作符的字符串数组
*/
String[] getSupportConSymbolInReport();
/**
* 控件参与查询的时候其值的转换处理
*
* @param fieldBean 自定义控件所在字段
* @param value 传入的控件的值
* @return object,便于后续扩展,接口重用
*/
Object convertCtrlValue(FormFieldBean fieldBean, Object value);
/**
* 获取用于报表列表显示的渲染资源路径
*
* @return 渲染js文件的路径
*/
FormFieldCustomCtrlRunInfo getRenderInfo4Run();
/**
* 是否下架,默认false
* 当下架时,在表单编辑器控件管理页面不再显示
* @return false--否,true--下架
*/
boolean offline();
/**
* 1 过滤哪些控件可以出现在校验规则 公式里的过滤方法 false过滤,true不过滤
*/
boolean canInCheckRuleCondition();
/**
* 参与校验规则提示内容设置接口 预留,后面公式设置界面改造时候用到
*/
//boolean canInCheckRuleTips();
/**
* 参与字段计算公式结果设置接口 预留,后面公式设置界面改造时候用到
*/
//boolean canInFormulaResult();
/**
* 1 过滤哪些控件可以出现在计算公式里的过滤方法 false过滤,true不过滤
*/
@Deprecated
boolean canInFormulaCondition();
/**
* 1 过滤哪些控件可以出现在计算公式(高级)里的过滤方法 false过滤,true不过滤
*/
@Deprecated
boolean canInHighFormulaCondition();
/**
* 无流程表单应用绑定,操作范围屏蔽
*/
@Deprecated
boolean canInOperatingRange();
/**
*业务关系--触发关系-前置条件公式屏蔽
*/
@Deprecated
boolean canInConditionTypeNoFunction();
/**
* 业务关系--关联关系--筛选条件过滤
*/
boolean canInScreeningConditions();
/**
* 是否能参与计算
*/
boolean canInCalc();
/**
* 参与函数extend设置接口
*/
boolean canExtend();
/**
* 返回字段参与字符串公式的值
*/
Object getFormulaValue4Varchar(FormFieldBean fieldBean, Object val) throws BusinessException;
/**
* 返回字段参与数字公式的值
*/
Object getFormulaValue4Number(FormFieldBean fieldBean, Object val) throws BusinessException;
/**
* 返回字段参与日期、日期时间公式的值
*/
Object getFormulaValue4Date(FormFieldBean fieldBean, Object val) throws BusinessException;
/**
* 返回字段参与条件的值
*/
Object getFormulaValue4Condition(FormFieldBean fieldBean, Object val) throws BusinessException;
/**
* 能否批量修改(无流程应用绑定)接口,能否批量刷新也用此接口判断
*/
boolean canBathUpdate();
/**
* 参与无流程应用绑定操作范围设置接口(此接口应该可以和参与条件设置接口通用) 预留,后面公式设置界面改造时候用到
*/
boolean canInUnFlowBindOperationScope();
/**
* 参与流程列表(待办列表和综合业务列表)操作范围设置接口
*/
boolean canInFlowBusinessOperationScope();
/**
* 能否参与excel导入导出
* */
boolean canInExcelExpOrImp();
/**
* 能否参与无流程列表显示项,或者排序设置
* 排序设置是从列表显示项中来的,因此接口共用一个
* */
boolean canInDataList();
/**
* 设置操作权限时是否支持必填设置
*
* @return true--支持,false--不支持 默认true
*/
boolean isSupportRequiredValue();
/**
* 校验字段值是否必填权限,并且值没有填写,默认实现只校验权限是否必填,需要控件自身重写逻辑实现,
* 如果控件是必填,并且没有填写,返回true,否则,返回false。
*
* @param formDataMasterBean 表单数据
* @param field 字段
* @param authViewFieldBean 字段权限
* @param val 字段值
*/
boolean authNotNullAndValIsNull(FormDataMasterBean formDataMasterBean, FormFieldBean field, FormAuthViewFieldBean authViewFieldBean, Object val);
/**
* 能否设置初始值
*/
boolean isSupportSetDefaultVal();
/**
* 获取初始值系统变量待选项列表接口
*/
List<String[]> getListShowDefaultVal(Integer externalType);
/**
* 字段在初始值设置页面上显示的元素
*
* @param fieldBean 当前字段
* @param formId 当前编辑表单ID
*/
Map<String, Object> getAuthDefaultValueMap(FormFieldBean fieldBean, Long formId) throws BusinessException;
/**
* 是否参与二维码组成接口
*/
boolean barcodeContent();
/**
* 是否支持套红
*/
boolean canInjectionWord();
/**
* 获取套红值
*/
String getTaoHongValue(FormDataMasterBean masterBean, FormFieldBean fieldBean, Map<String, Object> special) throws BusinessException;
/**
* 获取签章保护数据
*/
String getProtectedValue(Object value);
/**
* 翻译控件值提供给标签打印使用
*/
Object getLabelPrintVal(FormFieldBean fieldBean, FormDataMasterBean masterData) throws BusinessException;
/**
* 获取全文检索值
*
* @param params 传入参数
* key: formFieldBean:FormFieldBean类型
* reference:Long类型,附件的reference
* value:Object类型,控件值
*/
String convertVal4Index(Map<String, Object> params) throws Exception;
/**
* 控件值在回退或者撤销到待发列表的时候,是否需要清空此类型控件的值,默认需要,如果不需要清空,请重写此接口返回false
*/
boolean needClearWhenBackToStarter();
/**
* 回退或者撤销到待发的时候,实现控件值的清空接口
*
* @param formBean 表单定义bean
* @param masterDataId 数据id
* @param fieldBean 字段定义bean
* @param fillBackMap 如果要清空此字段的值,直接在map中put以字段名称fieldxxxx为key以null为value即可,cap会自动将map中的值更新回数据库动态表
* @param attachments 要删除的附件信息
*/
void clearWhenBackToStarter(FormBean formBean, Long masterDataId, FormFieldBean fieldBean, Map<String, Object> fillBackMap, Map<String, Long> attachments) throws BusinessException;
/**
* 是否支持一键复制,默认支持
* @return
*/
default Boolean canAKeyToCopy(){
return true;
}
/**
* 参与触发关系前置条件接口 预留,后面公式设置界面改造时候用到
*/
//boolean canInTriggerPreCondition();
/**
* 参与触发关系映射接口
*/
boolean canInTriggerFillBack();
/**
* 参与触发关系映射接口 预留,后面公式设置界面改造时候用到
*/
//boolean canInTriggerRowCondition();
/**
* 参与触发消息内容设置接口 预留,后面公式设置界面改造时候用到
*/
//boolean canInTriggerMsgContent();
/**
* 参与关联关系映射接口
*/
boolean canInRelationFillBack();
/**
* 是否能作为cap4手工关联cap3的关联过滤条件,默认是false,如果控件能支持,重写此接口返回true
*/
boolean canInCap3RelationCondition();
/**
* 业务关系设置的时候,能不能给这个字段设置穿透信息
* @since V8.0
* @author wangh
* @return
*/
boolean canThroughSet();
/**
* 参与流程标题设置接口 预留,后面公式设置界面改造时候用到
*/
//boolean canInFlowSubjectSet();
/**
* 参与流程消息内容组装接口 预留,后面公式设置界面改造时候用到
*/
//boolean canInFlowMsgContent();
/**
* 参与流程分支条件接口
*/
boolean canInWorkFlowBranch();
/**
* 参与流程表单相关数据查询接口
*/
boolean canInRelatedDataCondition();
/**
* 控件设置态控制参数(最大控件数) -2 表示前端使用原有方式;-1表示不控制,非负整数表示具体可拖动的控件数量;
*
* @return
*/
default FieldViewCtl setFieldViewCtl() {
FieldViewCtl fieldViewCtl = new FieldViewCtl();
FieldViewCtl.ViewParam viewParam = new FieldViewCtl.ViewParam(true, true, true,
true, true);
FieldViewCtl.Client client = new FieldViewCtl.Client(true, true);
fieldViewCtl.setCount(5);
fieldViewCtl.setTargets(viewParam);
fieldViewCtl.setClients(client);
return fieldViewCtl;
}
/**
* 根据字段的字段类型获取该字段值的字符串格式 重复表间关系计算的时候在调用
*
* @param value 值
* @return 如果为空,返回空字符串
*/
public String getDbValue(Object value) {
if (value == null || Strings.isBlank(String.valueOf(value))) {
return "";
}
return value.toString();
}
/**
* 获取控件的显示值 此方法被FormFieldBean.getDisplayValue()方法调用,默认是个空方法
*
* @param returnArr 长度为3的数组,(以组织机构控件为例,0:id(数据库保存值)、1:显示名称字符串(组织机构的名字字符串,数字类型百分号或者千分位或者小数位格式之后的值)、2:Member|292929292929(数字参与计算值,非组织机构则为展示值))
* @param valueStr 字段值的字符串形态
* @param needSub 多部门时,是否需要有包含子部门标识(场景:当设置多部门的初始值时,不包含子部门的值后面会添加|1标识,但是不处理就直接显示页面会多余,而且保存后值有问题。)
* @param forExport 是否导出时调用
*/
public void getDisplayValue4Ctrl(FormFieldBean fieldBean, Object[] returnArr, String valueStr, boolean needSub, boolean forExport) throws BusinessException {
}
/**
* 自定义控件extend扩展计算公式页面url
* @return 返回自定义控件自定义extend计算公式配置页面url,默认返回空
*/
public String extendUrl() {
return null;
}
/**
* 前端控制视图显示的config.json信息,该信息需要开发自定义控件用户自己实现,并将js配置到config.json中,
* 前端通到config.json中取对应的js用于渲染;
* 如查询条件,列表,报表等
*
* {
* "key": "1745730351955790712",
* "name": "formrichtext2ctrl",
* "path": {
* "pc": "apps_res/cap/customCtrlResources/formRichText2CtrlResources/js",
* "wap": "m3/apps/v5/customCtrlResources/formrichtext2ctrl/js",
* "native": "http://customCtrlResources.v5.cmp/v1.0.0/js"
* },
* "render": {
* "defRender": {
* "filter": "defRenderFilter.js",
* "list": "defRenderList.js"
* },
* "render1": {
* "filter": "render1Filter.js",
* "list": "render1List.js",
* "087C5688-8C95-49B9-2502-6727D6C3YY91": {
* "filter": "render1Filter.js",
* "list": "render1List.js"
* }
* },
* "render2": {
* "filter": "render1Filter.js",
* "list": "render1List.js",
* "087C5688-8C95-49B9-2502-6727D6C3YY91": {
* "filter": "render1Filter.js",
* "list": "render1List.js"
* }
* }
* },
* "renderMapping": {
* "cap4query": "render1",
* "cap4unflow": {
* "filter": "render2Filter.js",
* "list": "render2List.js",
* "087C5688-8C95-49B9-2502-6727D6C35502": {
* "filter": "render3Filter.js",
* "list": "render3List.js"
* }
* }
* }
* }
* @return config.json 文件路径
*
*/
public String viewJsUrl(){
return null;
}
/**
* 校验公式
*
* @param functionStr 自定义公式字符串
* @param elementList 结果字段
* @param formBean 结果字段
* @return
*/
@Override
public ValidateResult check(String functionStr, List<String> elementList, FormBean formBean) {
return new ValidateResult(true, null, -1);
}
/**
* 自定义公式运行,表单高级计算公式和普通计算公式
*
* @param formBean
* @param condition
* @param cacheMasterData
* @return
*/
@Override
public Object run(FormBean formBean, String condition, FormDataMasterBean cacheMasterData) {
return "111";
}
//8.2 新增加
/**
* 报表拼接sql,编写时1=1需要修改为 (xx表.xx字段=xx值)
*
* @param formBean
* @param fields
* @return
*/
default String reportRun(FormBean formBean, List<String> fields) {
return "(1=1)";
}
/**
* 计算公式布尔值,工作流用
* @param formBean
* @param fieldValue
* @param containsValue
* @return
*/
default Boolean booleanValueRun(FormBean formBean, Object fieldValue,Object containsValue) {
return true;
}
# 8.1sp1后新增接口
/**
* 是否支持一键复制,默认支持
* @return
*/
default Boolean canAKeyToCopy(){
return true;
}
/**
* 控件设置态控制参数(最大控件数) -2 表示前端使用原有方式;-1表示不控制,非负整数表示具体可拖动的控件数量;
*
* @return
*/
default FieldViewCtl setFieldViewCtl() {
FieldViewCtl fieldViewCtl = new FieldViewCtl();
FieldViewCtl.ViewParam viewParam = new FieldViewCtl.ViewParam(true, true, true,
true, true);
FieldViewCtl.Client client = new FieldViewCtl.Client(true, true);
fieldViewCtl.setCount(5);
fieldViewCtl.setTargets(viewParam);
fieldViewCtl.setClients(client);
return fieldViewCtl;
}
/**
* 自定义控件extend扩展计算公式页面url
* @return 返回自定义控件自定义extend计算公式配置页面url,默认返回空
*/
public String extendUrl() {
return null;
}
/**
* 前端控制视图显示的config.json信息,该信息需要开发自定义控件用户自己实现,并将js配置到config.json中,
* 前端通到config.json中取对应的js用于渲染;
* 如查询条件,列表,报表等
*
* {
* "key": "1745730351955790712",
* "name": "formrichtext2ctrl",
* "path": {
* "pc": "apps_res/cap/customCtrlResources/formRichText2CtrlResources/js",
* "wap": "m3/apps/v5/customCtrlResources/formrichtext2ctrl/js",
* "native": "http://customCtrlResources.v5.cmp/v1.0.0/js"
* },
* "render": {
* "defRender": {
* "filter": "defRenderFilter.js",
* "list": "defRenderList.js"
* },
* "render1": {
* "filter": "render1Filter.js",
* "list": "render1List.js",
* "087C5688-8C95-49B9-2502-6727D6C3YY91": {
* "filter": "render1Filter.js",
* "list": "render1List.js"
* }
* },
* "render2": {
* "filter": "render1Filter.js",
* "list": "render1List.js",
* "087C5688-8C95-49B9-2502-6727D6C3YY91": {
* "filter": "render1Filter.js",
* "list": "render1List.js"
* }
* }
* },
* "renderMapping": {
* "cap4query": "render1",
* "cap4unflow": {
* "filter": "render2Filter.js",
* "list": "render2List.js",
* "087C5688-8C95-49B9-2502-6727D6C35502": {
* "filter": "render3Filter.js",
* "list": "render3List.js"
* }
* }
* }
* }
* @return config.json 文件路径
*
*/
public String viewJsUrl(){
return null;
}
/**
* 校验公式
*
* @param functionStr 自定义公式字符串
* @param elementList 结果字段
* @param formBean 结果字段
* @return
*/
@Override
public ValidateResult check(String functionStr, List<String> elementList, FormBean formBean) {
return new ValidateResult(true, null, -1);
}
/**
* 自定义公式运行,表单高级计算公式和普通计算公式
*
* @param formBean
* @param condition
* @param cacheMasterData
* @return
*/
@Override
public Object run(FormBean formBean, String condition, FormDataMasterBean cacheMasterData) {
return "111";
}
//8.2 新增加
/**
* 报表拼接sql,编写时1=1需要修改为 (xx表.xx字段=xx值)
*
* @param formBean
* @param fields
* @return
*/
default String reportRun(FormBean formBean, List<String> fields) {
return "(1=1)";
}
/**
* 计算公式布尔值,工作流用
* @param formBean
* @param fieldValue
* @param containsValue
* @return
*/
default Boolean booleanValueRun(FormBean formBean, Object fieldValue,Object containsValue) {
return true;
}
# 公式
# 计算公式
实现方案:将计算公式的配置、校验、实现交由自定义控件实现;
# 报表计算公式
功能:实现sql where 条件拼接,后端实现非groove
公式: customFunction({表单名称.富文本21},=,'5705361015223765326')
结果:(formmain_1024.field0007='5705361015223765326')
代码:
# 工作流计算公式
功能:布尔值计算
公式:customCtrlFunction('==',{富文本21}, '1','富文本1')
结果:布尔值
代码:
# 表单计算公式
功能:包含高级计算公式和普通计算公式
公式: customFunction (''富文本1','客户计算公式字符串');
结果:布尔值和 其他
代码:
创建人:xuecx