# 7.模型生命周期

# 逻辑事件

事件 描述
beforeCreate 单据创建时,卡片数据组装之前
afterCreated 单据创建时,卡片数据组装之后
beforeCalculate 单据字段触发计算时,数据计算之前
afterCalculated 单据字段触发计算时,数据计算之后
beforeUpdate 单据执行保存操作时,卡片数据组装之前
afterUpdate 单据执行保存操作时,卡片数据组装之后
afterUpdated 单据数据全部保存完成,索引更新完成之后
stateChanged 单据状态发生改变的时候,从一个状态到另一个状态之时
afterUpdateCommit 单据数据保存提交之后

# 处理程序

# NkDocAssertCycleInterceptor 通用的数据校验程序

{
	"提示信息1": "${表达式,返回boolean}",
	"提示信息2": "${表达式,返回boolean}",
	"提示信息3": "${表达式,返回boolean}"
}
1
2
3
4
5

# NkDocByCondiUpdateDocInterceptor 更新当前单据

提示

_condition:处理程序执行条件,可使用表达式 formCard:描述哪个卡片触发的计算,(如果事件是带计算的,并且calculate为TRUE,一定要指定formCard,不然后造成循环调用) _calculate:值为TRUE 或者false,表示是否触发计算 updates:更新的卡片数据,value值是表达式

在参数列中填入json参数

{
  "_condition": "${返回真或假,表示是否执行更新逻辑}",
  "formCard":"NkDynamicForm",
  "_calculate":"true",
  "updates": {
    "docState": "'VOFF'",
    "data.custom.name":"'张三'",
    "data.custom.age":"18",
    "data.custom.address":"${data.idcard.address}"
  }
}
1
2
3
4
5
6
7
8
9
10
11

# NkDocDingTalkMessageInterceptor 钉钉机器人消息发送

提示

_condition:处理程序执行条件,可使用表达式,默认为true url:发送消息的url地址 data:发送数据集合

在参数列中填入json参数

{
	"_condition": "${docState=='S004'}",
	"url": "https://oapi.dingtalk.com/robot/send?access_token=24c9f168a382104bd0f36e0808cc9e9fa698934202e5ac2e4590299c831cee25",
	"data": {
		"msgtype": "markdown",
		"markdown": {
			"title": "#{data?.quest?.person?.docName}有BUG待处理",
			"text": "@#{data?.quest?.personMobile}你有新的BUG待处理\n\n任务:**#{data?.message?.desc}**\n\n测试人员:#{data?.test?.tester?.docName}\n\n[点击查看详情](http://pm.nkpro.cn/#/apps/docs/detail/#{docId})"
		},
		"at": {
			"atMobiles": ["${data?.quest?.personMobile}"],
			"isAtAll": false
		}
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# NkDocShortMessageNotificationInterceptor 短信通知

提示

_condition:处理程序执行条件,可使用表达式,默认为true phone:接收方号码,可传多个接收方手机号 templateCode:签名通道号,签名通道号&模板Id(华为云) templateParams:模板参数,表达式模式

在参数列中填入json参数

{
        "_condition": "${docState == 'NEW'}",
         "phone": [],
        "templateCode": "签名通道号&模板Id",       //签名通道号和模板Id用&分割(华为云)
        "templateParams": {
            "1": "${@doc.detail(data.partner?.customer?.docId).data.base.comName}", //承租人名称
            "2": "${@doc.detail(preDocId)?.docNumber}"
        }
}
1
2
3
4
5
6
7
8
9

# NkDocStateChangedCreateDocInterceptor 创建单据

单据存在则修改,不存在就创建

提示

_condition:处理程序执行条件,默认true _update:触发修改条件,默认true _businessKey:目标单据业务主键 _validateSpEL:验证表达式 _validateMessage:验证提示 _refSpEL:映射到单据引用字段的路径,要将本单据映射到目标单据的某个字段上 _optSource:操作描述 _calculate:创建或修改数据时候是否需要计算 _postConditionSpEL:后置条件表达式,若为空则为true docType:需要创建的单据类型 docState:需要创建的单据状态 docName:目标单据名称 preDocId:目标单据的前序单据ID 可配 data:目标的单据的默认卡片数据

在参数列中填入json参数

{
	"_condition": "${docState == 'ACTI'}",
	"_update": true,
	"_businessKey": "${docId}",
	"_validateSpEL": true,
	"_validateMessage": "",
	"_refSpEL": "data.overdue.urgeQuest",
	"_calculate": true,
	"_optSource": "",
	"preDocId": "${docId}",
	"docType": "RBM1",
	"docState": "NEW",
	"data": {
		"overdue": "${data?.overdue}"
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# NkDocStateChangedUpdateDocInterceptor 修改其他单据

单据存在则修改,不存在则不处理

提示

_condition:处理程序执行条件,默认true _update:触发修改条件,默认true _businessKey:目标单据业务主键 _validateSpEL:验证表达式 _validateMessage:验证提示 _refSpEL:映射到单据引用字段的路径,要将本单据映射到目标单据的某个字段上 _optSource:操作描述 _calculate:创建或修改数据时候是否需要计算 _postConditionSpEL:后置条件表达式,若为空则为true docType:需要创建的单据类型 docState:需要创建的单据状态 docName:目标单据名称 preDocId:目标单据的前序单据ID 可配 data:目标的单据的默认卡片数据

在参数列中填入json参数

{
	"_condition": "${docState == 'ACTI'}",
	"_update": true,
	"_businessKey": "${docId}",
	"_validateSpEL": true,
	"_validateMessage": "",
	"_refSpEL": "data.overdue.urgeQuest",
	"_calculate": true,
	"_optSource": "",
	"preDocId": "${docId}",
	"docType": "RBM1",
	"docState": "NEW",
	"data": {
		"overdue": "${data?.overdue}"
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# NkDocStateChangedLoopCreateDocInterceptor 创建单据[批量]

提示

该处理程序可以将某个表格数据批量生成单据

_loop:需要循环处理的数据

其他跟NkDocStateChangedCreateDocInterceptor 创建单据一致

在参数列中填入json参数

{
    "_loop":"${data?.certificate}",
	"_condition": "${docState == 'ACTI'}",
	"_update": true,
	"_businessKey": "${docId}",
	"_validateSpEL": true,
	"_validateMessage": "",
	"_refSpEL": "data.overdue.urgeQuest",
	"_calculate": true,
	"_optSource": "",
	"preDocId": "${docId}",
	"docType": "RBM1",
	"docState": "NEW",
	"data": {
		"overdue": "${data?.overdue}"
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# NkDocBalanceProcessInterceptor 创建或更新结余明细记录

提示

在金额变动单据配置该生命周期程序,注意targetDocId必须要存在
在结余明细展示单据配置NkCardFinBalance | 结余 卡片

{
  "condition":"${}", //激活条件
  "targetDocId": "${}",//结余目标单据ID 使用示例:${@doc.getTargetDocId('单据类型')}
  "targetCardKey": "${}",//结余目标单据的结余卡片KEY
  "amount": "${}", //明细金额
  "remark":"${}",//描述说明,非必填
  "state": 2,//状态,可选默认为2
}
1
2
3
4
5
6
7
8

提示

事件配合处理程序使用,可满足个性化设计需求

目前系统中有通用的处理程序,也可根据需要自定义处理程序

参数一项可以向处理程序传参

TODO 这一块要删除吧

# 创建

# 运算

# 更新

# 状态变化

# 加载

# 单据交互

# 避免循环调用