集成设计器数据流程暴露接口触发
需求:在集成设计器配置的连接器、数据流程链接到外部接口,需要可以有一个管理页面,统一管理这些集成配置。比如对接多个医院的挂号系统,希望可以配置好数据流程之后,能够在已经实现的开放接口上,动态的调用集成平台配置的数据流程。
连接器暴露接口触发
-
设计连接器资源配置模型。使用业务ID+接口唯一标识+连接器实现连接器资源和业务唯一。
@Model.model(EipConnectorResourceSetting.MODEL_MODEL) @Model(displayName = "连接器资源配置", summary = "连接器资源配置") @Model.Advanced(unique = {"hospitalId, interfaceUnique"}) public class EipConnectorResourceSetting extends IdModel { public static final String MODEL_MODEL = "hr.simple.EipConnectorResourceSetting"; @UxTableSearch.FieldWidget(@UxWidget()) @Field(displayName = "医院", required = true) @Field.Relation(relationFields = {"hospitalId"}, referenceFields = {"id"}) private Hospital hospital; @Field.Integer @Field(displayName = "医院ID", invisible = true) private Long hospitalId; @UxTableSearch.FieldWidget(@UxWidget()) @Field.String @Field(displayName = "接口唯一标识", required = true) private String interfaceUnique; @UxTableSearch.FieldWidget(@UxWidget()) @Field.many2one @Field(displayName = "连接器", required = true) @Field.Relation(relationFields = {"connectorId"}, referenceFields = {"id"}) private EipConnector connector; @Field.Integer @Field(displayName = "连接器ID", invisible = true) private Long connectorId; @UxTableSearch.FieldWidget(@UxWidget()) @Field.many2one @Field(displayName = "连接器接口", required = true) @Field.Relation(relationFields = {"integrationInterfaceId"}, referenceFields = {"id"}, domain = "connectorId==${activeRecord.connector.id}") private EipConnectorResource connectorResource; @Field.Integer @Field(displayName = "连接器接口ID", invisible = true) private Long connectorResourceId; }
-
开放接口定义,文档参考:https://doc.oinone.top/oio4/9326.html
外部平台调用开放接口,实现动态调用连接器资源@Model.model(HospitalSection.MODEL_MODEL) @Model(displayName = "医院科室", summary = "医院科室") public class HospitalSection extends IdModel { public static final String MODEL_MODEL = "net.example.HospitalSection"; @Field(displayName = "科室Code", required = true) private String deptCode; @Field(displayName = "科室名称", required = true) private String deptName; @Field(displayName = "科室描述") private String deptDesc; }
@Slf4j @Fun @Component public class TestOpenService { @Resource private TestCommonService testCommonService; @Function @Open(name = "获取科室", path = "test/gainSections") @Open.Advanced(httpMethod = "POST") public OpenEipResult<List<HospitalSection>> gainSections(IEipContext<SuperMap> context, ExtendedExchange exchange) { return new OpenEipResult<>(testCommonService.gainSections(context)); } }
@Slf4j @Component public class TestCommonService { @Resource private CustomWorkflowService customWorkflowService; /** * 获取科室 * * @param context 请求上下文 * @return 科室集合 */ public List<HospitalSection> gainSections(IEipContext<SuperMap> context) { EipResult<SuperMap> gainSections = executeEipConnector(context, "gainSections"); if (gainSections.getSuccess()) { if (gainSections.getContext().getInterfaceContext().get("DepartmentList")!=null) { return JSON.parseArray(JSON.toJSONString(gainSections.getContext().getInterfaceContext().get("DepartmentList")), HospitalSection.class); } } String errorCode = gainSections.getErrorCode(); String errorMessage = gainSections.getErrorMessage(); // Object result = gainSections.getResult(); return new ArrayList<>(); } /** * 根据请求参数中医院id和参数key-value、接口标识获取连接器 * * @param context 请求上下文 * @param interfaceUnique 接口标识 * @return 连接器 */ private EipResult<SuperMap> executeEipConnector(IEipContext<SuperMap> context, String interfaceUnique) { String hospitalId = Optional.ofNullable(String.valueOf(context.getInterfaceContext().getIteration("hospitalId"))).orElse(""); String parameterValue = Optional.ofNullable(String.valueOf(context.getInterfaceContext().getIteration("parameterValue"))).orElse(""); //step1. 获取连接器模型 EipConnectorResourceSetting interfaceSetting = new EipConnectorResourceSetting() .setHospitalId(Long.valueOf(hospitalId)).setInterfaceUnique(interfaceUnique).queryOne(); if (interfaceSetting == null) { throw PamirsException.construct(ExpEnumerate.SYSTEM_ERROR).appendMsg("连接器模型未找到").errThrow(); } //step2. 获取连接器接口 interfaceSetting.fieldQuery(EipConnectorResourceSetting::getConnectorResource); EipConnectorResource connectorResource = interfaceSetting.getConnectorResource(); if (connectorResource == null) { throw PamirsException.construct(ExpEnumerate.SYSTEM_ERROR).appendMsg("连接器接口未找到").errThrow(); } //3. 执行连接器获取结果 Map<String, Object> params = new HashMap<>(); params.put("wxValue1", parameterValue); return EipExecutor.newInstance().call(connectorResource.getInterfaceName(), params); }
数据流程暴露接口触发
-
设计数据流程配置模型。使用业务ID+接口唯一标识+连接器实现数据流程配置和业务唯一。
@Model.model(EipOpenDataflowSetting.MODEL_MODEL) @Model(displayName = "数据流程配置", summary = "数据流程配置") @Model.Advanced(unique = {"hospitalId,interfaceUnique"}) public class EipOpenDataflowSetting extends IdModel { public static final String MODEL_MODEL = "hr.simple.EipOpenDataflowSetting"; @UxTableSearch.FieldWidget(@UxWidget()) @Field(displayName = "医院", required = true) @Field.Relation(relationFields = {"hospitalId"}, referenceFields = {"id"}) private Hospital hospital; @Field.Integer @Field(displayName = "医院ID", invisible = true) private Long hospitalId; @UxTableSearch.FieldWidget(@UxWidget()) @Field.String @Field(displayName = "接口唯一标识", required = true) private String interfaceUnique; @UxTableSearch.FieldWidget(@UxWidget()) @Field.many2one @Field(displayName = "数据流程", required = true) @Field.Relation(relationFields = {"dataflowId"}, referenceFields = {"id"}) private DataflowDesigner dataflow; @Field.Integer @Field(displayName = "数据流程编码", invisible = true) private Long dataflowId; @Field.String @Field.Related(related = {"dataflow", "code"}) @UxForm.FieldWidget(@UxWidget(readonly = "true")) @Field(displayName = "数据流程编码", store = NullableBoolEnum.TRUE) private String dataflowCode; }
-
开放接口定义。
@Fun(RegisterOpenService.FUN_NAMESPACE) public interface RegisterOpenService { String FUN_NAMESPACE = "net.example.RegisterService"; @Function RegisterOrder queryById(Long hospitalId, Long memberId); }
@Slf4j @Fun(RegisterOpenService.FUN_NAMESPACE) @Component public class RegisterOpenServiceImpl implements RegisterOpenService { @Autowired private CustomWorkflowService customWorkflowService; /** * 开放接口:把自己的开放出去供外部调用(如:小程序调用) * * 文档参考:https://doc.oinone.top/oio4/9326.html * * 1、接口访问URL地址:http://127.0.0.1:8195/openapi/pamirs/register/queryById 端口根据yml配置进行修改 * 2、参数默认是map格式,构造为IEipContext对象 */ @Function @Open(name = "根据ID查询挂号流水", path = "register/queryById") @Open.Advanced( httpMethod = "GET" ) public OpenEipResult<RegisterOrder> queryById4Open(IEipContext<SuperMap> context, ExtendedExchange exchange) { String memberId = Optional.ofNullable(String.valueOf(context.getInterfaceContext().getIteration("id"))).orElse("0"); String hospitalId = Optional.ofNullable(String.valueOf(context.getInterfaceContext().getIteration("hospitalId"))).orElse("0"); // 开发接口的内部具体实现 RegisterOrder register = queryById(Long.valueOf(hospitalId), Long.valueOf(memberId)); if (register!=null) { return new OpenEipResult<>(register); } else { throw PamirsException.construct(EipExpEnumerate.SYSTEM_ERROR).appendMsg("根据ID "+ memberId +"查询挂号流水").errThrow(); } } @Override @Function public RegisterOrder queryById(Long hospitalId, Long memberId) { // step1、业务前置逻辑、参数校验等 // step2、构造请求数据、或者通过BD获取数据(这里先进行Mock) RegisterOrder register = new RegisterOrder(); register.setHospitalId("719331903102009889"); register.setSectionId("1"); register.setDoctorId("1"); register.setSourceId("1"); register.setPatienterName("zhangsan"); register.setPatienterIdCard("123444"); // 配置表,医院 + 接口功能 == >> 流程编码。 ****** 实际项目这些基础数据需要缓存,如果Caffeine/Redis********* EipOpenDataflowSetting dataflowSetting = new EipOpenDataflowSetting().setHospitalId(hospitalId).setInterfaceUnique("theWeather").queryOne(); if (dataflowSetting != null) { // step3、调用数据流程 WorkflowDefinition workflowDefinition = customWorkflowService.queryWorkflowDefinition(dataflowSetting.getDataflowCode()); if (workflowDefinition != null) { // 分支1:调用数据流程 Map<String, Object> result = customWorkflowService.startWorkflow(workflowDefinition, register); log.info("调用数据流程返回:" + result); // 根据返回处理业务逻辑 } } else { // 分支2:异常处理,或者没有数据流程实现执行默认逻辑 } // Step4 业务后置逻辑,数据操作、其他service的调用之类 return register; } }
@Slf4j @Component public class CustomWorkflowService { public WorkflowDefinition queryWorkflowDefinition(String workflowCode) { return new WorkflowDefinition().queryOneByWrapper( Pops.<WorkflowDefinition>lambdaQuery() .from(WorkflowDefinition.MODEL_MODEL) .eq(WorkflowDefinition::getWorkflowCode, workflowCode) .eq(WorkflowDefinition::getActive, 1) ); } /** * 触发⼯作流实例 */ public Map<String, Object> startWorkflow(WorkflowDefinition workflowDefinition, IdModel modelData) { Map<String, Object> result = new HashMap<>(); if (null == workflowDefinition) { // 流程没有运⾏实例 return result; } String model = Models.api().getModel(modelData); //⼯作流上下⽂ WorkflowDataContext wdc = new WorkflowDataContext(); wdc.setDataType(WorkflowVariationTypeEnum.ADD); wdc.setModel(model); wdc.setWorkflowDefinitionDefinition(workflowDefinition.parseContent()); wdc.setWorkflowDefinition(workflowDefinition); wdc.setWorkflowDefinitionId(workflowDefinition.getId()); IdModel copyData = KryoUtils.get().copy(modelData); // ⼿动触发创建的动作流,将操作⼈设置为当前用户,作为流程的发起⼈ copyData.setCreateUid(PamirsSession.getUserId()); copyData.setWriteUid(PamirsSession.getUserId()); String jsonData = JsonUtils.toJSONString(copyData.get_d()); //触发工作流 新增时触发-onCreateManual 更新时触发-onUpdateManual Fun.run(WorkflowModelTriggerFunction.FUN_NAMESPACE, "onCreateManualSync", wdc, "1", jsonData); // 处理返回结果 Long workflowInstanceId = (Long) wdc.getDataMap().get(WorkflowConstant.WORKFLOW_INSTANCE_ID); if (workflowInstanceId !=null) { WorkflowInstance workflowInstance = new WorkflowInstance().setId(workflowInstanceId).queryById(); WorkflowContext workflowContext = workflowInstance.fetchWorkflowContext(); result = (HashMap)workflowContext.get(ParamNode.PARAM_PREFIX); } return result; } public Map<String,Object> startCreatOrderWorkflow(WorkflowDefinition workflowDefinition, IdModel modelData){ Map<String, Object> result = new HashMap<>(); if (null == workflowDefinition) { // 流程没有运⾏实例 return result; } String model = Models.api().getModel(modelData); //⼯作流上下⽂ WorkflowDataContext wdc = new WorkflowDataContext(); wdc.setDataType(WorkflowVariationTypeEnum.ADD); wdc.setModel(model); wdc.setWorkflowDefinitionDefinition(workflowDefinition.parseContent()); wdc.setWorkflowDefinition(workflowDefinition); wdc.setWorkflowDefinitionId(workflowDefinition.getId()); IdModel copyData = KryoUtils.get().copy(modelData); // ⼿动触发创建的动作流,将操作⼈设置为当前用户,作为流程的发起⼈ copyData.setCreateUid(PamirsSession.getUserId()); copyData.setWriteUid(PamirsSession.getUserId()); String jsonData = JsonUtils.toJSONString(copyData.get_d()); //触发⼯作流 新增时触发-onCreateManual 更新时触发-onUpdateManual Fun.run(WorkflowModelTriggerFunction.FUN_NAMESPACE, "onCreateManualSync", wdc, "1", jsonData); // 处理返回结果 Long workflowInstanceId = (Long) wdc.getDataMap().get(WorkflowConstant.WORKFLOW_INSTANCE_ID); if (workflowInstanceId !=null) { WorkflowInstance workflowInstance = new WorkflowInstance().setId(workflowInstanceId).queryById(); WorkflowContext workflowContext = workflowInstance.fetchWorkflowContext(); result = (HashMap)workflowContext.get(ParamNode.PARAM_PREFIX); } return result; } }
Oinone社区 作者:yexiu原创文章,如若转载,请注明出处:https://doc.oinone.top/dai-ma-shi-jian/20972.html
访问Oinone官网:https://www.oinone.top获取数式Oinone低代码应用平台体验