我的第一个原创FlowPortal插件:TaskComment,给你的应用增加万能评论功能

上个月我写的第一个FlowPortal插件发布到现在,经过付费用户的使用反馈和建议,目前版本已经非常稳定,代码也比最初发行时做了优化。

这个插件也是一个尝试,看看FlowPortal这个产品的用户群的活跃程度,看看这个产品的生态系统的情况。目前的思路是可以自己寻找其用户群,并销售给需要的用户。另一个方案就是借助官方的力量,通过官方授权认证,并通过官方渠道销售。我相信这么做的话,肯定会有更多人来写FlowPortal插件、应用,同时也会有越来越多的用户购买现成的插件、应用,直接应用到自己的公司或者参考学习。这样子整个FlowPortal的产品会形成一个很好地开发者体系,从而是这个产品更加完善,更加有知名度。

从目前的反馈来看,技术人员很多都过于自信和封闭,认为别人能做到的,自己也能做到,很少有人考虑其付钱给其它技术人员,节省其时间和精力,可以集中精力做更多的业绩,这样不仅是对其它技术人员的尊重,也是对自己的尊重,对技术的尊重。

啰嗦了半天,权当自己意淫了,最后附上插件的发布地址:[URL=http://bbs.bpmsalon.com/thread-163-1-1.html]http://bbs.bpmsalon.com/thread-163-1-1.html[/URL],大家有啥意见和建议都可以到[URL=http://bbs.bpmsalon.com]八匹马BPM沙龙论坛[/URL]跟帖留言,最重要的是用购买来支持我,哈哈。

Loading

Flowportal.Net BPM最新4.5u版新亮点补充及登录界面世界地图背景分享

首先多谢过路人在前篇文章《[URL=http://www.cuiwenyuan.com/shanghai/post/Flowportal.Net-BPM-V4.5u-New-Features.html]Flowportal.Net BPM最新4.5u版新亮点[/URL]》的一个补充:前端提供了一个web应用开发框架,能够构建以流程为驱动的应用,将BPM的应用带到一个新的高度。这个功能的确是解决了一些基础数据,还有不完全依赖流程而进行的数据维护工作,常见的增加、删除、编辑、查询功能都能很方便的实现,并能在界面和功能上跟相关流程再结合起来。

昨天新版的BPM已经在上海的工厂正式上线了,而下一个任务是升级另一台总部的服务器,今天这篇文章给大家带来一个新版BPM的登录页面的背景图片,如果您所在的公司是一家全球性的公司,而这个BPM应用是一个全球应用,用BPM自带的中国地图背景就未免有点不适,喜欢偷懒的朋友,不妨拿去直接用。

另外,再次感谢一下BPM总部的技术高手马丁,周六的中午有幸见面给我和朋友深入介绍了一下BPM这个产品,也希望以后的日子,马丁能多举办一些周末的小规模技术交流聚会活动,让所有BPM的用户能相互分享、学习和进步。

Loading

Flowportal.Net BPM最新4.5u版新亮点

上周五请Flowportal公司的资深顾问给培训了一下新版的新功能及升级的细节,这两天体验了一下新版的功能,特别在此说一下我个人认为的几个亮点:

亮点1、用户前端界面使用Extjs框架,显得更加专业。人靠衣服马靠鞍,这个软件好不好,很大程度上是来自于广大最终用户的评价,而不仅是IT部门。

亮点2、取消了客户端的ActiveX控件,减少了部署成本。同样地,由于ActiveX只有IE支持,现在取消了,也就带出来第三个亮点。

亮点3、更多主流浏览器支持,以前只有IE,现在Google的Chrome,火狐的Firefox,苹果的Safari等都支持了。

等升级完毕,在实际使用一段时间后,相信还会有新的体会,再来分享给大家。

Loading

在Flowportal.Net 3.5t BPM中批量设定输入框、下拉选项的字体颜色

想了半天也想不好该给这篇文章起个什么标题,其实这篇文章的核心是说当DropDownList使用了disabled属性后,字体变为灰色,怎么办都没法修改字体颜色,除非不用DropDownList或者不要Disabled。研究这个问题的缘由是美国的一个BPM关键用户提出来当访问forms/read.aspx?tid=xxx的页面时,很多输入框和选择项都是灰色的,她说很难看清,要求字体颜色深一点。对于input和textarea,在BPM里有一个DisableBehavior属性如下图,默认是Disable,修改为Readonly就能解决。而对于DropDownList和CheckBox等Select类的选项,就没有办法解决了。

既然如此,那就按照我的思路,只要访问的页面地址包括read.aspx,那就把所有select的控件的disabled属性去掉。首先想起来的就是用Jquery,把核心代码写到 $(document).ready(function(){}中,可悲的是,调整input控件的代码执行了,但是去掉select控件属性的代码怎么都不执行。

<br/>$(document).ready(function(){<br/><br/>var pathname = window.location.pathname;<br/>if (pathname.toLowerCase().indexOf("read.aspx") >= 0 ) {<br/>$("select").removeAttr("disabled");<br/>$("select").removeAttr("readonly");<br/>$("input").removeAttr("disabled");<br/>// method 1<br/>//$("input").attr("DisableBehavior","ReadOnly");<br/>// method 2<br/>$("input").css({color:"#000"});<br/>$("textarea").css({color:"#000"});<br/>}<br/><br/>});<br/>

经过询问官方的技术大牛马丁,他说BPM本身的js是在document的Ready状态执行,可能跟Jquery的document的Ready会有先后执行的顺序问题。给出建议使用Button来调试那段去掉select控件属性的代码,如果成功的话,就放到body.onload中调用。

于是拖了一个xButton控件到页面任意地方,然后用如下代码调试,一切顺利。

<br/>$("#xbtnDarken").click(function(){<br/><br/>$("select").removeAttr("disabled");<br/>$("select").removeAttr("readonly");<br/><br/>});<br/>

于是按照马丁所给思路,我把代码写到window.onload中,如下代码,解决问题。

<br/>//window.onload = function(){<br/>// 可以使用这种方法,建议用下面的方法,当然了,还可以使用body.onload的原生和Jquery两种调用<br/>//};<br/>$(window).load(function (){<br/><br/>var pathname = window.location.pathname;<br/>if (pathname.toLowerCase().indexOf("read.aspx") >= 0 ) {<br/>$("select").removeAttr("disabled");<br/>$("select").removeAttr("readonly");<br/>$("input").removeAttr("disabled");<br/>// method 1<br/>//$("input").attr("DisableBehavior","ReadOnly");<br/>// method 2<br/>$("input").css({color:"#000"});<br/>$("textarea").css({color:"#000"});<br/>}<br/><br/>});<br/>

虽然问题解决了,但是由此引发的思考很多,为了保险起见,我同时保留了Ready的函数。详细原因强烈建议阅读以下几篇文章:

1、[URL=http://www.cnblogs.com/mackxu/archive/2012/12/02/2798207.html]jQuery.ready和onload区别[/URL]
2、[URL=http://www.songlecn.com/2009/03/423/]window.onload 和 ‘jquery.onload’的执行顺序问题[/URL]
3、[URL=http://www.google.com.hk/search?hl=zh-CN&newwindow=1&safe=strict&site=&source=hp&q=HTML+SELECT+Disable+Font+Color&btnK=Google+%E6%90%9C%E7%B4%A2]HTML SELECT Disable Font Color[/URL]

Loading

在Flowportal.Net 3.5t BPM中设置邮件内直接审批

今天再次碰到用户需要在邮件中直接确认Flowportal.Net BPM中的流程申请,很早以前弄过,居然花了好长时间才找到改怎么用。这里记录下来,以备以后不时之需。

应用场景:

1、适用于:直接发送申请内容到邮件中,看到邮件之后不用打开单独网页查看申请表单,直接通过邮件里面的审批或其它链接处理当前步骤。
2、不适用于:当前处理人需要填写或者修改申请表单的内容,这时候必须引导当前处理人打开申请表单来处理。

开启直接审批的步骤:

1、在BPM主数据库中找到BPMSysSettings表,添加一行数据:
ItemName=ClickToProcessHTTP
ItemValue=http://(本机的Ip地址和端口号/或者域名和端口号)/BPM/XMLService/ClickToProcess.aspx
2、使用流程编辑器,打开流程中相应的步骤,找到“通知(英文版为Notify)”项,在可定制的邮件内容中加入相应的表单信息,然后在合适的位置添加一行代码:<%=Context.Current.CreateProcessLinks()%>

Loading

Flowportal.Net 3.5t BPM系统报表导出限制的解决办法

今天用户说要导出Flowportal.Net 3.5t BPM系统中的某个流程的记录做分析,但是不管怎么选择,最多只能导出1000行数据。我记得好像原来询问过供应商这个问题,倒是我忘记修改了。

解决方法如下:

1、找到安装目录下Website\Reports的DefaultView.aspx文件
2、查找1000,找到第50行(代码如下),修改这行的相关1000字样为你想要设定的值,我设定了10000
备注:如果你想增加那个最大行数的限制,只需修改MaximumValue为较大的值,如99999999

<br/><td style="text-align:right;"><asp:Label ID="_labExpStartRow" runat="server" Text="开始行"></asp:Label><asp:TextBox ID="_edtExpStartRow" CssClass="SchBox" runat="server" Width="30px">1</asp:TextBox><asp:RangeValidator ID="RangeValidator1" runat="server" ErrorMessage="*" ControlToValidate="_edtExpStartRow" Display="Dynamic" MaximumValue="99999999" MinimumValue="1" Type="Integer" ValidationGroup="Export"></asp:RangeValidator><asp:Label ID="_labExpRows" runat="server" Text="行数"></asp:Label><asp:TextBox ID="_edtExpRows" CssClass="SchBox" runat="server" Width="30px">1000</asp:TextBox><asp:RangeValidator ID="RangeValidator2" runat="server" ErrorMessage="1~1000" ControlToValidate="_edtExpRows" Display="Dynamic" MaximumValue="1000" MinimumValue="1" Type="Integer" ValidationGroup="Export"></asp:RangeValidator><asp:Button ID="_Export"  CssClass="SchBtn" runat="server" OnClick="_Export_Click" Text="Export" ValidationGroup="Export" /></td><br/>

Loading

Flowportal.Net BPM中2个有用的函数:setvaluefunc和getvaluefunc

特别感谢Flowportal.Net公司及时快速的技术支持,在Flowportal.Net公司的马丁帮助下,终于搞定了一个在多行表单中动态显示图片的开发,在此整理下来分享给遇到此问题的朋友们。

先上一张图告诉大家要做的是什么事情。

通过上图大家应该能看出来,在这个例子中,用户可以添加多个要申请的文具,每个文具一行。在这里用户希望能够在选择文具后能把相应的图片显示在同一行。经过查看Flowportal.Net的XForm控件,并没有img类型的控件,我们可以拖入一个静态的img或者Asp.Net控件到Form上,转到源码编辑模式,手动对控件添加xdatabind、setvaluefunc、getvaluefunc的属性,同时要写出2个自定义的javascript函数。

还是说重点吧:第一xdatabind绑定到数据库的repeat line table;第二setvaluefunc是XForm控件在绑定的时候必须调用的函数,我们这里的用法是重载它;第三getvaluefunc是在赋值绑定以后在提交保存的时候获取正确的值并存到数据库,我第一次的时候没用这个函数,所有的值存到数据库都是null,造成第2个步骤的人打开表单后看不到图片。

<br/><img src="http://bpm.waiglobal.com.cn/WAI/Stationery/white.jpg" width="90" height="90" xdatabind="WAIWorkflow:FormOfficeSuppliesLine.ItemCode" setvaluefunc="MyFunc" getvaluefunc="MyFunc1" /><br/>

<br/><script type="text/javascript"><br/><br/>function MyFunc(el,value)<br/>{<br/><br/>var a = 'http://bpm.waiglobal.com.cn/WAI/Stationery/white.jpg';<br/>if (value != '')<br/>{<br/>a = 'http://bpm.waiglobal.com.cn/WAI/Stationery/'+value+'.jpg';<br/>}<br/>//alert(a);<br/><br/>el.setAttribute("src",a);<br/>el.setAttribute("itemcode",value);<br/><br/>}<br/><br/>function MyFunc1(el)<br/>{<br/>return el.getAttribute("itemcode");<br/>}<br/><br/></script><br/>

Loading

Flowportal.Net BPM中如何重发邮件

用户说没收到审批通过的邮件,经过查实那天的邮件发送因为SMTP的问题都发送失败了,经过咨询Flowportal.Net BPM的技术人员,原来每条邮件提醒都存储在数据库中,并且分处存放,所以通过直接操作数据库就很容易地实现了邮件的重新发送。

涉及到的表:
BPMSysMessagesQueue 邮件发送队列
BPMSysMessagesFailed 邮件发送失败记录
BPMSysMessagesSucceed 邮件发送成功记录

用到的SQL语句

<br/>INSERT INTO BPMSysMessagesQueue (ProviderName,Address,Title,Message,CreateAt,FailCount)<br/>SELECT ProviderName,Address,Title,Message,CreateAt,0 FROM BPMSysMessagesFailed WHERE CreateAt >='2012-07-25'<br/>

Loading

分享一段在Flowportal.Net BPM中永久删除申请的sql语句

上次分享过《[URL=http://www.cuiwenyuan.com/shanghai/post/how-to-change-the-process-name-in-flowportal.net-bpm.html]一段在Flowportal.Net BPM中修改流程名称的sql语句[/URL]》,今天再来一段从数据库中永久删除某一指定申请的SQL,这里特指已经在BPM界面上删除过的申请。

第一个Select语句是从已经在BPM界面删除的某一流程的TaskID,然后逐一删除,当然了,你可以写一个In语句把所有的TaskID都传递进去。

<br/><br/>SELECT * <br/>FROM [dbo].[BPMInstTasks]<br/>WHERE ProcessName='ICN'<br/>AND State='Deleted'<br/><br/>declare @TaskID INT <br/>SET @TaskID=12361<br/><br/>--SELECT StepID FROM [dbo].[BPMInstProcSteps] WHERE TaskID = @TaskID<br/><br/>--Snapshot<br/>DELETE FROM [dbo].[BPMSysSnapshot] WHERE TaskID = @TaskID<br/>--Security<br/>DELETE FROM [dbo].[BPMSecurityTACL] WHERE TaskID = @TaskID<br/>--TaskStepLinks<br/>DELETE FROM [dbo].[BPMInstTaskStepLinks] WHERE TaskID = @TaskID<br/>--Tasks<br/>DELETE FROM [dbo].[BPMInstTasks] WHERE TaskID = @TaskID<br/>--Share Tasks<br/>DELETE FROM [dbo].[BPMInstShare] WHERE StepID IN (SELECT StepID FROM [dbo].[BPMInstProcSteps] WHERE TaskID = @TaskID)<br/>--Task Steps<br/>DELETE FROM [dbo].[BPMInstProcSteps] WHERE TaskID = @TaskID<br/>--Routing<br/>DELETE FROM [dbo].[BPMInstRouting] WHERE TaskID = @TaskID<br/>--Links in Email<br/>DELETE FROM [dbo].[BPMInstClickToProcessQuery] WHERE TaskID = @TaskID<br/>

这也还是同样的建议给厂商,一定要做一个永久删除的功能,从数据库中删除掉。

Loading

分享一段在Flowportal.Net BPM中修改流程名称的sql语句

在实际使用Flowportal.Net的BPM过程中,做好了一个BPM流程,难免会修改流程名称的时候,今天整理了一段sql语句,分享给大家。

通过遍历BPM的系统表,共有4个表包含ProcessName字段,使用以下语句的时候只需要修改@OldProcessName和@NewProcessName。

<br/>declare @OldProcessName nvarchar(50) <br/>declare @NewProcessName nvarchar(50) <br/>SET @OldProcessName='ICNR'<br/>SET @NewProcessName='ICN'<br/><br/>--Tasks<br/>UPDATE [BPMDB].[dbo].[BPMInstTasks]<br/>SET ProcessName=@NewProcessName<br/>WHERE ProcessName=@OldProcessName<br/><br/>--Drafts<br/>UPDATE [BPMDB].[dbo].[BPMInstDrafts]<br/>SET ProcessName=@NewProcessName<br/>WHERE ProcessName=@OldProcessName<br/>--Steps<br/>UPDATE [BPMDB].[dbo].[BPMInstProcSteps]<br/>SET ProcessName=@NewProcessName<br/>WHERE ProcessName=@OldProcessName<br/><br/>--Rule<br/>UPDATE [BPMDB].[dbo].[BPMSysTaskRuleProcess]<br/>SET ProcessName=@NewProcessName<br/>WHERE ProcessName=@OldProcessName<br/>

不过,针对这个问题,我倒是希望给厂商一个建议,新建一个表放置流程的编号ProcessId和流程的名称ProcessName,当然了流程的编号是唯一的,然后流程名称随便可以修改,而相关的4个表中的ProcessName修改为ProcessId即可。

Loading