# 全量接口

继承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