向日葵甘特实战一:实现零件加工任务的显示
最近要完成一个机械加工厂生产管理系统的项目,正好用上向日葵甘特图组件,我将实战过程公布如下。
我的第一个任务是显示零件任务加工过程的甘特图,并允许用户调整工序的计划时间。
我的技术路线如下图所示:
首先我要建立Web Service, 用于从数据库中提取数据生成甘特图组件所需要的xml数据。Xml数据格式要求可参见
http://www.51diaodu.cn/sfgantt/docs/index.html
采用.net发布Web Service很简单,这里不再赘述。但有几点要特别注意:
1、控制任务链接对象的序列化
由于任务与前置任务属于一对多的关系,所以Task对象中存在PredecessorLinkS数组,这样在.net 生成的web服务WSDL中会多出一个节点PredecessorLinkS,与向日葵甘特图要求的XML格式不一致。程序中我们必须采用如下标记来控制Xml的序列化 <System.Xml.Serialization.XmlElement(elementName:="PredecessorLink", IsNullable:=False)> _ Public PredLinkS() As PredecessorLink
2、大纲级别
任务属性中的大纲级别OutlineNumber对甘特图组件
极为重要,它控制了任务之间的父子关系,必须按照1,1.1,1.1.1 这种方式进行进行定义。
3、xml数据中的根任务
向日葵甘特图中必须有一个根任务,它的OutlineNumber=0,计划开始属性Start最好为所有任务的最早计划时间,这样便于Gantt图初始化时间的显示。
4、任务链接类型的显示
LinkType=0 表示完成-完成FF
LinkType=1 表示完成-开始 FS
LinkType=2 表示开始-完成 FS
LinkType=3 表示开始-开始 SS
Web服务建立完之后,我们就获取了甘特图组件显示所需要的数据。但这样还不行,因为web service进行了SOAP协议封装,所得到的Dom对象无法直接为向日葵甘特图所用,必须采用如下语句进行转化:
var doc=SFAjax.createDocument();
doc.appendChild(loader.xmlDoc.documentElement.firstChild.firstChild.firstChild);//firstChild的级数随需而变
获取到向日葵甘特所需要的Dom对象,我们就可以进行Gantt图的初始化了。
因为我们要做生产管理软件,所需要的属性当然与向日葵甘特图缺省提供的属性全然不同了。我们先扩展任务对象,向日葵甘特图会自动从XML中获取相应节点,例如扩展“计划数”属性:
adapter.addTaskProperty("PlanQty","PlanQty",SFDataRender.types.Float);
任务属性扩展后,我们还需将其定义到Gantt任务域中
SFGanttField.addTaskField("PlanQty",50,'计划数',SFGanttField.NormalHead,SFGanttField.NormalBody,SFGanttField.NormalInput,"PlanQty","PlanQty");
这样,一个零件任务的甘特图界面就形成了,如下图所示
哈哈,第一步工作顺利完成了。不过我知道路还远着呢?生产管理系统毕竟太复杂了……