现在的位置: 首页 > 综合 > 正文

实际工作中遇到的技术难题与大家交流(工作流条件表达式计算部分),希望技术高手能给于指点

2013年04月22日 ⁄ 综合 ⁄ 共 6841字 ⁄ 字号 评论关闭
文章目录

有一个审核的工作流程,默认情况下是 【杭州编辑审核】--》 【北京编辑审核】--》 【信息发布员审核】--》 【信息发布】

这个是一个典型的工作审核流程,我们可以简单的建立3个角色,来定义这个审核流程,也很容易可以达到目的,但是问题没这么简单了。

 

1:若是杭州编辑发布的,需要走 【杭州编辑审核】--》 【北京编辑审核】--》 【信息发布员审核】--》 【信息发布】 流程。

2:若是北京编辑发布的,需要走 【北京编辑审核】--》 【信息发布员审核】 --》 【信息发布】流程。

 

这下问题变得有些复杂了,还需要自动判断当前编辑人员是属于哪个组织的?说白了,就是需要有一个条件表达式。

 

// 例如程序想达到的运行效果如下,这个是审核流程的入口判断 

if (this.userinfo.company == "杭州")

{

     杭州的审核流程

}

if (this.userinfo.company == "北京")

{

     北京的审核流程

}

 

例如现在设置了一个条件表达式 “UserInfo.Company == "杭州"” 那问题是,如何动态的让程序判断是否满足了这个条件?

我如何写程序才能道道

if (UserInfo.Company == "杭州")

{

     杭州的审核流程

}

 

红色部分是可以自由定义的,我如何能做到,与我写固定的程序一样的效果?这个表达式是否能成立,用C#如何做才是最灵活的?客户可以自由定义的?

如何能让程序动态执行?红色部分又可以自由定义?请高手指点

 

例如红色这个表达式可以由用户自由定义的功能 

 UserInfo.Company == "杭州" && UserInfo.Age < 40

 UserInfo.Company == "北京"

 UserInfo.Age > 40 || UserInfo.Age < 30

 

工作流开始 --》 UserInfo.Company == "杭州"?--》 【杭州编辑审核】-》 【北京编辑审核】-》 【信息发布员审核】 -》 【信息发布】

                                 ||                                                                                               ^

                                 ||                                                                                               ||

                                 V                                                                                               ||

                                 ==============================================

 

当然在程序里进行了硬编码,那是很容易的事情,但是红色部分想用户自己可以灵活定义,就难了,不知道如何做会更好?更灵活?

虚心向大家学习,当然红色部分的表达式可能更复杂,不是只是一个 == 条件的。

 

 

若有满意的例子程序可以提供的,愿意支付 500元辛苦费。

 

程序的要求:

1:能验证表达式是否成立,语法是否正确?出错了可以提示。
2:能正确保存表达式,显示表达式。
3:能正确解析表达式。

4: 不需要整个流程的定义,流程的实现,只需要条件表达式这部分的示意程序就可以了。

5: 只要C#语言的代码,其他语言的不要。

 

往往想得太高了,实际能力没那么强的,呵呵
先简单一点儿能实现,就很不错了

例如 天数 > 3 很容易就可以修改为
天数 > 3 && 天数 < 5

 

 

主要目的,不是为了绕过难题解决问题,而是就是解决这个问题,不需要变通的解决方法。

 

 http://www.cnblogs.com/zeus/archive/2006/02/11/codedom.html

 

 

将权限管理、工作流管理做到我能力的极致,一个人只能做好那么很少的几件事情。

posted on 2010-09-06 23:03 吉日嘎拉 不仅权通用权限 阅读(717) 评论(29) 编辑 收藏

评论

#1楼  回复 引用 查看    如果是.net平台可以关注一下workflow,符合你的要求。

2010-09-06 23:17 | Ink@Snow      

#2楼[楼主]  回复 引用 查看   

@Ink@Snow

workflow 里没有这个功能,没有客户自由定义的,
是需要在开发环境里写死才可以,在没有VS2008等开发环境时,就闹心了。

#3楼[楼主]  回复 引用 查看   

UserInfo.Company == "杭州"
你的意思是,除了Company,还可能是其它的条件?

嗯 希望是 and or 一大堆可以自由设置表达式的那种

#4楼  回复 引用 查看   

@吉日嘎拉 不仅权限管理

Activity可以复用,你可以通过替换Activity来复用工作流,或者用Expression Tree即表达式树来实现你所说的“不是只是一个 == 条件的”,不过我更推荐前者。

2010-09-06 23:22 | Ink@Snow      

#5楼[楼主]  回复 引用 查看   

@Ink@Snow

主要是还是想靠 普通的C#程序实现, 不是通过微软的WF。

#6楼  回复 引用 查看   

关于你这个问题,解决方法挺简单的。你在数据库中定义一个标准流程表,【杭州编辑审核】-》 【北京编辑审核】-》 【信息发布员审核】 -》 【信息发布】四个流程的定义;再定义一个用户流程表,如包括杭州发贴,北京发贴;定义一个用户流程子表,如杭州发贴流程就包括【杭州编辑审核】-》 【北京编辑审核】-》 【信息发布员审核】三个子记录;再为杭州编辑设定有杭州编辑审核的权限,北京编辑有北京编辑审核的权限;再建一个地区和流程的关联表。

用户发贴的时候,判断用户的所属的地区,根所用户的地区从地区和流程的关联表中找到关联的流程,将该贴子的下一步流程设为该关联的流程,如杭州编辑审核。杭州编辑登录系统后,根据权限就会看到该流程中的贴子,审核后转入下一流程。同理,北京用户发贴后,根据地区和流程的关联表找到关联程序,将该巾子的下一步流程设为北京编辑审核,北京编辑登录系统后,根据权限就可以看到要它审核的贴子,而杭州编辑登录后,则看不到。

2010-09-06 23:27 | 海上清风      

#7楼[楼主]  回复 引用 查看   

@海上清风

我的意思,不是硬编码,硬编码太简单了,我是需要灵活的 条件设置功能

#8楼  回复 引用 查看   

@吉日嘎拉 不仅权限管理
WF推出的目的就是解决您遇到的这类问题,或者另一类有限状态机模型,个人认为能用最合适的技术去实现需求是非常重要的。
如果您不想使用WF,针对您的需求,我想可以有如下设计。

设计接口IVerify,表示所有验证过程。对于每一个验证类型,做一个实现类。你可以实现一个抽象类LocalAreaVerify,实现IVerify,表示限定在某一区域审核,其内部逻辑就是==逻辑。

或者使用策略模式,设计接口IVerifyCondition,设计类VerifyEntity,其构造函数接受IVerifyCondition表示判断验证条件,Action<T...>表示验证通过执行的动作。

您觉得如何?

2010-09-06 23:32 | Ink@Snow      

#9楼[楼主]  回复 引用 查看   

@海上清风
怕你看不清楚,我又补上了几个条件表达式,目的是让可以能自由定义条件表达式。

1:能验证表达式是否成立,语法是否正确?出错了可以提示。
2:能正确保存表达式,显示表达式。
3:能正确解析表达式。

#10楼  回复 引用 查看   

学习中,盼高见!

2010-09-06 23:33 | ffffff      

#11楼[楼主]  回复 引用 查看   

@Ink@Snow
你这个回复比较贴切,就想要一个比较完美一点儿的代码例子。

#12楼[楼主]  回复 引用 查看   

NETET之门槛 23:30:26
这个条件,在流程中是常用的
我们的流程,现在有前驱/后劲
后驱
实际上就是这个意思
前驱:满足什么条件下跳到某个地方
后驱:满足什么条件时可以往下跳
如果你的条件,是固定的,比如:仅是判断人员所在的地区,那这上事情好办
也可以给用户设置
但如果必须给用户设置的条件不仅是一个地区,比如他可以设置人员是北京的,还可以设置是男性的话,还可以设置如果是女性,但是科长,像这种情况,就无法给用户设置
只能通过程序员来写程序,或者是通过存储过程/或者是通过实现某个方法再通过反射调用
我们的流程里面,为响应前驱事件和后驱事件,以前是使用存储过程,在前驱/后驱条件表里面,添加一个条件语句,这个语句即存储过程名,然后在节点运行到这里的时候,判断是否存在条件语句,如果有则执行
现在,修改为存储一个方法名,如果有,则通过反射的形式执行该方法
Ψ吉日嘎拉 23:36:24
嗯,通过反射的形式执行该方法,我觉得很可行

#13楼  回复 引用 查看   

@吉日嘎拉 不仅权限管理

如果真的有需要“用户自定审计条件”的需求,那么应当考虑到用户并不懂得程序语言,甚至只会点点鼠标的情况,那么您应该使用Expression Tree来创建条件,我之前做过这样的需求,不过是对一些数据进行复杂表达式查询的。Expression Tree的相关文章网上有很多,LZ可以自行查阅。

最终的解决方案可能回事Expression Tree作为执行条件,Serialize作为保存方式将条件保存以便于下一次启动时继续。

最后我还是再次推荐WF,您可以将Expression Tree和WF结合,WF本身提供持久化功能,甚至可以在审计中间的某个阶段持久化,也就是说,可能轮到北京的某人审计,但是该人不在办公室,几天之后才回来,那么可以把这个流持久化到数据库中,直到他回来继续执行。

2010-09-06 23:39 | Ink@Snow      

#14楼[楼主]  回复 引用 查看   

@Ink@Snow

我最想要的是结果,就能解决上面的问题,表达式也友善,就愿意支付辛苦费,我自己没精力折腾哦,实在是没精力。

#15楼  回复 引用 查看   

实现UserInfo.Company == "杭州" || UserInfo.Role== "admin"这种条件自定义,一种简单的方法:首先要分析左边表示式的数据来源,如果只是活动的一些简单属性,你可以通过反射把公共属性列出来,然后把“"杭州"作为输入参数 [role],或常量"杭州",提供给用户自由组合定义。UserInfo.Company == "杭州" || UserInfo.Role== [role]对于这种,先拆成简单的条件表达式,你同样可以通过反射取到对射的值,然后比较。简单的可以自己这样处理,也借用http://www.codeplex.com/Flee

2010-09-06 23:51 | trenhui      

#16楼  回复 引用 查看   

一不小心跑到此地,抬头一看,原来是吉日大神的地盘!

2010-09-06 23:58 | 玛瑙河      

#17楼[楼主]  回复 引用 查看   

@trenhui

http://www.codeplex.com/Flee

5: 只要C#语言的代码,其他语言的不要

#18楼[楼主]  回复 引用 查看   

热烈欢迎

引用

玛瑙河:一不小心跑到此地,抬头一看,原来是吉日大神的地盘!

#19楼  回复 引用 查看   

就是简单的状态机,楼主的建模都是错的,
哦,看到了那段红字,我只能说,绕路的恰恰是楼主自己,
按照楼主的思路,业务规则稍微灵活点,开发工作会变得异常复杂

2010-09-07 05:59 | 缪军      

#20楼[楼主]  回复 引用 查看   

@缪军
意思是用微软的工作流?

#21楼  回复 引用 查看   

??状态机跟微软有什么关系?
我是说楼主描述的情况属于状态机这种类型
定义N种状态,
定义节点:一个处理节点=任意抽取2个不同的状态的组合,
流程是这些节点的组合排列,
用户的实际操作自然而然会形成各种各样的流程,

2010-09-07 08:44 | 缪军      

#22楼  回复 引用 查看   

PowerShell

2010-09-07 08:51 | 阿水      

#23楼  回复 引用 查看   

要想设置自由,得有自己解译此类似条件的功能,得有自己的流程标准走法,得有自己灵活设置此条件的功能,相应的权限设置吧。这些齐了,一个小型的工作流程管理系统就出来了。

2010-09-07 08:53 | 心悦      

#24楼  回复 引用 查看   

呵呵,这年头名词都被弓虽女干了
一说到状态机,就以为是VS的WF,
一说到MVC,就以为是ASP.NetMVC
一说到设计模式,就以为是GoF说的Design Patterns设计模式
一说到重构,就以为是马丁.福勒的Refactoring

我想,现在人看书可能连虎头蛇尾都不如,干脆斩头去尾了,
难怪程序员都成了民工了,工资还不如洗碗的高,
鱼字去头去尾,种田的命

2010-09-07 08:54 | 缪军      

#25楼[楼主]  回复 引用 查看   

王彦锋 2010/9/7 8:37:38

这个我以前只搞过java版的。这个红色部分是工作流规则定义,你可以用脚本语言在工作流定义部分里面定义。
UserInfo.Company 这些作为工作流运行的上下文环境的一部分。在工作流执行的时候赋值。
就像这样, 在工作流定义里用脚本修表达式:
if( :userCompany=="杭州") ....

在执行工作流的时候设置 :userCompany的值。
如setContext("userCompany","北京").

Java里有个IkExpression 是做工作流定义表达式引擎的,C#应该也有。

这个表达式解析部分要是你自己写得话,相当于写个小型的语言编译器。其实就是在C#里面执行自定义脚本。

Ψ吉日嘎拉 9:32:35
Java 还这么强啊

#26楼  回复 引用 查看   

楼主其实需要一个迷你C#编译器。
LINQPad的功能和楼主的需求很像。

2010-09-07 15:40 | zzfff      

#27楼  回复 引用 查看   

工作流离不开组织架构。工作流程当中包含的逻辑一种是业务逻辑,这种一般需要编码实现;另一种就是跟组织架构层次相关的逻辑,这种逻辑处理可以通过组织架构树形层次关系来处理。像楼主的问题通过组织架构就能很好的处理(流程第二步取发起人所在城市编辑审核,第三步取北京编辑审核【这里选不允许重复审批】,当第二步发起人所在城市编辑审核所取到的审批人也是北京编辑的时候,则到第三步的时候判断一下当前取到的审批人前面是否有审批过,有则跳过当前环节)。
发起流程
|
发起人所在城市编辑审核
|
北京编辑审核[不允许重复审批]
|
信息发布员审核
|
信息发布

2010-09-08 09:27 | ee11      

#28楼  回复 引用 查看   

个人认为 把流程的Code 记录到 用户的信息里
比如 ,【杭州编辑审核】为001 【北京编辑审核】为002
那么杭州的编辑人员发布信息的初始流程Code 为001
那么北京的编辑人员发布信息的初始流程Code 为002

你还可以把流程做成方案 .那么个人的信息在加上方案.
就可以满足不同用户走不同的审核流程.

甚至可以把code 放到组 在把用户和组关联.

个人愚见.反正以前我的审核流程是这样做的.呵呵,希望高手指点下.少给点打击

2010-09-09 13:17 | 程序之菜鸟      

#29楼  回复 引用 查看   

楼主看看这篇文章:
http://www.cnblogs.com/briankfc/archive/2010/08/31/1813846.html

抱歉!评论已关闭.