基于Web技术的服务通告人工工时计算软件设计与开发
2021-07-28傅聪张艳红付冬梅杨焘
傅聪 张艳红 付冬梅 杨焘
【关键词】服务通告;人工工时;Web技术;软件设计
【中图分类号】TP393.09;U695.2【文献标识码】A【文章编号】1674-0688(2021)06-0053-04
0 引言
服务通告人工工时包括最短施工时间和总人工工时。最短施工时间是指完成一项工程,在人力资源充足、工人操作娴熟且没有发生特殊状况的情况下,工程施工周期的最小值。与最短施工时间不同,总人工工时是指完成一项工程所有工序,在工人操作娴熟且没有发生特殊状况的情况下,所有工人花费的工时之和。由于工程施工期间可以让多道工序同时进行,所以最短施工时间一般小于总人工工时 [1]。
目前,服务通告人工工时的制定主要依赖专业工程技术人员的经验,人为主观因素影响很大,没有相对科学的理论依据作为支撑,而实际的工程工序时长具有一定的时间不确定性,使得这种凭借经验的人工工时的可靠性较低。
本文旨在利用Web等技术 [2-5],通过分析某型飞机制造商已发布的部分服务通告,借助网络计划理论 [6],设计和开发一套能够计算服务通告人工工时的软件,提高服务通告制定效率,减少服务通告人工工时制定过程中受主观因素的影响,提升服务通告的参考价值。
1 软件总体功能说明
本文设计开发的软件主要具有三大功能:经验数据查询、人工工时计算、数据提取更新。用户可以通过输入关键字和给定精确度查询数据库中已有的服务通告人工工时统计数据、工序数和文件下载链接;通过软件提供的数据提取更新功能,数据库管理者只需要上传服务通告PDF文件,就可以自动提取并统计数据;在工序时长和前后关系已知的情况下,用户通过输入工序表信息,可以得到理论人工工时计算结果。软件功能结构图如图1所示。
2 软件开发与设计说明
服务器端运行Linux系统,使用Nginx作为静态服务器,使用uWSGI作为应用程序服务器运行Python程序,软件采用基于Python语言的Flask后端框架 [7-10]和基于JavaScript [11]语言的Vue前端框架 [12-13]相耦合,前端使用BootStrap实现响应式布局,用户使用浏览器输入服务器的网址即可使用软件。
2.1 服务器
服务器的Python CGI脚本作为数据I/O模块,能够处理不同请求。
(1)请求查询数据时:将收到的关键字符串交给Python数据库模块的查询接口,使用数据搜索算法查找结果,然后将查询的结果发送给客户端。
(2)请求下载文件时:根据请求的文件名将文件发送给客户端。
(3)请求上传文件时:首先将上传的数据转交给Python数据提取模块,借助正则表达式和数据提取算法进行字符匹配和提取,然后交给Python数据库模块的更新接口,使用在线数据统计算法更新数据库的数据,最后将处理成功与否返回给客户端。
2.2 客户端
当客户端请求主页Html和Javascript文件后,客户端Vue按Html模板渲染网页,基于Vue的Javascript脚本数据I/O模块作为客户端运行的核心,协调内部数据,使由Html文件和Bootstrap构成的GUI模块能够动态响应用户输入。
(1)当用户输入时:数据I/O模块自动检查并更新GUI模块中的数据,使用自动纠错算法纠正错误输入。
(2)当用户要计算数据时:数据I/O模块将GUI模块中的数据交给工时计算模块,使用树枝图算法计算最短施工时间和总人工工时结果,将返回的结果更新到GUI模块中。
(3)当用户要查询或更新数据时:数据I/O模块将GUI模块中的数据发送给服务器数据更新接口,将返回的结果更新到GUI模块中。
2.3 数据库
在数据库结构方面,软件使用的数据库由服务通告元数据表(命名sb)和统计数据表(命名count)组成,其定义如图2所示。数据表sb用来记录数据提取模块产生的数据,数据表count用来统计数据表sb中的数据记录。
2.4 算法设计
2.4.1 树枝图算法
算法的输入:工序表,工序表中每道工序具有名称、时长、紧前工序3个基本属性,其中紧前工序的名称与工序名称是对应的。算法的输出:最短施工时间、关键工序、总人工工时。
树枝图算法的关键是选取可选工序和获得所有工序路线施工时间的最大值。对于前者,程序应该在每次选择之前判断哪些工序可以选择;对于后者,程序需要找出所有工序路线,比较各条工序路线的施工时间,然后得到所有工序路线施工时间的最大值,作为工程最短施工時间。
算法运行过程:①以一个空数组和初始时刻0为初始参数开始,遍历所有工序表中可选的工序;②每次将一道可选工序的名称加入数组,并将初始时刻加上该工序时长得到新的时刻,如果没有可选工序,则转到过程?譼?訛;③以所得到的数组和新的时刻为初始参数开始重复上述过程?譹?訛;④将数组和时刻作为一条结果保存在结果数组中,由于所有可选工序都遍历了一遍,所以结果数组中保存的就是所有的工序路线;⑤利用基本的排序与求和算法找到最大值和工序时长之和,即可得到最短施工时间和总人工工时。
图3是利用树枝图算法计算所有路线及其总工时的算法流程图,其中“能否放入队列”是一个布尔表达式,“调用自身”指的是程序递归调用自身,括号部分是调用时输入的参数。
2.4.2 自动逻辑检测
算法的输入:当前操作的工序节点、工序表。算法的输出:经过调整(禁用错误选项)的工序表。
帮助用户避免错误选项的原理是禁用错误选项,所以算法的核心是设法得到每道工序需要禁用的选项,每次用户对紧前工序做出改变时,就可能需要重新设置工序的禁用选项,用户既能添加紧前工序,也能删除紧前工序,所以程序既需要能禁用选项,也需要能恢复选项,为了方便理解,以下论述把“紧前工序”称为“依赖”。
禁用选项:假设工序A增加了一个依赖B,则工序B的依赖不能选择工序A,所以工序B将A加入禁用选项中,这只解决了部分问题,如果工序C是工序B的依赖,当工序C选择A作为依赖时,错误就会发生,因为A等待B完成,B等待C完成,C却等待A完成,解决方法是将A加入B、B的依赖、B的依赖的依赖、B的依赖的依赖的依赖(简称B的依赖路径)……的禁用选项中,可以使用递归算法实现。
恢复选项:假设工序A删除了一个依赖B,这时不能盲目地将B的禁用选项A删除,因为工序A可能有一个依赖C,而C的依赖是B,根据禁用选项部分的论述,B依然不能将A作为依赖,即B的禁用选项A不能恢复。这种情况发生的根源是A存在其他含有B的依赖路径,所以解决方法是将B的依赖路径减去A依赖路径与B依赖路径的交集,所剩余的依赖为恢复选项,即从禁用选项中删除。
算法运行过程:①根据节点判断需要禁用还是恢复过程;②递归查找禁用(恢复)列表;③根据禁用(恢复)列表调整工序表。自动检测算法流程图如图4所示。
2.4.3 自动提取数据
算法的输入:服务通告PDF原件。算法的输出:服务通告中的最短施工时间、总人工工时、工序步骤。
PDF文件不便于数据提取,所以选择使用工具将PDF转化为文本文件,这里选择了Python工具pdftotext,使用layout选项以保留页面布局,文本转化好之后,可以利用Perl的文本处理功能提取数据,因为Perl原生支持正则表达式,使用Perl正则表达式进行文本匹配时,程序在循环中进行,每次只匹配一行,每个文件中关于人工工时部分的信息重复出现了两次,所以需要设置一个变量作为开关,当匹配了一次结果后就关闭开关以避免重复。
对于标题部分,原标题是一个用“-”连接的整体,并且使用了不同的编码表示“-”,这非常不便于数据拆分统计,所以标题需要经过二次处理,利用正則表达式的替换功能,把各种编码的“-”替换称制表符,只有这样,统计分析模块才能分析处理。
对于工序部分,服务通告内的工序非常复杂,有的工序包含子工序,甚至子工序的子工序,为了处理方便和数据简洁,程序只处理到第一层工序(即不包含子工序),这样仍然不能正常提取,单行的工序与子工序之间几乎没有格式上的差异(即使人工比较单行工序也很难发现差异),仔细思考人理解文件的方式后发现,人可以进行上下文比对,而程序是单行匹配的,为了让程序也能上下文比对,而不破坏逐行匹配的模式,程序使用了一些上下文变量以提供上下文比对的功能,匹配前先检查上下文变量以决定是否匹配当前行,以及上一行匹配结果是否有效,这样处理后,程序匹配工序失误的概率显著降低。
2.4.4 自动统计数据
算法的输入:新加入的服务通告最短施工时间、总人工工时,数据的原统计结果。算法的输出:数据的新统计结果。
数据统计可以使用离线算法,也可以使用在线算法,离线算法需要输入所有数据,没有利用已完成的统计结果,效率低下,所以使用在线算法。
在数据库中,使用一张数据表存储所有数据,使用另一张数据表存储中间结果和统计量,其中每一条记录代表标题属性相同的同类数据,为了统计最大值、最小值、平均值、众数等统计量,需要在每条记录中存储已统计过的数据,这样统计时就不用从所有数据中搜索同类数据。
由于数据库很难存储复杂的数据(比如数组),所以已经统计过的数据不能以数组结构存储,解决方法是使用一种变通策略,将数组转化为字符串存储在数据库中,在使用时将字符串转化为数组。为了实现这种策略,转化为字符串时应遵循某种规则,保证这种转化是可逆的。在本程序的转化中,数组元素之间插入了特殊符号,在解析字符串时以这种符号将字符串分割为数组,这样带来的好处是不需要修改数据库的定义就可以存储自定义的数据,而且可以方便地重新定义数据。
获得了已统计过的数据后,统计量的计算就变得非常简单,将新统计的数据与原最大值、最小值比较可以获得新的最大值、最小值,搜索新数据的出现频率与原众数出现频率,然后比较得到新的众数值,其他统计量的计算过程类似,此处不再赘述。
2.4.5 数据搜索算法
算法的输入:搜索关键字、搜索精确度。算法的输出:匹配到的相关服务通告最短施工时间、总人工工时等数据。
要实现数据搜索,直接使用数据库的查询功能是不行的,因为SELECT语句擅长根据其他属性筛选数据,所以属性值必须完全符合才能正确匹配,而数据搜索功能更像常用网页搜索引擎的模糊匹配功能,即使输入不精确的信息也能得到想要的结果。
为了实现模糊匹配功能,程序需要对输入关键字进行拆分,由于将关键字拆分为单个词汇在不使用自然语言处理技术的情况下可能比较困难,而使用自然语言处理技术已经超出能力范围,所以程序将关键字拆分成字符而非词汇。
获得分割好的各级别的字符集(简称为源字符)后,程序每次扫描一条数据的标题部分,以相同的方式对标题各级别进行分割得到字符集(简称目标字符)。每次扫描一个源字符,如果源字符与某一个目标字符相同,称为一次命中,命中的次数与源字符个数之比称为匹配度,完成源字符扫描后,计算匹配度,如果匹配度超过设定的阈值,则该数据匹配成功,否则失败。
为了更精准地匹配同级关键字,同时具有匹配非同级关键字的能力,只需对以上算法稍做修改:增加一次对同级别字符的扫描,计算匹配度时将源字符个数乘2,其他不变,这样同级匹配权值为1,不同级匹配权值为0.5,在阈值较高时,可以排除非同级关键字匹配;当阈值较低时,可以匹配非同级关键字。当阈值达到100%时,程序将不再进行模糊匹配,而只有关键字完整连续匹配时,才能匹配成功,这样做可以适应更高的匹配需求。
3 软件界面与应用
基于Python语言开发了服务器端程序,包括数据I/O模块、数据库模块、数据提取模块;基于JavaScript语言开发了浏览器端程序,包括数据I/O模块、工时计算模块、GUI交互模块,主页包括顶部导航栏、数据输入栏、表格展示区、底部装饰栏4个区域。
假设已知某服务通告的大致类别为空调-软管。在数据输入栏的查询区分别输入“空调”“软管”,点击查询即可快速获得参考工时。调节查询精准度:移动数据输入栏的滑块,重新点击查询即可,查询的结果中的“详情”可在点击后显示此记录所统计的服务通告工序数和文件下载链接。
假设当前工程需要3道工序P1、P2、P3,其中P2和P3互不影响,但必须在完成P1后才能开始,在已知每道工序的最小时长、最大时长、平均时长的条件下,计算人工工时。首先,在左侧数据输入栏的计算区输入工序数3,点击“确定”后在右侧生成工序表,填写工序表各项数据时分别在P2和P3的“紧前工序”中选择P1,点击“计算”即可得到人工工时计算结果。在填写工序表时,如果左侧数据输入栏中的逻辑检测功能处于开启状态,则会为每道工序的“紧前工序”剔除所有会造成逻辑错乱的选项,避免因误填而导致的错误。
软件内部数据来自已发布的服务通告文件,可实现文件到数据的自动转换。应用内的数据一般在后端添加和处理,为了方便数据更新,本应用还提供了从浏览器端更新数据的功能,由于上传行为受网络状况影响较大,所以建议不要以此方式更新大量数据。
在数据输入栏点击“选择文件”按钮,浏览器调用系统的文件浏览器,选择需要上传的PDF文件(按住Ctrl可多选),点击“打开”,按钮右侧会显示已选择了几个文件,点击“上传”按钮,如果没有后端正在更新数据,也没有其他客户端正在更新数据时,后端会接收文件,提取数据,添加到数据库,并更新统計数据以供查询,之后浏览器提示文件处理情况,后端的所有操作全部自动完成,不需要人为干预。如果有后端正在更新数据,或者其他客户端正在更新数据,浏览器会弹出提示,请耐心等待其他数据更新完毕。
4 结语
采用先进的Web应用技术和网络计划理论,开发了服务通告人工工时计算的软件,实现了一整套数据提取、统计、搜索的人工工时数据库系统,提供有价值的工时参考数据,解决了仅凭工程经验估计工时的人为主观影响和时间不确定性的问题。软件采用跨平台用户界面,在不同需求下都具有良好的交互体验。
参 考 文 献
[1]严焕迪,邢广华.民用飞机服务通告编制及管理分析[J].航空工程进展,2019,10(2):194-200.
[2]李宁,吴之明.网络计划技术的新发展——项目关键链管理(CCPM)[J].公路,2002(10):85-88.
[3]叶锋.Python最新Web编程框架Flask研究[J].电脑编程技巧与维护,2015(15):27-28.
[4]李广宏.vue.js前端应用技术分析[J].中国新通信,2019,21(20):115.
[5]刘志洋.ajax技术在web程序开发中的运用探讨[J].轻纺工业与技术,2020,49(2):169-170.
[6]孙纪周,朱锋,赵芳,等.基于WEB及APP的设备维修管理系统[J].软件,2020,41(1):165-169.
[7]牛作东,李捍东.基于Python与flask工具搭建可高效开发的实用型MVC框架[J].计算机应用与软件,2019,
36(7):21-25.
[8]李超,徐云龙,华中伟,等.一种基于Python Flask的Web服务器端设计[J].信息与电脑(理论版),2019(8):87-88.
[9]邓成,孙书会.MVVM设计模式的前端应用[J].电脑知识与技术,2019(29):249-250.
[10]吕英华.渐进式JavaScript框架Vue.js的全家桶应用[J].电子技术与软件工程,2019(22):39-40.
[11]刘鹏.移动Web3.0时代AJAX技术在个性化开发中的作用[J].电子技术与软件工程,2018(22):59-60.
[12]卢爱芬.基于H5中的Bootstrap框架技术的应用与研究[J].电脑知识与技术,2020,16(7):54-56.
[13](美)格林布戈.Flask Web开发:基于Python的Web应用开发实战[M].安道,译.北京:人民邮电出版社,2015.