From d39104b3abe67466fd1a7dd8aba5db1403f105ab Mon Sep 17 00:00:00 2001 From: ZzIsGod1019 <1498852723@qq.com> Date: Wed, 22 Nov 2023 23:50:10 -0800 Subject: [PATCH 1/2] flow: optimize api state_transitions --- middleware/flow/src/dto/flow_inst_dto.rs | 2 + middleware/flow/src/serv/flow_inst_serv.rs | 46 ++++++++----------- services/bios-all/config/locale/zh-cn.basic | 1 + spi/spi-conf/src/conf_config.rs | 4 +- .../src/console_tenant/api/iam_ct_role_api.rs | 13 ++---- 5 files changed, 29 insertions(+), 37 deletions(-) diff --git a/middleware/flow/src/dto/flow_inst_dto.rs b/middleware/flow/src/dto/flow_inst_dto.rs index f8f240fa2..ba588c792 100644 --- a/middleware/flow/src/dto/flow_inst_dto.rs +++ b/middleware/flow/src/dto/flow_inst_dto.rs @@ -87,6 +87,8 @@ pub struct FlowInstDetailResp { pub current_state_id: String, pub current_state_name: Option, pub current_state_color: Option, + pub current_state_kind: Option, + pub current_state_ext: Option, pub current_assigned: Option, pub current_vars: Option>, diff --git a/middleware/flow/src/serv/flow_inst_serv.rs b/middleware/flow/src/serv/flow_inst_serv.rs index 8bdeb170d..f849eff40 100644 --- a/middleware/flow/src/serv/flow_inst_serv.rs +++ b/middleware/flow/src/serv/flow_inst_serv.rs @@ -308,6 +308,8 @@ impl FlowInstServ { pub current_state_id: String, pub current_state_name: Option, pub current_state_color: Option, + pub current_state_kind: Option, + pub current_state_ext: Option, pub current_assigned: Option, pub current_vars: Option, @@ -330,6 +332,7 @@ impl FlowInstServ { let rel_state_table = Alias::new("rel_state"); let flow_state_table = Alias::new("flow_state"); let rel_model_table = Alias::new("rel_model"); + let rbum_rel_table = Alias::new("rbum_rel"); let mut query = Query::select(); query .columns([ @@ -351,6 +354,8 @@ impl FlowInstServ { ]) .expr_as(Expr::col((rel_state_table.clone(), NAME_FIELD.clone())).if_null(""), Alias::new("current_state_name")) .expr_as(Expr::col((flow_state_table.clone(), Alias::new("color"))).if_null(""), Alias::new("current_state_color")) + .expr_as(Expr::col((flow_state_table.clone(), Alias::new("sys_state"))).if_null(""), Alias::new("current_state_kind")) + .expr_as(Expr::col((rbum_rel_table.clone(), Alias::new("ext"))).if_null(""), Alias::new("current_state_ext")) .expr_as(Expr::col((rel_model_table.clone(), NAME_FIELD.clone())).if_null(""), Alias::new("rel_flow_model_name")) .from(flow_inst::Entity) .join_as( @@ -377,6 +382,15 @@ impl FlowInstServ { .add(Expr::col((rel_model_table.clone(), REL_KIND_ID_FIELD.clone())).eq(FlowModelServ::get_rbum_kind_id().unwrap())) .add(Expr::col((rel_model_table.clone(), REL_DOMAIN_ID_FIELD.clone())).eq(FlowModelServ::get_rbum_domain_id().unwrap())), ) + .join_as( + JoinType::LeftJoin, + rbum_rel_table.clone(), + rbum_rel_table.clone(), + Cond::all() + .add(Expr::col((rbum_rel_table.clone(), Alias::new("to_rbum_item_id"))).equals((flow_inst::Entity, flow_inst::Column::CurrentStateId))) + .add(Expr::col((rbum_rel_table.clone(), Alias::new("from_rbum_id"))).equals((flow_inst::Entity, flow_inst::Column::RelFlowModelId))) + .add(Expr::col((rbum_rel_table.clone(), Alias::new("tag"))).eq("FlowModelState".to_string())), + ) .and_where(Expr::col((flow_inst::Entity, flow_inst::Column::Id)).is_in(flow_inst_ids)) .and_where(Expr::col((flow_inst::Entity, flow_inst::Column::OwnPaths)).like(format!("{}%", ctx.own_paths))); @@ -399,6 +413,8 @@ impl FlowInstServ { current_state_id: inst.current_state_id, current_state_name: inst.current_state_name, current_state_color: inst.current_state_color, + current_state_kind: inst.current_state_kind, + current_state_ext: inst.current_state_ext, current_assigned: inst.current_assigned, current_vars: inst.current_vars.map(|current_vars| TardisFuns::json.json_to_obj(current_vars).unwrap()), rel_business_obj_id: inst.rel_business_obj_id, @@ -1107,7 +1123,7 @@ impl FlowInstServ { spec_flow_transition_id: Option, req_vars: &Option>, skip_filter: bool, - funs: &TardisFunsInst, + _funs: &TardisFunsInst, ctx: &TardisContext, ) -> TardisResult { let flow_model_transitions = flow_model.transitions(); @@ -1188,36 +1204,14 @@ impl FlowInstServ { double_check: model_transition.double_check(), }) .collect_vec(); - let current_flow_state = FlowStateServ::find_one_item( - &FlowStateFilterReq { - basic: RbumBasicFilterReq { - ids: Some(vec![flow_inst.current_state_id.to_string()]), - with_sub_own_paths: true, - own_paths: Some("".to_string()), - ..Default::default() - }, - ..Default::default() - }, - funs, - ctx, - ) - .await? - .ok_or_else(|| funs.err().not_found("flow_inst", "do_find_next_transitions", "flow state is not found", "404-flow-state-not-found"))?; let state_and_next_transitions = FlowInstFindStateAndTransitionsResp { flow_inst_id: flow_inst.id.to_string(), finish_time: flow_inst.finish_time, current_flow_state_name: flow_inst.current_state_name.as_ref().unwrap_or(&"".to_string()).to_string(), - current_flow_state_kind: current_flow_state.sys_state.clone(), - current_flow_state_color: current_flow_state.color.clone(), - current_flow_state_ext: TardisFuns::json.str_to_obj::( - &FlowRelServ::find_from_simple_rels(&FlowRelKind::FlowModelState, &flow_inst.rel_flow_model_id, None, None, funs, ctx) - .await? - .into_iter() - .find(|rel| current_flow_state.id == rel.rel_id) - .ok_or_else(|| funs.err().not_found("flow_inst", "do_find_next_transitions", "flow state is not found", "404-flow-state-not-found"))? - .ext, - )?, + current_flow_state_color: flow_inst.current_state_color.as_ref().unwrap_or(&"".to_string()).to_string(), + current_flow_state_kind: flow_inst.current_state_kind.as_ref().unwrap_or(&FlowSysStateKind::Start).clone(), + current_flow_state_ext: TardisFuns::json.str_to_obj::(&flow_inst.current_state_ext.clone().unwrap_or_default())?, next_flow_transitions: next_transitions, }; Ok(state_and_next_transitions) diff --git a/services/bios-all/config/locale/zh-cn.basic b/services/bios-all/config/locale/zh-cn.basic index b6bbd395a..d5c182c83 100644 --- a/services/bios-all/config/locale/zh-cn.basic +++ b/services/bios-all/config/locale/zh-cn.basic @@ -36,6 +36,7 @@ 400-rbum-cert-sk-vcode-only-one 凭证密钥与动态码只能二选一 400-rbum-cert-reset-sk-duplicate 重置密钥不能重复 400-rbum-cert-sk-contains-ak 密码不能包含用户名 +400-rbum-cert-lock 账号已锁定 401-rbum-cert-lock 账号已锁定 409-rbum-cert-sk-expire 凭证密钥已过期 404-rbum-cert-conf-not-exist 找不到对应的凭证配置 diff --git a/spi/spi-conf/src/conf_config.rs b/spi/spi-conf/src/conf_config.rs index 39b27ebcb..fedc15b8a 100644 --- a/spi/spi-conf/src/conf_config.rs +++ b/spi/spi-conf/src/conf_config.rs @@ -1,7 +1,7 @@ -use std::net::IpAddr; -use ipnet::IpNet; use bios_basic::rbum::rbum_config::RbumConfig; +use ipnet::IpNet; use serde::{Deserialize, Serialize}; +use std::net::IpAddr; use tardis::consts::{IP_LOCALHOST, IP_UNSPECIFIED}; use crate::dto::conf_auth_dto::RegisterRequest; diff --git a/support/iam/src/console_tenant/api/iam_ct_role_api.rs b/support/iam/src/console_tenant/api/iam_ct_role_api.rs index 8ee6cbfbf..c9688dc00 100644 --- a/support/iam/src/console_tenant/api/iam_ct_role_api.rs +++ b/support/iam/src/console_tenant/api/iam_ct_role_api.rs @@ -119,7 +119,6 @@ impl IamCtRoleApi { TardisResp::ok(result) } - /// 聚合查询租户及基础项目角色 Find Roles base app #[oai(path = "/base_app", method = "get")] async fn find_role_base_app( @@ -133,9 +132,7 @@ impl IamCtRoleApi { let funs = iam_constants::get_tardis_inst(); let app_result = IamRoleServ::find_items( &IamRoleFilterReq { - basic: RbumBasicFilterReq { - ..Default::default() - }, + basic: RbumBasicFilterReq { ..Default::default() }, kind: Some(IamRoleKind::App), in_base: Some(true), ..Default::default() @@ -145,12 +142,10 @@ impl IamCtRoleApi { &funs, &ctx.0, ) - .await?; + .await?; let tenant_result = IamRoleServ::find_items( &IamRoleFilterReq { - basic: RbumBasicFilterReq { - ..Default::default() - }, + basic: RbumBasicFilterReq { ..Default::default() }, // kind: Some(IamRoleKind::Tenant), in_base: Some(false), ..Default::default() @@ -160,7 +155,7 @@ impl IamCtRoleApi { &funs, &ctx.0, ) - .await?; + .await?; ctx.0.execute_task().await?; let mut result = vec![]; result.extend(tenant_result); From 094e1f101f742844c4fe8d5af62a9bae523ab369 Mon Sep 17 00:00:00 2001 From: ZzIsGod1019 <1498852723@qq.com> Date: Thu, 23 Nov 2023 18:48:31 -0800 Subject: [PATCH 2/2] flow: reach notify --- middleware/flow/src/dto/flow_external_dto.rs | 1 + middleware/flow/src/flow_initializer.rs | 53 +------------------ .../flow/src/serv/flow_external_serv.rs | 10 ++-- middleware/flow/src/serv/flow_inst_serv.rs | 14 +++-- 4 files changed, 18 insertions(+), 60 deletions(-) diff --git a/middleware/flow/src/dto/flow_external_dto.rs b/middleware/flow/src/dto/flow_external_dto.rs index eae94c677..63735641d 100644 --- a/middleware/flow/src/dto/flow_external_dto.rs +++ b/middleware/flow/src/dto/flow_external_dto.rs @@ -19,6 +19,7 @@ pub struct FlowExternalReq { pub original_sys_state: Option, pub owner_paths: String, pub obj_ids: Vec, + pub notify: Option, pub params: Vec, } diff --git a/middleware/flow/src/flow_initializer.rs b/middleware/flow/src/flow_initializer.rs index 68b7b7216..60b2d59cb 100644 --- a/middleware/flow/src/flow_initializer.rs +++ b/middleware/flow/src/flow_initializer.rs @@ -6,16 +6,11 @@ use bios_basic::rbum::{ }; use bios_sdk_invoke::invoke_initializer; -use itertools::Itertools; -use serde_json::Value; use tardis::{ basic::{dto::TardisContext, field::TrimString, result::TardisResult}, db::{ reldb_client::TardisActiveModel, - sea_orm::{ - self, - sea_query::{Query, Table}, - }, + sea_orm::sea_query::Table, }, log::info, web::web_server::TardisWebServer, @@ -33,7 +28,7 @@ use crate::{ flow_model_dto::FlowModelFilterReq, flow_state_dto::FlowSysStateKind, flow_transition_dto::{ - FlowTransitionActionByVarChangeInfoChangedKind, FlowTransitionActionChangeInfo, FlowTransitionActionChangeKind, FlowTransitionDoubleCheckInfo, FlowTransitionInitInfo, + FlowTransitionDoubleCheckInfo, FlowTransitionInitInfo, }, }, flow_config::{BasicInfo, FlowBasicInfoManager, FlowConfig}, @@ -77,7 +72,6 @@ pub async fn init_db(mut funs: TardisFunsInst) -> TardisResult<()> { funs.begin().await?; if check_initialized(&funs, &ctx).await? { init_basic_info(&funs).await?; - // self::modify_post_actions(&funs, &ctx).await?; } else { let db_kind = TardisFuns::reldb().backend(); let compatible_type = TardisFuns::reldb().compatible_type(); @@ -125,49 +119,6 @@ async fn init_basic_info<'a>(funs: &TardisFunsInst) -> TardisResult<()> { Ok(()) } -// @TODO temporary -pub async fn modify_post_actions(funs: &TardisFunsInst, ctx: &TardisContext) -> TardisResult<()> { - #[derive(sea_orm::FromQueryResult)] - pub struct FlowTransactionPostAction { - id: String, - action_by_post_changes: Value, - } - let transactions = funs - .db() - .find_dtos::( - Query::select() - .columns([ - (flow_transition::Entity, flow_transition::Column::Id), - (flow_transition::Entity, flow_transition::Column::ActionByPostChanges), - ]) - .from(flow_transition::Entity), - ) - .await? - .into_iter() - .filter(|res| !TardisFuns::json.json_to_obj::>(res.action_by_post_changes.clone()).unwrap_or_default().is_empty()) - .collect_vec(); - for transaction in transactions { - let mut post_changes = TardisFuns::json.json_to_obj::>(transaction.action_by_post_changes.clone()).unwrap_or_default(); - for post_change in post_changes.iter_mut() { - if post_change.changed_kind.is_none() && post_change.kind == FlowTransitionActionChangeKind::Var { - if post_change.changed_val.is_some() { - post_change.changed_kind = Some(FlowTransitionActionByVarChangeInfoChangedKind::ChangeContent); - } else { - post_change.changed_kind = Some(FlowTransitionActionByVarChangeInfoChangedKind::Clean); - } - } - } - let flow_transition = flow_transition::ActiveModel { - id: sea_orm::ActiveValue::Set(transaction.id.clone()), - action_by_post_changes: sea_orm::ActiveValue::Set(TardisFuns::json.obj_to_json(&post_changes)?), - ..Default::default() - }; - funs.db().update_one(flow_transition, ctx).await?; - } - - Ok(()) -} - pub async fn init_rbum_data(funs: &TardisFunsInst, ctx: &TardisContext) -> TardisResult<()> { let kind_state_id = add_kind(flow_constants::RBUM_KIND_STATE_CODE, flow_constants::RBUM_EXT_TABLE_STATE, funs, ctx).await?; let kind_model_id = add_kind(flow_constants::RBUM_KIND_MODEL_CODE, flow_constants::RBUM_EXT_TABLE_MODEL, funs, ctx).await?; diff --git a/middleware/flow/src/serv/flow_external_serv.rs b/middleware/flow/src/serv/flow_external_serv.rs index 7b0d3c44e..e05de3c64 100644 --- a/middleware/flow/src/serv/flow_external_serv.rs +++ b/middleware/flow/src/serv/flow_external_serv.rs @@ -76,6 +76,7 @@ impl FlowExternalServ { target_sys_state: Option, original_state: Option, original_sys_state: Option, + is_notify: bool, params: Vec, ctx: &TardisContext, funs: &TardisFunsInst, @@ -110,6 +111,7 @@ impl FlowExternalServ { target_sys_state, original_state, original_sys_state, + notify: Some(is_notify), params, ..Default::default() }; @@ -138,6 +140,7 @@ impl FlowExternalServ { target_sys_state: FlowSysStateKind, original_state: String, original_sys_state: FlowSysStateKind, + is_notify: bool, ctx: &TardisContext, funs: &TardisFunsInst, ) -> TardisResult { @@ -156,6 +159,7 @@ impl FlowExternalServ { target_sys_state: Some(target_sys_state), original_state: Some(original_state), original_sys_state: Some(original_sys_state), + notify: Some(is_notify), ..Default::default() }; debug!("do_notify_changes body: {:?}", body); @@ -215,11 +219,7 @@ impl FlowExternalServ { curr_bus_obj_id: "".to_string(), owner_paths: own_paths.to_string(), obj_ids: rel_business_obj_ids, - target_state: None, - target_sys_state: None, - original_state: None, - original_sys_state: None, - params: vec![], + ..Default::default() }; debug!("do_query_field body: {:?}", body); let resp: FlowExternalResp = funs diff --git a/middleware/flow/src/serv/flow_inst_serv.rs b/middleware/flow/src/serv/flow_inst_serv.rs index f849eff40..b40e3a81f 100644 --- a/middleware/flow/src/serv/flow_inst_serv.rs +++ b/middleware/flow/src/serv/flow_inst_serv.rs @@ -678,8 +678,10 @@ impl FlowInstServ { if next_flow_transition.is_none() { return Err(funs.err().not_found("flow_inst", "transfer", "no transferable state", "404-flow-inst-transfer-state-not-found")); } + let model_transition = flow_model.transitions(); + let next_transition_detail = model_transition.iter().find(|trans| trans.id == transfer_req.flow_transition_id).unwrap().to_owned(); if FlowModelServ::check_post_action_ring( - flow_model.transitions().into_iter().find(|trans| trans.id == transfer_req.flow_transition_id).unwrap(), + next_transition_detail.clone(), (false, vec![]), funs, ctx, @@ -740,6 +742,7 @@ impl FlowInstServ { Some(next_flow_state.sys_state.clone()), Some(prev_flow_state.name.clone()), Some(prev_flow_state.sys_state.clone()), + next_transition_detail.is_notify, params, ctx, funs, @@ -792,10 +795,9 @@ impl FlowInstServ { // get updated instance detail let flow_inst_detail = Self::get(flow_inst_id, funs, ctx).await?; - let model_transition = flow_model.transitions(); Self::do_request_webhook( from_transition_id.and_then(|id: String| model_transition.iter().find(|model_transition| model_transition.id == id)), - model_transition.iter().find(|model_transition| model_transition.id == next_flow_transition.next_flow_transition_id), + Some(&next_transition_detail), ) .await?; @@ -809,6 +811,7 @@ impl FlowInstServ { next_flow_state.sys_state, prev_flow_state.name.clone(), prev_flow_state.sys_state, + next_transition_detail.is_notify, ctx, funs, ) @@ -818,7 +821,7 @@ impl FlowInstServ { let post_changes = model_transition.into_iter().find(|model_transition| model_transition.id == next_flow_transition.next_flow_transition_id).unwrap_or_default().action_by_post_changes(); if !post_changes.is_empty() { - Self::do_post_change(&flow_inst_detail, &flow_model, post_changes, updated_instance_list, ctx, funs).await?; + Self::do_post_change(&flow_inst_detail, &flow_model, post_changes, updated_instance_list, next_transition_detail.is_notify, ctx, funs).await?; } let next_flow_transitions = Self::do_find_next_transitions(&flow_inst_detail, &flow_model, None, &None, skip_filter, funs, ctx).await?.next_flow_transitions; @@ -849,6 +852,7 @@ impl FlowInstServ { current_model: &FlowModelDetailResp, post_changes: Vec, updated_instance_list: &mut Vec, + is_notify: bool, ctx: &TardisContext, funs: &TardisFunsInst, ) -> TardisResult<()> { @@ -883,6 +887,7 @@ impl FlowInstServ { None, None, None, + is_notify, vec![FlowExternalParams { rel_kind: None, rel_tag: None, @@ -907,6 +912,7 @@ impl FlowInstServ { None, None, None, + is_notify, vec![FlowExternalParams { rel_kind: None, rel_tag: None,