1993-2017金蝶国际软件集团有限公司金蝶云星空开发项目案例分享部门:总部交付支持部时间:2019.6.112目录分享项目场景方案设计需求分析具体实现分享项目场景-培训管理系统场景培训管理系统–能对年度顾问培训情况、认证情况进行查询和管理–能对通过顾问认证的批量生成电子证书–能批量打印纸质证书–能对顾问证书能批量发邮件–能对顾问证书进行在线查询、下载电子证书–能对培训人员根据报名表快速导入系统,并保证员工顾问重复性检查,证书编号重复检查–证书模板需要能随时调整,证书如果出现信息错误时支持重新生成证书–证书内容中包含内容有人名及人名的拼音,拼音能动态翻译.需求分析-1思考1:该培训管理系统放到哪里合适呢?目前已有系统:项目监控系统、社区、协同平台综合考虑:为了以后更好的和金蝶云星空的顾问结合起来,并可以对顾问的培训情况进行一体化管理,因此决定在项目监控系统里加一模块:培训管理系统思考2:该项目与已有系统怎么建立关系呢?1.由于培训是针对顾问的培训,所以顾问每参加一次培训,该顾问都可以看到自己的培训和认证记录,因此允许在顾问下添加培训和认证记录,需要在金蝶云顾问下增加培训认证情况维护和查看,同时可以查看和生成证书,添加培训记录时可以选到对应的培训项目,顾问和培训项目产生关联.2.针对一批培训的顾问,能在培训项目下查看和维护参加培训的人员的,因此在这里培训项目和顾问建立关联3.证书发放后要能查看自己的证书,目前监控系统里有licence限制,必须有这个用户和权限才能查看,但实际上对用户来说只要给个查询地址,输入姓名和身份证号码则应该允许能查看,因此这个不能放到原监控系统,并且现在对用户入口来说主要是金蝶云社区,因此查询入口最好是在社区,监控系统提供接口思考3:证书包含哪些内容?要怎么批量生成电子证书?用什么技术来实现呢?1.电子证书要跟纸质证书一样,每个证书的信息动态信息包括含有人名、人名的拼音、培训项目名称、培训内容、培训级别、证书编号、认证人身份证、证书有效期区间,证书模板需要能随时调整,证书如果出现信息错误时支持重新生成证书,静态信息包括:管理层签名、金蝶云星空产品认证、金蝶认证及认证证书的图案。2.要想一些静态信息比如静态信息包括:管理层签名、金蝶云星空产品认证、金蝶认证及认证证书的图案变为随时也可以调整,最好这部分内容作为底图并且可以配置,对于别的地方证书的格式和内容,包括字段的样式和字段的调整都可以进行配置,目前想利用金蝶云星空BOS平台来实现,想到套打这个功能3.要想批量来生成证书,针对同一批认证的人来说,培训信息都是一样,因此在培训项目下,针对此批参加培训的人进行批量生成证书比较合适,在单据体中进行批量证书生成功能,标准功能是不支持的,只能在单据体循环所有的培训认证通过人员,通过插件来实现生成证书需求分析-2思考4:如何实现批量打印呢?1.认证通过的人只是需要部分进行纸质打印,所以需在培训认证表里加个标记是否打印2.必须有个批量打印清单,列出标记为打印的批量打印清单3.批量打印前需要预览,由于可能批量打印的资料比较多,预览会存在性能问题,需要考虑做成分页进行批量打印4.打印的模板要能支持随时可以调整.4.目前这种批量打印标准套打无法支持,只能写插件来实现思考5:如何实现批量发邮件?1.证书生成后需通知通过人员,并将证书作为附件一起发送2.发邮件必须有邮件记录,没发成功的还可以支持继续继续发送3.证书邮件里需包含证书查询地址,批量发送邮件需要写插件来实现思考6:如何能培训表里的资料能方便准确地导入到培训项目下呢?1.如果利用目前BOS平台标准导入工具很不方便,由于涉及到的基础资料表多,各基础资料需要先导入关联ID,然后再整合到一个表进行导入,非常麻烦还容易出错2.培训报名表本身填写也不规范,无法直接根据报名表进行导入,导入时需要校验员工是否存在,如果存在,不需要重新生成金蝶云顾问信息,只需添加培训记录信息3.为了方便导入报名信息到对应的培训项目下,模拟真实的手动操作,写一个导入工具来执行思考7:证书如何同步到社区,如何实现查询?1.在培训证书系统里专门做个单据用来存放证书,既可以供证书系统查看已生成证书,也可以方便对外接口,服务社区这边单独做个功能供查询证书,每天从培训系统里通过一个服务批量同步到社区这边方案设计培训项目培训顾问待发证书已发证书待发邮件已发邮件打印清单人员导入金蝶云顾问证书预览批量生成单个生成生成并发邮件导出证书群发证书邮件批量打印证书预览证书生成发邮件导出文件已参加培训电子证书社区电子证书查询通过接口培训系统设计结构图功能设计说明•培训证书以培训项目为基础,在主控台中增加基础资料“培训项目”•在项目培训项目增加页签“培训顾问”、“待发证书清单”、“已发证书清单”、“待发邮件清单”、“已发邮件记录”、“打印清单”、“人员导入”•“培训顾问”功能中可以增加和删除培训顾问,在该培训项目下通过“人员导入”后,培训顾问将显示“培训顾问”列表中,导入时如果含有证书编号等信息时,则在“待发证书清单”中也会显示出来•“待发电子证书清单”中显示未发电子证书的人员,里面有“证书预览”、“批量生成证书”、“单个证书生成”、“生成并发邮件”,“导出证书”功能•“待发邮件清单”里面显示还未发邮件的人员列表,点击群发邮件则可以批量发送带电子证书邮件•“打印清单”中显示需要打印证书的清单,点击批量打印时可以先预留,然后进行打印,打印清单的套打模板跟生成证书的套打模板不一样,一个带底图,一个不带底图•“导入人员”功能需要根据报名表的信息进行拆分,模拟人员操作进行自动执行,当顾问不存在时新增顾问信息,添加顾问时读取各基础资料对应的ID,比如所属公司、顾问类型、性别、区域、培训项目ID、认证级别、成绩等级等,当所属公司不存在,可以在基础资料组织机构里自动添加一个公司,并返回ID,存入员工关联表•在“金蝶云顾问”有增加培训记录功能,可以添加培训记录,也可以生成证书,并发邮件功能•提供WEBAPI接口给社区,社区这边抓取已经生成的电子证书,在社区可以查询证书,并可以下载证书.具体实现-批量证书生成设计和实现思路•在培训项目新增页签“待办证书清单”,并新增单据体,“待发电子证书清单”表类型选择“视图”,视图取数方式为:培训项目表和电子证书单据做关联的一个视图,取未生成证书的人员显示.•由于批量处理生成证书,由于需要较长时间,所以需要进度条,防止服务端处理时间太久客户端不响应会造成异常•循环读取“待发电子证书清单”记录,对每条记录首先生成PDF,每条记录都会去执行方法OnPrepareNotePrintData(BOS.Core.DynamicForm.PlugIn.Args.PreparePrintDataEventArgse),根据当前记录的证书ID,在e.DataObjects里找,找到后对对应的数据重新赋值,比如将人名翻译为拼音,调用转换为拼音的插件,这条记录的所有值赋值然后返回.批量证书生成-关键实现代码分享1获取模板ID批量证书生成-关键实现代码分享2套打模板中的数据过滤和数据更新实现生成PDF实现代码实现说明:•由于每个顾问的证书生成时都需要执行方法OnPrepareNotePrintData,因此循环执行生成PDF前,需要在OnPrepareNotePrintData方法中的e.DataObjects[0]中找到证书ID为当前生成证书ID的记录,然后赋值,找到后返回,•人名转换为拼音调第三方的开源插件,完成转换,并赋值给套打模板中用不到的别的字段代替,再套打模板设计时需选这个字段,并放到套打模板中•生成证书时调用平台生成PDF文件的方法,文件名为了不重复,同时便于查看,名称取名为“金蝶云产品认证-“+证书获得人的名字+身份证+证书ID•生成的证书存放于“CERTFILE”下,每次证书生成后则存放于该目录•具体关键代码实现请参照截图批量发邮件-具体实现群发邮件界面邮件服务器配置入库(administrator账户)群发邮件界面邮件服务器配置界面个人账户配置界面批量发邮件-关键实现代码分享代码实现说明1.获取当前用户的邮箱地址方法Listsendlist=newList();sendlist.Add(newSelectorItemInfo("FEMAIL"));2.判断当前服务器地址是否有配置好的方法OQLFilterofilter=newOQLFilter();ofilter.Add(newOQLFilterHeadEntityItem{FilterString=string.Format("FUSERID={0}",userid)});DynamicObject[]obj=businessDataService.Load(ctx,"BAS_MAILACCOUNTSETTING",list,ofilter);3.发送邮件的方法MailUtils.Sendmail(senderMailAddress,null,listTo,title,message,SMTPHost,port,isSSL,dictStream,userName,pwd);批量打印-具体实现设计和实现思路•在培训项目新增页签“批量打印清单”,并新增单据体,“批量打印清单”表类型选择“视图”,视图取数方式为:取培训认证表里是否打印的状态为是的所有顾问.•打印程序在执行时需要执行方法OnPrepareNotePrintData,在这个方法里同样需要对套打模板中的数据进行赋值,跟批量生成证书里实现方式差不多,所来以在这个方法里用类别type=3来区别为批量打印.•由于批量打印的数据可能很大,预览会对性能造成影响,则采取分页的方式,每次批量打印•获取套打模板,首先获取套打模板信息中得到模板ID•获取FORMID,通过this.View.BillBusinessInfo.GetForm().Id;获得•将所有需要打印的项放到Session里•打印时放到JSONObject对象里输出,对象中包括pageID,printJobId,action批量打印-关键代码分享导入工具-具体实现设计和实现思路•导入数据可能较多,需要考虑使用“进度条”,由于导入数据是可以计算的,所以进度条采取真实进度条.•加一个文件上传控件,读取上传文件excel的内容,对模板的字段判定,如果上传文件的字段非模板中字段,则提示非标准模板,不能执行导入,导入前需检查员工重复,重复检查以“人名”+“手机号码”进行验证.•循环读取excel里的每笔记录,如果该顾问已存在,则只需增加一笔培训记录,如果是在系统中不存在,则添加一笔新的顾问资料,对于“所属公司”如果在系统中已存在则取出对应的所属公司组织Number(基础资料绑定是number而不是ID),如果不存在,则根据报名表模板里的公司所属区域、组织类别,自动生成对应的组织,并返回组织Number,•在添加时利用目前系统保存数据的方式进行保存,保存时同时调用数据提交和审核方法,使数据保存后处于已审核状态.关键代码分享-文件引入和数据读取代码1.上传文件时需重新方法CustomEvents,在个方法里处理上传结束时保存上传结果,并对引入控件进行控制,如果未加入文件成功,则不允许点引入控件,则不会去执行引入动作2.利用DataSetds=helper.ReadFromFile(_filePath,1,0)将读取的数据放入到DataSet集合里.3.利用hasData=ds.Tables.Cast().Any(p=>p.Rows.Count>0)判定是否有数据关键代码分享-模拟界面数据保存方式代码分享创建视图方法更新属性值方法保存所属组织和保存员工信息方法真实进度条-具体实现设计和实现思路1.用平台方法显示平台自带进度条2.新加一个进程来处理进度条显示3.进度条处理时需考虑方法中执行时的异常处理,如果出现异常时需关闭进度条4.在执行方法中根据循环体执行的情况更新进度条中的Session[“ProcessRateValue”]的值5.对于方法中执行时在校验到不符合条件的数据退出方法执行时需将Session[“ProcessRateValue”]=100进度条线程建立、执行、异常处理和结果处理进度条进度更新校验异常数据返回时进度条处理1993-2017金蝶国际软件集团有限公司Thankyou!