某银行运管部凭证号分配需求难点解决

1 需求概述

各支行需给客户分配凭证号,所以每天定时发起预约计划,由库管员进行凭证号的线下及线上分配。

1.1 原人工操作

1. 支行发起凭证领用计划(004101 交易)

2. 由库管员对支行预约单进行审批(004103 交易)

3. 库管员进行线下手动分配凭证号。

4. 再进行线上凭证号分配。预约审批单状态为“已审批”时,由库管员操作凭证配号交易(004104 交易),需一一输入凭证起始号码,还需输入现金支票等的凭证批号。

5. 由库管员进行凭证出库(004204 交易),打印配号清单。

6. 支行进行凭证入库操作。

1.2 痛点

人工需手动记录每个凭证种类的起始号,进行线下手动的凭证号分配动作后再到线上分配,错误率高,操作重复。引入 RPA,释放人力,将线上的重复操作替代,降低错误率。效率高且及时。

2 RPA 设计步骤详情

1. 从 OA 读取名为“凭证禁用号段”的消息,下载附件《凭证禁用号段表》。若人工有更新,才会发 OA,如果当天没有收到 OA 的禁用号段表,则默认用前一次的。

2. 每天下午 16:00,RPA 开始操作。RPA 从《库区信系表》读取账号密码登录至核心系统,系统右上角输入交易号(003603). 从《库区信息表》读取机构号录入,点击查询。目前有三个机构号(01200- 武进区、01500- 金坛库区、01600- 溧阳库区)需进行查询。每个机构有不同的账号密码。

3. 获取该机构下的不同凭证种类的“凭证种类”、“凭证起始号”和“凭证终止号”、“数量”。关闭该交易。

4. 系统右上角输入交易号(004104).

预约日期选择当天,预约标志选择“领用”

计划类型选择 0- 日常计划。

凭证计划状态选择“4- 已审批”。

点击查询。会出现所有“已审批”状态下的数据。从第一条开始选中一条数据,记录下“凭证预约编号”,回车。

获取凭证种类和凭证数量。当凭证种类属于《凭证批号表》中的类型,则需录入“凭证批号”。

a. 若凭证种类的数量小于等于之前 003603 交易中对应凭证种类的数量,则可继续操作。

b. 反之,则整个退出该分配表。继续下一个计划的分配操作。

若符合 a,则继续录入“凭证起始号”和“凭证终止号”。

“凭证起始号”根据之前 003603 查询到的对应机构下对应凭证种类的凭证起始号。 

“凭证终止号”等于“凭证起始号 + 凭证数量”。

在《凭证禁用号段表》表中的,判断即将分配的“凭证起始号”和“凭证终止号”之间所有的号段,是否属于对应凭证种类的禁用号段,如果是,则记录下来号段和数量。在原凭证终止号后顺延相应数量的凭证号进行分配。

回到图 3-1 的界面。判断是否为已经做过的“凭证预约编号”,如果是未做过的,继续点击该条数据,回车进入分配操作。直至所有已审批的计划都执行了分配动作。

3 难点描述

如下图所示,同一个凭证种类下会有多个连续的待分配的凭证起始号到终止号。另外,由于具体业务需要,提供了一张凭证禁用号段表格,其中记录了每一种凭证种类下多个连续的不可以使用的凭证起始号到终止号。将待分配的减去禁用的得到的就是可以分配的凭证数量。
某银行运管部凭证号分配需求难点解决

某银行运管部凭证号分配需求难点解决

对于下图中的每一笔已经审批的凭证预约记录,会有当前凭证种类需要分配的凭证数量,当这个需要分配的凭证数量小于等于可以分配的凭证数量时,进行凭证号分配操作。分配时,按顺序填写每一个可以分配凭证的起始号到终止号,直到需要分配的凭证数量用完为止。
某银行运管部凭证号分配需求难点解决
某银行运管部凭证号分配需求难点解决

3.1 具体操作

凭证号分配操作步骤的一个假设案例如下:

为方便起见,待分配和禁用号段都保存为集合的结构。假设多个连续的待分配的凭证起始号到终止号分别为 {1, 2, 3, 4, 5}, {11, 12, 13, 14, 15}, {21, 22, 23, 24, 25},禁用号段分别为 {9, 10, 11, 12}, {15, 16, 17, 18, 19, 20, 21}, {24, 25, 26},那么可分配的凭证为 [[1, 2, 3, 4, 5], [13, 14], [22, 23]],总共 9 张可以分配的凭证,假设现在需要分配 6 张,那么按顺序分配的结果就是 [[1, 2, 3, 4, 5], [13, 14]],在业务系统中分别填写 1——5,13——14 即可。

3.2 算法分解

从后往前推,我们可以设计两个算法来解决以上问题。分别命名为集合分块算法和分块填入算法。

4 开发框架设计

【模块化】前置操作:流程文档中步骤1——3
004104点击查询
for i in range(len(查询结果)):
    选中记录并回车,打开预约凭证明细
    for j in range(len(明细结果)):
        if 凭证种类 not in 批号表:
            continue
        else:
            if 凭证剩余数量 > 查询结果中对应种类的凭证数量:
                关闭预约凭证明细
                break
            else:
                打开预约凭证明细中的当前记录
                【模块化】集合分块算法
                【模块化】分块填入算法
                调用算法,获取凭证分配的调用数据,并输入至系统
                点击提交

4.1 集合分块算法

尾箱凭证表中每一个凭证种类的起始终止号作为一个集合,比如集合 a,b,c,每一个集合内的值是可以连续的

相同凭证种类的每一个需要排除的凭证起始终止号作为一个集合,比如集合 d,e,f,每一个集合内的值是可以连续的

对于集合 a,b,c 中的每一个集合,都减去每一个排除集合,之后转为列表并排序,按连续情况分为多个列表,最后统一放在列表 set_list 中

4.2 分块填入算法

对于多个连续列表组成的列表,例如 [[11-20],[31-40],[51-60]],给定一个不超过所有连续列表元素数量之和的一个数,假设是 29

返回数量总和为这个数的连续列表,这个例子中的返回结果为 [11-20],[31-40],[51-59]