类 F7 方式弹出表单原创
金蝶云社区-周立思
周立思
1人赞赏了该文章 68次浏览 未经作者许可,禁止转载编辑于2024年09月19日 15:43:10

需求

业务需要根据不同类型弹出对应的配置动态表单页面进行操作,配置数据不进行单独存储


思路方案

利用 DynamicObject 序列化将配置数据转成字符串存储在大文本字段


实现步骤

新建测试配置动态表单页面

image.png

编写配置表单插件

public void createNewData(BizDataEventArgs e) {
    String data =(String)this.getView().getFormShowParameter().getCustomParams().get("data");
    if (!StringUtils.isBlank(data)) {
        MainEntityType entityType = this.getModel().getDataEntityType();
        DynamicObject dataSource = toDynamicObject(data, entityType);
        e.setDataEntity(dataSource);
    }
}

【确定】按钮事件

@Override
public void afterDoOperation(AfterDoOperationEventArgs args) {
    super.afterDoOperation(args);
    String operateKey = args.getOperateKey();
    if ("ok".equals(operateKey)) {
        OperationResult operationResult = args.getOperationResult();
        if (!operationResult.isSuccess()) {
            this.getView().showOperationResult(operationResult);
            return;
        }

        MainEntityType entityType = this.getModel().getDataEntityType();
        DynamicObject dataEntity = this.getModel().getDataEntity(true);
        String data = dynamicObjectToString(dataEntity);
        Map<String,Object> returnData = new HashMap<>();
        returnData.put("entity",entityType.getName());
        returnData.put("data", data);
        this.getView().returnDataToParent(returnData);
        this.getView().close();
    }

DynamicObject 序列化

private static DynamicObject toDynamicObject(String value, MainEntityType entityType) {
    DynamicObjectSerializationBinder binder = new DynamicObjectSerializationBinder(entityType);
    DcJsonSerializer jser = new DcJsonSerializer(binder);
    return (DynamicObject)jser.deserializeFromString(value, (Object)null);
}

private static String dynamicObjectToString(DynamicObject obj) {
    DynamicObjectType type = obj.getDynamicObjectType();
    DynamicObjectSerializationBinder binder = new DynamicObjectSerializationBinder(type);
    DcJsonSerializer jser = new DcJsonSerializer(binder);
    jser.setIsLocaleValueFull(true);
    binder.setOnlyDbProperty(false);
    return jser.serializeToString(obj, (Object)null);
}


新建测试表单页面

image.png

【类型】下拉列表字段,值填写的是对应的配置页面标识

【配置】大文本字段,存储配置信息

【文本 1】文本点按编辑,测试弹出配置表单页面


编写测试表单页面插件

showForm 弹出页面标识直接取【类型】字段的值

@Override
public void click(EventObject evt) {
    super.click(evt);
    FormShowParameter showParameter=new FormShowParameter();
    String type=(String)getModel().getValue("soi_combofield");
    showParameter.setFormId(type);
    showParameter.getOpenStyle().setShowType(ShowType.Modal);
    String data=(String)getModel().getValue("soi_config_tag");
    showParameter.setCustomParam("data",data);
    showParameter.setCloseCallBack(new CloseCallBack(this,"f7_form"));
    this.getView().showForm(showParameter);
}

closeCallBack 事件存储配置信息

配置页面标识和数据存储到大文本字段

@Override
public void closedCallBack(ClosedCallBackEvent event) {
    super.closedCallBack(event);
    if("f7_form".equals(event.getActionId())){
        Map<String,Object> returnData=(Map<String,Object>)event.getReturnData();
        if(returnData!=null){
            String entity=(String)returnData.get("entity");
            getModel().setValue("soi_config",entity);
            String data=(String)returnData.get("data");
            getModel().setValue("soi_config_tag",data);
        }
    }
}


实现效果

屏幕录制 2024-09-19 时间 15.29.57.gif

开发环境版本

v6.0

注意事项

  1. 如何做好序列化?https://vip.kingdee.com/link/s/l5k7s 

赞 1