跳到主要内容

如何实现自定义编号?(进阶版)

注意:该方案需要版本为企业版才可用。目的是为了解决初阶版遇到的问题

使用场景&期望达成

使用自定义编号的场景非常多,例如合同/订单编号,物料编码,员工工号等。

以订单编号为例,一般的制造业在采购时都会区分成品和原材料,或者叫成品和配件。希望在采购的时候,能分开计数,且每个月重置编号,例如这是我这个月的第一笔成品订单,那就是“CP-20201215-0001”,然后我又买了一笔配件订单,我希望他是“PJ-20201215-0001”,我们需要通过字段来组合需要的自定义编号。

存在问题

1、暂存:如果数据进行过暂存,会使得后续编号出现重复。原因是数据关联字段聚合方式为最新数据,这里是以申请时间来进行排序的。但是暂存的数据申请时间在数据生成的那一刻就会产生

2、回退:如果数据回退到申请人节点,但是我们又不希望数据的编号再次提交重计算一下,希望可以保留之前的编号

问题剖析

我们可以先分析一下这个自定义编号,CP/PJ-年月日-自增编号。

一共有3部分,前缀、日期和自增编号。

1、前缀

这部分很简单,是成品和配件的英文首字母大写,我们通过单项选择配合IF函数就可以直接控制。

2、年月

这个就不说了,通过日期字段配合CONCAT来实现即可。

3、自增编号

我们可以通过数据关联字段来完成。

当我们分别处理了这3个部分后,用CONCAT组合一下就可以了。

4、暂存

我们可以通Q-linker来调用获取应用数据接口,根据【提交时间】降序取第一个数据为自定义编号,来替代数据关联字段

5、回退

可以在申请人节点下加一个填写节点来替代申请人节点,并不要开启关于编号的提交重计算

解决方案

image.png

1、前缀:

1.设置采购类型

【采购类型】:单项选择

image.png

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

image.png

2、年月日

1.设置日期字段

【采购日期】:日期-设置公式

image.png

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

image.png

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

image.png

image.png

image.png

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”,即得到自增后的编号

image.png

4、按月重置编号

1.每月月初(用于每月重置编号)

日期字段(格式:年月日 时分秒):公式计算

image.png

2.每月月末(用于每月重置编号)

日期字段(格式:年月日 时分秒):公式计算

image.png

3.Q-linker的配置body

进行对于数据的筛选只筛选出当月的数据,从而实现对于每月编号的重置

image.png

5、完整公式

当还没有选择采购类型时:ISEMPTY(采购类型),先不显示编号,即返回空值:" "

选择了采购类型后,取当前最新编号右边的4位字符再+1:

CONCAT(IF(采购类型***=="配件","PJ-","CP-"),TEXT(***采购日期

,"YYYYMMDD"),"-",

RIGHT(CONCAT("0000",NUM(RIGHT(当前最新编号,4))+1),4))

最后通过IF()函数将两种情况写在一起

image.png

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

image.png

image.png

6、拓展

1.设置提交/通过时重新触发数据关联或公式

申请人节点中开启“提交/通过时重新触发数据关联或公式”,选择需要重新触发的字段【提交时间】【Q-linker】【当前最新编号】【自定义编号】

设置意义:当填写中提交前的过程中,如果有其他人员提交了表单,这时【当前最新编号】获取的编号不是最新的了,自定义编号也就会和其他数据的编号重复,所以需要在提交时重新触发再次获取最新的当前编号,计算出正确的自定义编号

image.png

注:提交重计算功能打开后,在选择字段时,需要注意字段顺序计算顺序是从上往下,因为**【自定义编号】是根据【当前最新编号】来进行公式计算的,所以一定要先算出来【当前最新编号】,才能计算【自定义编号】**,不然的话,先算【自定义编号】,那时候会导致公式错误。

2.设置应用校验

注:对于自身应用进行配置应用的自身校验。目的是为了控制同时提交,从而避免编号的重复

image.png

image.png

7、回退操作

在回退时,如何保证之前生成的编号不会再重新生成了

解决思路:在申请人节点下,再加一个节点,用于后续回退时回退的节点。只单纯用于修改填写用,不可将生成编号的字段再提交重计算一次。

image.png

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

image.png

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

image.png

流程设计

image.png

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

image.png

image.png

【自动处理自定义编号申请人完善节点】:处理单条数据

  • URL中的数据ID为插入表单的字段,并不是系统的数据ID,需要注意
  • auditNodeId:需要获取对应节点的ID,这里是指申请人完善节点

image.png

image.png