业务规则

业务规则

作者:


本文将介绍新增一个业务规则时如何在前端和go处理。以及如何在表单和列表中如何获取业务规则。

新增一个业务规则

当新增一个业务规则,且“用户规则”列是枚举或者参照时,就需要写代码。前端需要处理渲染,go要处理回显时用到的结构化数据。

前端处理渲染

apps/link/src/main/screens/archive/bill-type/business-rule,在这个目录下有各个实体的业务规则。

下面的代码是处理枚举的例子,key是业务规则id,cellToSelect有3个参数:enumType: string, isMulti = false, required = false

import { cellToSelect } from '@main/screens/archive/bill-type/business-rule/projectSchedule';
export const budgetPlanBusinessRule: { [keys: string]: IBusinessRuleCustomizedDef } = ({
  ["P3438562CFH005H"]: cellToSelect('StageDurationLinkTaskRange'),
})

根据另一个字段设置禁用状态

用cellDisabledWithDepend实现,禁用了以后通常还要清空,要在另一个字段的valueChangedReaction中实现。

import { cellToSelect } from '@main/screens/archive/bill-type/business-rule/projectSchedule';
export const budgetPlanBusinessRule = {
	["P3438562CFH005G"]: Object.assign(
		cellToSelect('StageDurationLinkTaskRule', false, true),
		cellDisabledWithDepend({
			dependEvery: [
				FuncUnit_Constants.stageOwnerUserRange, // 阶段负责人可选范围
				FuncUnit_Constants.enableProjectScheduleValidator, // 启用项目计划
			]
		}),
	),
	[FuncUnit_Constants.stageOwnerUserRange]: {
      valueChangedReaction: (params: IFuncUnitValueChangedReaction) => {
        setFalse(params, ['P3438562CFH005G'])
      },
    },
}

处理参照

import {
  cellValueSubmitHandlerOld as cellValueSubmitHandler,
  createCellEditor,
  createCellRender,
} from '../utils';

  [F.incomeAssocAddCategoryConfigValidator]: {
    cellValueSubmitHandler,
    cellRenderer: createCellRender(),
    cellEditor: createCellEditor(() => {
      return { isMulti: true };
    }),
  },

Go处理返回值

由于后端存的是字符串,对于枚举和参照,存的都是Id,就需要在Go上把Id转化为结构化数据。

如果是枚举用GetEnumValue方法获取结构化数据即可。如果是参照对象,就需要GQL请求会对应的数据了。

trek/web/controllers/web-controllers/bill-type-setting/bill-type-setting.go

在此文件中加一个 case

	case "xxId":
		u, ok := result.UserRule.(string)
		if ok {
			var enumValue = metadata.GetMetadata().GetEnumValue(gen_enums.ENUM_ChangeViewType, u)
			result.UserRule = enumValue
		}
		s, ok := result.SystemRule.(string)
		if ok {
			var enumValue = metadata.GetMetadata().GetEnumValue(gen_enums.ENUM_ChangeViewType, s)
			result.SystemRule = enumValue
		}

取业务规则的值

列表

先在Go上查一次,通过列表方案的extraData传到前端。

func ViewTypeMiddleware() query_list.QueryListMiddleware {
	return &viewTypeMiddleware{}
}

func (m *viewTypeMiddleware) Register(ctx query_list.QueryListContext) {
	ctx.AddResponsePiplineItem(m.appendExtraData)
}

func (m *viewTypeMiddleware) appendExtraData(ctx query_list.QueryDataContext, response *query_list.QueryResponse) {
	funcUnit := calendar_entry.FetchFuncUnit("BudgetPlan", []string{"budgetPlanViewTypeProcessor"}, ctx.GetContext())
	response.ExtraData["changeViewTypeId"] = funcUnit
}

前端通过列表presenter.listDefController获取,由于列表中可能包含多个单据类型,需要根据单据类型获取

  private getChangeViewType = (billTypeId: string) => {
    const extraData = this.presenter.listDefController.dataSource.data.extraData
    if(extraData && extraData.changeViewTypeId) {
      const changeViewTypeId = extraData.changeViewTypeId.find(i => get(i, 'billType.id') === billTypeId)
      return get(changeViewTypeId, 'setting');
    }
  }

表单

bizFormPresenter.api有两个方法getBusinessRules和getBusinessRuleById。

方式一:FormPresenter

class ProjectFormPresenter extends EasyBizFormPresenter<IProject>{
  private billTypeRules: Array<IBizProcessFuncUnitSetting> = [];

  xx() {
    const businessRules = this.bizFormPresenter.api.getBusinessRules()
    this.billTypeRules = oc(businessRules).rules([])
  }
}

方式二:表单顶部按钮MenuButton

import { FuncUnit_Constants } from '@q7/athena-gen/src';

class ProjectPlanButton extends MenuButton {
  private checkEnableProjectRule = () => {
    const enableProject: IBizProcessFuncUnitSetting = this.presenter.api.getBusinessRuleById(
      FuncUnit_Constants.enableProjectScheduleValidator,
    );
    if (enableProject) {
      return enableProject.setting;
    }
    return;
  };
}

其中FuncUnit_Constants是根据预置数据生成的,可以问后端你要的业务规则的名字。

业务规则的类型

interface IBizProcessFuncUnitSetting {
  applyTo?: { [key: string]: any } // 应用的对象,
	applyToTypeObject?: IEnumValue // 应用对象类型,
	billIoType?: IEnumValue // 单据方向,
	billType?: IBillType // 单据类型,
	bizObjectInfoWs?: string // 业务对象信息,
	businessType?: IBusinessType // 业务类型,
	createdTime?: number // 创建时间,
	createdUser?: IUser // 创建人,
	criteria?: { [key: string]: any } // 条件,
	customizedFields?: { [key: string]: any } // 自定义属性,
	dataObject?: IObjectType // 对象类型,
	dataVersion?: number // 数据版本,
	elseSetting?: { [key: string]: any } // 其他的值,
	entrySrcSystem?: IEnumValue // 数据来源类型,
	externalObjectId?: string // 外部系统唯一标识,
	externalObjectType?: string // 外部系统对象类型,
	externalSystemCode?: string // 外部系统标识,
	funcUnitBillOfBizProcess?: string // 业务过程处理单元,
	funcUnit?: IFuncUnit // 功能部件,
	id?: string // ID,
	isDeleted?: boolean // 是否为删除数据,
	isInitData?: boolean // 是否为预置数据,
	isSystem?: boolean // 是否为系统数据,
	lastModifiedTime?: number // 最后修改时间,
	lastModifiedUser?: IUser // 最后修改人,
	lastRequestId?: string // 最后一次更新请求的requestId,
	listFieldName?: string // 应用的列表字段名,
	modifiedTime?: number // 修改时间,
	modifiedUser?: IUser // 修改人,
	objectTypeObject?: IObjectType // 对象类型,
	overrideModeObject?: IEnumValue // 重载模式,
	setting?: { [key: string]: any } // 设置,
	settingDisplayInfo?: string // 描述,
	sourceBillIoType?: IEnumValue // 允许来源的单据方向,
	sourceBillType?: IBillType // 允许来源的单据类型,
	sourceBusinessType?: IBusinessType // 允许来源的业务类型,
	sourceObjectTypeObject?: IObjectType // 允许来源的对象类型,
	uiOption?: { [key: string]: any } // 前端保存的值
}