如何实现自定义编号?(进阶版)
注意:该方案需要版本为企业版才可用。目的是为了解决初阶版遇到的问题
使用场景&期望达成
使用自定义编号的场景非常多,例如合同/订单编号,物料编码,员工工号等。
以订单编号为例,一般的制造业在采购时都会区分成品和原材料,或者叫成品和配件。希望在采购的时候,能分开计数,且每个月重置编号,例如这是我这个月的第一笔成品订单,那就是“CP-20201215-0001”,然后我又买了一笔配件订单,我希望他是“PJ-20201215-0001”,我们需要通过字段来组合需要的自定义编号。
存在问题
1、暂存:如果数据进行过暂存,会使得后续编号出现重复。原因是数据关联字段聚合方式为最新数据,这里是以申请时间来进行排序的。但是暂存的数据申请时间在数据生成的那一刻就会产生
2、回退:如果数据回退到申请人节点,但是我们又不希望数据的编号再次提交重计算一下,希望可以保留之前的编号
问题剖析
我们可以先分析一下这个自定义编号,CP/PJ-年月日-自增编号。
一共有3部分,前缀、日期和自增编号。
1、前缀
这部分很简单,是成品和配件的英文首字母大写,我们通过单项选择配合IF函数就可以直接控制。
2、年月
这个就不说了,通过日期字段配合CONCAT来实现即可。
3、自增编号
我们可以通过数据关联字段来完成。
当我们分别处理了这3个部分后,用CONCAT组合一下就可以了。
4、暂存
我们可以通Q-linker来调用获取应用数据接口,根据【提交时间】降序取第一个数据为自定义编号,来替代数据关联字段
5、回退
可以在申请人节点下加一个填写节点来替代申请人节点,并不要开启关于编号的提交重计算
解决方案

1、前缀:
1.设置采购类型
【采购类型】:单项选择

2.通过IF()函数取前缀

2、年月日
1.设置日期字段
【采购日期】:日期-设置公式

2.通过TEXT()函数取年月日

3、自增编号
我们先来看最简单的自增编号如何实现
1.设置Q-linker字段获取当前最新编号
- 具体接口帮助文档:获取应用数据接口
- accessToken:需要通过拓展插件——openAPI中获取
- body配置
{
"pageSize": "1",
"pageNum": "1",
"sorts": [
{
"queId": 239163404,//替换成提交时间的queid
"isAscend": false
}
],
"queries": [
{
"queId": 239167814,////替换成采购类型的queid
"searchKey": {采购类型$$24B4ACE8C$$}//替换成表单字段
},
{
"queId": 239163404,////替换成提交时间的queid
"minValue": {每月月初$$24B545DAC$$},//替换成表单字段
"maxValue": {每月月末$$24B545DAD$$}//替换成表单字段
}
]
}
- json path解析
queid值需替换为【自定义编号】的queid
$.result.result[0].answers[?(@.queId=='239163406')].values[0].value



2.设置自增编号的公式
【自定义编号】:单行文字-设置公式
例如:【当前最新编号】获取到当前最新的一条编号为“CG-0015”,那在发起一条数据时,编号应该是“CG-0016”(即自增:0015+1),也就是需要获取“CG-0015”中右边4位字符部分“0015”再+1,然后将前缀“CG-”和“0015”+1拼接起来
即公式:CONCAT("CG-",RIGHT(CONCAT("0000",NUM(RIGHT(当前最新编号,4))+1),4))
公式拆分:
RIGHT(当前最新编号***,4):***获取当前最新编号中的右边4位字符部分“0015”
NUM(RIGHT(当前最新编号***,4))+1:***通过NUM()函数将“0015”从文本格式转换为数字格式再+1
RIGHT(CONCAT("0000",NUM(RIGHT(当前最新编号***,4))+1),4):***通过NUM()函数转换“0015”的格式后会变成“15”,不再保留固定的4位字符,通过CONCAT()函数将“0000”和“16”拼接为“000016”,再通过RIGHT()函数取从右开始固定的4位字符“0016”
CONCAT("CG-",RIGHT(CONCAT("0000",NUM(RIGHT(当前最新编号***,4))+1),4)):***最后通过CONCAT()函数将前缀“CG-”和“0016”拼接为“CG-0016”,即得到自增后的编号

4、按月重置编号
1.每月月初(用于每月重置编号)
日期字段(格式:年月日 时分秒):公式计算

2.每月月末(用于每月重置编号)
日期字段(格式:年月日 时分秒):公式计算

3.Q-linker的配置body
进行对于数据的筛选只筛选出当月的数据,从而实现对于每月编号的重置

5、完整公式
当还没有选择采购类型时:ISEMPTY(采购类型),先不显示编号,即返回空值:" "
选择了采购类型后,取当前最新编号右边的4位字符再+1:
CONCAT(IF(采购类型***=="配件","PJ-","CP-"),TEXT(***采购日期
,"YYYYMMDD"),"-",
RIGHT(CONCAT("0000",NUM(RIGHT(当前最新编号,4))+1),4))
最后通过IF()函数将两种情况写在一起

设置好之后,我们可以看一下效果:


6、拓展
1.设置提交/通过时重新触发数据关联或公式
申请人节点中开启“提交/通过时重新触发数据关联或公式”,选择需要重新触发的字段【提交时间】【Q-linker】【当前最新编号】【自定义编号】
设置意义:当填写中提交前的过程中,如果有其他人员提交了表单,这时【当前最新编号】获取的编号不是最新的了,自定义编号也就会和其他数据的编号重复,所以需要在提交时重新触发再次获取最新的当前编号,计算出正确的自定义编号

注:提交重计算功能打开后,在选择字段时,需要注意字段顺序,计算顺序是从上往下,因为**【自定义编号】是根据【当前最新编号】来进行公式计算的,所以一定要先算出来【当前最新编号】,才能计算【自定义编号】**,不然的话,先算【自定义编号】,那时候会导致公式错误。
2.设置应用校验
注:对于自身应用进行配置应用的自身校验。目的是为了控制同时提交,从而避免编号的重复


7、回退操作
在回退时,如何保证之前生成的编号不会再重新生成了
解决思路:在申请人节点下,再加一个节点,用于后续回退时回退的节点。只单纯用于修改填写用,不可将生成编号的字段再提交重计算一次。

中间的QR添加:作用是为了在申请人首次提交后,不需要再二次处理【申请人完善】节点,而是可以直接系统提交通过

【自动处理申请人完善节点】应用设计

流程设计

【获取对应数据处理人userid】:根据邮箱获取成员userid


【自动处理自定义编号申请人完善节点】:处理单条数据
- URL中的数据ID为插入表单的字段,并不是系统的数据ID,需要注意
- auditNodeId:需要获取对应节点的ID,这里是指申请人完善节点

