近几日淘宝店引发的感想

有想法就要有行动

细心的朋友应该能看到我博客右上角的淘宝店链接,没错开了很久了,还付了1000块保证金。DTcms带来了的订单和客户最多,现在旺财系列的代码生成器是主力。其实本没想通过这个弄个皇冠店啥得,只不过觉得好玩,什么都想玩一玩,尝试一下,不做空想家。

没耐心的人不少

不少人旺旺留言,咨询问题,我觉得写得够详细了,并且在宝贝描述里写了我的手机、微信、QQ等,还特别说明旺旺不常看。可惜还是有那么多人,不仔细看,对我来说这个损失很小,但真正需要的人,那就是大损失了。我有时候觉得自己很没耐心,可是发现网上比我还没耐心的人更多。

沟通态度特别重要

昨天有个兄弟很晚了,通过旺旺留言、加我QQ留言,还给我发短信,还加我微信,就想要以前asp写得团队任务管理系统,看到我图片有个优惠价10元,希望来一套学习研究。本来我拒绝了,因为曾经10元卖过一套,后来退款了,被买的人骚扰烦死了,写得很清楚技术支持需要2份,钱就付了10元,就想要本来200的服务,怎么也得付110吧,买家不自觉,我直接退款了,源码白送了,远离垃圾。后来这位朋友的沟通,让我觉得懂得彼此尊重,一高兴就从100块直接改为10块钱了。虽然钱少了,但开心。难道我真的很需要这100快吗,没有也可以,而因此换来开心,换来在对待技术、对待交易有相同理念的朋友,收获更丰盛。

同样一个反例,是关于以前写过的Flowportal的手写签名插件,此人前几天就联系我,后来问了问题不会,忽然又联系我,总是问问题,拒绝回答我的提问,上来直接被我拒绝了。但对方不折不挠,反复问要看演示,又是说要外包开发,我道出1万起的标准,对方还不停追问,被我言辞激烈的拒绝了。沟通最起码有个前提,及时响应,谈得话题大家都清楚,自己不懂技术,上来就问一些无关紧要,还不介绍自己的情况,浪费时间,浪费生命。

发一下截图,大家自己看吧。

FlowPortal.Net BPM的类库之Context上下文:Current

近期做了个FlowPortal的技术交流,有个关于流程自动生成的自定义流水号要保存到业务表的问题,当时没准备这块涉及如此底层类库的信息,不得不在这里补充一下。

先说一下我常用到的:

  1. Context.Current.Task.SerialNum – 当前流程任务的流水号

  2. Context.Current.ClientIP – 当前登录用户的IP地址

  3. Context.Current.FromDataSet.Tables["tableName.FieldName"]  – 当前流程任务表tableName的字段FieldName值

  4. Context.Current.Task.Owner.UserInfo – 当前任务拥有者用户

  5. Context.Current.Task.Owner.UserInfo.Account – 当前任务拥有者的帐号

  6. Context.Current.AgentUser.Account – 当前代理人帐号

  7. Context.Current.Task.Agent.Account – 当前任务代理人帐号

  8. Context.Current.Task.Applicant.Account – 当前任务申请人帐号

  9. Context.Current.Task.Owner.UserInfo.ConstCenter – 当前任务拥有者的成本中心

  10. Context.Current.AgentUser.Constenter – 当前代理人的成本中心

  11. Context.Current.Task.Agent.Constenter – 当前任务代理人的成本中心

  12. Context.Current.Task.Applicant.Constenter – 当前任务申请人的成本中心

  13. Context.Current.Task.IsFinished – 当前任务是否结束,结束(True)/没结束(false)

  14. Context.Current.Task.IsRuning – 当前任务是否处于运行状态,结束(True)/没结束(false)

前2个是我每个流程都必用的字段,因为我设定了一个表模板,每张表除了必须的TaskID(重复表OrderIndex)之外,还有

  1. ID – 自增主键

  2. Status – 状态,默认为Inprocess,配合流程的OnTaskApproved,OnTaskRejected,OnTaskAborted,OnTaskDeleted进行自动更新

  3. TransactionUser – 提交人

  4. TransactionDate – 提交时间

  5. TransIP – 提交人IP

  6. LastUpdateUser – 最后修改人

  7. LastUpdateDate – 最后修改时间

  8. LastUpdateIp – 最后修改人IP

平常常用的,可以前台点选的项目我也列在这里

  1. Owner of the current step – 当前步骤处理人信息

  2. Agent – 代理人信息

  3. Log in User –  当前登录用户信息

  4. Initiator – 发起人信息

  5. Date – 日期

  6. Week – 周

  7. Form Field – 表单字段(自动关联流程、表单上的表)

如果你觉得这篇文章能够帮到你,请多帮我推荐给你的朋友们,也希望能够帮助到他们。

从崔牛的2017云图看BPM市场

上图来自牛透社(崔牛会)的崔牛2017云图关于国内BPM市场的重量级玩家。还是由衷的高兴看到FlowPortal,职业上选择一个能发展的很好的产品,也算是一种欣慰。不过说起Infor ERP LN (BaaN)就没那么开心了。

近期也接触到C#平台的开源工作流引擎和新的BPM产品,我计划今年也花时间去了解,去体验,届时也写写感受。

FlowPortal.Net中写代码自定义步骤处理人

就写写代码,大家参考一下。

if (Convert.ToString(FormDataSet["FormManpower.Location"]).Contains("SHANGHAI"))
{
return Role.FromFullName("BPMOU://Shanghai/HR Specialist").Members;
}
else if (Convert.ToString(FormDataSet["FormManpower.OrderBPCode"]).Contains("BEIJING"))
{
return Role.FromFullName("BPMOU://Beijing/HR Specialist").Members;
}
else
{
return Initiator.GetParentOU("Company").GetAllRoles("HR Specialist").AllMembers;
}

第二种

if (Convert.ToString(FormDataSet["FormNPNR.SBU"]).Contains("Eng Mgmt") && Convert.ToString(FormDataSet["FormNPNR.ItemGroup"]).Contains("034"))
{
return Member.FromAccount("Troy.Cui");
}
else
{
return Member.FromAccount(FormDataSet["FormNPNR.SBUManager"].ToString());
}

FlowPortal.Net BPM中所有可查看任务的一个权限bug

 姑且称之为bug吧,这个涉及到权限的管理,从记录的时间维度来看,这个地方的确是个bug。我画了一张图,帮助大家理解。

我处理的时候是找到2个特别的组,查看一下 Everyone这个组的记录,删除掉不需要的历史记录即可。

Administrators – S_GS_B639EB43-67D7-42fb-BD2E-B754BB11915B
Everyone – S_GS_90674E5E-AC3C-4032-9EDF-7477F2247542

删除的代码很简单,一并放上来。记得删除前备份数据库,以防不测。

  --Everyone
  DELETE FROM [BPMDB].[dbo].[BPMSecurityTACL]
  WHERE SID='S_GS_90674E5E-AC3C-4032-9EDF-7477F2247542'

 

附上流程上Everyone的设置

6年做BPM的实施、开发、推广应用的一个小结

晚上加班整理了一下这些年(从2010年就开始使用了)FlowPortal.Net BPM的使用情况,希望能从用户、流程、申请、效率、价值等角度做一些可视化的分析。发现几点有趣的现象。

1、真正用得多的流程都是跟员工利益有重大关系的。
2、有一些流程只是为了帮助一小部分人考虑的时候,产生的效益其实不大。
3、没有一个独立的流程管控部门,不做绩效分析、流程梳理和优化,其实很难达到提高效率的目标,顶多只是电子化,无纸化。
4、做流程很寂寞,需要坚守并打开思路。思考如何做的更好,不能单纯从技术角度考虑。得从老板的角度考虑钱、时间、资源、效率。

目前遇到的问题:

1、表单内容在邮件上的全部展现或者说手机App上的表单展示

2、用户对流程的基本概念培训

3、流程系统和其它系统的无缝结合

找我培训、咨询(问问题)、外包、技术支持前,请先阅读

今天一位温州的朋友加我QQ,希望谈培训、技术支持的问题,挺典型的一个沟通过程,特整理下来,节省下次与其它人的沟通时间。

相信找到我的人,多少对我有些了解,或者朋友介绍,或者看了博客等,在您寻求我的培训、咨询(问问题)、外包、技术支持前,请先想清楚以下3个问题

一、你想得到什么服务?

1、培训?

2、咨询?

3、技术支持?

二、你真正的想要的是什么?

1、快速搞定自己搞不定的问题?棘手的项目?

2、提升效率,尽快做出业绩或者做出更多业绩,得到升职加薪机会?

3、充电、指点迷津,树立清晰的目标和路线图?

4、获得成功的经验分享,同时避免常见的坑?

三、你愿意拿什么从我这里换取以上的要求?

1、你认可“舍得”之道吗?

2、你认可价值投资吗?

3、你认可知识的价值吗?

4、你认可技术的价值吗?

在接触的过程中,乃至服务结束后,我都希望你铭记以上几个问题的答案。因为不忘初心,方得始终。很多人在接触的过程中会放大自己的欲望、迷失自己的最初需求,问很多类似的问题,我也在这里不断的补充我的答案:

1、我想知道你这个培训到底值不值?

答:掉了钱包,丢了几百块,你会觉得很难过,而抢个几块钱的红包你都会觉得很开心、很开心。心态决定你的认知,初心很重要,笃信更重要。信则灵,一开始就怀疑,就算我倾囊相授,将我15年的IT信息化经验全盘托出,你还是会认为不值得。所以人常说:对的时间遇见对的人,一句话,一个思路,醍醐灌顶,犹如睡梦中惊醒,会令人终生受益。你能找到我,就要相信:我是对的人,我也会相信:你是对的人!

2、你这个价格怎么这么贵?

答:价格是跟我我的时间价值来决定,没办法,理论上单位时间的价格会越来越高。2019年之前3000元/天(8小时),2019年起5000元/天(8小时)。

3、你怎么问个问题都提钱?

答:虽然你加了我QQ好友或者微信好友或者博客留了言,但你要明白,我没有义务回答你的技术问题,我会在朋友圈、QQ空间、博客发布一些有价值的信息,这些是不收费,但我也没有要求你一定看。如果一定让我回答,要么看我心情,要么付费,让我愿意将时间交给你。一切都是用生命来换取的,你上班老板付你工资就是典型的例子,我没办法只靠你的免费提问,活在房价这么高、物价这么高的上海。

4、请你吃饭,什么时候碰个头咨询一下问题行吗?

答:真的不需要为了吃那顿饭,而准备往返时间、准备时间去解决你的问题。你想要的肯定不是让我吃顿好吃的吧,请记住自己想要什么。

5、你的培训特点是什么?

答:真实!我愿意用真实打动对方。不管是技术也好,工具的使用也好,其实大家智商都差不多,无非是靠时间的积累,我花了十几年的积累,也许你只需要一半的时间。我的目的其实是给你一个导师、益友班的辅导。对积极乐观的人来说,也许面对面的培训结束却只是个开始。

6、你为什么有时间做这个?

答:我每年有15天带薪年假、还有5天带薪病假(这个不算)、周六周末双休、外加每年的固定节假日,可以拿出来一部分来分享出来,变现。

7、想找你外包开发,你给报个价吧

答:报价需要你有明确的需求,才能评估工作量、交期、费用等。外包的开发,我是有选择性的。低于1万的不接,因为金额大小其实沟通成本、商务成本差不多。比如一个项目实际干活需要3天,可能前后沟通、商务需要3个3天=9天了。非常不划算。

8、你熟悉的技术或产品有哪些?

答:产品我列在博客顶部的链接有3个:Infor ERP LN(以前叫BaaN ERP)、FlowPortal.Net BPM、DTcms,另外我还熟悉博客园知名博主、技术大牛吉日嘎拉的C# .Net通用权限管理系统,并基于其底层开发了Web端的全功能的管理系统。我对MSSQL数据库较熟悉、并了解和会使用Oracle、MYSQL数据库,对Tableau做数据可视化分析、Camstasia制作微课、PowerPoint和Excel办公都有独特的见解。当然了,这些都是产品和技术,我对开发、支持、项目管理全流程的熟悉程度是经过实战考验的,这点我是有充分自信的,不会的没把握的也不会去接 – 有自知之明。

9、预约流程和支付方式

请直接加我微信:13818699609(文尾有微信二维码)联系预约,支付方式优选微信支付,请扫描以下付款二维码。

1小时起约:800元,仅限电话、语音等远程方式。

预定1天(8小时):5000元,可本市指定地点,注意需扣除往返路途时间。

Flowportal.Net BPM中拒绝后更新数据库字段的方法

今天FlowPortal.Net群里有人提问一个问题,希望能在流程被拒绝后,更改流程对应数据库中的指定字段值,这个其实很简单啦,FlowPortal提供了很强大的流程事件,大家可以自行写代码。

请问,流程拒绝后,如何更改流程字段

例如:流程提交收 字段a 有空,改为 ‘申请中’,同意后,A改为 ‘同意’,如果拒绝 A 改为 空

打开“流程管理器”右键点击指定的流程,点击"Event"的Tab,就能看到丰富的事件,我常用的有OnTaskRejected、OnTaskAborted、OnTaskDeleted,其实这几项我实战项目中必须要配置的。

最关键的就是代码的写法,大家参考以下代码。其中FormHire是你流程对应的表(我这个例子是非重复表)名,Status是其中的字段。

FormDataSet.Tables["FormHire"].Rows[0]["Status"] = "Rejected";


补充:后来快乐DIY问我:如果是重复表呢,好吧,做好人做到底,这个代码不管重复表还是不重复表都行:FromDataSet.Tables["tableName.FieldName"]="Reject";


简单吧?!如果觉得有用,就留下你的大名,留言给我你的感触。

做IT也得看清趋势

今天去参加了2016上海Tableau的年度峰会,感触颇多。开始之前,先说一点激励的体悟,一个公司有时候因为整体行业形势、个体业绩等原因造成大环境没有升职加薪的机会,这点任何部门、任何人都没有机会的时候,如何留住团队的骨干就涉及到激励。有时候除了加薪、升职之外,还有荣誉奖励、培训、接触行业动态机会等。如果你也做领导,记得尝试一下这些方式,如果你站在普通员工角度考虑,不妨利用好机会,把去抱怨的时间拿出来给自己充电、提升自己的价值,那么终有一天,你的价值会体现出来,不在此处,便在彼处!

我们做IT,很多时候都是比较专注,专注于技术,反而对同行的交流、跨行业的接触以及外面的世界不太关心。所以,对于市场上什么技术已经流行,什么产品是未来的趋势都不太关心。而那些做得好的IT始终保持一种开放的心态,去认识趋势,顺应趋势。大多数时候,我们提到“随波逐流”,都认为是没有主见,但当破浪来临的时候,难道你要逆水行舟?

就像当年各大公司都在上ERP,尽管结果有好有坏,难道你不上?连联想的柳传志有一句名言:“不上ERP等死,上了ERP找死。” 但是联想还是上了ERP,没办法,哪个公司不经历“出生入死”能依然屹立不倒,百年长青?再举个例子,电子商务,你说现在哪个公司敢说拒绝电子商务?

今天Tableau峰会的主题就是报表可视化,这里明确了2个趋势:

1、可视化报表,一图胜千言(无图无真相)

2、面向最终用户,而非面向IT的BI

何以见得:第一上午峰会开幕参会人员809(下午又多了一些),第二参会的人大部分是来自业务部门,第三这家公司的股票(美国纳斯达克DATA)

我也在反思我们公司用得的BI产品是大名鼎鼎的SAP旗下Business Objects,但是用户不喜欢用?就连我都不喜欢用!

微软虽然在线的Office365的在线Excel,也有自己的数据库MSSQL的报表分析工具,但还是要搞一个叫Power BI的可视化报表产品?

这不得不令我们深思,有时候我们的职业生涯是跟随着某个软件产品、某种开发语言、某个行业,入错行的意思是选择了一个错误的趋势,并且在趋势变化时,没有断臂归零求生存。比如说我选择了Infor ERP LN这个产品,前身叫BaaN ERP,有好几位前伟创力的同事都换行去做了SAP或Oracle,他们的路越走越宽,而我一直在围绕这个产品,职场上的选择机会就相对少了很多很多!

不说了,说多了都是泪,女怕嫁错郎,男怕入错行,做IT的错在没有顺应趋势!

既然说无图无真相,就放上来一张图,让你看看哪些大公司都在用Tableau,看你会不会有下一步行动。

我的行动:

1、立马淘宝买了一套学习Tableau视频!

2、分享给好友

3、写下这篇博客

4、明天安装试用版,开始学习使用

5、以后分享使用心得

多公司下Flowportal.Net BPM流程步骤处理人的设定

6月份以来随着ERP系统的升级上线,忙得不可开交,但因为公司组织机构变动,还是得花时间弄BPM的流程审批人的问题,为了一套流程同行所有的中国区的组织,我们使用角色的定义来设定流程。其中一个典型的是出差申请,其中一个步骤是给到申请人和同行人所在的部门最大的老板审批,我们在BPM的每个Company级别下的组织架构下开设Department级别的部门,然后在每个部门设定一个Department Head的角色。但是在设定步骤审批人的时候,使用以下代码代表当前申请人所在部门的Department Head。

Initiator.GetParentOU("Department").GetAllRoles("Department Head").AllMembers

相应的BPM设置截图如下:

然后使用以下代码代表(多行)同行人所在部门的Department Head

Member.FromAccount(FormDataSet["FormTravelRetinue.Requester"].ToString()).GetParentOU("Department").GetAllRoles("Department Head").AllMembers

但是问题出来了,如果有同行人的时候,是没问题的,一旦没有同行人,这段代码就会报错,说找不到同行人的部门Department Head,于是修改代码如下:

MemberCollection members = new MemberCollection();
if (Initiator.GetParentOU("Department").GetAllRoles("Department Head").AllMembers != null)
{
members.AddRange(Initiator.GetParentOU("Department").GetAllRoles("Department Head").AllMembers);
}
foreach(FlowDataRow row in FormDataSet.Tables["FormTravelRetinue"].Rows)
{
string account = Convert.ToString(row["Requester"]);
if (!string.IsNullOrEmpty(account) && !members.ContainsUser(account))
{
if (Member.FromAccount(account).GetParentOU("Department").GetAllRoles("Department Head").AllMembers != null)
{
     members.AddRange(Member.FromAccount(account).GetParentOU("Department").GetAllRoles("Department Head").AllMembers);
}
}
}
return members;

这样一段代码,却造成一旦有同行人,就没办法提交成功,直接BPM的服务Down掉了。

于是联系官方技术,给出了一下的优化建议:

于是官方技术刘亮发过来修改的代码如下:

//第3版
MemberCollection members = new MemberCollection();
foreach (Member member in Initiator.GetParentOU("Department").GetAllRoles("Department Head").AllMembers)
{
members.Add(member);
}
foreach (FlowDataRow row in FormDataSet.Tables["FormTravelRetinue"].Rows)
{
string account = Convert.ToString(row["Requester"]);
if (!string.IsNullOrEmpty(account) && !members.ContainsUser(account))
{
foreach (Member member in Member.FromAccount(account).GetParentOU("Department").GetAllRoles("Department Head").AllMembers)
{
members.Add(member);
}
}
}
return members;

就这样通过替换AddRange的方法,问题解决了!

记录在这里,给可能遇到类似需求的朋友。